<html>
  <head>
    <meta content="text/html; charset=UTF-8" http-equiv="Content-Type">
  </head>
  <body 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>
    <pre class="moz-signature" cols="72">Răzvan Crainea
OpenSIPS Solutions
<a class="moz-txt-link-abbreviated" href="http://www.opensips-solutions.com">www.opensips-solutions.com</a></pre>
    <div class="moz-cite-prefix">On 06/22/2015 07:28 PM, Mickael
      Marrache wrote:<br>
    </div>
    <blockquote
cite="mid:CA+=4G22QJsmQmh1V0TVqbg-Rg+gdQ=+g6o3sbGVq=qx=cad68Q@mail.gmail.com"
      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">&lt;<a
              moz-do-not-send="true"
              href="mailto:mickaelmarrache@gmail.com" target="_blank"><a class="moz-txt-link-abbreviated" href="mailto:mickaelmarrache@gmail.com">mickaelmarrache@gmail.com</a></a>&gt;</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,
                  &amp;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(&amp;my_avp_name, &amp;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, &amp;my_avp, (int)EQ_T,
                  &amp;pvar_value) &lt; 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 class="HOEnZb">
              <div class="h5">
                <div class="gmail_extra"><br>
                  <div class="gmail_quote">On Mon, Jun 22, 2015 at 10:33
                    AM, Răzvan Crainea <span dir="ltr">&lt;<a
                        moz-do-not-send="true"
                        href="mailto:razvan@opensips.org"
                        target="_blank"><a class="moz-txt-link-abbreviated" href="mailto:razvan@opensips.org">razvan@opensips.org</a></a>&gt;</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 moz-do-not-send="true" 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-&gt;avl_count</div>
                                  <div>$5 = 4</div>
                                  <div>(gdb) print avp_map-&gt;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">&lt;<a
                                      moz-do-not-send="true"
                                      href="mailto:razvan@opensips.org"
                                      target="_blank"><a class="moz-txt-link-abbreviated" href="mailto:razvan@opensips.org">razvan@opensips.org</a></a>&gt;</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-&gt;flags == 0 and
                                          avp-&gt;data == 0.<br>
                                          What I'd do, is to note down
                                          the avp-&gt;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 moz-do-not-send="true" 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>
  </body>
</html>