--- libeio/xthread.h 2008/05/10 17:16:39 1.1 +++ libeio/xthread.h 2009/07/15 01:36:04 1.7 @@ -37,13 +37,11 @@ typedef pthread_mutex_t mutex_t; #define X_MUTEX_INIT PTHREAD_MUTEX_INITIALIZER -#define X_MUTEX_CHECK(mutex) #define X_LOCK(mutex) pthread_mutex_lock (&(mutex)) #define X_UNLOCK(mutex) pthread_mutex_unlock (&(mutex)) typedef pthread_cond_t cond_t; #define X_COND_INIT PTHREAD_COND_INITIALIZER -#define X_COND_CHECK(cond) #define X_COND_SIGNAL(cond) pthread_cond_signal (&(cond)) #define X_COND_WAIT(cond,mutex) pthread_cond_wait (&(cond), &(mutex)) #define X_COND_TIMEDWAIT(cond,mutex,to) pthread_cond_timedwait (&(cond), &(mutex), &(to)) @@ -55,12 +53,17 @@ static int thread_create (thread_t *tid, void *(*proc)(void *), void *arg) { + int retval; pthread_attr_t attr; pthread_attr_init (&attr); pthread_attr_setdetachstate (&attr, PTHREAD_CREATE_DETACHED); - return pthread_create (tid, &attr, proc, arg) == 0; + retval = pthread_create (tid, &attr, proc, arg) == 0; + + pthread_attr_destroy (&attr); + + return retval; } #define respipe_read(a,b,c) PerlSock_recv ((a), (b), (c), 0) @@ -110,6 +113,15 @@ #define X_THREAD_PROC(name) static void *name (void *thr_arg) #define X_THREAD_ATFORK(prepare,parent,child) pthread_atfork (prepare, parent, child) +// the broken bsd's once more +#ifndef PTHREAD_STACK_MIN +# define PTHREAD_STACK_MIN 0 +#endif + +#ifndef X_STACKSIZE +# define X_STACKSIZE sizeof (long) * 4096 +#endif + static int thread_create (thread_t *tid, void *(*proc)(void *), void *arg) { @@ -119,8 +131,7 @@ 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); + pthread_attr_setstacksize (&attr, PTHREAD_STACK_MIN < X_STACKSIZE ? X_STACKSIZE : PTHREAD_STACK_MIN); #ifdef PTHREAD_SCOPE_PROCESS pthread_attr_setscope (&attr, PTHREAD_SCOPE_PROCESS); #endif @@ -131,6 +142,8 @@ retval = pthread_create (tid, &attr, proc, arg) == 0; pthread_sigmask (SIG_SETMASK, &oldsigset, 0); + pthread_attr_destroy (&attr); + return retval; }