X-Git-Url: https://git.cweiske.de/enigma2.git/blobdiff_plain/cd3f3a74f7399db378fc35f8d0cb458b737f8b1b..a029953596adaed49a5b0346acd5a867eff91a57:/lib/base/eerror.h diff --git a/lib/base/eerror.h b/lib/base/eerror.h index 91575878..e7c33a0b 100644 --- a/lib/base/eerror.h +++ b/lib/base/eerror.h @@ -7,52 +7,16 @@ #include // to use memleak check change the following in configure.ac -// * add -rdynamic to LD_FLAGS -// * add -DMEMLEAK_CHECK to CPP_FLAGS +// * add -DMEMLEAK_CHECK and -rdynamic to CPP_FLAGS #ifdef MEMLEAK_CHECK #define BACKTRACE_DEPTH 5 -// when you have c++filt and corresponding libs on your platform -// then add -DHAVE_CPP_FILT to CPP_FLAGS in configure.ac #include #include #include #include #include -#endif // MEMLEAK_CHECK - -#ifndef NULL -#define NULL 0 -#endif - -#ifndef SWIG -#define CHECKFORMAT __attribute__ ((__format__(__printf__, 1, 2))) -#else -#define CHECKFORMAT -#endif - -void CHECKFORMAT eFatal(const char*, ...); - -enum { lvlDebug=1, lvlWarning=2, lvlFatal=4 }; - -#ifndef SWIG -extern Signal2 logOutput; -extern int logOutputConsole; -#endif - -#ifdef ASSERT -#undef ASSERT -#endif - -#ifdef DEBUG - void CHECKFORMAT eDebug(const char*, ...); - void CHECKFORMAT eDebugNoNewLine(const char*, ...); - void CHECKFORMAT eWarning(const char*, ...); -#ifndef SWIG - #define ASSERT(x) { if (!(x)) eFatal("%s:%d ASSERTION %s FAILED!", __FILE__, __LINE__, #x); } -#endif - -#ifdef MEMLEAK_CHECK +#include typedef struct { unsigned int address; @@ -131,68 +95,35 @@ inline void operator delete[](void *p) free(p); }; -inline void DumpUnfreed() -{ - AllocList::iterator i; - unsigned int totalSize = 0; +void DumpUnfreed(); +#define new new(__FILE__, __LINE__) - if(!allocList) - return; +#endif // MEMLEAK_CHECK - for(i = allocList->begin(); i != allocList->end(); i++) - { - unsigned int tmp; - printf("%s\tLINE %d\tADDRESS %p\t%d unfreed\ttype %d\n", - i->second.file, i->second.line, (void*)i->second.address, i->second.size, i->second.type); - totalSize += i->second.size; - char **bt_string = backtrace_symbols( i->second.backtrace, i->second.btcount ); - for ( tmp=0; tmp < i->second.btcount; tmp++ ) - { - if ( bt_string[tmp] ) - { -#ifdef HAVE_CPP_FILT - char *beg = strchr(bt_string[tmp], '('); - if ( beg ) - { - std::string tmp1(beg+1); - int pos1=tmp1.find('+'), pos2=tmp1.find(')'); - std::string tmp2(tmp1.substr(pos1,(pos2-pos1)-1)); - std::string cmd="c++filt "; - cmd+=tmp1.substr(0,pos1); - FILE *f = popen(cmd.c_str(), "r"); - char buf[256]; - if (f) - { - size_t rd = fread(buf, 1, 255, f); - if ( rd > 0 ) - { - buf[rd-1]=0; - printf("%s %s\n", buf, tmp2.c_str() ); - } - else - printf("%s\n", tmp1.substr(0,pos1).c_str()); - fclose(f); - } - } - else -#endif // HAVE_CPP_FILT - printf("%s\n", bt_string[tmp]); - } - } - free(bt_string); - printf("\n"); - } +#ifndef NULL +#define NULL 0 +#endif - printf("-----------------------------------------------------------\n"); - printf("Total Unfreed: %d bytes\n", totalSize); - fflush(stdout); -}; -#define new new(__FILE__, __LINE__) +#ifdef ASSERT +#undef ASSERT +#endif -#endif // MEMLEAK_CHECK +#ifndef SWIG + +#define CHECKFORMAT __attribute__ ((__format__(__printf__, 1, 2))) + +extern Signal2 logOutput; +extern int logOutputConsole; +void CHECKFORMAT eFatal(const char*, ...); +enum { lvlDebug=1, lvlWarning=2, lvlFatal=4 }; -#else +#ifdef DEBUG + void CHECKFORMAT eDebug(const char*, ...); + void CHECKFORMAT eDebugNoNewLine(const char*, ...); + void CHECKFORMAT eWarning(const char*, ...); + #define ASSERT(x) { if (!(x)) eFatal("%s:%d ASSERTION %s FAILED!", __FILE__, __LINE__, #x); } +#else // DEBUG inline void eDebug(const char* fmt, ...) { } @@ -207,4 +138,10 @@ inline void DumpUnfreed() #define ASSERT(x) do { } while (0) #endif //DEBUG +void eWriteCrashdump(); + +#endif // SWIG + +void ePythonOutput(const char *); + #endif // __E_ERROR__