X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/ec16845133f5f1b5262d2d77d8ba22824fa8a446..932b7fc3b014a174c2e9ec69564a43201711d340:/src/xbt/xbt_os_thread.c diff --git a/src/xbt/xbt_os_thread.c b/src/xbt/xbt_os_thread.c index 2efd81eb2d..b2be4c7fe6 100644 --- a/src/xbt/xbt_os_thread.c +++ b/src/xbt/xbt_os_thread.c @@ -23,7 +23,6 @@ XBT_LOG_NEW_DEFAULT_SUBCATEGORY(xbt_sync_os, xbt, /* ********************************* PTHREAD IMPLEMENTATION ************************************ */ #ifdef HAVE_PTHREAD_H -#include #include #ifdef HAVE_MUTEX_TIMEDLOCK @@ -219,6 +218,24 @@ xbt_os_thread_t xbt_os_thread_self(void) 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; @@ -478,7 +495,7 @@ xbt_os_sem_t xbt_os_sem_init(unsigned int value) 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)); @@ -726,6 +743,21 @@ void xbt_os_thread_exit(int *retval) 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; @@ -1128,6 +1160,13 @@ void xbt_os_sem_get_value(xbt_os_sem_t sem, int *svalue) #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; @@ -1137,3 +1176,52 @@ void *xbt_os_thread_get_extra_data(void) { 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); +}