diff options
author | Lennart Poettering <lennart@poettering.net> | 2007-10-02 21:03:19 +0000 |
---|---|---|
committer | Lennart Poettering <lennart@poettering.net> | 2007-10-02 21:03:19 +0000 |
commit | f8217c1241c570ab4b529f81f86573df27a93c1f (patch) | |
tree | cbe85ac7ed8101652cd154806516a0410279f1b7 /src/once.c | |
parent | b0c5e0bdea90d5d045039724977f673505829756 (diff) |
remove once.[ch]
git-svn-id: file:///home/lennart/svn/public/libsydney/trunk@40 9ba3c220-e4d3-45a2-8aa3-73fcc9aff6ce
Diffstat (limited to 'src/once.c')
-rw-r--r-- | src/once.c | 58 |
1 files changed, 0 insertions, 58 deletions
diff --git a/src/once.c b/src/once.c deleted file mode 100644 index 5dc9764..0000000 --- a/src/once.c +++ /dev/null @@ -1,58 +0,0 @@ -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - -#include <pthread.h> -#include <assert.h> - -#include "once.h" -#include "mutex.h" -#include "malloc.h" -#include "macro.h" - -static sa_mutex_t *global_mutex; -static pthread_once_t global_mutex_once = PTHREAD_ONCE_INIT; - -static void global_mutex_once_func(void) { - global_mutex = sa_mutex_new(0); -} - -int sa_once(sa_once_t *control, sa_once_func_t func) { - int r; - - assert(control); - assert(func); - - /* Create the global mutex */ - sa_assert_success(pthread_once(&global_mutex_once, global_mutex_once_func)); - - if (!global_mutex) - return -1; - - r = 0; - - /* Create the local mutex */ - sa_mutex_lock(global_mutex); - if (!control->mutex) { - if (!(control->mutex = sa_mutex_new(1))) - r = -1; - } - sa_mutex_unlock(global_mutex); - - if (r) - return -1; - - /* Execute function */ - sa_mutex_lock(control->mutex); - if (!control->once_value) { - control->once_value = 1; - func(); - } - sa_mutex_unlock(control->mutex); - - /* Caveat: We have to make sure that the once func has completed - * before returning, even if the once func is not actually - * executed by us. Hence the awkward locking. */ - - return 0; -} |