// 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;
case ETIMEDOUT:
THROW1(timeout_error,0,"mutex %p not ready",mutex);
default:
- THROW2(system_error,errcode,"xbt_mutex_tryacquire(%p) failed: %s",mutex, strerror(errcode));
+ THROW2(system_error,errcode,"xbt_mutex_timedacquire(%p) failed: %s",mutex, strerror(errcode));
}
case ETIMEDOUT:
THROW1(timeout_error,0,"semaphore %p not ready",sem);
default:
- THROW2(system_error,errcode,"xbt_sem_tryacquire(%p) failed: %s",sem, strerror(errcode));
+ THROW2(system_error,errcode,"xbt_os_sem_timedacquire(%p) failed: %s",sem, strerror(errcode));
}
} else {
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 ******/
}
void xbt_os_mutex_acquire(xbt_os_mutex_t mutex) {
-
EnterCriticalSection(& mutex->lock);
}
-void xbt_os_mutex_tryacquire(xbt_os_mutex_t mutex)
-{
- TryEnterCriticalSection(&mutex->lock);
-}
-
void xbt_os_mutex_timedacquire(xbt_os_mutex_t mutex, double delay) {
THROW_UNIMPLEMENTED;
}
if (delay < 0) {
xbt_os_cond_wait(cond,mutex);
} else {
- DEBUG3("xbt_cond_timedwait(%p,%p,%ul)",&(cond->events),&(mutex->lock),end);
+ DEBUG3("xbt_cond_timedwait(%p,%p,%lu)",&(cond->events),&(mutex->lock),end);
/* lock the threads counter and increment it */
EnterCriticalSection (& cond->waiters_count_lock);
CRITICAL_SECTION value_lock; /* protect access to value of the semaphore */
}s_xbt_os_sem_t ;
+#ifndef INT_MAX
+# define INT_MAX 32767 /* let's be safe by underestimating this value: this is for 16bits only */
+#endif
+
xbt_os_sem_t
xbt_os_sem_init(unsigned int value)
{