[ 
http://issues.apache.org/jira/browse/XERCESC-1508?page=comments#action_12331180 
] 

peter suggitt commented on XERCESC-1508:
----------------------------------------

>> There were many fixes in 2.7, I don't know if this was fixed. The first 
>> thing that I will have to to is try with the latest version and I was 
>> hopeing you would do that :) 

I do not have a 2.7 version available at the moment.  And after taking a while 
to get the 2.6 version running (had to download some extra source code for 
compilation) I would rather not.  Do you have a verion of 2.7 that this test 
app (see attachment) can be run against?

I take it this is something that you will be looking into? (The above comment 
suggests that you may we waiting for some confirmation from me).

Based on the code i have supplied can you suggest an alternative approach to 
the construction beyond the following:
    XERCES_CPP_NAMESPACE::DOMImplementation *imp = 
XERCES_CPP_NAMESPACE::DOMImplementation::getImplementation(); 
    // create the document type and the doc 
    XERCES_CPP_NAMESPACE::DOMDocumentType *type = imp->createDocumentType( 
tName, pub, sys ); 
    XERCES_CPP_NAMESPACE::DOMDocument *tmp = imp->createDocument( NULL, name, 
type ); 

I do not actually see an alternative that allows me so explicitly set the type, 
public id and system id.  perhaps I have missed something.


> createDocumentType does not release memory when document released/deleted
> -------------------------------------------------------------------------
>
>          Key: XERCESC-1508
>          URL: http://issues.apache.org/jira/browse/XERCESC-1508
>      Project: Xerces-C++
>         Type: Bug
>     Versions: 2.6.0
>  Environment: SUSE Linux 9
>     Reporter: peter suggitt
>     Assignee: Gareth Reakes
>  Attachments: play.cpp
>
> Hi
> I am writing an aplication that has to create XML documents on the fly for 
> interprocess communications.
> The problem that I have is that the memory is not being released when I use 
> the DOMDocument (documentType) constructor.  I have played around with 
> various different ways of releasing the memory including using the 
> DOMDocumentType->release() method but alas no luck.  I appreciate that this 
> may not seem like a huge issue but as I am looking memory everytime I create 
> a new document I feel that this is an issue to be resolved.
> I have also found a few excepts on the web talking about this issue and there 
> also seems to be a few people who believe this issue to be a case of bad API 
> use:
> http://mail-archives.apache.org/mod_mbox/xerces-c-dev/200505.mbox/[EMAIL 
> PROTECTED]
> .. this is followed up by a gentleman named Gareth Reakes from 
> PathenonComputing describing that this is to do with the way that the release 
> methods have not been called .. I do not believe him:
> "Nope, not a real leak. When you free the document the memory pools that were 
> used to new things from are deleted so it cleans up all the things like the 
> attribute list from the creation of an element."
> The below example shows how this is not the case.
> I have created the following example code thaqt fully replicates the issue 
> including taking stats of the memory usage (RSS) after each document creation 
> and deletion.  Please note that in main() I have a commented out version of 
> the call to create the document as this shows how the standard constructor 
> for the domdocument creates without any memory leaks
> ///////////////////////////////////////////
> #include <xercesc/util/PlatformUtils.hpp>
> #include <xercesc/parsers/XercesDOMParser.hpp> // to get the xmlstring
> #include <xercesc/dom/DOM.hpp>
> #include <iostream>
> #include <fcntl.h>
> #include <unistd.h>
> /////////////////////////////////////////////////////////////////////
> // pre decl
> XERCES_CPP_NAMESPACE::DOMDocument *createNewDoc();
> XERCES_CPP_NAMESPACE::DOMDocument *createNewDocWithType();
> int getMemorySize();
> /////////////////////////////////////////////////////////////////////
> int main()
> {
>     std::cout << "**************** starting" << std::endl;
>     XERCES_CPP_NAMESPACE::XMLPlatformUtils::Initialize();
>     for( int i = 0; i < 1000; ++i )
>     {
>         //XERCES_CPP_NAMESPACE::DOMDocument * doc = createNewDoc();
>         XERCES_CPP_NAMESPACE::DOMDocument * doc = createNewDocWithType();
>         std::cout << "    - Doing something with the document" << std::endl;
>         delete doc;
>         usleep(100000);
>         std::cout << "* Memory (rss): " << getMemorySize() << std::endl;
>     }
>     
>     XERCES_CPP_NAMESPACE::XMLPlatformUtils::Terminate();
>     std::cout << "**************** ending" << std::endl;
>     return 0;
> }
> /////////////////////////////////////////////////////////////////////
> XERCES_CPP_NAMESPACE::DOMDocument *createNewDocWithType()
> {
>     // set up strings
>     XMLCh *tName = XERCES_CPP_NAMESPACE::XMLString::transcode( "typeName" );
>     XMLCh *pub = XERCES_CPP_NAMESPACE::XMLString::transcode( "pubId" );
>     XMLCh *sys = XERCES_CPP_NAMESPACE::XMLString::transcode( "sysId" );
>     XMLCh *name = XERCES_CPP_NAMESPACE::XMLString::transcode( "rootName" );
>     XERCES_CPP_NAMESPACE::DOMImplementation *imp = 
> XERCES_CPP_NAMESPACE::DOMImplementation::getImplementation();
>     // create the document type and the doc
>     XERCES_CPP_NAMESPACE::DOMDocumentType *type = imp->createDocumentType( 
> tName, pub, sys );
>     XERCES_CPP_NAMESPACE::DOMDocument *tmp = imp->createDocument( NULL, name, 
> type );
>     std::cout << "    - created a doc" << std::endl;
>     // clean up
>     XERCES_CPP_NAMESPACE::XMLString::release(&tName);
>     XERCES_CPP_NAMESPACE::XMLString::release(&name);
>     XERCES_CPP_NAMESPACE::XMLString::release(&pub);
>     XERCES_CPP_NAMESPACE::XMLString::release(&sys);
>     std::cout << "    - returning doc" << std::endl;
>     return tmp;;
> }
> /////////////////////////////////////////////////////////////////////
> XERCES_CPP_NAMESPACE::DOMDocument *createNewDoc()
> {
>     // set up strings
>     XERCES_CPP_NAMESPACE::DOMImplementation *imp = 
> XERCES_CPP_NAMESPACE::DOMImplementation::getImplementation();
>     // create the document type and the doc
>     XERCES_CPP_NAMESPACE::DOMDocument *tmp = imp->createDocument();
>     std::cout << "    - returning doc" << std::endl;
>     return tmp;;
> }
> /////////////////////////////////////////////////////////////////////
> int getMemorySize()
> {
>     char fileName[64];
>     int fd;
>     snprintf( fileName, sizeof(fileName), "/proc/%d/statm", (int)getpid() );
>     fd = open(fileName, O_RDONLY);
>     if( fd == -1 )
>     {
>         return -1;
>     }
>     char memInfo[128];
>     int rval = read( fd, memInfo, sizeof(memInfo)-1 );
>     close(fd);
>     if( rval <= 0 )
>     {
>         return -1;
>     }
>     memInfo[rval] = '\0';
>     int rss;
>     rval = sscanf( memInfo, "%*d %d", &rss );
>     if( rval != 1 )
>     {
>         return -1;
>     }
>     return rss * getpagesize() / 1024;
> }
> /////////////////////////////////////////////////////////////////////

-- 
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators:
   http://issues.apache.org/jira/secure/Administrators.jspa
-
For more information on JIRA, see:
   http://www.atlassian.com/software/jira


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

Reply via email to