Fix memory leak at startup / exit 28/15328/2
Clément DAVID [Mon, 6 Oct 2014 12:58:45 +0000 (14:58 +0200)]
'bin/scilab -nwni -ns -profiling' do not leak memory anymore.

Change-Id: I26e218c567f7efb8613921b0a0eadc1159b0631c

scilab/modules/ast/includes/parse/parser.hxx
scilab/modules/ast/src/cpp/parse/parser.cpp
scilab/modules/console/src/c/cmdLine/getKey.c
scilab/modules/core/src/cpp/InitScilab.cpp
scilab/modules/xml/src/cpp/VariableScope.cpp
scilab/modules/xml/src/cpp/VariableScope.hxx
scilab/tools/profiling/valgrind.supp

index cf552f1..a7811f8 100644 (file)
@@ -74,6 +74,8 @@ public:
     };
 
 public:
+    /** \brief cleanup parser internal buffers */
+    static void cleanup();
 
     /** \brief parse the given file name */
     void parseFile(const std::wstring& name, const std::wstring& progName);
index 4864358..13ee3cb 100644 (file)
@@ -38,6 +38,12 @@ extern "C"
 extern FILE*    yyin;
 extern int      yyparse();
 extern int      yydebug;
+extern int      yylex_destroy();
+
+void Parser::cleanup()
+{
+    yylex_destroy();
+}
 
 void Parser::parseFile(const std::wstring& fileName, const std::wstring& progName)
 {
index 804dea3..ca5c6a6 100644 (file)
@@ -219,7 +219,7 @@ static void getKey(wchar_t ** commandLine, unsigned int *cursorLocation)
 
     key = getwchar();
 
-       // Need to clear the stdin
+    // Need to clear the stdin
     if (key == WEOF && feof(stdin))
     {
         clearerr(stdin);
@@ -324,10 +324,6 @@ char *getCmdLine(void)
 
     if (commandLine == NULL || commandLine[nextLineLocationInWideString] == L'\0')
     {
-        if (commandLine != NULL)
-        {
-            FREE(commandLine);
-        }
         commandLine = MALLOC(1024 * sizeof(*commandLine));
         *commandLine = L'\0';
         nextLineLocationInWideString = 0;
@@ -373,6 +369,11 @@ char *getCmdLine(void)
         return NULL;
     }
 
+    if (commandLine[nextLineLocationInWideString] == L'\0')
+    {
+        FREE(commandLine);
+        commandLine = NULL;
+    }
     return multiByteString;
 }
 
index 9625708..ffbb808 100644 (file)
@@ -181,6 +181,7 @@ int StartScilabEngine(ScilabEngineInfo* _pSEI)
     InitializeLaunchScilabSignal();
 
     /* Scilab Startup */
+    xmlInitParser();
     InitializeEnvironnement();
 
     if (_pSEI->pstLang)
@@ -337,8 +338,6 @@ void StopScilabEngine(ScilabEngineInfo* _pSEI)
     symbol::Context::getInstance()->clearAll();
     //destroy context
     symbol::Context::destroyInstance();
-    //destroy function manager
-    destroyfunctionManagerInstance();
 
     //from ExitScilab()
     saveCWDInPreferences();
@@ -356,18 +355,29 @@ void StopScilabEngine(ScilabEngineInfo* _pSEI)
     //clear opened files
     FileManager::destroy();
 
-    /*
-    * Cleanup function for the XML library.
-    */
-    xmlCleanupParser();
-
     /* Remove TMPDIR before exit */
     clearTMPDIR();
 
     //Unload dynamic modules
     UnloadModules();
+
+    //destroy function manager
+    destroyfunctionManagerInstance();
     /* TerminateCorePart2 end */
 
+    /*
+     * History manager cleanup
+     */
+    TerminateHistoryManager();
+
+    /*
+    * Cleanup function for the XML library.
+    */
+    xmlCleanupParser();
+
+    /* Cleanup the parser state */
+    Parser::cleanup();
+
 #ifdef _MSC_VER
     TerminateWindows_tools();
 #endif
@@ -537,6 +547,7 @@ static int interactiveMain(ScilabEngineInfo* _pSEI)
     std::cerr << "To end program press [ENTER]" << std::endl;
 #endif
 
+    FREE(command);
     return ConfigVariable::getExitStatus();
 }
 
index 011eded..dede3c2 100644 (file)
 namespace org_modules_xml
 {
 xmlFreeFunc VariableScope::XMLFreeFunc = 0;
-std::map < void *, XMLObject * >*VariableScope::mapLibXMLToXMLObject = new std::map < void *, XMLObject * >();
-std::map < void *, XMLNodeList * >*VariableScope::mapLibXMLToXMLNodeList = new std::map < void *, XMLNodeList * >();
-std::map < const XMLObject *, std::vector < const XMLObject *>*>*VariableScope::parentToChildren =
-    new std::map < const XMLObject *, std::vector < const XMLObject *>*>();
+std::map < void *, XMLObject * > VariableScope::mapLibXMLToXMLObject = std::map < void *, XMLObject * >();
+std::map < void *, XMLNodeList * > VariableScope::mapLibXMLToXMLNodeList = std::map < void *, XMLNodeList * >();
+std::map < const XMLObject *, std::vector < const XMLObject *>*> VariableScope::parentToChildren = std::map < const XMLObject *, std::vector < const XMLObject *>*>();
 
 VariableScope::VariableScope(int _initialSize)
 {
@@ -28,7 +27,6 @@ VariableScope::VariableScope(int _initialSize)
     initialSize = _initialSize;
     scope = new std::vector < XMLObject * >();
     freePlaces = new std::stack < int >();
-    parentToChildren = new std::map < const XMLObject *, std::vector < const XMLObject *>*>();
     initXMLMemory();
 }
 
@@ -43,7 +41,6 @@ VariableScope::~VariableScope()
     }
     delete scope;
     delete freePlaces;
-    delete parentToChildren;
 }
 
 /**
@@ -68,17 +65,17 @@ int VariableScope::getVariableId(const XMLObject & obj)
 
     if (parent)
     {
-        std::map < const XMLObject *, std::vector < const XMLObject *>*>::const_iterator it = parentToChildren->find(parent);
+        std::map < const XMLObject *, std::vector < const XMLObject *>*>::const_iterator it = parentToChildren.find(parent);
 
-        if (it != parentToChildren->end())
+        if (it != parentToChildren.end())
         {
             it->second->push_back(&obj);
         }
         else
         {
-            (*parentToChildren)[parent] = new std::vector < const XMLObject *>();
+            parentToChildren[parent] = new std::vector < const XMLObject *>();
 
-            (*parentToChildren)[parent]->push_back(&obj);
+            parentToChildren[parent]->push_back(&obj);
         }
     }
 
@@ -108,7 +105,7 @@ void VariableScope::registerPointers(void *libxml, XMLObject * obj)
 {
     if (libxml)
     {
-        (*mapLibXMLToXMLObject)[libxml] = obj;
+        mapLibXMLToXMLObject[libxml] = obj;
     }
 }
 
@@ -116,7 +113,7 @@ void VariableScope::registerPointers(void *libxml, XMLNodeList * nodeList)
 {
     if (libxml)
     {
-        (*mapLibXMLToXMLNodeList)[libxml] = nodeList;
+        mapLibXMLToXMLNodeList[libxml] = nodeList;
     }
 }
 
@@ -124,7 +121,7 @@ void VariableScope::unregisterPointer(void *libxml)
 {
     if (libxml)
     {
-        mapLibXMLToXMLObject->erase(libxml);
+        mapLibXMLToXMLObject.erase(libxml);
     }
 }
 
@@ -132,7 +129,7 @@ void VariableScope::unregisterNodeListPointer(void *libxml)
 {
     if (libxml)
     {
-        mapLibXMLToXMLNodeList->erase(libxml);
+        mapLibXMLToXMLNodeList.erase(libxml);
     }
 }
 
@@ -140,8 +137,8 @@ XMLObject *VariableScope::getXMLObjectFromLibXMLPtr(void *libxml) const
 {
     if (libxml)
     {
-        std::map < void *, XMLObject * >::const_iterator it = mapLibXMLToXMLObject->find(libxml);
-        if (it != mapLibXMLToXMLObject->end())
+        std::map < void *, XMLObject * >::const_iterator it = mapLibXMLToXMLObject.find(libxml);
+        if (it != mapLibXMLToXMLObject.end())
         {
             return it->second;
         }
@@ -154,8 +151,8 @@ XMLNodeList *VariableScope::getXMLNodeListFromLibXMLPtr(void *libxml)const
 {
     if (libxml)
     {
-        std::map < void *, XMLNodeList * >::const_iterator it = mapLibXMLToXMLNodeList->find(libxml);
-        if (it != mapLibXMLToXMLNodeList->end())
+        std::map < void *, XMLNodeList * >::const_iterator it = mapLibXMLToXMLNodeList.find(libxml);
+        if (it != mapLibXMLToXMLNodeList.end())
         {
             return it->second;
         }
@@ -177,9 +174,9 @@ void VariableScope::removeId(int id)
 
 void VariableScope::removeDependencies(XMLObject * obj)
 {
-    std::map < const XMLObject *, std::vector < const XMLObject *>*>::const_iterator it = parentToChildren->find(obj);
+    std::map < const XMLObject *, std::vector < const XMLObject *>*>::const_iterator it = parentToChildren.find(obj);
 
-    if (it != parentToChildren->end())
+    if (it != parentToChildren.end())
     {
         for (unsigned int i = 0; i < it->second->size(); i++)
         {
@@ -192,7 +189,7 @@ void VariableScope::removeDependencies(XMLObject * obj)
         }
         delete it->second;
 
-        parentToChildren->erase(obj);
+        parentToChildren.erase(obj);
     }
 }
 
@@ -220,22 +217,22 @@ xmlFreeFunc VariableScope::getFreeFunc(xmlFreeFunc freeFunc)
 
 void VariableScope::_xmlFreeFunc(void *mem)
 {
-    std::map < void *, XMLObject * >::const_iterator it = mapLibXMLToXMLObject->find(mem);
+    std::map < void *, XMLObject * >::const_iterator it = mapLibXMLToXMLObject.find(mem);
 
-    if (it != mapLibXMLToXMLObject->end())
+    if (it != mapLibXMLToXMLObject.end())
     {
         delete it->second;
 
-        mapLibXMLToXMLObject->erase(mem);
+        mapLibXMLToXMLObject.erase(mem);
     }
 
-    std::map < void *, XMLNodeList * >::const_iterator itnl = mapLibXMLToXMLNodeList->find(mem);
+    std::map < void *, XMLNodeList * >::const_iterator itnl = mapLibXMLToXMLNodeList.find(mem);
 
-    if (itnl != mapLibXMLToXMLNodeList->end())
+    if (itnl != mapLibXMLToXMLNodeList.end())
     {
         delete itnl->second;
 
-        mapLibXMLToXMLNodeList->erase(mem);
+        mapLibXMLToXMLNodeList.erase(mem);
     }
 
     XMLFreeFunc(mem);
@@ -244,9 +241,9 @@ void VariableScope::_xmlFreeFunc(void *mem)
 inline void VariableScope::removeChildFromParent(const XMLObject * child)
 {
     const XMLObject *parent = child->getXMLObjectParent();
-    std::map < const XMLObject *, std::vector < const XMLObject *>*>::const_iterator it = parentToChildren->find(parent);
+    std::map < const XMLObject *, std::vector < const XMLObject *>*>::const_iterator it = parentToChildren.find(parent);
 
-    if (it != parentToChildren->end())
+    if (it != parentToChildren.end())
     {
         for (unsigned int i = 0; i < it->second->size(); i++)
         {
index 627e163..5f67ad1 100644 (file)
@@ -37,9 +37,9 @@ class VariableScope
     int initialSize;
     std::stack < int >*freePlaces;
 
-    static std::map < const XMLObject *, std::vector < const XMLObject *>*>*parentToChildren;
-    static std::map < void *, XMLObject * >*mapLibXMLToXMLObject;
-    static std::map < void *, XMLNodeList * >*mapLibXMLToXMLNodeList;
+    static std::map < const XMLObject *, std::vector < const XMLObject *>*> parentToChildren;
+    static std::map < void *, XMLObject * > mapLibXMLToXMLObject;
+    static std::map < void *, XMLNodeList * > mapLibXMLToXMLNodeList;
     static xmlFreeFunc XMLFreeFunc;
 
 public:
index 514df79..a8e6c0e 100644 (file)
    fun:tgetnum
 }
 {
-   dl_init/static_initialization_and_destruction
+   scilab-console/tgetstr
    Memcheck:Leak
-   fun:_Znwm
    ...
-   fun:_dl_init
-}
-{
-   PThread auto cleanup at exit
-   Memcheck:Leak
-   fun:calloc
-   fun:_dl_allocate_tls
-   fun:pthread_create*
-}
-{
-   Last error messages
-   Memcheck:Leak
-   fun:malloc
-   fun:strdup
-   fun:addErrorMessage
-}
-{
-   Realloc the stack on freemem64
-   Memcheck:Leak
-   fun:realloc
-   fun:freemem64
-   fun:TerminateCorePart2
-   fun:ExitScilab
-   fun:realmain
-   fun:main
-   fun:__libc_start_main
-   obj:/home/davidcl/work/branches/master-review/scilab/.libs/lt-scilab-cli-bin
-   obj:*
-   obj:*
-   obj:*
-   obj:*
-}
-{
-   Last getCmdLine free issue
-   Memcheck:Leak
-   fun:malloc
-   fun:getCmdLine
-   fun:getCommandLine
-   fun:watchGetCommandLine
-   fun:start_thread
-   fun:clone
-}
-{
-   Fixeable but crash-ed using javasci
-   Memcheck:Leak
-   fun:malloc
-   fun:wide_string_to_UTF8
-   fun:getCmdLine
-   fun:getCommandLine
-   fun:watchGetCommandLine
-   fun:start_thread
-   fun:clone
+   fun:tgetstr
 }