--- deliantra/server/common/utils.C 2008/01/22 15:53:01 1.69 +++ deliantra/server/common/utils.C 2008/05/04 14:12:37 1.77 @@ -1,7 +1,7 @@ /* * This file is part of Deliantra, the Roguelike Realtime MMORPG. * - * Copyright (©) 2005,2006,2007 Marc Alexander Lehmann / Robin Redeker / the Deliantra 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 * @@ -33,22 +33,21 @@ #include #include -#include #include #include refcnt_base::refcnt_t refcnt_dummy; -size_t slice_alloc; -rand_gen rndm; +ssize_t slice_alloc; +rand_gen rndm, rmg_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,16 +470,12 @@ void *salloc_ (int n) throw (std::bad_alloc) { -#ifdef PREFER_MALLOC - void *ptr = malloc (n); -#else - slice_alloc += n; void *ptr = g_slice_alloc (n); -#endif if (!ptr) throw std::bad_alloc (); + slice_alloc += n; return ptr; } @@ -498,9 +493,9 @@ /******************************************************************************/ -#ifdef DEBUG_SALLOC +#if DEBUG_SALLOC -#define MAGIC 0xa1b2c35543deadL +#define MAGIC 0xa1b2c35543deadLL void *g_slice_alloc (unsigned long size) { @@ -517,14 +512,17 @@ void g_slice_free1 (unsigned long size, void *ptr) { + //fprintf (stderr, "g_slice_free %ld %p\n", size, ptr);//D if (expect_true (ptr)) { - //fprintf (stderr, "g_slice_free %ld %p\n", size, ptr);//D unsigned long *p = (unsigned long *)ptr; unsigned long s = *--p ^ MAGIC; - if ((*p ^ MAGIC) != size) - LOG (logBacktrace | llevError, "slice free size (%lx) doesn't match alloc size (%lx)\n", size, s); + 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; @@ -650,3 +648,26 @@ 0x2d02ef8dL }; +void thread::start (void *(*start_routine)(void *), void *arg) +{ + 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); +} +