From 55a8bd9e359074709975e6b99629fbb3cae4a913 Mon Sep 17 00:00:00 2001 From: Max Horn Date: Sat, 30 Oct 2010 00:33:11 +0000 Subject: TINSEL: Add COROUTINE_DEBUG macro to ease debugging coroutine code svn-id: r53932 --- engines/tinsel/coroutine.cpp | 82 ++++++++++++++++++++++++++++++++++++++++++++ engines/tinsel/coroutine.h | 19 ++++++---- engines/tinsel/module.mk | 1 + 3 files changed, 96 insertions(+), 6 deletions(-) create mode 100644 engines/tinsel/coroutine.cpp (limited to 'engines/tinsel') diff --git a/engines/tinsel/coroutine.cpp b/engines/tinsel/coroutine.cpp new file mode 100644 index 0000000000..89d00d12ac --- /dev/null +++ b/engines/tinsel/coroutine.cpp @@ -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 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 + diff --git a/engines/tinsel/coroutine.h b/engines/tinsel/coroutine.h index d4cd54a8db..5a8084b7e3 100644 --- a/engines/tinsel/coroutine.h +++ b/engines/tinsel/coroutine.h @@ -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 @@ namespace Tinsel { */ //@{ + +// 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 @@ struct CoroBaseContext { 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 @@ public: * _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. diff --git a/engines/tinsel/module.mk b/engines/tinsel/module.mk index 6c818bcb0f..2778cec3df 100644 --- a/engines/tinsel/module.mk +++ b/engines/tinsel/module.mk @@ -8,6 +8,7 @@ MODULE_OBJS := \ bmv.o \ cliprect.o \ config.o \ + coroutine.o \ cursor.o \ debugger.o \ detection.o \ -- cgit v1.2.3