Hi all,

seems as if I have found a solution.
If I transform the SDO to axiom like this, it looks clean (will do more
testing but initially it looked ok):

//------------------
  axiom_document_t * doc = axiomHelper->toAxiomDoc(sdo);
  axiom_node_t * ret = NULL;
  if(doc != NULL)
  {
    ret = axiom_document_get_root_element(doc, env);
    axiom_stax_builder_t * sb = axiom_document_get_builder(doc, env);
    axiom_stax_builder_free_self(sb, env);
  }
  return ret;
//------------------

Essentially, the trick is not to call axiom_stax_builder_free() but
rather axiom_stax_builder_free_self().
This way the stax builder and the doc is freed but the node tree in
'ret' is left intact.

Comments?

Rgds,
  tge

BTW: I found some more leaks in the AxiomHelper ... -> Tuscany SDO C++

On Mon, 2010-07-12 at 19:17 +0200, Thomas Gentsch wrote:
> Hi all,
> 
> I did some more investigation and it looks as if indeed both the request
> an response nodes are freed properly.
> Looking at the valgrind stack I believe it is something else that is
> left over ...
> 
> On Sun, 2010-07-11 at 12:37 +0200, Thomas Gentsch wrote:
> > Many thx for this pointer - it confirms the answer to question one:
> > [...]
> > > > So I create a returned axiom_node_t but eventually end up with a memory
> > > > leak:
> > > > ------------------
> > > > ==3461== 20,164 (40 direct, 20,124 indirect) bytes in 1 blocks are
> > > > definitely lost in loss record 975 of 980
> > > > ==3461==    at 0x4025C1C: malloc (vg_replace_malloc.c:195)
> > > > ==3461==    by 0x47C1CFC: axutil_allocator_malloc_impl (allocator.c:75)
> > > > ==3461==    by 0x47A2E1C: axiom_stax_builder_create
> > > > (om_stax_builder.c:70)
> 
> It is the stax builder that is not freed. Essentially the following
> happens:
> 1. my service produces an SDO and calls the AxiomHelper to transform it
> to an axiom node which I then return
> 2. the AxiomHelper does
>   a) char * str = ... // Serialize the SDO to XML
>   b) axiom_xml_reader_create_for_memory(env, str, ...)
>   c) axiom_stax_builder_t* builder =
>                 axiom_stax_builder_create(env, reader);
>   d) axiom_document_t* document =
>                 axiom_stax_builder_get_document(builder, env);
>   e) axiom_node_t* root_node =
>                 axiom_document_get_root_element(document, env);
>   f) axiom_document_build_all(document, env);
>   and returns the "document" from which I extract the root node again
>   which is the response node
> 
> No matter what I try to free things:
>  - the stax builder
>  - the doc
>  - I tried detaching the root node
>  - tried extracting the stax builder from the doc and freeing it
>  - ...
> either I get a double-free crash or the memory leak.
> 
> Any ideas?
> 
> Regarding the other one see below ...
> 
> > > > ==3461==    by 0x4712A66:
> > > > commonj::sdo_axiom::AxiomHelper::toAxiomDoc(commonj::sdo::RefCountingPointer<commonj::sdo::DataObject>,
> > > >  char const*, char const*) (sdo_axiom.cpp:146)
> > > > ==3461==    by 0x4438CB8:
> > > > dataObjToAxiom(commonj::sdo::RefCountingPointer<commonj::sdo::DataObject>)
> > > >  (in /opt/bes/itm/modules/libimsoap.so)
> > > > ==3461==    by 0x4439839: invokeFunc(axutil_env const*, axiom_node*)
> > > > (im_soapsrv.cpp:160)
> > > > ==3461==    by 0x4439396: invoke(axis2_svc_skeleton*, axutil_env const*,
> > > > axiom_node*, axis2_msg_ctx*) (im_soapsrv.cpp:79)
> > > > ==3461==    by 0x4C31C8D: soapSrvInvoke (im_soapsrvax.cpp:37)
> > > > ==3461==    by 0x474B0D6:
> > > > axis2_raw_xml_in_out_msg_recv_invoke_business_logic_sync
> > > > (raw_xml_in_out_msg_recv.c:209)
> > > > ==3461==    by 0x474A433: axis2_msg_recv_invoke_business_logic
> > > > (msg_recv.c:481)
> > > > ==3461==    by 0x474AB34: axis2_msg_recv_receive_impl (msg_recv.c:403)
> > > > ==3461==    by 0x474A4B3: axis2_msg_recv_receive (msg_recv.c:520)
> > > > ------------------
> [...]
> > > > Secondly, how is it supposed to work the other way around? In my
> > > > service, I receive an axiom node, transform it to a SDO etc.
> > > > Who is in charge of freeing the original axiom_node_t?
> > > > I don't do it in my code, so the result is another memory leak:
> > > >
> > > > -----------------------
> > > > ==3461== 8,737 (56 direct, 8,681 indirect) bytes in 1 blocks are
> > > > definitely lost in loss record 970 of 980
> > > > ==3461==    at 0x4025C1C: malloc (vg_replace_malloc.c:195)
> > > > ==3461==    by 0x47C1CFC: axutil_allocator_malloc_impl (allocator.c:75)
> > > > ==3461==    by 0x47A022B: axiom_output_create (om_output.c:79)
> 
> Again, it is not the node but the axiom_output_t which has been created
> in the AxiomHelper.
> Here I have added an
>   axiom_output_free(output, the_env);
> in the AxiomHelper which seems to fix the second leak.
> 
> Many thx,
>   tge
> 
> > > > ==3461==    by 0x4712381:
> > > > commonj::sdo_axiom::AxiomHelper::toSdo(axiom_node*,
> > > > commonj::sdo::RefCountingPointer<commonj::sdo::DataFactory>, char
> > > > const*) (sdo_axiom.cpp:214)
> > > > ==3461==    by 0x4438D9F: dataObjFromAxiom(axiom_node*)
> > > > (in /opt/bes/itm/modules/libimsoap.so)
> > > > ==3461==    by 0x44397C0: invokeFunc(axutil_env const*, axiom_node*)
> > > > (im_soapsrv.cpp:152)
> > > > ==3461==    by 0x4439396: invoke(axis2_svc_skeleton*, axutil_env const*,
> > > > axiom_node*, axis2_msg_ctx*) (im_soapsrv.cpp:79)
> > > > ==3461==    by 0x4C31C8D: soapSrvInvoke (im_soapsrvax.cpp:37)
> > > > ==3461==    by 0x474B0D6:
> > > > axis2_raw_xml_in_out_msg_recv_invoke_business_logic_sync
> > > > (raw_xml_in_out_msg_recv.c:209)
> > > > ==3461==    by 0x474A433: axis2_msg_recv_invoke_business_logic
> > > > (msg_recv.c:481)
> > > > ==3461==    by 0x474AB34: axis2_msg_recv_receive_impl (msg_recv.c:403)
> > > > ==3461==    by 0x474A4B3: axis2_msg_recv_receive (msg_recv.c:520)
> > > > -----------------------
> > > >
> > > > Any hints are greatly appreciated!!
> > > >
> > > > Many thx + regards,
> > > >   tge
> > > >
> > > >
> > > > ---------------------------------------------------------------------
> > > > To unsubscribe, e-mail: c-user-unsubscr...@axis.apache.org
> > > > For additional commands, e-mail: c-user-h...@axis.apache.org
> > > >
> > > >
> > > >   



---------------------------------------------------------------------
To unsubscribe, e-mail: c-user-unsubscr...@axis.apache.org
For additional commands, e-mail: c-user-h...@axis.apache.org

Reply via email to