- if(!sem)
- THROW0(arg_error,EINVAL,"Cannot get the value of the NULL semaphore");
-
- #ifndef HAVE_SEM_WAIT
- if(sem_getvalue((sem->s),svalue) < 0)
- THROW1(system_error,errno,"sem_getvalue() failed: %s",
- strerror(errno));
- #else
- if(sem_getvalue(&(sem->s),svalue) < 0)
- THROW1(system_error,errno,"sem_getvalue() failed: %s",
- strerror(errno));
- #endif
-}
-
-/* ********************************* WINDOWS IMPLEMENTATION ************************************ */
-
-#elif defined(WIN32)
-
-#include <math.h>
-
-typedef struct xbt_os_thread_ {
- char *name;
- HANDLE handle; /* the win thread handle */
- unsigned long id; /* the win thread id */
- pvoid_f_pvoid_t start_routine;
- void* param;
-} s_xbt_os_thread_t ;
-
-/* so we can specify the size of the stack of the threads */
-#ifndef STACK_SIZE_PARAM_IS_A_RESERVATION
-#define STACK_SIZE_PARAM_IS_A_RESERVATION 0x00010000
-#endif
-
-/* the default size of the stack of the threads (in bytes)*/
-#define XBT_DEFAULT_THREAD_STACK_SIZE 4096
-
-/* key to the TLS containing the xbt_os_thread_t structure */
-static unsigned long xbt_self_thread_key;
-
-void xbt_os_thread_mod_init(void) {
- xbt_self_thread_key = TlsAlloc();
-}
-void xbt_os_thread_mod_exit(void) {
-
- if (!TlsFree(xbt_self_thread_key))
- THROW0(system_error,(int)GetLastError(),"TlsFree() failed to cleanup the thread submodule");
-}
-
-static DWORD WINAPI wrapper_start_routine(void *s) {
- xbt_os_thread_t t = (xbt_os_thread_t)s;
- void* rv;
-
- if(!TlsSetValue(xbt_self_thread_key,t))
- THROW0(system_error,(int)GetLastError(),"TlsSetValue of data describing the created thread failed");
-
- rv = (*(t->start_routine))(t->param);
-
- return *((DWORD*)rv);
-}
-
-
-xbt_os_thread_t xbt_os_thread_create(const char *name,pvoid_f_pvoid_t start_routine,
- void* param) {
-
- xbt_os_thread_t t = xbt_new(s_xbt_os_thread_t,1);
-
- t->name = xbt_strdup(name);
- t->start_routine = start_routine ;
- t->param = param;
-
- t->handle = CreateThread(NULL,XBT_DEFAULT_THREAD_STACK_SIZE,
- (LPTHREAD_START_ROUTINE)wrapper_start_routine,
- t,STACK_SIZE_PARAM_IS_A_RESERVATION,&(t->id));
-
- if(!t->handle) {
- xbt_free(t);
- THROW0(system_error,(int)GetLastError(),"CreateThread failed");
- }
-
- return t;
-}
-
-const char* xbt_os_thread_name(xbt_os_thread_t t) {
- return t->name;
-}
-
-const char* xbt_os_thread_self_name(void) {
- xbt_os_thread_t t = xbt_os_thread_self();
- return t?t->name:"main";