make the uses of pthread_once faster by checking the once var first

This commit is contained in:
Christian Thaeter 2008-12-24 04:17:36 +01:00
parent 16adff318d
commit 07cec0a44d
4 changed files with 19 additions and 8 deletions

View file

@ -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);
}

View file

@ -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);

View file

@ -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);

View file

@ -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,