aboutsummaryrefslogtreecommitdiffstats
path: root/gpgme/posix-sema.c
diff options
context:
space:
mode:
Diffstat (limited to 'gpgme/posix-sema.c')
-rw-r--r--gpgme/posix-sema.c60
1 files changed, 6 insertions, 54 deletions
diff --git a/gpgme/posix-sema.c b/gpgme/posix-sema.c
index aff8bbcc..bcb1339d 100644
--- a/gpgme/posix-sema.c
+++ b/gpgme/posix-sema.c
@@ -35,7 +35,7 @@
#include "util.h"
#include "sema.h"
-#include "mutex.h"
+#include "ath.h"
static void
sema_fatal (const char *text)
@@ -44,76 +44,28 @@ sema_fatal (const char *text)
abort ();
}
-
-static void
-critsect_init (struct critsect_s *s)
-{
- static mutex_t init_lock;
- static int initialized;
- mutex_t *mp;
-
- if (!initialized)
- {
- /* The very first time we call this function, we assume that
- only one thread is running, so that we can bootstrap the
- semaphore code. */
- mutex_init (init_lock);
- initialized = 1;
- }
- if (!s)
- return; /* We just want to initialize ourself. */
-
- /* First test whether it is really not initialized. */
- mutex_lock (init_lock);
- if (s->private)
- {
- mutex_unlock (init_lock);
- return;
- }
- /* Now initialize it. */
- mp = xtrymalloc (sizeof *mp);
- if (!mp)
- {
- mutex_unlock (init_lock);
- sema_fatal ("out of core while creating critical section lock");
- }
- mutex_init (*mp);
- s->private = mp;
- mutex_unlock (init_lock);
-}
-
-
void
_gpgme_sema_subsystem_init ()
{
/* FIXME: we should check that there is only one thread running */
- critsect_init (NULL);
+ ath_init ();
}
-
void
_gpgme_sema_cs_enter (struct critsect_s *s)
{
- if (!s->private)
- critsect_init (s);
- mutex_lock (*((mutex_t *) s->private));
+ ath_mutex_lock (&s->private);
}
void
_gpgme_sema_cs_leave (struct critsect_s *s)
{
- if (!s->private)
- critsect_init (s);
- mutex_unlock (*((mutex_t *) s->private));
+ ath_mutex_unlock (&s->private);
}
void
_gpgme_sema_cs_destroy (struct critsect_s *s)
{
- if (s && s->private)
- {
- mutex_destroy (*((mutex_t *) s->private));
- xfree (s->private);
- s->private = NULL;
- }
+ ath_mutex_destroy (&s->private);
+ s->private = NULL;
}