<div dir="ltr">Hi Razvan,<div><br></div><div>I have some news.</div><div><br></div><div>The suspects are not regular AVPs but branch AVPs that I set in a module.</div><div><br></div><div>Is there a specific handling for those AVPs?</div><div><br></div><div>Here is how I use it:</div><div><br></div><div>static str bavp_msgops_flags = str_init("$bavp(_msgops_bflags)");<br></div><div>pv_spec_t bavp_msgops_flags_spec;<br></div><div><br></div><div>In mod_init:</div><div><br></div><div><div>if (parse_store_bavp(&bavp_msgops_flags, &bavp_msgops_flags_spec)) {</div><div> LM_ERR("Fail to parse branch AVPs.\n");</div><div> return -1;</div><div>}</div></div><div><br></div><div>In a command called from branch_route:</div><div><br></div><div><div>b_flags.flags = PV_VAL_INT|PV_TYPE_INT;</div><div>b_flags.ri = 0;</div><div>if(pv_set_value(msg, &bavp_msgops_flags_spec, (int)EQ_T, &b_flags) != 0) {</div><div> LM_ERR("Fail to set branch flags AVP.\n");</div><div> return -1;</div><div>}</div></div><div><br></div><div>Sometimes, I do the following to get the branch AVP value:</div><div><br></div><div><div>if (pv_get_spec_value(rpl, &bavp_msgops_flags_spec, &b_flags_val) != 0) {</div><div> LM_ERR("Branch AVP not found!\n");</div><div> return;</div><div>}</div></div><div><br></div><div><br></div><div>Thanks,</div><div>Mickael</div></div><div class="gmail_extra"><br><div class="gmail_quote">On Thu, Jul 2, 2015 at 2:34 PM, Răzvan Crainea <span dir="ltr"><<a href="mailto:razvan@opensips.org" target="_blank">razvan@opensips.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<div bgcolor="#FFFFFF" text="#000000">
<tt>Hi, Mickael!<br>
<br>
Not sure why the signal is triggered. But what you could do is to
replicate the behavior of the function until you find the proper
id.<br>
<br>
Best regards,<br>
</tt><span class="">
<pre cols="72">Răzvan Crainea
OpenSIPS Solutions
<a href="http://www.opensips-solutions.com" target="_blank">www.opensips-solutions.com</a></pre>
</span><div><div class="h5"><div>On 06/23/2015 05:37 PM, Mickael
Marrache wrote:<br>
</div>
<blockquote type="cite">
<div dir="ltr">Hi Razvan,
<div><br>
</div>
<div>I'm using GDB as follows:</div>
<div><br>
</div>
<div>
<div>(gdb) p get_avp_name_id(((struct
usr_avp*)0x2ba445441948)->id)</div>
<div><br>
</div>
<div>Program received signal SIGUSR2, User defined signal 2.</div>
<div>get_avp_name_id (id=139) at usr_avp.c:263</div>
<div>263 {</div>
<div>The program being debugged was signaled while in a
function called from GDB.</div>
<div>GDB remains in the frame where the signal was received.</div>
<div>To change this behavior use "set unwindonsignal on"</div>
<div>Evaluation of the expression containing the function
(get_avp_name_id) will be abandoned.</div>
</div>
<div><br>
</div>
<div>where ((struct usr_avp*)0x2ba445441948)->id gives me the
AVP id.</div>
<div><br>
</div>
<div>I expect the result to be of type str* (representing the
AVP name) but it looks like some signal is received while
executing the function.</div>
<div><br>
</div>
<div>Any idea?</div>
<div><br>
</div>
<div>Thanks,</div>
<div>Mickael </div>
</div>
<div class="gmail_extra"><br>
<div class="gmail_quote">On Tue, Jun 23, 2015 at 12:08 PM,
Răzvan Crainea <span dir="ltr"><<a href="mailto:razvan@opensips.org" target="_blank">razvan@opensips.org</a>></span>
wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<div bgcolor="#FFFFFF" text="#000000"> <tt>Hi, Mickael!<br>
<br>
That's the correct usage, and the AVP is attached to the
transaction, and destroyed when the transaction is
destroyed. However, it depends on the context when the
AVP is populated. Is it done for each message? Timer
based?<br>
If I were you, I'd continue tracing the name of the AVPs
and checking where they are populated.<br>
<br>
Best regards,<br>
</tt><span>
<pre cols="72">Răzvan Crainea
OpenSIPS Solutions
<a href="http://www.opensips-solutions.com" target="_blank">www.opensips-solutions.com</a></pre>
</span>
<div>
<div>
<div>On 06/22/2015 07:28 PM, Mickael Marrache wrote:<br>
</div>
<blockquote type="cite">
<div dir="ltr">Looking for example at the DIALPLAN
module, it looks like the same procedure is
followed, so I don't see anything special I'm
doing here.</div>
<div class="gmail_extra"><br>
<div class="gmail_quote">On Mon, Jun 22, 2015 at
7:22 PM, Mickael Marrache <span dir="ltr"><<a href="mailto:mickaelmarrache@gmail.com" target="_blank"></a><a href="mailto:mickaelmarrache@gmail.com" target="_blank">mickaelmarrache@gmail.com</a>></span>
wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<div dir="ltr">Hi Razvan,
<div><br>
</div>
<div>I do the following:</div>
<div><br>
</div>
<div>
<div>static str my_avp_name = {NULL, 0};</div>
<div>static pv_spec_t my_avp;</div>
</div>
<div><br>
</div>
<div>
<div>static param_export_t params[] = {</div>
<div><span style="white-space:pre-wrap">        .....</span></div>
<div><span style="white-space:pre-wrap">        </span>{
"my_avp",<span style="white-space:pre-wrap"> </span>STR_PARAM,
&my_avp_name.s}</div>
<div>};</div>
</div>
<div><br>
</div>
<div>
<div>static int mod_init(void) {</div>
<div> ....</div>
<div><span style="white-space:pre-wrap">        my</span>_avp_name.len
= strlen(my_avp_name.s);</div>
</div>
<div> ....</div>
<div> if(my_avp_name.s == NULL ||
my_avp_name.len == 0) {</div>
<div><span style="white-space:pre-wrap">                </span>return
-1;</div>
<div><span style="white-space:pre-wrap">        </span>}</div>
<div><span style="white-space:pre-wrap">        </span>if
(pv_parse_spec(&my_avp_name,
&my_avp) == 0 || my_avp.type !=
PVT_AVP) {</div>
<div><span style="white-space:pre-wrap">                </span>return
-1;</div>
<div><span style="white-space:pre-wrap">        </span>}</div>
<div>}</div>
<div><br>
</div>
<div>Then, when I want to set a value to my
AVP (for example, for setting an integer):</div>
<div><br>
</div>
<div>pv_value_t pvar_value;<br>
</div>
<div>
<div>pvar_value.flags =
PV_VAL_INT|PV_TYPE_INT;</div>
<div>pvar_value.ri = some_integer;</div>
<div>if(pv_set_value(msg, &my_avp,
(int)EQ_T, &pvar_value) < 0) {</div>
<div><span style="white-space:pre-wrap">        </span>goto
error;</div>
<div>}</div>
</div>
<div><br>
</div>
<div>And, that's all. I don't detroy the AVP
after use because the module can't know
the AVP is not used anymore. I can destroy
the AVP in the script after use but I
thought it was handled automatically.</div>
<div><br>
</div>
<div>In the example I gave here, is the AVP
attached to a transaction? What are the
conditions for an AVP to be attached to a
transaction?</div>
<div><br>
</div>
<div>Thanks,</div>
<div>Mickael</div>
</div>
<div>
<div>
<div class="gmail_extra"><br>
<div class="gmail_quote">On Mon, Jun 22,
2015 at 10:33 AM, Răzvan Crainea <span dir="ltr"><<a href="mailto:razvan@opensips.org" target="_blank"></a><a href="mailto:razvan@opensips.org" target="_blank">razvan@opensips.org</a>></span>
wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<div bgcolor="#FFFFFF" text="#000000"> <tt>Hi, Mickael!<br>
<br>
Both maps are relevant, because
both of them contain id2name
mappings. So you should
definitely look into the avp_map
too. Note that those mappings do
not store AVPs, they only store
the real name of the AVP, as you
use in script, and they can be
populated at startup (in this
case they are stored in PKG) and
runtime (stored in SHM).<br>
It depends when the AVP should
be destroyed: if they are
attached to the transaction (and
they usually are), they are
automatically destroyed by the
tm module. Otherwise the module
that uses them, should take care
of that.<br>
<br>
Best regards,<br>
</tt><span>
<pre cols="72">Răzvan Crainea
OpenSIPS Solutions
<a href="http://www.opensips-solutions.com" target="_blank">www.opensips-solutions.com</a></pre>
</span>
<div>
<div>
<div>On 06/18/2015 09:56 PM,
Mickael Marrache wrote:<br>
</div>
<blockquote type="cite">
<div dir="ltr">Hi Razvan,
<div><br>
</div>
<div>I looked at both
avp_map and avp_map_shm.
In our case, only
avp_map_shm is relevant
since the leak appears
in shared memory. I only
see 4 elements in this
map while I can see a
lot of remaining AVPs
when looking at the
memory dump created at
shutdown using QM debug.
Therefore, it looks like
these AVPs are not in
the map. Looking at the
new_avp function in
usr_avp.c, I don't see
at any moment that an
entry is added to the
map for the new AVP.</div>
<div><br>
</div>
<div>
<div>(gdb) print
avp_map_shm->avl_count</div>
<div>$5 = 4</div>
<div>(gdb) print
avp_map->avl_count</div>
<div>$6 = 140</div>
</div>
<div><br>
</div>
<div>Any idea?</div>
<div><br>
</div>
<div>At which moment
during execution an AVP
is destroyed? Is it
required for modules
returning values to
script through AVPs to
destroy these AVPs? or
are they automatically
destroyed?</div>
<div><br>
</div>
<div>Thanks,</div>
<div>Mickael</div>
</div>
<div class="gmail_extra"><br>
<div class="gmail_quote">On
Thu, Jun 18, 2015 at
7:33 PM, Răzvan Crainea
<span dir="ltr"><<a href="mailto:razvan@opensips.org" target="_blank"></a><a href="mailto:razvan@opensips.org" target="_blank">razvan@opensips.org</a>></span>
wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<div bgcolor="#FFFFFF" text="#000000"> <tt><span>Hi,
Mickael!<br>
<br>
This is not
entirely true -
you can define
AVPs with the
integer value 0.
Those will have
avp->flags ==
0 and
avp->data ==
0.<br>
What I'd do, is
to note down the
avp->id value
of those AVPs
and then try to
see their names.
To do that,
you'd have to
look into the
avp_map and
avp_map_shm maps
to see the
corresponding
name for that
id.
Alternatively
you can call in
your script the
avp_print()
method, which
prints all the
AVPs for a
specific
transaction
along with their
id and names.
Let me know how
this goes.<br>
<br>
</span> Best
regards,</tt><span>
<pre cols="72">Răzvan Crainea
OpenSIPS Solutions
<a href="http://www.opensips-solutions.com" target="_blank">www.opensips-solutions.com</a>
</pre>
</span></div>
</blockquote>
</div>
</div>
</blockquote>
</div>
</div>
</div>
</blockquote>
</div>
</div>
</div>
</div>
</blockquote>
</div>
</div>
</blockquote>
</div>
</div>
</div>
<br>
_______________________________________________<br>
Users mailing list<br>
<a href="mailto:Users@lists.opensips.org" target="_blank">Users@lists.opensips.org</a><br>
<a href="http://lists.opensips.org/cgi-bin/mailman/listinfo/users" rel="noreferrer" target="_blank">http://lists.opensips.org/cgi-bin/mailman/listinfo/users</a><br>
<br>
</blockquote>
</div>
<br>
</div>
<br>
<fieldset></fieldset>
<br>
<pre>_______________________________________________
Users mailing list
<a href="mailto:Users@lists.opensips.org" target="_blank">Users@lists.opensips.org</a>
<a href="http://lists.opensips.org/cgi-bin/mailman/listinfo/users" target="_blank">http://lists.opensips.org/cgi-bin/mailman/listinfo/users</a>
</pre>
</blockquote>
<br>
</div></div></div>
<br>_______________________________________________<br>
Users mailing list<br>
<a href="mailto:Users@lists.opensips.org">Users@lists.opensips.org</a><br>
<a href="http://lists.opensips.org/cgi-bin/mailman/listinfo/users" rel="noreferrer" target="_blank">http://lists.opensips.org/cgi-bin/mailman/listinfo/users</a><br>
<br></blockquote></div><br></div>