[Scummvm-cvs-logs] SF.net SVN: scummvm:[53932] scummvm/trunk/engines/tinsel

fingolfin at users.sourceforge.net fingolfin at users.sourceforge.net
Sat Oct 30 02:33:11 CEST 2010


Revision: 53932
          http://scummvm.svn.sourceforge.net/scummvm/?rev=53932&view=rev
Author:   fingolfin
Date:     2010-10-30 00:33:11 +0000 (Sat, 30 Oct 2010)

Log Message:
-----------
TINSEL: Add COROUTINE_DEBUG macro to ease debugging coroutine code

Modified Paths:
--------------
    scummvm/trunk/engines/tinsel/coroutine.h
    scummvm/trunk/engines/tinsel/module.mk

Added Paths:
-----------
    scummvm/trunk/engines/tinsel/coroutine.cpp

Added: scummvm/trunk/engines/tinsel/coroutine.cpp
===================================================================
--- scummvm/trunk/engines/tinsel/coroutine.cpp	                        (rev 0)
+++ scummvm/trunk/engines/tinsel/coroutine.cpp	2010-10-30 00:33:11 UTC (rev 53932)
@@ -0,0 +1,82 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * 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 (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.
+
+ * You should have received a copy of the GNU 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.
+ *
+ * $URL$
+ * $Id$
+ */
+
+#include "tinsel/coroutine.h"
+#include "common/hashmap.h"
+#include "common/hash-str.h"
+
+namespace Tinsel {
+
+#if COROUTINE_DEBUG
+namespace {
+static int s_coroCount = 0;
+
+typedef Common::HashMap<Common::String, int> CoroHashMap;
+static CoroHashMap *s_coroFuncs = 0;
+
+static void changeCoroStats(const char *func, int change) {
+	if (!s_coroFuncs)
+		s_coroFuncs = new CoroHashMap();
+
+	(*s_coroFuncs)[func] += change;
+}
+
+static void displayCoroStats() {
+	printf("%d active coros\n", s_coroCount);
+
+	// Loop over s_coroFuncs and print info about active coros
+	if (!s_coroFuncs)
+		return;
+	for (CoroHashMap::const_iterator it = s_coroFuncs->begin();
+		it != s_coroFuncs->end(); ++it) {
+		if (it->_value != 0)
+			printf("  %3d x %s\n", it->_value, it->_key.c_str());
+	}
+}
+
+}
+#endif
+
+CoroBaseContext::CoroBaseContext(const char *func)
+	: _line(0), _sleep(0), _subctx(0) {
+#if COROUTINE_DEBUG
+	_funcName = func;
+	changeCoroStats(_funcName, +1);
+	s_coroCount++;
+#endif
+}
+
+CoroBaseContext::~CoroBaseContext() {
+#if COROUTINE_DEBUG
+	s_coroCount--;
+	changeCoroStats(_funcName, -1);
+	printf("Deleting coro in %s at %p (subctx %p)\n  ",
+		_funcName, (void *)this, (void *)_subctx);
+	displayCoroStats();
+#endif
+	delete _subctx;
+}
+
+} // End of namespace Tinsel
+


Property changes on: scummvm/trunk/engines/tinsel/coroutine.cpp
___________________________________________________________________
Added: svn:mime-type
   + text/plain
Added: svn:keywords
   + Date Rev Author URL Id
Added: svn:eol-style
   + native

Modified: scummvm/trunk/engines/tinsel/coroutine.h
===================================================================
--- scummvm/trunk/engines/tinsel/coroutine.h	2010-10-30 00:32:45 UTC (rev 53931)
+++ scummvm/trunk/engines/tinsel/coroutine.h	2010-10-30 00:33:11 UTC (rev 53932)
@@ -27,6 +27,7 @@
 #define TINSEL_COROUTINE_H
 
 #include "common/scummsys.h"
+#include "common/util.h"	// for SCUMMVM_CURRENT_FUNCTION
 
 namespace Tinsel {
 
@@ -58,6 +59,10 @@
  */
 //@{
 
+
+// Enable this macro to enable some debugging support in the coroutine code.
+//#define COROUTINE_DEBUG	1
+
 /**
  * The core of any coroutine context which captures the 'state' of a coroutine.
  * Private use only.
@@ -66,8 +71,11 @@
 	int _line;
 	int _sleep;
 	CoroBaseContext *_subctx;
-	CoroBaseContext() : _line(0), _sleep(0), _subctx(0) {}
-	~CoroBaseContext() { delete _subctx; }
+#if COROUTINE_DEBUG
+	const char *_funcName;
+#endif
+	CoroBaseContext(const char *func);
+	~CoroBaseContext();
 };
 
 typedef CoroBaseContext *CoroContext;
@@ -123,11 +131,10 @@
  *   _ctx->var = 0;
  *
  * @see CORO_END_CONTEXT
- *
- * @note We always declare a variable 'DUMMY' to allow the user to specify
- * an 'empty' context.
  */
-#define CORO_BEGIN_CONTEXT  struct CoroContextTag : CoroBaseContext { int DUMMY
+#define CORO_BEGIN_CONTEXT  \
+	struct CoroContextTag : CoroBaseContext { \
+		CoroContextTag() : CoroBaseContext(SCUMMVM_CURRENT_FUNCTION) {} \
 
 /**
  * End the declaration of a coroutine context.

Modified: scummvm/trunk/engines/tinsel/module.mk
===================================================================
--- scummvm/trunk/engines/tinsel/module.mk	2010-10-30 00:32:45 UTC (rev 53931)
+++ scummvm/trunk/engines/tinsel/module.mk	2010-10-30 00:33:11 UTC (rev 53932)
@@ -8,6 +8,7 @@
 	bmv.o \
 	cliprect.o \
 	config.o \
+	coroutine.o \
 	cursor.o \
 	debugger.o \
 	detection.o \


This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.




More information about the Scummvm-git-logs mailing list