From 82f7fcc9e91a3d961f155d7df64f65c33cf7ea06 Mon Sep 17 00:00:00 2001 From: Love Hornquist Astrand Date: Sun, 24 Oct 2010 12:20:14 -0700 Subject: [PATCH] provide heim_base_once_f --- base/heimbase.c | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/base/heimbase.c b/base/heimbase.c index 10c0d3788..b63a78cd3 100644 --- a/base/heimbase.c +++ b/base/heimbase.c @@ -297,6 +297,28 @@ heim_base_once_f(heim_base_once_t *once, void *ctx, void (*func)(void *)) #ifdef HAVE_DISPATCH_DISPATCH_H dispatch_once_f(once, ctx, func); #else - #error "write heim_base_once_t" + static HEIMDAL_MUTEX mutex = HEIMDAL_MUTEX_INITIALIZER; + HEIMDAL_MUTEX_lock(&mutex); + if (*once == 0) { + *once = 1; + HEIMDAL_MUTEX_unlock(&mutex); + func(ctx); + HEIMDAL_MUTEX_lock(&mutex); + *once = 2; + HEIMDAL_MUTEX_unlock(&mutex); + } else if (*once == 2) { + HEIMDAL_MUTEX_unlock(&mutex); + } else { + HEIMDAL_MUTEX_unlock(&mutex); + while (1) { + struct timeval tv = { 0, 1000 }; + select(0, NULL, NULL, NULL, &tv); + HEIMDAL_MUTEX_lock(&mutex); + if (*once == 2) + break; + HEIMDAL_MUTEX_unlock(&mutex); + } + HEIMDAL_MUTEX_unlock(&mutex); + } #endif }