[waffle] [PATCH 17/33] core: Convert to c11 threads
Emil Velikov
emil.l.velikov at gmail.com
Mon Jul 7 10:28:24 PDT 2014
Will allow us more freedom wrt building/using waffle
on multiple OS's (mostly non-posix).
Note that pthreads_once has been converted to call_once
which "can never fail".
Signed-off-by: Emil Velikov <emil.l.velikov at gmail.com>
---
src/waffle/CMakeLists.txt | 1 +
src/waffle/core/wcore_display.c | 8 ++++----
src/waffle/core/wcore_tinfo.c | 26 +++++++++++++-------------
3 files changed, 18 insertions(+), 17 deletions(-)
diff --git a/src/waffle/CMakeLists.txt b/src/waffle/CMakeLists.txt
index 12cc567..bc7d45b 100644
--- a/src/waffle/CMakeLists.txt
+++ b/src/waffle/CMakeLists.txt
@@ -42,6 +42,7 @@ set(waffle_libdeps
${x11_LDFLAGS}
${x11-xcb_LDFLAGS}
${xcb_LDFLAGS}
+ ${THREADS_LIBRARIES}
)
set(waffle_sources
diff --git a/src/waffle/core/wcore_display.c b/src/waffle/core/wcore_display.c
index 43e9e6a..a47e2c3 100644
--- a/src/waffle/core/wcore_display.c
+++ b/src/waffle/core/wcore_display.c
@@ -24,8 +24,8 @@
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#include <assert.h>
-#include <pthread.h>
#include <stdio.h>
+#include "threads.h"
#include "wcore_display.h"
@@ -34,14 +34,14 @@ wcore_display_init(struct wcore_display *self,
struct wcore_platform *platform)
{
static size_t id_counter = 0;
- static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
+ static mtx_t mutex = _MTX_INITIALIZER_NP;
assert(self);
assert(platform);
- pthread_mutex_lock(&mutex);
+ mtx_lock(&mutex);
self->api.display_id = ++id_counter;
- pthread_mutex_unlock(&mutex);
+ mtx_unlock(&mutex);
self->platform = platform;
diff --git a/src/waffle/core/wcore_tinfo.c b/src/waffle/core/wcore_tinfo.c
index df31085..7d749b7 100644
--- a/src/waffle/core/wcore_tinfo.c
+++ b/src/waffle/core/wcore_tinfo.c
@@ -28,13 +28,13 @@
#include <stdio.h>
#include <stdlib.h>
-#include <pthread.h>
+#include "threads.h"
#include "wcore_error.h"
#include "wcore_tinfo.h"
-static pthread_once_t wcore_tinfo_once = PTHREAD_ONCE_INIT;
-static pthread_key_t wcore_tinfo_key;
+static once_flag wcore_tinfo_once = ONCE_FLAG_INIT;
+static tss_t wcore_tinfo_key;
#ifdef WAFFLE_HAS_TLS
/// @brief Thread-local storage for all of Waffle.
@@ -80,7 +80,7 @@ wcore_tinfo_key_create(void)
{
int err;
- err = pthread_key_create(&wcore_tinfo_key, wcore_tinfo_key_dtor);
+ err = tss_create(&wcore_tinfo_key, wcore_tinfo_key_dtor);
if (err)
wcore_tinfo_abort_init();
}
@@ -105,12 +105,13 @@ wcore_tinfo_init(struct wcore_tinfo *tinfo)
// each instance of tinfo must be registered individually. The key's data
// is never retrieved because use the key only to register tinfo for
// destruction.
- err = pthread_once(&wcore_tinfo_once, wcore_tinfo_key_create);
- if (err)
- wcore_tinfo_abort_init();
+
+ // With C11 threads call_once "can never fail"...
+ // http://open-std.org/twiki/pub/WG14/DefectReports/n1654.htm
+ call_once(&wcore_tinfo_once, wcore_tinfo_key_create);
#endif
- err = pthread_setspecific(wcore_tinfo_key, tinfo);
+ err = tss_set(wcore_tinfo_key, tinfo);
if (err)
wcore_tinfo_abort_init();
}
@@ -122,14 +123,13 @@ wcore_tinfo_get(void)
wcore_tinfo_init(&wcore_tinfo);
return &wcore_tinfo;
#else
- int err;
struct wcore_tinfo *tinfo;
- err = pthread_once(&wcore_tinfo_once, wcore_tinfo_key_create);
- if (err)
- wcore_tinfo_abort_init();
+ // With C11 threads call_once "can never fail"...
+ // http://open-std.org/twiki/pub/WG14/DefectReports/n1654.htm
+ call_once(&wcore_tinfo_once, wcore_tinfo_key_create);
- tinfo = pthread_getspecific(wcore_tinfo_key);
+ tinfo = tss_get(wcore_tinfo_key);
if (tinfo)
return tinfo;
--
2.0.0
More information about the waffle
mailing list