diff options
author | Igor Sysoev <igor@sysoev.ru> | 2017-01-17 20:00:00 +0300 |
---|---|---|
committer | Igor Sysoev <igor@sysoev.ru> | 2017-01-17 20:00:00 +0300 |
commit | 16cbf3c076a0aca6d47adaf3f719493674cf2363 (patch) | |
tree | e6530480020f62a2bdbf249988ec3e2a751d3927 /auto/threads | |
download | unit-16cbf3c076a0aca6d47adaf3f719493674cf2363.tar.gz unit-16cbf3c076a0aca6d47adaf3f719493674cf2363.tar.bz2 |
Initial version.
Diffstat (limited to 'auto/threads')
-rw-r--r-- | auto/threads | 282 |
1 files changed, 282 insertions, 0 deletions
diff --git a/auto/threads b/auto/threads new file mode 100644 index 00000000..9187caab --- /dev/null +++ b/auto/threads @@ -0,0 +1,282 @@ + +# Copyright (C) Igor Sysoev +# Copyright (C) NGINX, Inc. + + +case "$NXT_SYSTEM" in + + Linux) + NXT_PTHREAD="-lpthread" + ;; + + FreeBSD) + # FreeBSD libc supports only pthread stubs. + NXT_PTHREAD="-lpthread" + ;; + + SunOS) + case "$NXT_SYSTEM_VERSION" in + 5.8 | 5.9) + NXT_PTHREAD="-lpthread" + ;; + *) + # Solaris 10 libpthread.so.1 is a filter to libc.so.1. + NXT_PTHREAD= + ;; + esac + ;; + + Darwin) + # MacOSX libpthread.dylib is a symlink to libSystem.dylib. + NXT_PTHREAD= + ;; + + *) + NXT_PTHREAD="-lpthread" + ;; +esac + + +# Linux, FreeBSD. + +nxt_feature="pthread_yield()" +nxt_feature_name=NXT_HAVE_PTHREAD_YIELD +nxt_feature_run= +nxt_feature_incs= +nxt_feature_libs=$NXT_PTHREAD +nxt_feature_test="#define _GNU_SOURCE + #include <pthread.h> + + int main() { + pthread_yield(); + return 0; + }" +. auto/feature + + +if [ $nxt_found = no ]; then + + # MacOSX. + + nxt_feature="pthread_yield_np()" + nxt_feature_name=NXT_HAVE_PTHREAD_YIELD_NP + nxt_feature_run= + nxt_feature_incs= + nxt_feature_libs=$NXT_PTHREAD + nxt_feature_test="#include <pthread.h> + + int main() { + pthread_yield_np(); + return 0; + }" + . auto/feature +fi + + +# FreeBSD, Solaris, AIX. + +nxt_feature="pthread spinlock" +nxt_feature_name=NXT_HAVE_PTHREAD_SPINLOCK +nxt_feature_run=yes +nxt_feature_incs= +nxt_feature_libs=$NXT_PTHREAD +nxt_feature_test="#include <pthread.h> + + int main() { + pthread_spinlock_t lock; + + if (pthread_spin_init(&lock, PTHREAD_PROCESS_PRIVATE) != 0) + return 1; + if (pthread_spin_lock(&lock) != 0) + return 1; + if (pthread_spin_unlock(&lock) != 0) + return 1; + if (pthread_spin_destroy(&lock) != 0) + return 1; + return 0; + }" +. auto/feature + + +if [ $nxt_found = yes ]; then + + # Linux glibc uses 0 as pthread_spinlock_t initial value on the most + # platforms. However, on i386 and x86_64 the initial value is 1. + + nxt_feature="pthread spinlock zero initial value" + nxt_feature_name=NXT_HAVE_PTHREAD_SPINLOCK_ZERO + nxt_feature_run=yes + nxt_feature_incs= + nxt_feature_libs=$NXT_PTHREAD + nxt_feature_test="#include <pthread.h> + + pthread_spinlock_t lock = 0; + + int main() { + if (pthread_spin_trylock(&lock) != 0) + return 1; + if (pthread_spin_unlock(&lock) != 0) + return 1; + return 0; + }" + . auto/feature +fi + + +if [ $nxt_found = no ]; then + + # MacOSX spinlock(3). + + nxt_feature="MacOSX spinlock" + nxt_feature_name=NXT_HAVE_MACOSX_SPINLOCK + nxt_feature_run=yes + nxt_feature_incs= + nxt_feature_libs=$NXT_PTHREAD + nxt_feature_test="#include <libkern/OSAtomic.h> + + int main() { + OSSpinLock lock = 0; + + if (OSSpinLockTry(&lock) == 0) + return 1; + OSSpinLockUnlock(&lock); + return 0; + }" + . auto/feature +fi + + +nxt_feature="sem_timedwait()" +nxt_feature_name=NXT_HAVE_SEM_TIMEDWAIT +nxt_feature_run=yes +nxt_feature_incs= +nxt_feature_libs= +nxt_feature_test="#include <semaphore.h> + + int main() { + sem_t sem; + struct timespec ts; + + if (sem_init(&sem, 0, 0) != 0) + return 1; + if (sem_post(&sem) != 0) + return 1; + + ts.tv_sec = 0; + ts.tv_nsec = 0; + if (sem_timedwait(&sem, &ts) != 0) + return 1; + + if (sem_destroy(&sem) != 0) + return 1; + return 0; + }" +. auto/feature + + +if [ $nxt_found = no ]; then + + if [ -n "$NXT_PTHREAD" ]; then + + # Linux requires libpthread. + + nxt_feature="sem_timedwait() in libpthread" + nxt_feature_libs=$NXT_PTHREAD + . auto/feature + fi + + if [ $nxt_found = no ]; then + + # Solaris 10 requires librt. + + nxt_feature="sem_timedwait() in librt" + nxt_feature_libs="-lrt" + . auto/feature + + if [ $nxt_found = yes ]; then + NXT_LIBRT="-lrt" + fi + fi +fi + + +# Thread Local Storage / Thread Specific Data. +# +# Linux, FreeBSD 5.3, Solaris. +# MacOSX 10.7 (Lion) Clang. However, if the -mmacosx-version-min +# option is specified it must be at least 10.7. + +nxt_feature="__thread" +nxt_feature_name=NXT_HAVE_THREAD_STORAGE_CLASS +nxt_feature_run=yes +nxt_feature_incs= +nxt_feature_libs=$NXT_PTHREAD +nxt_feature_test="#include <pthread.h> + #include <stdlib.h> + + __thread int key; + + void *func(void *p); + + void *func(void *p) { + key = 0x9abcdef0; + return NULL; + } + + int main() { + void *n; + pthread_t pt; + + key = 0x12345678; + if (pthread_create(&pt, NULL, func, NULL)) + return 1; + if (pthread_join(pt, &n)) + return 1; + if (key != 0x12345678) + return 1; + return 0; + }" +. auto/feature + + +if [ $nxt_found = no ]; then + + # MacOSX GCC lacks __thread support. + # On NetBSD __thread causes segmentation fault. + + nxt_feature="phtread_key_t" + nxt_feature_name=NXT_HAVE_PTHREAD_SPECIFIC_DATA + nxt_feature_run=yes + nxt_feature_incs= + nxt_feature_libs=$NXT_PTHREAD + nxt_feature_test="#include <pthread.h> + + int main() { + pthread_key_t key = -1; + + if (pthread_key_create(&key, NULL)) + return 1; + if (pthread_setspecific(key, (void *) 0x12345678)) + return 1; + if (pthread_getspecific(key) != (void *) 0x12345678) + return 1; + return 0; + }" + . auto/feature + + + nxt_feature="PTHREAD_KEYS_MAX" + nxt_feature_name= + nxt_feature_run=value + nxt_feature_incs= + nxt_feature_libs= + nxt_feature_test="#include <limits.h> + #include <pthread.h> + #include <stdio.h> + + int main() { + printf(\"%d\", PTHREAD_KEYS_MAX); + return 0; + }" + . auto/feature +fi |