diff options
author | NIIBE Yutaka <gniibe@fsij.org> | 2022-03-28 13:36:19 +0900 |
---|---|---|
committer | NIIBE Yutaka <gniibe@fsij.org> | 2022-03-28 13:38:43 +0900 |
commit | 6e17e70bb7eea1f6ed4c08f795ea65a09f89d38f (patch) | |
tree | 3dde6b936f0adfc1393ebdee4cc93277cd285b72 | |
parent | 70489b4f75c0afcb1b5c65e579b231d8f657b8c6 (diff) | |
download | libgpg-error-6e17e70bb7eea1f6ed4c08f795ea65a09f89d38f.tar.gz |
core: Fix support of posix-lock for FreeBSD.
* src/posix-lock.c [__FreeBSD__] (use_pthread_p): Use
pthread_key_create to determine if it's linked to lpthread or not.
--
This is from glthread_in_use in gnulib/lib/glthread/threadlib.c.
On FreeBSD, pthread_key_create in there in libc (stub function) as
well as -lpthread (real one), while pthread_create is not available
in libc.
Signed-off-by: NIIBE Yutaka <gniibe@fsij.org>
-rw-r--r-- | src/posix-lock.c | 36 |
1 files changed, 35 insertions, 1 deletions
diff --git a/src/posix-lock.c b/src/posix-lock.c index d0fd07a..85ec660 100644 --- a/src/posix-lock.c +++ b/src/posix-lock.c @@ -67,6 +67,38 @@ # endif # endif /*!USE_POSIX_THREADS_WEAK*/ # if PTHREAD_IN_USE_DETECTION_HARD +# if defined __FreeBSD__ || defined __DragonFly__ /* FreeBSD */ + +/* Test using pthread_key_create. */ + +static int +use_pthread_p (void) +{ + static int tested; + static int result; /* 1: linked with -lpthread, 0: only with libc */ + + if (!tested) + { + pthread_key_t key; + int err = pthread_key_create (&key, NULL); + + if (err == ENOSYS) + result = 0; + else + { + result = 1; + if (err == 0) + pthread_key_delete (key); + } + tested = 1; + } + return result; +} + +# else /* Solaris, HP-UX */ + +/* Test using pthread_create. */ + /* The function to be executed by a dummy thread. */ static void * dummy_thread_func (void *arg) @@ -84,7 +116,7 @@ use_pthread_p (void) { pthread_t thread; - if (pthread_create (&thread, NULL, dummy_thread_func, NULL)) + if (pthread_create (&thread, NULL, dummy_thread_func, NULL) != 0) result = 0; /* Thread creation failed. */ else { @@ -102,6 +134,8 @@ use_pthread_p (void) } return result; } +# endif /* Solaris, HP-UX */ + # endif /*PTHREAD_IN_USE_DETECTION_HARD*/ #endif /*USE_POSIX_THREADS*/ |