axis-c-user mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Akos Marton <makos...@gmail.com>
Subject Re: Memory handling in Axis2c server
Date Fri, 09 Jul 2010 11:26:57 GMT
You had better send the corresponding code of the certain stack-trace.
-can be interesting.


On Fri, Jul 9, 2010 at 1:02 PM, Thomas Gentsch <tg@e-tge.de> wrote:
>
> Hi all,
>
> I encountered a problem which I'm not sure how to handle - whether it is
> my own fault because I did something wrong?
>
> I have a Axis2c server, which generally works nicely. The actual service
> deals with Tuscany SDO objects, so I transform the Axiom objects to/from
> SDOs when processing a request (this is actually a detail which should
> not matter as the question is more general):
>
> In my service, I have something like this (following the example here:
> http://www.dimuthu.org/blog/2008/10/02/understanding-apache-axis2c-services)
>
>> Service logic
>> Just create a function with the following format.
>> axiom_node_t *axis2_echo_echo(
>>    const axutil_env_t * env,
>>    axiom_node_t * input_node) {
>>
>>    /* Write your business logic Right Here */
>> }
>> Here you extract out the input parameters from the the input_node and
>> build the return node based on your output parameters. (Note that even
>> though this is an echo example you can’t return the same input node as
>> the output node, instead you have to replicate the input node and
>> return it to avoid the double freeing)
>
> 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)
> ==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)
> ------------------
>
> Who is going to free the axiom_node_t I return? In theory this must
> happen inside of Axis2c when serializing the data to the network, right?
> So, there is actually nothing I can do?
> Under which circumstances might this not be done?
> Am I possibly doing something wrong?
>
>
> 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)
> ==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-unsubscribe@axis.apache.org
> For additional commands, e-mail: c-user-help@axis.apache.org
>
>



-- 
People seldom notice clothes, if you wear a big smile.
My grandmother uses Ubuntu, don't you think so?!
OLVASD: http://www.xkcd.org/

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


Mime
View raw message