X-Git-Url: https://git.lizzy.rs/?a=blobdiff_plain;f=src%2Fdebug.h;h=1b14c4e0a325c2b2d1fbf50f6bbee19c356e91a7;hb=098692ef26d115a05c0a1e5916588c8523789556;hp=014456c0acf4826493b209288005e0942f252952;hpb=4e249fb3fbf75f0359758760d88e22aa5b14533c;p=dragonfireclient.git diff --git a/src/debug.h b/src/debug.h index 014456c0a..1b14c4e0a 100644 --- a/src/debug.h +++ b/src/debug.h @@ -1,9 +1,20 @@ /* -(c) 2010 Perttu Ahola -*/ +Minetest +Copyright (C) 2013 celeron55, Perttu Ahola -/* - Debug stack and assertion +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation; either version 2.1 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License along +with this program; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ #ifndef DEBUG_HEADER @@ -13,35 +24,40 @@ #include #include #include -#include "common_irrlicht.h" - -/* - Compatibility stuff -*/ +#include "irrlichttypes.h" +#include +#include "threads.h" +#include "gettime.h" +#include "exceptions.h" +#include -#if (defined(WIN32) || defined(_WIN32_WCE)) -typedef DWORD threadid_t; -#define __NORETURN __declspec(noreturn) -#define __FUNCTION_NAME __FUNCTION__ +#ifdef _WIN32 + #define WIN32_LEAN_AND_MEAN + #ifndef _WIN32_WINNT + #define _WIN32_WINNT 0x0500 + #endif + #include + #ifdef _MSC_VER + #include + #endif #else -typedef pthread_t threadid_t; -#define __NORETURN __attribute__ ((__noreturn__)) -#define __FUNCTION_NAME __PRETTY_FUNCTION__ #endif -inline threadid_t get_current_thread_id() -{ -#if (defined(WIN32) || defined(_WIN32_WCE)) - return GetCurrentThreadId(); +// Whether to catch all std::exceptions. +// Assert will be called on such an event. +// In debug mode, leave these for the debugger and don't catch them. +#ifdef NDEBUG + #define CATCH_UNHANDLED_EXCEPTIONS 1 #else - return pthread_self(); + #define CATCH_UNHANDLED_EXCEPTIONS 0 #endif -} /* Debug output */ +#define DTIME (getTimestamp()+": ") + #define DEBUGSTREAM_COUNT 2 extern FILE *g_debugstreams[DEBUGSTREAM_COUNT]; @@ -75,21 +91,21 @@ class Debugbuf : public std::streambuf if(g_debugstreams[i] == stderr && m_disable_stderr) continue; if(g_debugstreams[i] != NULL) - fwrite(&c, 1, 1, g_debugstreams[i]); + (void)fwrite(&c, 1, 1, g_debugstreams[i]); //TODO: Is this slow? fflush(g_debugstreams[i]); } return c; } - int xsputn(const char *s, int n) + std::streamsize xsputn(const char *s, std::streamsize n) { for(int i=0; i g_debug_stacks; +extern std::map g_debug_stacks; extern JMutex g_debug_stacks_mutex; extern void debug_stacks_init(); +extern void debug_stacks_print_to(std::ostream &os); extern void debug_stacks_print(); class DebugStacker @@ -166,11 +184,113 @@ class DebugStacker bool m_overflowed; }; -#define DSTACK(...)\ +#define DSTACK(msg)\ + DebugStacker __debug_stacker(msg); + +#define DSTACKF(...)\ char __buf[DEBUG_STACK_TEXT_SIZE];\ snprintf(__buf,\ DEBUG_STACK_TEXT_SIZE, __VA_ARGS__);\ DebugStacker __debug_stacker(__buf); +/* + Packet counter +*/ + +class PacketCounter +{ +public: + PacketCounter() + { + } + + void add(u16 command) + { + std::map::iterator n = m_packets.find(command); + if(n == m_packets.end()) + { + m_packets[command] = 1; + } + else + { + n->second++; + } + } + + void clear() + { + for(std::map::iterator + i = m_packets.begin(); + i != m_packets.end(); ++i) + { + i->second = 0; + } + } + + void print(std::ostream &o) + { + for(std::map::iterator + i = m_packets.begin(); + i != m_packets.end(); ++i) + { + o<<"cmd "<first + <<" count "<second + < m_packets; +}; + +/* + These should be put into every thread +*/ + +#if CATCH_UNHANDLED_EXCEPTIONS == 1 + #define BEGIN_PORTABLE_DEBUG_EXCEPTION_HANDLER try{ + #define END_PORTABLE_DEBUG_EXCEPTION_HANDLER(logstream)\ + }catch(std::exception &e){\ + logstream<<"ERROR: An unhandled exception occurred: "\ + <