Created
April 12, 2019 01:56
-
-
Save mjeveritt/9a080d7fa2b9dbc332383916e3dbf69a to your computer and use it in GitHub Desktop.
../libgpg-error-1.29-xcompile-lock.patch
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
diff --git a/src/mkheader.c b/src/mkheader.c | |
index 2fc5fad..20a2764 100644 | |
--- a/src/mkheader.c | |
+++ b/src/mkheader.c | |
@@ -545,8 +545,14 @@ write_special (const char *fname, int lnr, const char *tag) | |
} | |
else if (!strcmp (tag, "include:lock-obj")) | |
{ | |
+#if 0 | |
if (try_include_file (fname, lnr, "./lock-obj-pub.native.h", write_line)) | |
include_file (fname, lnr, "syscfg/lock-obj-pub.&.h", write_line); | |
+#else | |
+write_line("#include <pthread.h>"); | |
+write_line("#define gpgrt_lock_t pthread_mutex_t"); | |
+write_line("#define GPGRT_LOCK_INITIALIZER PTHREAD_MUTEX_INITIALIZER"); | |
+#endif | |
} | |
else | |
return 0; /* Unknown tag. */ | |
diff --git a/src/posix-lock.c b/src/posix-lock.c | |
index b5e6916..aad1bd1 100644 | |
--- a/src/posix-lock.c | |
+++ b/src/posix-lock.c | |
@@ -35,152 +35,35 @@ | |
#include <errno.h> | |
#include <assert.h> | |
-#if USE_POSIX_THREADS | |
# include <pthread.h> | |
-#endif | |
#include "gpgrt-int.h" | |
#include "lock.h" | |
-#include "posix-lock-obj.h" | |
- | |
- | |
-#if USE_POSIX_THREADS | |
-# if USE_POSIX_THREADS_WEAK | |
- /* On ELF systems it is easy to use pthreads using weak | |
- references. Take care not to test the address of a weak | |
- referenced function we actually use; some GCC versions have a | |
- bug were &foo != NULL is always evaluated to true in PIC mode. */ | |
-# pragma weak pthread_cancel | |
-# pragma weak pthread_mutex_init | |
-# pragma weak pthread_mutex_lock | |
-# pragma weak pthread_mutex_trylock | |
-# pragma weak pthread_mutex_unlock | |
-# pragma weak pthread_mutex_destroy | |
-# if ! PTHREAD_IN_USE_DETECTION_HARD | |
-# define use_pthread_p() (!!pthread_cancel) | |
-# endif | |
-# else /*!USE_POSIX_THREADS_WEAK*/ | |
-# if ! PTHREAD_IN_USE_DETECTION_HARD | |
-# define use_pthread_p() (1) | |
-# endif | |
-# endif /*!USE_POSIX_THREADS_WEAK*/ | |
-# if PTHREAD_IN_USE_DETECTION_HARD | |
-/* The function to be executed by a dummy thread. */ | |
-static void * | |
-dummy_thread_func (void *arg) | |
-{ | |
- return arg; | |
-} | |
- | |
-static int | |
-use_pthread_p (void) | |
-{ | |
- static int tested; | |
- static int result; /* 1: linked with -lpthread, 0: only with libc */ | |
- | |
- if (!tested) | |
- { | |
- pthread_t thread; | |
- | |
- if (pthread_create (&thread, NULL, dummy_thread_func, NULL)) | |
- result = 0; /* Thread creation failed. */ | |
- else | |
- { | |
- /* Thread creation works. */ | |
- void *retval; | |
- if (pthread_join (thread, &retval) != 0) | |
- { | |
- assert (!"pthread_join"); | |
- abort (); | |
- } | |
- result = 1; | |
- } | |
- tested = 1; | |
- } | |
- return result; | |
-} | |
-#endif /*PTHREAD_IN_USE_DETECTION_HARD*/ | |
-#endif /*USE_POSIX_THREADS*/ | |
- | |
- | |
-static _gpgrt_lock_t * | |
-get_lock_object (gpgrt_lock_t *lockhd) | |
-{ | |
- _gpgrt_lock_t *lock = (_gpgrt_lock_t*)lockhd; | |
- | |
- if (lock->vers != LOCK_ABI_VERSION) | |
- { | |
- assert (!"lock ABI version"); | |
- abort (); | |
- } | |
- if (sizeof (gpgrt_lock_t) < sizeof (_gpgrt_lock_t)) | |
- { | |
- assert (!"sizeof lock obj"); | |
- abort (); | |
- } | |
- | |
- return lock; | |
-} | |
+//#include "posix-lock-obj.h" | |
+#define gpgrt_lock_t pthread_mutex_t | |
+#define GPGRT_LOCK_INITIALIZER PTHREAD_MUTEX_INITIALIZER | |
gpg_err_code_t | |
_gpgrt_lock_init (gpgrt_lock_t *lockhd) | |
{ | |
- _gpgrt_lock_t *lock = (_gpgrt_lock_t*)lockhd; | |
- int rc; | |
- | |
- /* If VERS is zero we assume that no static initialization has been | |
- done, so we setup our ABI version right here. The caller might | |
- have called us to test whether lock support is at all available. */ | |
- if (!lock->vers) | |
- { | |
- if (sizeof (gpgrt_lock_t) < sizeof (_gpgrt_lock_t)) | |
- { | |
- assert (!"sizeof lock obj"); | |
- abort (); | |
- } | |
- lock->vers = LOCK_ABI_VERSION; | |
- } | |
- else /* Run the usual check. */ | |
- lock = get_lock_object (lockhd); | |
- | |
-#if USE_POSIX_THREADS | |
- if (use_pthread_p()) | |
- { | |
- rc = pthread_mutex_init (&lock->u.mtx, NULL); | |
- if (rc) | |
- rc = _gpg_err_code_from_errno (rc); | |
- } | |
- else | |
- rc = 0; /* Threads are not used. */ | |
-#else /* Unknown thread system. */ | |
- rc = lock->vers == LOCK_ABI_NOT_AVAILABLE? 0 : GPG_ERR_NOT_IMPLEMENTED; | |
-#endif /* Unknown thread system. */ | |
- | |
- return rc; | |
+ int rc = pthread_mutex_init (lockhd, NULL); | |
+ if (rc) | |
+ rc = gpg_err_code_from_errno (rc); | |
+ return rc; | |
} | |
- | |
gpg_err_code_t | |
_gpgrt_lock_lock (gpgrt_lock_t *lockhd) | |
{ | |
- _gpgrt_lock_t *lock = get_lock_object (lockhd); | |
- int rc; | |
- | |
-#if USE_POSIX_THREADS | |
- if (use_pthread_p()) | |
- { | |
- _gpgrt_pre_syscall (); | |
- rc = pthread_mutex_lock (&lock->u.mtx); | |
- if (rc) | |
- rc = _gpg_err_code_from_errno (rc); | |
- _gpgrt_post_syscall (); | |
- } | |
- else | |
- rc = 0; /* Threads are not used. */ | |
-#else /* Unknown thread system. */ | |
- rc = lock->vers == LOCK_ABI_NOT_AVAILABLE? 0 : GPG_ERR_NOT_IMPLEMENTED; | |
-#endif /* Unknown thread system. */ | |
+ int rc; | |
+ if (pre_lock_func) | |
+ pre_lock_func (); | |
+ rc = pthread_mutex_lock (lockhd); | |
+ if (rc) | |
+ rc = gpg_err_code_from_errno (rc); | |
+ if (post_lock_func) | |
+ post_lock_func (); | |
return rc; | |
} | |
@@ -191,20 +74,9 @@ _gpgrt_lock_trylock (gpgrt_lock_t *lockhd) | |
{ | |
_gpgrt_lock_t *lock = get_lock_object (lockhd); | |
int rc; | |
- | |
-#if USE_POSIX_THREADS | |
- if (use_pthread_p()) | |
- { | |
- rc = pthread_mutex_trylock (&lock->u.mtx); | |
+ rc = pthread_mutex_trylock (lockhd); | |
if (rc) | |
- rc = _gpg_err_code_from_errno (rc); | |
- } | |
- else | |
- rc = 0; /* Threads are not used. */ | |
-#else /* Unknown thread system. */ | |
- rc = lock->vers == LOCK_ABI_NOT_AVAILABLE? 0 : GPG_ERR_NOT_IMPLEMENTED; | |
-#endif /* Unknown thread system. */ | |
- | |
+ rc = gpg_err_code_from_errno (rc); | |
return rc; | |
} | |
@@ -215,18 +87,9 @@ _gpgrt_lock_unlock (gpgrt_lock_t *lockhd) | |
_gpgrt_lock_t *lock = get_lock_object (lockhd); | |
int rc; | |
-#if USE_POSIX_THREADS | |
- if (use_pthread_p()) | |
- { | |
- rc = pthread_mutex_unlock (&lock->u.mtx); | |
+ rc = pthread_mutex_unlock (lockhd); | |
if (rc) | |
- rc = _gpg_err_code_from_errno (rc); | |
- } | |
- else | |
- rc = 0; /* Threads are not used. */ | |
-#else /* Unknown thread system. */ | |
- rc = lock->vers == LOCK_ABI_NOT_AVAILABLE? 0 : GPG_ERR_NOT_IMPLEMENTED; | |
-#endif /* Unknown thread system. */ | |
+ rc = gpg_err_code_from_errno (rc); | |
return rc; | |
} | |
@@ -239,25 +102,15 @@ _gpgrt_lock_destroy (gpgrt_lock_t *lockhd) | |
{ | |
_gpgrt_lock_t *lock = get_lock_object (lockhd); | |
int rc; | |
- | |
-#if USE_POSIX_THREADS | |
- if (use_pthread_p()) | |
- { | |
- rc = pthread_mutex_destroy (&lock->u.mtx); | |
+ rc = pthread_mutex_destroy (lockhd); | |
if (rc) | |
rc = _gpg_err_code_from_errno (rc); | |
else | |
{ | |
/* Re-init the mutex so that it can be re-used. */ | |
+/* XXX UB ? */ | |
gpgrt_lock_t tmp = GPGRT_LOCK_INITIALIZER; | |
memcpy (lockhd, &tmp, sizeof tmp); | |
} | |
- } | |
- else | |
- rc = 0; /* Threads are not used. */ | |
-#else /* Unknown thread system. */ | |
- rc = lock->vers == LOCK_ABI_NOT_AVAILABLE? 0 : GPG_ERR_NOT_IMPLEMENTED; | |
-#endif /* Unknown thread system. */ | |
- | |
return rc; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment