From 07cec0a44dbe8a55461dcc5a0d9d67a4864d2b5c Mon Sep 17 00:00:00 2001 From: Christian Thaeter Date: Wed, 24 Dec 2008 04:17:36 +0100 Subject: [PATCH] make the uses of pthread_once faster by checking the once var first --- src/lib/error.c | 9 ++++++--- src/lib/mutex.c | 4 +++- src/lib/resourcecollector.c | 6 ++++-- src/lib/safeclib.c | 8 ++++++-- 4 files changed, 19 insertions(+), 8 deletions(-) diff --git a/src/lib/error.c b/src/lib/error.c index 6007dcbdb..735f85955 100644 --- a/src/lib/error.c +++ b/src/lib/error.c @@ -49,7 +49,8 @@ lumiera_error_tls_init (void) lumiera_err lumiera_error_set (lumiera_err nerr) { - pthread_once (&lumiera_error_initialized, lumiera_error_tls_init); + if (lumiera_error_initialized == PTHREAD_ONCE_INIT) + pthread_once (&lumiera_error_initialized, lumiera_error_tls_init); lumiera_err err = pthread_getspecific (lumiera_error_tls); if (!err) @@ -62,7 +63,8 @@ lumiera_error_set (lumiera_err nerr) lumiera_err lumiera_error (void) { - pthread_once (&lumiera_error_initialized, lumiera_error_tls_init); + if (lumiera_error_initialized == PTHREAD_ONCE_INIT) + pthread_once (&lumiera_error_initialized, lumiera_error_tls_init); lumiera_err err = pthread_getspecific (lumiera_error_tls); if (err) @@ -74,7 +76,8 @@ lumiera_error (void) lumiera_err lumiera_error_peek (void) { - pthread_once (&lumiera_error_initialized, lumiera_error_tls_init); + if (lumiera_error_initialized == PTHREAD_ONCE_INIT) + pthread_once (&lumiera_error_initialized, lumiera_error_tls_init); return pthread_getspecific (lumiera_error_tls); } diff --git a/src/lib/mutex.c b/src/lib/mutex.c index b228de746..60078671d 100644 --- a/src/lib/mutex.c +++ b/src/lib/mutex.c @@ -59,7 +59,9 @@ lumiera_recmutex_init (LumieraMutex self, const char* purpose, struct nobug_flag { if (self) { - pthread_once(&recursive_mutexattr_once, recursive_mutexattr_init); + if (recursive_mutexattr_once == PTHREAD_ONCE_INIT) + pthread_once (&recursive_mutexattr_once, recursive_mutexattr_init); + pthread_mutex_init (&self->mutex, &recursive_mutexattr); NOBUG_RESOURCE_HANDLE_INIT (self->rh); NOBUG_RESOURCE_ANNOUNCE_RAW (flag, "recmutex", purpose, self, self->rh); diff --git a/src/lib/resourcecollector.c b/src/lib/resourcecollector.c index e9848d6f0..e8ba7cb6c 100644 --- a/src/lib/resourcecollector.c +++ b/src/lib/resourcecollector.c @@ -73,7 +73,8 @@ lumiera_resourcecollector_run (enum lumiera_resource which, enum lumiera_resourc { TRACE (resourcecollector); - pthread_once (&lumiera_resourcecollector_once, lumiera_resourcecollector_init_); + if (lumiera_resourcecollector_once == PTHREAD_ONCE_INIT) + pthread_once (&lumiera_resourcecollector_once, lumiera_resourcecollector_init_); LUMIERA_MUTEX_SECTION (resourcecollector, &lumiera_resourcecollector_lock) { @@ -118,7 +119,8 @@ lumiera_resourcecollector_run (enum lumiera_resource which, enum lumiera_resourc LumieraResourcehandler lumiera_resourcecollector_register_handler (enum lumiera_resource resource, lumiera_resource_handler_fn handler, void* data) { - pthread_once (&lumiera_resourcecollector_once, lumiera_resourcecollector_init_); + if (lumiera_resourcecollector_once == PTHREAD_ONCE_INIT) + pthread_once (&lumiera_resourcecollector_once, lumiera_resourcecollector_init_); TRACE (resourcecollector); diff --git a/src/lib/safeclib.c b/src/lib/safeclib.c index ce099ccc9..73a0533ef 100644 --- a/src/lib/safeclib.c +++ b/src/lib/safeclib.c @@ -122,7 +122,9 @@ lumiera_tmpbuf_init (void) void lumiera_tmpbuf_freeall (void) { - pthread_once (&lumiera_tmpbuf_tls_once, lumiera_tmpbuf_init); + if (lumiera_tmpbuf_tls_once == PTHREAD_ONCE_INIT) + pthread_once (&lumiera_tmpbuf_tls_once, lumiera_tmpbuf_init); + struct lumiera_tmpbuf_struct* buf = pthread_getspecific (lumiera_tmpbuf_tls_key); if (buf) { @@ -137,7 +139,9 @@ lumiera_tmpbuf_freeall (void) void* lumiera_tmpbuf_provide (size_t size) { - pthread_once (&lumiera_tmpbuf_tls_once, lumiera_tmpbuf_init); + if (lumiera_tmpbuf_tls_once == PTHREAD_ONCE_INIT) + pthread_once (&lumiera_tmpbuf_tls_once, lumiera_tmpbuf_init); + struct lumiera_tmpbuf_struct* buf = pthread_getspecific (lumiera_tmpbuf_tls_key); if (!buf) pthread_setspecific (lumiera_tmpbuf_tls_key,