Skip to content

Instantly share code, notes, and snippets.

@mjeveritt
Created April 12, 2019 01:56
Show Gist options
  • Save mjeveritt/9a080d7fa2b9dbc332383916e3dbf69a to your computer and use it in GitHub Desktop.
Save mjeveritt/9a080d7fa2b9dbc332383916e3dbf69a to your computer and use it in GitHub Desktop.
../libgpg-error-1.29-xcompile-lock.patch
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