--- deliantra/server/include/util.h 2008/04/11 21:09:53 1.67 +++ deliantra/server/include/util.h 2008/05/04 14:12:37 1.74 @@ -22,8 +22,9 @@ #ifndef UTIL_H__ #define UTIL_H__ -#define DEBUG_SALLOC 0 -#define PREFER_MALLOC 0 +#define DEBUG_POISON 0x00 // poison memory before freeing it if != 0 +#define DEBUG_SALLOC 0 // add a debug wrapper around all sallocs +#define PREFER_MALLOC 0 // use malloc and not the slice allocator #if __GNUC__ >= 3 # define is_constant(c) __builtin_constant_p (c) @@ -67,7 +68,7 @@ #elif PREFER_MALLOC # define g_slice_alloc0(s) calloc (1, (s)) # define g_slice_alloc(s) malloc ((s)) -# define g_slice_free1(s,p) free ((s)) +# define g_slice_free1(s,p) free ((p)) #endif // use C0X decltype for auto declarations until ISO C++ sanctifies them (if ever) @@ -219,11 +220,20 @@ if (expect_true (ptr)) { slice_alloc -= n * sizeof (T); + if (DEBUG_POISON) memset (ptr, DEBUG_POISON, n * sizeof (T)); g_slice_free1 (n * sizeof (T), (void *)ptr); assert (slice_alloc >= 0);//D } } +// nulls the pointer +template +inline void sfree0 (T *&ptr, int n = 1) throw () +{ + sfree (ptr, n); + ptr = 0; +} + // makes dynamically allocated objects zero-initialised struct zero_initialised { @@ -254,6 +264,35 @@ } }; +// makes dynamically allocated objects zero-initialised +struct slice_allocated +{ + void *operator new (size_t s, void *p) + { + return p; + } + + void *operator new (size_t s) + { + return salloc (s); + } + + void *operator new[] (size_t s) + { + return salloc (s); + } + + void operator delete (void *p, size_t s) + { + sfree ((char *)p, s); + } + + void operator delete[] (void *p, size_t s) + { + sfree ((char *)p, s); + } +}; + // a STL-compatible allocator that uses g_slice // boy, this is verbose template @@ -356,7 +395,7 @@ typedef tausworthe_random_generator rand_gen; -extern rand_gen rndm; +extern rand_gen rndm, rmg_rndm; INTERFACE_CLASS (attachable) struct refcnt_base @@ -608,8 +647,15 @@ #endif #define SMUTEX(name) smutex name = SMUTEX_INITIALISER -#define SMUTEX_LOCK(name) pthread_mutex_lock (&(name)) +#define SMUTEX_LOCK(name) pthread_mutex_lock (&(name)) #define SMUTEX_UNLOCK(name) pthread_mutex_unlock (&(name)) +typedef pthread_cond_t scond; + +#define SCOND(name) scond name = PTHREAD_COND_INITIALIZER +#define SCOND_SIGNAL(name) pthread_cond_signal (&(name)) +#define SCOND_BROADCAST(name) pthread_cond_broadcast (&(name)) +#define SCOND_WAIT(name,mutex) pthread_cond_wait (&(name), &(mutex)) + #endif