trunk 20080912
[gitenigma.git] / include / lib / base / eerror.h
blob2cfbe28a6a3f38506f3650eeea65e92e8b0ed842
1 #ifndef __E_ERROR__
2 #define __E_ERROR__
4 // to use memleak check change the following in configure.ac
5 // * add -rdynamic to LD_FLAGS
6 // * add -DMEMLEAK_CHECK to CPP_FLAGS
8 #ifdef MEMLEAK_CHECK
9 #define BACKTRACE_DEPTH 10
10 #include <map>
11 #include <lib/system/elock.h>
12 #include <execinfo.h>
13 #include <string>
14 #include <new>
15 #include <cxxabi.h>
16 #endif // MEMLEAK_CHECK
18 #ifndef NULL
19 #define NULL 0
20 #endif
22 #include <libsig_comp.h>
23 #include <config.h>
25 class eString;
27 void eFatal(const char* fmt, ...);
29 enum { lvlDebug=1, lvlWarning=2, lvlFatal=4 };
31 extern Signal2<void, int, const eString&> logOutput;
32 extern int logOutputConsole;
34 #ifdef ASSERT
35 #undef ASSERT
36 #endif
38 #ifdef DEBUG
39 void eDebug(const char* fmt, ...);
40 void eDebugNoNewLine(const char* fmt, ...);
41 void eWarning(const char* fmt, ...);
42 #define ASSERT(x) { if (!(x)) eFatal("%s:%d ASSERTION %s FAILED!", __FILE__, __LINE__, #x); }
44 #ifdef MEMLEAK_CHECK
45 typedef struct
47 unsigned int address;
48 unsigned int size;
49 char *file;
50 void *backtrace[BACKTRACE_DEPTH];
51 unsigned char btcount;
52 unsigned short line;
53 unsigned char type;
54 } ALLOC_INFO;
56 typedef std::map<unsigned int, ALLOC_INFO> AllocList;
58 extern AllocList *allocList;
59 extern pthread_mutex_t memLock;
61 static inline void AddTrack(unsigned int addr, unsigned int asize, const char *fname, unsigned int lnum, unsigned int type)
63 ALLOC_INFO info;
65 if(!allocList)
66 allocList = new(AllocList);
68 info.address = addr;
69 info.file = strdup(fname);
70 info.line = lnum;
71 info.size = asize;
72 info.type = type;
73 info.btcount = backtrace( info.backtrace, BACKTRACE_DEPTH );
74 singleLock s(memLock);
75 (*allocList)[addr]=info;
78 static inline void RemoveTrack(unsigned int addr, unsigned int type)
80 if(!allocList)
81 return;
82 AllocList::iterator i;
83 singleLock s(memLock);
84 i = allocList->find(addr);
85 if ( i != allocList->end() )
87 if ( i->second.type != type )
88 i->second.type=3;
89 else
91 free(i->second.file);
92 allocList->erase(i);
97 inline void * operator new(unsigned int size, const char *file, int line)
99 void *ptr = (void *)malloc(size);
100 AddTrack((unsigned int)ptr, size, file, line, 1);
101 return(ptr);
104 inline void operator delete(void *p)
106 RemoveTrack((unsigned int)p,1);
107 free(p);
110 inline void * operator new[](unsigned int size, const char *file, int line)
112 void *ptr = (void *)malloc(size);
113 AddTrack((unsigned int)ptr, size, file, line, 2);
114 return(ptr);
117 inline void operator delete[](void *p)
119 RemoveTrack((unsigned int)p, 2);
120 free(p);
123 void DumpUnfreed();
125 #define new new(__FILE__, __LINE__)
127 #endif // MEMLEAK_CHECK
129 #else
130 inline void eDebug(const char* fmt, ...)
134 inline void eDebugNoNewLine(const char* fmt, ...)
138 inline void eWarning(const char* fmt, ...)
141 #define ASSERT(x) do { } while (0)
142 #endif //DEBUG
144 #endif // __E_ERROR__