diff --git a/src/c/package.d b/src/c/package.d index 759cb91c7..9d9792616 100644 --- a/src/c/package.d +++ b/src/c/package.d @@ -179,7 +179,7 @@ ecl_make_package(cl_object name, cl_object nicknames, cl_object use_list) { pthread_mutexattr_t attr; pthread_mutexattr_init(&attr); - pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_ERRORCHECK_NP); + pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_ERRORCHECK); pthread_mutex_init(&x->pack.lock, &attr); pthread_mutexattr_destroy(&attr); } diff --git a/src/c/threads.d b/src/c/threads.d index 1c967e2d6..6d871c6f1 100644 --- a/src/c/threads.d +++ b/src/c/threads.d @@ -55,6 +55,8 @@ static DWORD main_thread; static pthread_key_t cl_env_key; # endif static pthread_t main_thread; +static pthread_attr_t pthreadattr; +static pthread_mutexattr_t mutexattr_error, mutexattr_recursive; #endif /* _MSC_VER || mingw32 */ extern void ecl_init_env(struct cl_env_struct *env); @@ -335,7 +337,7 @@ mp_process_enable(cl_object process) if (mp_process_active_p(process) != Cnil) FEerror("Cannot enable the running process ~A.", 1, process); process->process.parent = mp_current_process(); - code = pthread_create(&process->process.thread, NULL, thread_entry_point, process); + code = pthread_create(&process->process.thread, &pthreadattr, thread_entry_point, process); output = (process->process.thread = code)? Cnil : process; #endif @(return output) @@ -426,20 +428,16 @@ mp_process_run_function(cl_narg narg, cl_object name, cl_object function, ...) output->lock.recursive = (recursive != Cnil); #else { - pthread_mutexattr_t attr; - pthread_mutexattr_init(&attr); output->lock.name = name; output->lock.holder = Cnil; output->lock.counter = 0; if (recursive == Cnil) { - pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_ERRORCHECK_NP); output->lock.recursive = 0; + pthread_mutex_init(&output->lock.mutex, &mutexattr_error); } else { - pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE_NP); output->lock.recursive = 1; + pthread_mutex_init(&output->lock.mutex, &mutexattr_recursive); } - pthread_mutex_init(&output->lock.mutex, &attr); - pthread_mutexattr_destroy(&attr); } #endif si_set_finalizer(output, Ct); @@ -548,13 +546,10 @@ mp_make_condition_variable(void) FEerror("Condition variables are not supported under Windows.", 0); @(return Cnil) #else - pthread_condattr_t attr; cl_object output; - pthread_condattr_init(&attr); output = ecl_alloc_object(t_condition_variable); - pthread_cond_init(&output->condition_variable.cv, &attr); - pthread_condattr_destroy(&attr); + pthread_cond_init(&output->condition_variable.cv, NULL); si_set_finalizer(output, Ct); @(return output) #endif @@ -658,11 +653,13 @@ init_threads(cl_env_ptr env) #ifdef ECL_WINDOWS_THREADS cl_core.global_lock = CreateMutex(NULL, FALSE, NULL); #else - pthread_mutexattr_t attr; - pthread_mutexattr_init(&attr); - pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_ERRORCHECK_NP); - pthread_mutex_init(&cl_core.global_lock, &attr); - pthread_mutexattr_destroy(&attr); + pthread_mutexattr_init(&mutexattr_error); + pthread_mutexattr_settype(&mutexattr_error, PTHREAD_MUTEX_ERRORCHECK); + pthread_mutexattr_init(&mutexattr_recursive); + pthread_mutexattr_settype(&mutexattr_recursive, PTHREAD_MUTEX_RECURSIVE); + pthread_attr_init(&pthreadattr); + pthread_attr_setdetachstate(&pthreadattr, PTHREAD_CREATE_DETACHED); + pthread_mutex_init(&cl_core.global_lock, &mutexattr_error); #endif cl_core.processes = OBJNULL; diff --git a/src/h/config.h.in b/src/h/config.h.in index cfbe42094..60beb5761 100644 --- a/src/h/config.h.in +++ b/src/h/config.h.in @@ -403,21 +403,6 @@ typedef unsigned @CL_FIXNUM_TYPE@ cl_hashkey; # include "@ECL_FPE_CODE@" #endif -#if defined(ECL_THREADS) -# if defined(darwin) || defined(freebsd) || defined(gnu) || defined(openbsd) || defined(netbsd) -# define PTHREAD_MUTEX_ERRORCHECK_NP PTHREAD_MUTEX_ERRORCHECK -# define PTHREAD_MUTEX_RECURSIVE_NP PTHREAD_MUTEX_RECURSIVE -# define PTHREAD_MUTEX_NORMAL_NP PTHREAD_MUTEX_NORMAL -# endif -# if defined(cygwin) -# define PTHREAD_MUTEX_FAST_NP PTHREAD_MUTEX_NORMAL -# define PTHREAD_MUTEX_RECURSIVE_NP PTHREAD_MUTEX_RECURSIVE -# define PTHREAD_MUTEX_ERRORCHECK_NP PTHREAD_MUTEX_ERRORCHECK -# define PTHREAD_MUTEX_TIMED_NP PTHREAD_MUTEX_NORMAL -# define PTHREAD_MUTEX_ADAPTIVE_NP PTHREAD_MUTEX_NORMAL -# endif -#endif - #ifdef ECL_INCLUDE_MATH_H # include # ifdef _MSC_VER diff --git a/src/h/ecl.h b/src/h/ecl.h index 2ae6890c2..d3a7c681f 100644 --- a/src/h/ecl.h +++ b/src/h/ecl.h @@ -17,6 +17,8 @@ #ifndef ECL_H #define ECL_H +#define _XOPEN_SOURCE 600 /* POSIX and XPG and later revisions */ + #include /* size_t, pthread_t, pthread_mutex_t */ #ifdef __OpenBSD__ /* same, but for OpenBSD (bug in OpenBSD!) */ # include