--- deliantra/server/include/util.h 2007/08/16 06:36:56 1.55 +++ deliantra/server/include/util.h 2008/01/25 18:09:23 1.61 @@ -1,9 +1,9 @@ /* - * This file is part of Crossfire TRT, the Roguelike Realtime MORPG. + * This file is part of Deliantra, the Roguelike Realtime MMORPG. * - * Copyright (©) 2005,2006,2007 Marc Alexander Lehmann / Robin Redeker / the Crossfire TRT team + * Copyright (©) 2005,2006,2007 Marc Alexander Lehmann / Robin Redeker / the Deliantra team * - * Crossfire TRT is free software: you can redistribute it and/or modify + * Deliantra 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 3 of the License, or * (at your option) any later version. @@ -16,13 +16,14 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . * - * The authors can be reached via e-mail to + * The authors can be reached via e-mail to */ #ifndef UTIL_H__ #define UTIL_H__ //#define PREFER_MALLOC +//#define DEBUG_SALLOC #if __GNUC__ >= 3 # define is_constant(c) __builtin_constant_p (c) @@ -54,6 +55,15 @@ #include #include +#ifdef DEBUG_SALLOC +# define g_slice_alloc0(s) debug_slice_alloc0(s) +# define g_slice_alloc(s) debug_slice_alloc(s) +# define g_slice_free1(s,p) debug_slice_free1(s,p) +void *g_slice_alloc (unsigned long size); +void *g_slice_alloc0 (unsigned long size); +void g_slice_free1 (unsigned long size, void *ptr); +#endif + // use C0X decltype for auto declarations until ISO C++ sanctifies them (if ever) #define auto(var,expr) decltype(expr) var = (expr) @@ -174,6 +184,8 @@ return ((d - 1) & 7) + 1; } +extern size_t slice_alloc; // statistics + // makes dynamically allocated objects zero-initialised struct zero_initialised { @@ -185,21 +197,25 @@ void *operator new (size_t s) { + slice_alloc += s; return g_slice_alloc0 (s); } void *operator new[] (size_t s) { + slice_alloc += s; return g_slice_alloc0 (s); } void operator delete (void *p, size_t s) { + slice_alloc -= s; g_slice_free1 (s, p); } void operator delete[] (void *p, size_t s) { + slice_alloc -= s; g_slice_free1 (s, p); } }; @@ -227,6 +243,7 @@ #ifdef PREFER_MALLOC free (ptr); #else + slice_alloc -= n * sizeof (T); g_slice_free1 (n * sizeof (T), (void *)ptr); #endif } @@ -347,6 +364,7 @@ refcnt_base () : refcnt (0) { } }; +// to avoid branches with more advanced compilers extern refcnt_base::refcnt_t refcnt_dummy; template @@ -541,7 +559,7 @@ typedef double tstamp; -// return current time as timestampe +// return current time as timestamp tstamp now (); int similar_direction (int a, int b);