Hi Jared,
Can you attach you fixes to the jira-537...
Thanks
Nandika
On 2/27/07, Jared Hanson <[EMAIL PROTECTED]> wrote:
An update:
I implemented my suggestion within my own types. Any text values they
read from axiom_element, they copy before setting them in their own
structures. I also uncommented the AXIOM_SOAP_ENVELOPE_FREE() in msg_ctx.
The result was a dramatic reduction in memory leaks. It's dependent on
how complex your SOAP messages are, but in my particular case, they dropped
to about 1% of what they were previously.
Also note, I'm running with the patch I sent previously, which fixes the
socket handle leak along with other small amounts of memory.
Jared
On 2/26/07, Jared Hanson <[EMAIL PROTECTED]> wrote:
>
> One other thought on this:
>
> Exposing an AXIOM_ELEMENT_GET_TEXT_ASSUME_OWNERSHIP, or some equivalent
> would also work. This would give an option for avoiding an unnecessary
> memcpy.
>
> Jared
>
> On 2/26/07, Jared Hanson <[EMAIL PROTECTED]> wrote:
> >
> > I've been digging into this one, and am writing in to report my
> > progress. To refresh, this is in reference to the major memory leak caused
> > by having AXIOM_SOAP_ENVELOPE_FREE(msg_ctx->soap_envelope, env); commented
> > out in msg_ctx.c
> >
> > When putting that line in, the code flows into
> > axiom_soap_builder_free(), axiom_stax_builder_free(), and
> > axiom_document_free(). Somewhere in axiom_document_free(), the application
> > will crash. This appears to be caused by a double free, in which memory is
> > owned by an om_element->text_value and the "application-level" types used in
> > the SOAP message.
> >
> > For example: here is a pseudo generated type:
> >
> > axis2_MyType_free (...) {
> > if (MyType_impl->attrib_MyText != NULL)
> > {
> > AXIS2_FREE( env-> allocator, MyType_impl->attrib_MyText);
> > MyType_impl->attrib_MyText = NULL;
> > }
> > }
> >
> > axis2_MyType_build_om (...) {
> > text_value = AXIOM_ELEMENT_GET_TEXT(current_element, env,
> > current_node );
> > AXIS2_MYTYPE_SET_MYTEXT(MyType, env,
> > text_value);
> > }
> >
> > axis2_MyType_set_MyText(param_MyText) {
> > MyType_impl->attrib_MyText = param_MyText;
> > }
> >
> >
> > In this case, MyType has assumed ownership of the text returned by
> > axiom_element_get_text(). It will free it in its free function. However,
> > if you look at axiom_element_get_text(), the following occurs:
> >
> > axiom_element_get_text(...) {
> > ...
> > dest = AXIS2_STRDUP(temp_text, env);
> > ...
> > om_element->text_value = dest;
> > return om_element->text_value;
> > }
> >
> > Then, in axiom_element_free():
> >
> > axiom_element_free() {
> > if (om_element->text_value)
> > {
> > AXIS2_FREE(env->allocator, om_element->text_value);
> > om_element->text_value = NULL;
> > }
> > }
> >
> >
> > The result of which, is that two objects lay claim to memory, and both
> > try to free it. This obviously will cause a crash, and is, I'm guessing,
> > why the AXIOM_SOAP_ENVELOPE_FREE() was commented out in the first place.
> >
> > I think what needs to be happening is that the WSDL->code generator
> > needs to be duplicating the text_values it reads before setting them.
> > Before 1.0, this needs to be ironed out, so there is no discrepancy,
> > because the memory leak is very severe.
> >
> > I'm posting the information so others can look into it as well. I'd
> > appreciate knowing what other people discover, so that these items can be
> > addressed.
> >
> > Thanks,
> > Jared
> >
> >
> >
> >
>
--
[EMAIL PROTECTED]
WSO2 INC www.wso2.com