diff options
author | Kahrl <kahrl@gmx.net> | 2013-08-11 04:09:45 +0200 |
---|---|---|
committer | Kahrl <kahrl@gmx.net> | 2013-08-14 21:03:33 +0200 |
commit | 4e1f50035e860a00636ca5d804c267119df99601 (patch) | |
tree | c6cab522305ef2a5b9cfdb3685340d57590f1ff1 /src/debug.cpp | |
parent | 6228d634fb31d1ce925d1fdc2dac022629a007ef (diff) | |
download | minetest-4e1f50035e860a00636ca5d804c267119df99601.tar.gz minetest-4e1f50035e860a00636ca5d804c267119df99601.tar.bz2 minetest-4e1f50035e860a00636ca5d804c267119df99601.zip |
Omnicleanup: header cleanup, add ModApiUtil shared between game and mainmenu
Diffstat (limited to 'src/debug.cpp')
-rw-r--r-- | src/debug.cpp | 71 |
1 files changed, 71 insertions, 0 deletions
diff --git a/src/debug.cpp b/src/debug.cpp index 2e4992a78..6bdd1bce5 100644 --- a/src/debug.cpp +++ b/src/debug.cpp @@ -19,16 +19,34 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "debug.h" +#include "exceptions.h" +#include "threads.h" #include <stdio.h> #include <stdlib.h> #include <cstring> +#include <map> +#include <jmutex.h> +#include <jmutexautolock.h> /* Debug output */ +#define DEBUGSTREAM_COUNT 2 + FILE *g_debugstreams[DEBUGSTREAM_COUNT] = {stderr, NULL}; +#define DEBUGPRINT(...)\ +{\ + for(int i=0; i<DEBUGSTREAM_COUNT; i++)\ + {\ + if(g_debugstreams[i] != NULL){\ + fprintf(g_debugstreams[i], __VA_ARGS__);\ + fflush(g_debugstreams[i]);\ + }\ + }\ +} + void debugstreams_init(bool disable_stderr, const char *filename) { if(disable_stderr) @@ -53,6 +71,47 @@ void debugstreams_deinit() fclose(g_debugstreams[1]); } +class Debugbuf : public std::streambuf +{ +public: + Debugbuf(bool disable_stderr) + { + m_disable_stderr = disable_stderr; + } + + int overflow(int c) + { + for(int i=0; i<DEBUGSTREAM_COUNT; i++) + { + if(g_debugstreams[i] == stderr && m_disable_stderr) + continue; + if(g_debugstreams[i] != NULL) + (void)fwrite(&c, 1, 1, g_debugstreams[i]); + //TODO: Is this slow? + fflush(g_debugstreams[i]); + } + + return c; + } + std::streamsize xsputn(const char *s, std::streamsize n) + { + for(int i=0; i<DEBUGSTREAM_COUNT; i++) + { + if(g_debugstreams[i] == stderr && m_disable_stderr) + continue; + if(g_debugstreams[i] != NULL) + (void)fwrite(s, 1, n, g_debugstreams[i]); + //TODO: Is this slow? + fflush(g_debugstreams[i]); + } + + return n; + } + +private: + bool m_disable_stderr; +}; + Debugbuf debugbuf(false); std::ostream dstream(&debugbuf); Debugbuf debugbuf_no_stderr(true); @@ -83,6 +142,18 @@ void assert_fail(const char *assertion, const char *file, DebugStack */ +struct DebugStack +{ + DebugStack(threadid_t id); + void print(FILE *file, bool everything); + void print(std::ostream &os, bool everything); + + threadid_t threadid; + char stack[DEBUG_STACK_SIZE][DEBUG_STACK_TEXT_SIZE]; + int stack_i; // Points to the lowest empty position + int stack_max_i; // Highest i that was seen +}; + DebugStack::DebugStack(threadid_t id) { threadid = id; |