Display types' memleak at Scilab exit 65/15365/5
Clément DAVID [Thu, 9 Oct 2014 11:36:15 +0000 (13:36 +0200)]
Change-Id: Ic34f065516873b5dca2d98d1f4287a9a7f8b0fcb

13 files changed:
scilab/modules/ast/includes/types/inspector.hxx
scilab/modules/ast/src/cpp/types/bool.cpp
scilab/modules/ast/src/cpp/types/cell.cpp
scilab/modules/ast/src/cpp/types/double.cpp
scilab/modules/ast/src/cpp/types/graphichandle.cpp
scilab/modules/ast/src/cpp/types/implicitlist.cpp
scilab/modules/ast/src/cpp/types/inspector.cpp
scilab/modules/ast/src/cpp/types/list.cpp
scilab/modules/ast/src/cpp/types/polynom.cpp
scilab/modules/ast/src/cpp/types/string.cpp
scilab/modules/ast/src/cpp/types/struct.cpp
scilab/modules/ast/src/cpp/types/tlist.cpp
scilab/modules/core/src/cpp/InitScilab.cpp

index 328c8af..c29951d 100644 (file)
@@ -32,18 +32,19 @@ protected :
     static std::vector<InternalType*> m_vIT;
 
 public :
-    static int getItemCount();
-    static int getUnreferencedItemCount();
+    static size_t getItemCount();
+    static size_t getUnreferencedItemCount();
 
     static void addItem(InternalType* _pIT);
     static void removeItem(InternalType* _pIT);
 
-    static InternalType* getItem(int _iPos);
-    static InternalType* getUnreferencedItem(int _iPos);
+    static InternalType* getItem(size_t _iPos);
+    static InternalType* getUnreferencedItem(size_t _iPos);
 
-    static std::wstring showItem(int _iPos);
-    static std::wstring showUnreferencedItem(int _iPos);
+    static std::wstring showItem(size_t _iPos);
+    static std::wstring showUnreferencedItem(size_t _iPos);
     static void deleteItems();
+    static void displayMemleak();
 };
 #endif
 }
index 926b61d..f5d6930 100644 (file)
@@ -30,7 +30,7 @@ Bool::~Bool()
         deleteAll();
     }
 #ifndef NDEBUG
-    //Inspector::removeItem(this);
+    Inspector::removeItem(this);
 #endif
 }
 
@@ -40,7 +40,7 @@ Bool::Bool(int _iRows, int _iCols)
     int *piBool = NULL;
     create(piDims, 2, &piBool, NULL);
 #ifndef NDEBUG
-    //Inspector::addItem(this);
+    Inspector::addItem(this);
 #endif
 }
 
@@ -51,7 +51,7 @@ Bool::Bool(int _iReal)
     create(piDims, 2, &piBool, NULL);
     piBool[0] = _iReal == 0 ? 0 : 1;
 #ifndef NDEBUG
-    //Inspector::addItem(this);
+    Inspector::addItem(this);
 #endif
 }
 
@@ -60,7 +60,7 @@ Bool::Bool(int _iRows, int _iCols, int **_piData)
     int piDims[2] = {_iRows, _iCols};
     create(piDims, 2, _piData, NULL);
 #ifndef NDEBUG
-    //Inspector::addItem(this);
+    Inspector::addItem(this);
 #endif
 }
 
@@ -69,7 +69,7 @@ Bool::Bool(int _iDims, int* _piDims)
     int* piData = NULL;
     create(_piDims, _iDims, &piData, NULL);
 #ifndef NDEBUG
-    //Inspector::addItem(this);
+    Inspector::addItem(this);
 #endif
 }
 
index 1c0cba2..637d3bc 100644 (file)
@@ -74,7 +74,7 @@ Cell::~Cell()
         }
     }
 #ifndef NDEBUG
-    //Inspector::removeItem(this);
+    Inspector::removeItem(this);
 #endif
 }
 
@@ -95,7 +95,7 @@ Cell::Cell(Cell *_oCellCopyMe)
         set(i, _oCellCopyMe->get(i)->clone());
     }
 #ifndef NDEBUG
-    //Inspector::addItem(this);
+    Inspector::addItem(this);
 #endif
 }
 
index ca8480f..a278e8a 100644 (file)
@@ -96,7 +96,7 @@ Double::~Double()
         deleteAll();
     }
 #ifndef NDEBUG
-    //Inspector::removeItem(this);
+    Inspector::removeItem(this);
 #endif
 }
 
@@ -117,7 +117,7 @@ Double::Double(int _iRows, int _iCols, bool _bComplex, bool _bZComplex)
 
     setViewAsInteger(false);
 #ifndef NDEBUG
-    //Inspector::addItem(this);
+    Inspector::addItem(this);
 #endif
 }
 
@@ -140,7 +140,7 @@ Double::Double(double _dblReal)
     //create(piDims, 2, &pdblVal, NULL);
     //pdblVal[0] = _dblReal;
 #ifndef NDEBUG
-    //Inspector::addItem(this);
+    Inspector::addItem(this);
 #endif
 }
 
@@ -156,7 +156,7 @@ Double::Double(double _dblReal, double _dblImg)
     pdblR[0] = _dblReal;
     pdblI[0] = _dblImg;
 #ifndef NDEBUG
-    //Inspector::addItem(this);
+    Inspector::addItem(this);
 #endif
 }
 
@@ -168,7 +168,7 @@ Double::Double(int _iRows, int _iCols, double **_pdblReal)
     create(piDims, 2, _pdblReal, NULL);
 
 #ifndef NDEBUG
-    //Inspector::addItem(this);
+    Inspector::addItem(this);
 #endif
 }
 
@@ -180,7 +180,7 @@ Double::Double(int _iRows, int _iCols, double **_pdblReal, double **_pdblImg)
     create(piDims, 2, _pdblReal, _pdblImg);
 
 #ifndef NDEBUG
-    //Inspector::addItem(this);
+    Inspector::addItem(this);
 #endif
 }
 
@@ -201,7 +201,7 @@ Double::Double(int _iDims, int* _piDims, bool _bComplex, bool _bZComplex)
     }
 
 #ifndef NDEBUG
-    //Inspector::addItem(this);
+    Inspector::addItem(this);
 #endif
 }
 
index 95aec5c..a2aa841 100644 (file)
@@ -38,7 +38,7 @@ GraphicHandle::GraphicHandle(long long _handle)
     create(piDims, 2, &pH, NULL);
     pH[0] = _handle;
 #ifndef NDEBUG
-    //Inspector::addItem(this);
+    Inspector::addItem(this);
 #endif
 }
 
@@ -48,7 +48,7 @@ GraphicHandle::GraphicHandle(int _iRows, int _iCols)
     long long* pH = NULL;
     create(piDims, 2, &pH, NULL);
 #ifndef NDEBUG
-    //Inspector::addItem(this);
+    Inspector::addItem(this);
 #endif
 }
 
@@ -57,7 +57,7 @@ GraphicHandle::GraphicHandle(int _iDims, int* _piDims)
     long long* pH = NULL;
     create(_piDims, _iDims, &pH, NULL);
 #ifndef NDEBUG
-    //Inspector::addItem(this);
+    Inspector::addItem(this);
 #endif
 }
 
@@ -74,7 +74,7 @@ GraphicHandle::~GraphicHandle()
         deleteAll();
     }
 #ifndef NDEBUG
-    //Inspector::removeItem(this);
+    Inspector::removeItem(this);
 #endif
 }
 
index 2c67ef4..ff8d547 100644 (file)
@@ -70,7 +70,7 @@ ImplicitList::~ImplicitList()
         }
     }
 #ifndef NDEBUG
-    //Inspector::removeItem(this);
+    Inspector::removeItem(this);
 #endif
 }
 
@@ -87,7 +87,7 @@ ImplicitList::ImplicitList()
     m_pDblEnd   = NULL;
 
 #ifndef NDEBUG
-    //Inspector::addItem(this);
+    Inspector::addItem(this);
 #endif
 }
 
@@ -108,7 +108,7 @@ ImplicitList::ImplicitList(InternalType* _poStart, InternalType* _poStep, Intern
     setEnd(_poEnd);
     compute();
 #ifndef NDEBUG
-    //Inspector::addItem(this);
+    Inspector::addItem(this);
 #endif
 }
 
index b108f6f..a4047ba 100644 (file)
 *
 */
 
+#include <string>
+#include <iostream>
+#include <map>
+
 #include "inspector.hxx"
 #include "types.hxx"
 
-extern "C"
-{
-#include <stdio.h>
-}
-
 namespace types
 {
 #ifndef NDEBUG
 std::vector<InternalType*> Inspector::m_vIT;
 
-int Inspector::getItemCount()
+size_t Inspector::getItemCount()
 {
-    return (int)m_vIT.size();
+    return m_vIT.size();
 }
 
-int Inspector::getUnreferencedItemCount()
+size_t Inspector::getUnreferencedItemCount()
 {
     int iCount = 0;
-    for (int i = 0 ; i < m_vIT.size() ; i++)
+    for (size_t i = 0 ; i < m_vIT.size() ; i++)
     {
         if (m_vIT[i]->getRef() == 0)
         {
@@ -81,7 +80,7 @@ void Inspector::removeItem(InternalType* _pIT)
     }
 }
 
-InternalType* Inspector::getItem(int _iPos)
+InternalType* Inspector::getItem(size_t _iPos)
 {
     if (_iPos >= m_vIT.size())
     {
@@ -90,10 +89,10 @@ InternalType* Inspector::getItem(int _iPos)
     return m_vIT[_iPos];
 }
 
-InternalType* Inspector::getUnreferencedItem(int _iPos)
+InternalType* Inspector::getUnreferencedItem(size_t _iPos)
 {
-    int iCount = 0;
-    for (int i = 0 ; i < m_vIT.size() ; i++)
+    size_t iCount = 0;
+    for (size_t i = 0 ; i < m_vIT.size() ; i++)
     {
         if (m_vIT[i]->getRef() == 0)
         {
@@ -109,7 +108,7 @@ InternalType* Inspector::getUnreferencedItem(int _iPos)
     return NULL;
 }
 
-std::wstring Inspector::showItem(int _iPos)
+std::wstring Inspector::showItem(size_t _iPos)
 {
     std::wstring st;
     InternalType* pIT = getItem(_iPos);
@@ -124,7 +123,7 @@ std::wstring Inspector::showItem(int _iPos)
     return st;
 }
 
-std::wstring Inspector::showUnreferencedItem(int _iPos)
+std::wstring Inspector::showUnreferencedItem(size_t _iPos)
 {
     std::wstring st;
     InternalType* pIT = getUnreferencedItem(_iPos);
@@ -144,13 +143,13 @@ void Inspector::deleteItems()
     InternalType** pIT = new InternalType*[m_vIT.size()];
 
     //copy item values
-    for (int i = 0 ; i < m_vIT.size() ; i++)
+    for (size_t i = 0 ; i < m_vIT.size() ; i++)
     {
         pIT[i] = m_vIT[i];
     }
 
     //delete each item
-    for (int i = 0 ; i < m_vIT.size() ; i++)
+    for (size_t i = 0 ; i < m_vIT.size() ; i++)
     {
         delete pIT[i];
     }
@@ -161,5 +160,49 @@ void Inspector::deleteItems()
         printf("Oo\n");
     }
 }
+
+void Inspector::displayMemleak()
+{
+    std::map<std::wstring, size_t> statistics;
+
+    if (m_vIT.size() != 0)
+    {
+        // construct the statistic map
+        for (size_t i = 0; i < m_vIT.size(); ++i)
+        {
+            statistics[m_vIT[i]->getTypeStr()]++;
+        }
+
+        // display the result
+        std::wcerr << L"Memory leaked, please file a bug on http://bugzilla.scilab.org" << std::endl;
+        for (auto it = statistics.begin(); it != statistics.end(); ++it)
+        {
+            std::wcerr << L"    " << it->second << L" " << it->first;
+
+            // list the not free-ed pointers
+            std::wcerr << L" : ";
+            bool isFirst = true;
+            for (size_t i = 0; i < m_vIT.size(); ++i)
+            {
+                if (it->first == m_vIT[i]->getTypeStr())
+                {
+                    if (isFirst)
+                    {
+                        isFirst = false;
+                    }
+                    else
+                    {
+                        std::wcerr << " , ";
+                    }
+                    std::wcerr << m_vIT[i];
+                }
+            }
+
+            std::wcerr << std::endl;
+        }
+
+    }
+}
+
 #endif
 }
index bf37a9d..7242758 100644 (file)
@@ -39,7 +39,7 @@ List::List() : Container()
 {
     m_plData = new std::vector<InternalType *>();
 #ifndef NDEBUG
-    //Inspector::addItem(this);
+    Inspector::addItem(this);
 #endif
 }
 
@@ -56,7 +56,7 @@ List::~List()
         delete m_plData;
     }
 #ifndef NDEBUG
-    //Inspector::removeItem(this);
+    Inspector::removeItem(this);
 #endif
 }
 
@@ -75,7 +75,7 @@ List::List(List *_oListCopyMe)
 
     m_iSize = static_cast<int>(m_plData->size());
 #ifndef NDEBUG
-    //Inspector::addItem(this);
+    Inspector::addItem(this);
 #endif
 }
 
index 91ded97..e65648d 100644 (file)
@@ -24,7 +24,7 @@ namespace types
 Polynom::Polynom()
 {
 #ifndef NDEBUG
-    //Inspector::addItem(this);
+    Inspector::addItem(this);
 #endif
 }
 
@@ -57,7 +57,7 @@ Polynom::~Polynom()
         deleteAll();
     }
 #ifndef NDEBUG
-    //Inspector::removeItem(this);
+    Inspector::removeItem(this);
 #endif
 }
 
@@ -76,7 +76,7 @@ void Polynom::createPoly(std::wstring _szVarName, int _iDims, int* _piDims, cons
         }
     }
 #ifndef NDEBUG
-    //Inspector::addItem(this);
+    Inspector::addItem(this);
 #endif
 }
 
index 7e97e91..3909143 100644 (file)
@@ -38,7 +38,7 @@ String::~String()
         deleteAll();
     }
 #ifndef NDEBUG
-    //Inspector::removeItem(this);
+    Inspector::removeItem(this);
 #endif
 }
 
@@ -47,7 +47,7 @@ String::String(int _iDims, int* _piDims)
     wchar_t** pwsData = NULL;
     create(_piDims, _iDims, &pwsData, NULL);
 #ifndef NDEBUG
-    //Inspector::addItem(this);
+    Inspector::addItem(this);
 #endif
 }
 
@@ -58,7 +58,7 @@ String::String(const wchar_t* _pwstData)
     create(piDims, 2, &pwsData, NULL);
     set(0, 0, _pwstData);
 #ifndef NDEBUG
-    //Inspector::addItem(this);
+    Inspector::addItem(this);
 #endif
 }
 
@@ -71,7 +71,7 @@ String::String(const char *_pstData)
     set(0, 0, data);
     FREE(data);
 #ifndef NDEBUG
-    //Inspector::addItem(this);
+    Inspector::addItem(this);
 #endif
 }
 
@@ -81,7 +81,7 @@ String::String(int _iRows, int _iCols)
     int piDims[] = {_iRows, _iCols};
     create(piDims, 2, &pwsData, NULL);
 #ifndef NDEBUG
-    //Inspector::addItem(this);
+    Inspector::addItem(this);
 #endif
 }
 
@@ -95,7 +95,7 @@ String::String(int _iRows, int _iCols, wchar_t const* const* _pstData)
         set(i, os_wcsdup(_pstData[i]));
     }
 #ifndef NDEBUG
-    //Inspector::addItem(this);
+    Inspector::addItem(this);
 #endif
 }
 
index e235e56..0b5a1c6 100644 (file)
@@ -26,7 +26,7 @@ Struct::Struct()
     int piDims[2] = {0, 0};
     create(piDims, 2, &pIT, NULL);
 #ifndef NDEBUG
-    //Inspector::addItem(this);
+    Inspector::addItem(this);
 #endif
 }
 
@@ -43,7 +43,7 @@ Struct::Struct(int _iRows, int _iCols)
     }
     delete p;
 #ifndef NDEBUG
-    //Inspector::addItem(this);
+    Inspector::addItem(this);
 #endif
 }
 
@@ -59,7 +59,7 @@ Struct::Struct(int _iDims, int* _piDims)
         delete p;
     }
 #ifndef NDEBUG
-    //Inspector::addItem(this);
+    Inspector::addItem(this);
 #endif
 }
 
@@ -86,7 +86,7 @@ Struct::~Struct()
         }
     }
 #ifndef NDEBUG
-    //Inspector::removeItem(this);
+    Inspector::removeItem(this);
 #endif
 }
 
@@ -105,7 +105,7 @@ Struct::Struct(Struct *_oStructCopyMe)
         pIT[i] = _oStructCopyMe->get(i)->clone();
     }
 #ifndef NDEBUG
-    //Inspector::addItem(this);
+    Inspector::addItem(this);
 #endif
 }
 
index 8522dff..817aa22 100644 (file)
@@ -37,14 +37,14 @@ namespace types
 TList::TList() : List()
 {
 #ifndef NDEBUG
-    //Inspector::addItem(this);
+    Inspector::addItem(this);
 #endif
 }
 
 TList::~TList()
 {
 #ifndef NDEBUG
-    //Inspector::removeItem(this);
+    Inspector::removeItem(this);
 #endif
 }
 
index c7b9d27..cc0b46a 100644 (file)
@@ -14,7 +14,7 @@
 #include <string>
 #include <libxml/parser.h>
 
-
+#include "inspector.hxx"
 #include "double.hxx"
 #include "polynom.hxx"
 #include "string.hxx"
@@ -339,6 +339,10 @@ void StopScilabEngine(ScilabEngineInfo* _pSEI)
     //destroy context
     symbol::Context::destroyInstance();
 
+#ifndef NDEBUG
+    types::Inspector::displayMemleak();
+#endif
+
     //from ExitScilab()
     saveCWDInPreferences();
     clearScilabPreferences();
@@ -349,7 +353,6 @@ void StopScilabEngine(ScilabEngineInfo* _pSEI)
         TerminateGraphics();
         TerminateJVM();
     }
-
     /* TerminateCorePart2 */
 
     //clear opened files