// if ((errcode=pthread_key_delete(xbt_self_thread_key)))
// THROW0(system_error,errcode,"pthread_key_delete failed for xbt_self_thread_key");
+ free(main_thread->exception);
+ free(main_thread);
+ main_thread = NULL;
+ thread_mod_inited=0;
+#ifndef HAVE_SEM_WAIT
+ xbt_os_mutex_destroy(next_sem_ID_lock);
+#endif
}
static void * wrapper_start_routine(void *s) {
if (thread->exception)
free(thread->exception);
+ if (thread->name)
+ free(thread->name);
+
if (thread == main_thread) /* just killed main thread */
main_thread = NULL;
static DWORD WINAPI wrapper_start_routine(void *s) {
xbt_os_thread_t t = (xbt_os_thread_t)s;
- void* rv;
+ DWORD* 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);
+ rv = (DWORD*)((t->start_routine)(t->param));
- return *((DWORD*)rv);
+ return rv ? *rv : 0;
+
}
}
CloseHandle(thread->handle);
- free(thread->name);
+
+ if(thread->name)
+ free(thread->name);
+
free(thread);
}
Sleep(0);
}
void xbt_os_thread_cancel(xbt_os_thread_t t) {
- THROW_UNIMPLEMENTED;
+ if(!TerminateThread(t->handle,0))
+ THROW0(system_error,(int)GetLastError(), "TerminateThread failed");
}
/****** mutex related functions ******/