--- deliantra/server/common/utils.C 2007/08/10 11:02:44 1.64 +++ deliantra/server/common/utils.C 2008/04/15 03:16:02 1.75 @@ -1,11 +1,11 @@ /* - * 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,2008 Marc Alexander Lehmann / Robin Redeker / the Deliantra team * Copyright (©) 2002,2007 Mark Wedel & Crossfire Development Team * Copyright (©) 1992,2007 Frank Tore Johansen * - * 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. @@ -18,7 +18,7 @@ * 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 */ /* @@ -39,16 +39,16 @@ #include refcnt_base::refcnt_t refcnt_dummy; - +ssize_t slice_alloc; rand_gen rndm; void tausworthe_random_generator::seed (uint32_t seed) { - state [0] = seed * 69069U; if (state [0] < 2U) state [0] += 2U; - state [1] = state [0] * 69069U; if (state [0] < 8U) state [0] += 8U; - state [2] = state [1] * 69069U; if (state [0] < 16U) state [0] += 16U; - state [3] = state [2] * 69069U; if (state [0] < 128) state [0] += 128U; + state [0] = seed * 69069U; if (state [0] < 2U) state [0] += 2U; + state [1] = state [0] * 69069U; if (state [0] < 8U) state [0] += 8U; + state [2] = state [1] * 69069U; if (state [0] < 16U) state [0] += 16U; + state [3] = state [2] * 69069U; if (state [0] < 128U) state [0] += 128U; for (int i = 11; --i; ) operator ()(); @@ -471,15 +471,12 @@ void *salloc_ (int n) throw (std::bad_alloc) { -#ifdef PREFER_MALLOC - void *ptr = malloc (n); -#else void *ptr = g_slice_alloc (n); -#endif if (!ptr) throw std::bad_alloc (); + slice_alloc += n; return ptr; } @@ -495,6 +492,49 @@ return ptr; } +/******************************************************************************/ + +#if DEBUG_SALLOC + +#define MAGIC 0xa1b2c35543deadLL + +void *g_slice_alloc (unsigned long size) +{ + unsigned long *p = (unsigned long *) (g_slice_alloc)(size + sizeof (unsigned long)); + *p++ = size ^ MAGIC; + //fprintf (stderr, "g_slice_alloc %ld %p\n", size, p);//D + return (void *)p; +} + +void *g_slice_alloc0 (unsigned long size) +{ + return memset (g_slice_alloc (size), 0, size); +} + +void g_slice_free1 (unsigned long size, void *ptr) +{ + //fprintf (stderr, "g_slice_free %ld %p\n", size, ptr);//D + if (expect_true (ptr)) + { + unsigned long *p = (unsigned long *)ptr; + unsigned long s = *--p ^ MAGIC; + + if (size != (unsigned long)(*p ^ MAGIC)) + { + LOG (logBacktrace | llevError, "slice free size (%lx) doesn't match alloc size (%lx)\n", size, s); + abort (); + } + + *p = MAGIC; + + (g_slice_free1)(s + sizeof (unsigned long), p); + } +} + +#endif + +/******************************************************************************/ + void assign (char *dst, const char *src, int maxlen) { if (!src) @@ -519,40 +559,19 @@ memcpy (dst, src, len + 1); } -const std::string +const char * format (const char *format, ...) { - int len; + static dynbuf_text buf; - { - char buf[128]; + buf.clear (); - va_list ap; - va_start (ap, format); - len = vsnprintf (buf, sizeof (buf), format, ap); - va_end (ap); - - assert (len >= 0); // shield againstz broken vsnprintf's - - // was our static buffer short enough? - if (len < sizeof (buf)) - return std::string (buf, len); - } - - { - // longer, try harder - char *buf = salloc (len + 1); - - va_list ap; - va_start (ap, format); - vsnprintf (buf, len + 1, format, ap); - va_end (ap); - - const std::string s (buf, len); - sfree (buf, len + 1); - - return buf; - } + va_list ap; + va_start (ap, format); + buf.vprintf (format, ap); + va_end (ap); + + return buf; } tstamp now () @@ -630,12 +649,26 @@ 0x2d02ef8dL }; -#if 0 -void xyzzy (object_ptr &a, object_ptr &o) +void thread::start (void *(*start_routine)(void *), void *arg) { - asm volatile ("int3"); - a = o; - asm volatile ("int3"); -} + pthread_attr_t attr; + + pthread_attr_init (&attr); + pthread_attr_setdetachstate (&attr, PTHREAD_CREATE_DETACHED); + pthread_attr_setstacksize (&attr, PTHREAD_STACK_MIN < sizeof (long) * 4096 + ? sizeof (long) * 4096 : PTHREAD_STACK_MIN); +#ifdef PTHREAD_SCOPE_PROCESS + pthread_attr_setscope (&attr, PTHREAD_SCOPE_PROCESS); #endif + sigset_t fullsigset, oldsigset; + sigfillset (&fullsigset); + + pthread_sigmask (SIG_SETMASK, &fullsigset, &oldsigset); + + if (pthread_create (&id, &attr, start_routine, arg)) + cleanup ("unable to create a new thread"); + + pthread_sigmask (SIG_SETMASK, &oldsigset, 0); +} +