]> git.lizzy.rs Git - minetest.git/blobdiff - src/debug.cpp
Disable fall bobbing by default; enable using fall_bobbing_amount = 1.0
[minetest.git] / src / debug.cpp
index 9fbdf7a396491d9c8d2304c44ad737ea41188268..2e4992a78013f752ae51211db4d5d018cda11498 100644 (file)
@@ -1,18 +1,18 @@
 /*
-Minetest-c55
-Copyright (C) 2010 celeron55, Perttu Ahola <celeron55@gmail.com>
+Minetest
+Copyright (C) 2013 celeron55, Perttu Ahola <celeron55@gmail.com>
 
 This program is free software; you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 2 of the License, or
+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 General Public License for more details.
+GNU Lesser General Public License for more details.
 
-You should have received a copy of the GNU General Public License along
+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.
 */
@@ -21,7 +21,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 #include "debug.h"
 #include <stdio.h>
 #include <stdlib.h>
-#include "porting.h"
+#include <cstring>
 
 /*
        Debug output
@@ -33,6 +33,8 @@ void debugstreams_init(bool disable_stderr, const char *filename)
 {
        if(disable_stderr)
                g_debugstreams[0] = NULL;
+       else
+               g_debugstreams[0] = stderr;
 
        if(filename)
                g_debugstreams[1] = fopen(filename, "a");
@@ -64,9 +66,9 @@ Nullstream dummyout;
 void assert_fail(const char *assertion, const char *file,
                unsigned int line, const char *function)
 {
-       DEBUGPRINT("\nIn thread %x:\n"
+       DEBUGPRINT("\nIn thread %lx:\n"
                        "%s:%d: %s: Assertion '%s' failed.\n",
-                       (unsigned int)get_current_thread_id(),
+                       (unsigned long)get_current_thread_id(),
                        file, line, function, assertion);
        
        debug_stacks_print();
@@ -74,8 +76,6 @@ void assert_fail(const char *assertion, const char *file,
        if(g_debugstreams[1])
                fclose(g_debugstreams[1]);
 
-       //sleep_ms(3000);
-
        abort();
 }
 
@@ -88,17 +88,18 @@ DebugStack::DebugStack(threadid_t id)
        threadid = id;
        stack_i = 0;
        stack_max_i = 0;
+       memset(stack, 0, DEBUG_STACK_SIZE*DEBUG_STACK_TEXT_SIZE);
 }
 
 void DebugStack::print(FILE *file, bool everything)
 {
-       fprintf(file, "DEBUG STACK FOR THREAD %x:\n",
-                       (unsigned int)threadid);
+       fprintf(file, "DEBUG STACK FOR THREAD %lx:\n",
+                       (unsigned long)threadid);
 
        for(int i=0; i<stack_max_i; i++)
        {
                if(i == stack_i && everything == false)
-                       continue;
+                       break;
 
                if(i < stack_i)
                        fprintf(file, "#%d  %s\n", i, stack[i]);
@@ -110,8 +111,26 @@ void DebugStack::print(FILE *file, bool everything)
                fprintf(file, "Probably overflown.\n");
 }
 
+void DebugStack::print(std::ostream &os, bool everything)
+{
+       os<<"DEBUG STACK FOR THREAD "<<(unsigned long)threadid<<": "<<std::endl;
+
+       for(int i=0; i<stack_max_i; i++)
+       {
+               if(i == stack_i && everything == false)
+                       break;
+
+               if(i < stack_i)
+                       os<<"#"<<i<<"  "<<stack[i]<<std::endl;
+               else
+                       os<<"(Leftover data: #"<<i<<"  "<<stack[i]<<")"<<std::endl;
+       }
 
-core::map<threadid_t, DebugStack*> g_debug_stacks;
+       if(stack_i == DEBUG_STACK_SIZE)
+               os<<"Probably overflown."<<std::endl;
+}
+
+std::map<threadid_t, DebugStack*> g_debug_stacks;
 JMutex g_debug_stacks_mutex;
 
 void debug_stacks_init()
@@ -119,17 +138,31 @@ void debug_stacks_init()
        g_debug_stacks_mutex.Init();
 }
 
+void debug_stacks_print_to(std::ostream &os)
+{
+       JMutexAutoLock lock(g_debug_stacks_mutex);
+
+       os<<"Debug stacks:"<<std::endl;
+
+       for(std::map<threadid_t, DebugStack*>::iterator
+                       i = g_debug_stacks.begin();
+                       i != g_debug_stacks.end(); ++i)
+       {
+               i->second->print(os, false);
+       }
+}
+
 void debug_stacks_print()
 {
        JMutexAutoLock lock(g_debug_stacks_mutex);
 
        DEBUGPRINT("Debug stacks:\n");
 
-       for(core::map<threadid_t, DebugStack*>::Iterator
-                       i = g_debug_stacks.getIterator();
-                       i.atEnd() == false; i++)
+       for(std::map<threadid_t, DebugStack*>::iterator
+                       i = g_debug_stacks.begin();
+                       i != g_debug_stacks.end(); ++i)
        {
-               DebugStack *stack = i.getNode()->getValue();
+               DebugStack *stack = i->second;
 
                for(int i=0; i<DEBUGSTREAM_COUNT; i++)
                {
@@ -145,18 +178,18 @@ DebugStacker::DebugStacker(const char *text)
 
        JMutexAutoLock lock(g_debug_stacks_mutex);
 
-       core::map<threadid_t, DebugStack*>::Node *n;
+       std::map<threadid_t, DebugStack*>::iterator n;
        n = g_debug_stacks.find(threadid);
-       if(n != NULL)
+       if(n != g_debug_stacks.end())
        {
-               m_stack = n->getValue();
+               m_stack = n->second;
        }
        else
        {
                /*DEBUGPRINT("Creating new debug stack for thread %x\n",
                                (unsigned int)threadid);*/
                m_stack = new DebugStack(threadid);
-               g_debug_stacks.insert(threadid, m_stack);
+               g_debug_stacks[threadid] = m_stack;
        }
 
        if(m_stack->stack_i >= DEBUG_STACK_SIZE)
@@ -190,12 +223,13 @@ DebugStacker::~DebugStacker()
                /*DEBUGPRINT("Deleting debug stack for thread %x\n",
                                (unsigned int)threadid);*/
                delete m_stack;
-               g_debug_stacks.remove(threadid);
+               g_debug_stacks.erase(threadid);
        }
 }
 
 
-#ifdef _WIN32
+#ifdef _MSC_VER
+#if CATCH_UNHANDLED_EXCEPTIONS == 1
 void se_trans_func(unsigned int u, EXCEPTION_POINTERS* pExp)
 {
        dstream<<"In trans_func.\n";
@@ -221,6 +255,7 @@ void se_trans_func(unsigned int u, EXCEPTION_POINTERS* pExp)
        }
 }
 #endif
+#endif