Ah yes. I have a fix for this. It is caused by the SDOXMLString::substring
method creating 2 copies of the string and only freeing one of them. this
method is called when parsing the QName string in type="fred:joe" so we end
up with an extra "fred" and "joe" when this is called.

I will raise a Jira and put the fix in.

Cheers,

On 11/10/06, Caroline Maynard <[EMAIL PROTECTED]> wrote:

One of our PHP users  has reported a problem with leaking memory from
libxml2. I started to investigate, but realised that the issue is
independent of PHP, and can be reproduced in a standalone Tuscany
environment. The issue is that memory allocated by libxml2 is not being
freed, so he is seeing a memory leak growing with each invocation.

For example, if we take a small schema:
<?xml version="1.0"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema";>
   <xsd:element name="courses">
       <xsd:complexType>
           <xsd:sequence>
               <xsd:element name="course" minOccurs="0"
maxOccurs="unbounded">
                   <xsd:complexType>
                       <xsd:sequence>
                           <xsd:element name="title" type="xsd:string"/>
                           <xsd:element name="description"
type="xsd:string"/>
                           <xsd:element name="credits"
type="xsd:decimal"/>
                           <xsd:element name="lastmodified"
type="xsd:dateTime" minOccurs="1"/>
                       </xsd:sequence>
                       <xsd:attribute name="cid" type="xsd:ID"/>
                   </xsd:complexType>
               </xsd:element>
           </xsd:sequence>
       </xsd:complexType>
   </xsd:element>
</xsd:schema>

and a trivial function to load it:
void load_schema(char *name)
{
   DataFactoryPtr mdg = DataFactory::getDataFactory();
   XSDHelperPtr xsh = HelperProvider::getXSDHelper(mdg);
   xsh->defineFile(name);
   xsh = NULL;
   mdg = NULL;
}

(I added the last two lines to try to encourage the reference-counting
pointers to do their work, but they made no difference to the outcome)

then use libxml features to check the memory usage:
int main (int argc, char** argv)
{
   xmlInitParser();

   load_schema(argv[1]);

   xmlCleanupParser();
   xmlMemoryDump();
   return 0;
}

(note: in order to use these libxml functions, you must recompile with
debug=yes mem_debug=yes)

We see the following output in libxml's .memdump file:

     MEMORY ALLOCATED : 108, MAX was 13687
BLOCK  NUMBER   SIZE  TYPE
0         984      3 malloc()  in none(0) "ID"
1         981      4 malloc()  in none(0) "xsd"
2         971      3 malloc()  in none(0) "ID"
3         968      4 malloc()  in none(0) "xsd"
4         875      9 malloc()  in none(0) "dateTime"
5         872      4 malloc()  in none(0) "xsd"
6         861      9 malloc()  in none(0) "dateTime"
7         858      4 malloc()  in none(0) "xsd"
8         770      8 malloc()  in none(0) "decimal"
9         767      4 malloc()  in none(0) "xsd"
10        756      8 malloc()  in none(0) "decimal"
11        753      4 malloc()  in none(0) "xsd"
12        677      7 malloc()  in none(0) "string"
13        674      4 malloc()  in none(0) "xsd"
14        663      7 malloc()  in none(0) "string"
15        660      4 malloc()  in none(0) "xsd"
16        584      7 malloc()  in none(0) "string"
17        581      4 malloc()  in none(0) "xsd"
18        570      7 malloc()  in none(0) "string"
19        567      4 malloc()  in none(0) "xsd"

I did this with the M1 release of Tuscany SDO C++ and libxml2 2.6.26.

The good news is that this leak has decreased a lot from an earlier
release he tried previously.

I hope this test seems valid to you. If so, any chance of removing the
remaining leaks? Even better, could this kind of testing be incorporated
in the process?


---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]




--
Pete

Reply via email to