source: trunk/IPs/systemC/processor/Morpheo/Common/src/MemCheck.cpp @ 115

Last change on this file since 115 was 115, checked in by rosiere, 15 years ago

1) Write queue with mealy
2) Network : fix bug
3) leak memory

  • Property svn:keywords set to Id
File size: 3.0 KB
Line 
1#ifdef DEBUG_MEMORY_LEAK
2
3#include "Common/include/Message.h"
4#include <cstdio>
5#include <cstdlib>
6#include <cassert>
7#include <cstddef>
8#include <map>
9
10using namespace std;
11using namespace morpheo;
12
13#undef new
14
15// Global flags set by macros in MemCheck.h
16bool traceFlag  = true;
17bool activeFlag = false;
18
19namespace {
20
21  // Memory map entry type
22  struct Info
23  {
24//  void* ptr;
25    const char* file;
26    long        line;
27    size_t      size;
28  };
29
30  bool Info_lt(std::pair<void *,Info> a, std::pair<void *,Info> b)
31  {
32    return a.second.size < b.second.size;
33  }
34 
35  // Memory map data
36  typedef map<void *,Info>           memMap_t;
37  typedef map<void *,Info>::iterator memMap_it;
38
39  memMap_t memMap;
40
41  // Searches the map for an address
42  memMap_it findPtr(void* p) 
43  {
44    return memMap.find(p);
45  }
46 
47  void delPtr(void* p) 
48  {
49    memMap_it it = findPtr(p);
50
51    assert(it != memMap.end());
52   
53    // Remove pointer from map
54    memMap.erase(it);
55  }
56
57  // Dummy type for static destructor
58  struct Sentinel
59  {
60    ~Sentinel() 
61    {
62      size_t size = memMap.size();
63      if(size > 0) 
64        {
65          size_t size_sum = 0;
66          msgWarning("Leaked memory at:\n");
67          for (memMap_it it=memMap.begin();
68               it!=memMap.end();
69               ++it)
70            {
71              size_t s = it->second.size;
72              size_sum += s;
73             
74              msgWarning("\t%p :  %u bytes (file: %s, line %ld)\n",
75                     it->first,
76                     s,
77                     it->second.file,
78                     it->second.line);
79            }
80          msgWarning("Total : %u bytes on %d localisations\n",size_sum, size);
81
82          uint32_t nb_top = (size>10)?10:size;
83          msgWarning("Top %d of leaked memory\n",nb_top);
84          for (uint32_t i=0; i<nb_top; ++i)
85            {
86              memMap_it max = max_element(memMap.begin(), memMap.end(),Info_lt);
87
88              msgWarning("  * [%d] %u bytes (file: %s, line %ld)\n",
89                         i,
90                         max->second.size,
91                         max->second.file,
92                         max->second.line);
93
94              memMap.erase(max);
95            }
96        }
97      else
98        msgInformation("No user memory leaks!\n");
99    }
100  };
101 
102  // Static dummy object
103  Sentinel s;
104 
105} // End anonymous namespace
106
107// Overload scalar new
108void* operator new(size_t size, const char* file, long line) 
109{
110  void* p = malloc(size);
111
112  if(activeFlag) 
113    {
114      Info info;
115      info.file = file;
116      info.line = line;
117      info.size = size;
118
119      memMap[p] = info;
120    }
121 
122  if(traceFlag) 
123    {
124      msgInformation("Allocated %u bytes at address %p (file: %s, line: %ld)\n", size, p, file, line);
125    }
126
127  return p;
128}
129
130// Overload array new
131void* operator new[](size_t size, const char* file, long line) 
132{
133  return operator new(size, file, line);
134}
135
136// Override scalar delete
137void operator delete(void* p) 
138{
139  memMap_it it = findPtr(p);
140 
141  if (it != memMap.end())
142    {
143      free(p);
144      delPtr(p);
145
146      if(traceFlag)
147        msgInformation("Deleted memory at address %p\n", p);
148    }
149  else 
150    if(!p && activeFlag)
151      msgError("Attempt to delete unknown pointer: %p\n", p);
152}
153
154// Override array delete
155void operator delete[](void* p) 
156{
157  operator delete(p);
158} 
159
160#endif // DEBUG_MEMORY_LEAK
Note: See TracBrowser for help on using the repository browser.