From: cherierm Date: Fri, 20 Jun 2008 10:20:23 +0000 (+0000) Subject: implement xbt_os_thread_cancel() for windows and make a little changes (test pointer... X-Git-Tag: v3.3~321 X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/commitdiff_plain/d6ae7b948dffd7f9268106a86f9de21d7d0a3621?hp=657ace25fc9c54a83d3f99f0ee24322e3718089b implement xbt_os_thread_cancel() for windows and make a little changes (test pointer before use it) git-svn-id: svn+ssh://scm.gforge.inria.fr/svn/simgrid/simgrid/trunk@5778 48e7efb5-ca39-0410-a469-dd3cf9ba447f --- diff --git a/src/xbt/xbt_os_thread.c b/src/xbt/xbt_os_thread.c index 71716e2588..46196d6be7 100644 --- a/src/xbt/xbt_os_thread.c +++ b/src/xbt/xbt_os_thread.c @@ -567,14 +567,15 @@ void xbt_os_thread_mod_exit(void) { 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; + } @@ -621,7 +622,10 @@ xbt_os_thread_join(xbt_os_thread_t thread,void ** thread_return) { } CloseHandle(thread->handle); - free(thread->name); + + if(thread->name) + free(thread->name); + free(thread); } @@ -646,7 +650,8 @@ void xbt_os_thread_yield(void) { 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 ******/