typedef struct xbt_thread_ {
pthread_t t;
+ void *param;
+ pvoid_f_pvoid_t *start_routine;
} s_xbt_thread_t ;
/* thread-specific data containing the xbt_thread_t structure */
// THROW0(system_error,errcode,"pthread_key_delete failed for xbt_self_thread_key");
}
-typedef struct s_xbt_thread_wrapper_for_restart__ {
- pvoid_f_pvoid_t *start_routine;
- void* param;
- xbt_thread_t res;
-} s_xbt_thread_wrapper_for_restart_t, *xbt_thread_wrapper_for_restart_t;
-
static void * wrapper_start_routine(void *s) {
- xbt_thread_wrapper_for_restart_t stub = s;
+ xbt_thread_t t = s;
int errcode;
- if ((errcode=pthread_setspecific(xbt_self_thread_key,stub->res)))
- THROW0(system_error,errcode,"pthread_setspecific failed for xbt_self_thread_key");
- return stub->start_routine(stub->param);
+ if ((errcode=pthread_setspecific(xbt_self_thread_key,t)))
+ THROW0(system_error,errcode,"pthread_setspecific failed for xbt_self_thread_key");
+ return t->start_routine(t->param);
}
xbt_thread_t xbt_thread_create(pvoid_f_pvoid_t start_routine,
void* param) {
int errcode;
- xbt_thread_wrapper_for_restart_t stub = xbt_new0(s_xbt_thread_wrapper_for_restart_t,1);
- stub->start_routine = start_routine ;
- stub->param = param;
- stub->res = xbt_new(s_xbt_thread_t,1);
+ xbt_thread_t res_thread=xbt_new(s_xbt_thread_t,1);
+ res_thread->start_routine = start_routine;
+ res_thread->param = param;
- if ((errcode = pthread_create(&(stub->res->t), NULL, wrapper_start_routine, stub)))
- THROW0(system_error,errcode, "pthread_create failed");
-
- return stub->res;
+ if ((errcode = pthread_create(&(res_thread->t), NULL, wrapper_start_routine, res_thread)))
+ THROW1(system_error,errcode, "pthread_create failed: %s",strerror(errcode));
+
+ return res_thread;
}
void
int errcode;
if ((errcode = pthread_join(thread->t,thread_return)))
- THROW0(system_error,errcode, "pthread_join failed");
+ THROW1(system_error,errcode, "pthread_join failed: %s",
+ strerror(errcode));
+ free(thread);
}
void xbt_thread_exit(int *retval) {
int errcode;
if ((errcode = pthread_mutex_init(&(res->m),NULL)))
- THROW0(system_error,errcode,"pthread_mutex_init() failed");
+ THROW1(system_error,errcode,"pthread_mutex_init() failed: %s",
+ strerror(errcode));
return res;
}
int errcode;
if ((errcode=pthread_mutex_lock(&(mutex->m))))
- THROW1(system_error,errcode,"pthread_mutex_lock(%p) failed",mutex);
+ THROW2(system_error,errcode,"pthread_mutex_lock(%p) failed: %s",
+ mutex, strerror(errcode));
}
void xbt_mutex_unlock(xbt_mutex_t mutex) {
int errcode;
if ((errcode=pthread_mutex_unlock(&(mutex->m))))
- THROW1(system_error,errcode,"pthread_mutex_unlock(%p) failed",mutex);
+ THROW2(system_error,errcode,"pthread_mutex_unlock(%p) failed: %s",
+ mutex, strerror(errcode));
}
void xbt_mutex_destroy(xbt_mutex_t mutex) {
if (!mutex) return;
if ((errcode=pthread_mutex_destroy(&(mutex->m))))
- THROW1(system_error,errcode,"pthread_mutex_destroy(%p) failed",mutex);
+ THROW2(system_error,errcode,"pthread_mutex_destroy(%p) failed: %s",
+ mutex, strerror(errcode));
free(mutex);
}
xbt_thcond_t res = xbt_new(s_xbt_thcond_t,1);
int errcode;
if ((errcode=pthread_cond_init(&(res->c),NULL)))
- THROW0(system_error,errcode,"pthread_cond_init() failed");
+ THROW1(system_error,errcode,"pthread_cond_init() failed: %s",
+ strerror(errcode));
return res;
}
void xbt_thcond_wait(xbt_thcond_t cond, xbt_mutex_t mutex) {
int errcode;
if ((errcode=pthread_cond_wait(&(cond->c),&(mutex->m))))
- THROW2(system_error,errcode,"pthread_cond_wait(%p,%p) failed",cond,mutex);
+ THROW3(system_error,errcode,"pthread_cond_wait(%p,%p) failed: %s",
+ cond,mutex, strerror(errcode));
}
void xbt_thcond_signal(xbt_thcond_t cond) {
int errcode;
if ((errcode=pthread_cond_signal(&(cond->c))))
- THROW1(system_error,errcode,"pthread_cond_signal(%p) failed",cond);
+ THROW2(system_error,errcode,"pthread_cond_signal(%p) failed: %s",
+ cond, strerror(errcode));
}
void xbt_thcond_broadcast(xbt_thcond_t cond){
int errcode;
if ((errcode=pthread_cond_broadcast(&(cond->c))))
- THROW1(system_error,errcode,"pthread_cond_broadcast(%p) failed",cond);
+ THROW2(system_error,errcode,"pthread_cond_broadcast(%p) failed: %s",
+ cond, strerror(errcode));
}
void xbt_thcond_destroy(xbt_thcond_t cond){
int errcode;
if (!cond) return;
if ((errcode=pthread_cond_destroy(&(cond->c))))
- THROW1(system_error,errcode,"pthread_cond_destroy(%p) failed",cond);
+ THROW2(system_error,errcode,"pthread_cond_destroy(%p) failed: %s",
+ cond, strerror(errcode));
free(cond);
}
#elif defined(WIN32)
typedef struct xbt_thread_ {
- HANDLE handle; /* the win thread handle */
- unsigned long id; /* the win thread id */
-} s_xbt_thread_t ;
-
-typedef struct s_xbt_thread_wrapper_for_restart__ {
+ HANDLE handle; /* the win thread handle */
+ unsigned long id; /* the win thread id */
pvoid_f_pvoid_t *start_routine;
void* param;
- xbt_thread_t res;
-} s_xbt_thread_wrapper_for_restart_t, *xbt_thread_wrapper_for_restart_t;
+} s_xbt_thread_t ;
/* key to the TLS containing the xbt_thread_t structure */
static unsigned long xbt_self_thread_key;
THROW0(system_error,(int)GetLastError(),"TlsFree() failed to cleanup the thread submodule");
}
-DWORD WINAPI wrapper_start_routine(void *s) {
- xbt_thread_wrapper_for_restart_t stub = (xbt_thread_wrapper_for_restart_t)s;
+static DWORD WINAPI wrapper_start_routine(void *s) {
+ xbt_thread_t t = (xbt_thread_t)s;
- if(!TlsSetValue(xbt_self_thread_key,stub->res))
+ if(!TlsSetValue(xbt_self_thread_key,t))
THROW0(system_error,(int)GetLastError(),"TlsSetValue of data describing the created thread failed");
- return (DWORD)stub->start_routine(stub->param);
+ return (DWORD)t->start_routine(t->param);
}
xbt_thread_t xbt_thread_create(pvoid_f_pvoid_t start_routine,
void* param) {
- xbt_thread_wrapper_for_restart_t stub = xbt_new0(s_xbt_thread_wrapper_for_restart_t,1);
+ xbt_thread_t t = xbt_new(s_xbt_thread_t,1);
- stub->start_routine = start_routine ;
- stub->param = param;
- stub->res = xbt_new(s_xbt_thread_t,1);
+ t->start_routine = start_routine ;
+ t->param = param;
- stub->res->handle = CreateThread(NULL,0,
- (LPTHREAD_START_ROUTINE)wrapper_start_routine,
- stub,0,&(stub->res->id));
+ t->handle = CreateThread(NULL,0,
+ (LPTHREAD_START_ROUTINE)wrapper_start_routine,
+ t,0,&(t->id));
- if(!stub->res->handle) {
- xbt_free(stub->res);
+ if(!t->handle) {
+ xbt_free(t);
THROW0(system_error,(int)GetLastError(),"CreateThread failed");
}
- return stub->res;
+ return t;
}
void
}
CloseHandle(thread->handle);
+ free(thread);
}
void xbt_thread_exit(int *retval) {
-
- xbt_thread_t self = xbt_thread_self();
-
if(retval)
ExitThread(*retval);
else
if (have_waiters)
if(!SetEvent(cond->events[SIGNAL]))
THROW0(system_error,0,"SetEvent failed");
+
+ xbt_thread_yield();
}
void xbt_thcond_broadcast(xbt_thcond_t cond){