/* ********************************* PTHREAD IMPLEMENTATION ************************************ */
#ifdef HAVE_PTHREAD_H
-#include <pthread.h>
#include <semaphore.h>
#ifdef HAVE_MUTEX_TIMEDLOCK
return res;
}
+void xbt_os_thread_key_create(xbt_os_thread_key_t* key) {
+
+ int errcode;
+ if ((errcode = pthread_key_create(key, NULL)))
+ THROWF(system_error, errcode, "pthread_key_create failed");
+}
+
+void xbt_os_thread_set_specific(xbt_os_thread_key_t key, void* value) {
+
+ int errcode;
+ if ((errcode = pthread_setspecific(key, value)))
+ THROWF(system_error, errcode, "pthread_setspecific failed");
+}
+
+void* xbt_os_thread_get_specific(xbt_os_thread_key_t key) {
+ return pthread_getspecific(key);
+}
+
void xbt_os_thread_detach(xbt_os_thread_t thread)
{
thread->detached = 1;
pthread_mutex_t m;
} s_xbt_os_mutex_t;
-typedef struct xbt_os_rmutex_ {
- xbt_os_mutex_t mutex;
- xbt_os_thread_t owner;
- int count;
-} s_xbt_os_rmutex_t;
-
#include <time.h>
#include <math.h>
free(mutex);
}
-xbt_os_rmutex_t xbt_os_rmutex_init(void)
-{
- xbt_os_rmutex_t rmutex = xbt_new0(struct xbt_os_rmutex_, 0);
- rmutex->mutex = xbt_os_mutex_init();
- rmutex->owner = NULL;
- rmutex->count = 0;
- return rmutex;
-}
-
-void xbt_os_rmutex_acquire(xbt_os_rmutex_t rmutex)
-{
- xbt_os_thread_t self = xbt_os_thread_self();
- xbt_assert(self != NULL, "Cannot get my own thread object (is the thread module initialized?)");
-
- if (self != rmutex->owner) {
- xbt_os_mutex_acquire(rmutex->mutex);
- rmutex->owner = self;
- rmutex->count = 1;
- } else {
- rmutex->count++;
- }
-}
-
-void xbt_os_rmutex_release(xbt_os_rmutex_t rmutex)
-{
- xbt_assert(rmutex->owner == xbt_os_thread_self());
-
- if (--rmutex->count == 0) {
- rmutex->owner = NULL;
- xbt_os_mutex_release(rmutex->mutex);
- }
-}
-
-void xbt_os_rmutex_destroy(xbt_os_rmutex_t rmutex)
-{
- xbt_os_mutex_destroy(rmutex->mutex);
- xbt_free(rmutex);
-}
-
/***** condition related functions *****/
typedef struct xbt_os_cond_ {
/* KEEP IT IN SYNC WITH xbt_thread.c */
if ((res->ps == (sem_t *) SEM_FAILED) && (errno == ENAMETOOLONG)) {
/* Old darwins only allow 13 chars. Did you create *that* amount of semaphores? */
res->name[13] = '\0';
- res->ps = sem_open(res->name, O_CREAT, 0644, 1);
+ res->ps = sem_open(res->name, O_CREAT, 0644, value);
}
if ((res->ps == (sem_t *) SEM_FAILED))
THROWF(system_error, errno, "sem_open() failed: %s", strerror(errno));
ExitThread(0);
}
+void xbt_os_thread_key_create(xbt_os_thread_key_t* key) {
+
+ *key = TlsAlloc();
+}
+
+void xbt_os_thread_set_specific(xbt_os_thread_key_t key, void* value) {
+
+ if (!TlsSetValue(key, value))
+ THROWF(system_error, (int) GetLastError(), "TlsSetValue() failed");
+}
+
+void* xbt_os_thread_get_specific(xbt_os_thread_key_t key) {
+ return TlsGetValue(key);
+}
+
void xbt_os_thread_detach(xbt_os_thread_t thread)
{
THROW_UNIMPLEMENTED;
#endif
+/***** reentrant mutexes *****/
+typedef struct xbt_os_rmutex_ {
+ xbt_os_mutex_t mutex;
+ xbt_os_thread_t owner;
+ int count;
+} s_xbt_os_rmutex_t;
+
void xbt_os_thread_set_extra_data(void *data)
{
xbt_os_thread_self()->extra_data = data;
{
return xbt_os_thread_self()->extra_data;
}
+
+xbt_os_rmutex_t xbt_os_rmutex_init(void)
+{
+ xbt_os_rmutex_t rmutex = xbt_new0(struct xbt_os_rmutex_, 1);
+ rmutex->mutex = xbt_os_mutex_init();
+ rmutex->owner = NULL;
+ rmutex->count = 0;
+ return rmutex;
+}
+
+void xbt_os_rmutex_acquire(xbt_os_rmutex_t rmutex)
+{
+ xbt_os_thread_t self = xbt_os_thread_self();
+
+ if (self == NULL) {
+ /* the thread module is not initialized yet */
+ rmutex->owner = NULL;
+ return;
+ }
+
+ if (self != rmutex->owner) {
+ xbt_os_mutex_acquire(rmutex->mutex);
+ rmutex->owner = self;
+ rmutex->count = 1;
+ } else {
+ rmutex->count++;
+ }
+}
+
+void xbt_os_rmutex_release(xbt_os_rmutex_t rmutex)
+{
+ if (rmutex->owner == NULL) {
+ /* the thread module was not initialized */
+ return;
+ }
+
+ xbt_assert(rmutex->owner == xbt_os_thread_self());
+
+ if (--rmutex->count == 0) {
+ rmutex->owner = NULL;
+ xbt_os_mutex_release(rmutex->mutex);
+ }
+}
+
+void xbt_os_rmutex_destroy(xbt_os_rmutex_t rmutex)
+{
+ xbt_os_mutex_destroy(rmutex->mutex);
+ xbt_free(rmutex);
+}