provide heim_base_once_f
This commit is contained in:
@@ -297,6 +297,28 @@ heim_base_once_f(heim_base_once_t *once, void *ctx, void (*func)(void *))
|
|||||||
#ifdef HAVE_DISPATCH_DISPATCH_H
|
#ifdef HAVE_DISPATCH_DISPATCH_H
|
||||||
dispatch_once_f(once, ctx, func);
|
dispatch_once_f(once, ctx, func);
|
||||||
#else
|
#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
|
#endif
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user