--- deliantra/server/include/util.h 2008/04/02 11:13:55 1.66 +++ deliantra/server/include/util.h 2008/04/11 21:09:53 1.67 @@ -64,6 +64,10 @@ void *g_slice_alloc (unsigned long size); void *g_slice_alloc0 (unsigned long size); void g_slice_free1 (unsigned long size, void *ptr); +#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)) #endif // use C0X decltype for auto declarations until ISO C++ sanctifies them (if ever) @@ -190,7 +194,35 @@ return ((d - 1) & 7) + 1; } -extern size_t slice_alloc; // statistics +extern ssize_t slice_alloc; // statistics + +void *salloc_ (int n) throw (std::bad_alloc); +void *salloc_ (int n, void *src) throw (std::bad_alloc); + +// strictly the same as g_slice_alloc, but never returns 0 +template +inline T *salloc (int n = 1) throw (std::bad_alloc) { return (T *)salloc_ (n * sizeof (T)); } + +// also copies src into the new area, like "memdup" +// if src is 0, clears the memory +template +inline T *salloc (int n, T *src) throw (std::bad_alloc) { return (T *)salloc_ (n * sizeof (T), (void *)src); } + +// clears the memory +template +inline T *salloc0(int n = 1) throw (std::bad_alloc) { return (T *)salloc_ (n * sizeof (T), 0); } + +// for symmetry +template +inline void sfree (T *ptr, int n = 1) throw () +{ + if (expect_true (ptr)) + { + slice_alloc -= n * sizeof (T); + g_slice_free1 (n * sizeof (T), (void *)ptr); + assert (slice_alloc >= 0);//D + } +} // makes dynamically allocated objects zero-initialised struct zero_initialised @@ -203,57 +235,25 @@ void *operator new (size_t s) { - slice_alloc += s; - return g_slice_alloc0 (s); + return salloc0 (s); } void *operator new[] (size_t s) { - slice_alloc += s; - return g_slice_alloc0 (s); + return salloc0 (s); } void operator delete (void *p, size_t s) { - slice_alloc -= s; - g_slice_free1 (s, p); + sfree ((char *)p, s); } void operator delete[] (void *p, size_t s) { - slice_alloc -= s; - g_slice_free1 (s, p); + sfree ((char *)p, s); } }; -void *salloc_ (int n) throw (std::bad_alloc); -void *salloc_ (int n, void *src) throw (std::bad_alloc); - -// strictly the same as g_slice_alloc, but never returns 0 -template -inline T *salloc (int n = 1) throw (std::bad_alloc) { return (T *)salloc_ (n * sizeof (T)); } - -// also copies src into the new area, like "memdup" -// if src is 0, clears the memory -template -inline T *salloc (int n, T *src) throw (std::bad_alloc) { return (T *)salloc_ (n * sizeof (T), (void *)src); } - -// clears the memory -template -inline T *salloc0(int n = 1) throw (std::bad_alloc) { return (T *)salloc_ (n * sizeof (T), 0); } - -// for symmetry -template -inline void sfree (T *ptr, int n = 1) throw () -{ -#if PREFER_MALLOC - free (ptr); -#else - slice_alloc -= n * sizeof (T); - g_slice_free1 (n * sizeof (T), (void *)ptr); -#endif -} - // a STL-compatible allocator that uses g_slice // boy, this is verbose template