summaryrefslogtreecommitdiff
path: root/src/debug.cpp
diff options
context:
space:
mode:
authorKahrl <kahrl@gmx.net>2013-08-11 04:09:45 +0200
committerKahrl <kahrl@gmx.net>2013-08-14 21:03:33 +0200
commit4e1f50035e860a00636ca5d804c267119df99601 (patch)
treec6cab522305ef2a5b9cfdb3685340d57590f1ff1 /src/debug.cpp
parent6228d634fb31d1ce925d1fdc2dac022629a007ef (diff)
downloadminetest-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.cpp71
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;