From d6ae7b948dffd7f9268106a86f9de21d7d0a3621 Mon Sep 17 00:00:00 2001 From: cherierm Date: Fri, 20 Jun 2008 10:20:23 +0000 Subject: [PATCH] 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 --- src/xbt/xbt_os_thread.c | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) 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 ******/ -- 2.20.1