git-svn-id: svn+ssh://scm.gforge.inria.fr/svn/simgrid/simgrid/trunk@3209
48e7efb5-ca39-0410-a469-
dd3cf9ba447f
#include "win_thread.h"
#include <string.h>
#include "win_thread.h"
#include <string.h>
int
win_thread_create(win_thread_t* thread,pfn_start_routine_t start_routine,void* param){
int
win_thread_create(win_thread_t* thread,pfn_start_routine_t start_routine,void* param){
int
win_thread_exit(win_thread_t* thread,unsigned long exit_code)
{
int
win_thread_exit(win_thread_t* thread,unsigned long exit_code)
{
-
- ExitThread(exit_code);
-
- free(*thread);
- *thread = NULL;
+ win_thread_t ___thread = *thread;
+
+ CloseHandle(___thread->handle);
+ free(___thread);
+ ___thread = NULL;
+
+ ExitThread(exit_code);
+
+
int
win_thread_mutex_init(win_thread_mutex_t* mutex)
{
int
win_thread_mutex_init(win_thread_mutex_t* mutex)
{
*mutex = xbt_new0(s_win_thread_mutex_t,1);
if(!*mutex)
*mutex = xbt_new0(s_win_thread_mutex_t,1);
if(!*mutex)
/* initialize the critical section object */
InitializeCriticalSection(&((*mutex)->lock));
/* initialize the critical section object */
InitializeCriticalSection(&((*mutex)->lock));
return 0;
}
int
win_thread_mutex_lock(win_thread_mutex_t* mutex){
return 0;
}
int
win_thread_mutex_lock(win_thread_mutex_t* mutex){
- EnterCriticalSection (&((*mutex)->lock));
+ EnterCriticalSection(&((*mutex)->lock));
+
int
win_thread_mutex_destroy(win_thread_mutex_t* mutex){
int
win_thread_mutex_destroy(win_thread_mutex_t* mutex){
DeleteCriticalSection(&((*mutex)->lock));
free(*mutex);
DeleteCriticalSection(&((*mutex)->lock));
free(*mutex);
int
win_thread_cond_init(win_thread_cond_t* cond){
int
win_thread_cond_init(win_thread_cond_t* cond){
*cond = xbt_new0(s_win_thread_cond_t,1);
if(!*cond)
return 1;
*cond = xbt_new0(s_win_thread_cond_t,1);
if(!*cond)
return 1;
memset(&((*cond)->waiters_count_lock),0,sizeof(CRITICAL_SECTION));
/* initialize the critical section object */
memset(&((*cond)->waiters_count_lock),0,sizeof(CRITICAL_SECTION));
/* initialize the critical section object */
unsigned long wait_result;
int is_last_waiter;
unsigned long wait_result;
int is_last_waiter;
/* lock the threads counter and increment it */
EnterCriticalSection (&((*cond)->waiters_count_lock));
(*cond)->waiters_count++;
/* lock the threads counter and increment it */
EnterCriticalSection (&((*cond)->waiters_count_lock));
(*cond)->waiters_count++;
/* relock the mutex associated with the condition in accordance with the posix thread specification */
EnterCriticalSection (&(*mutex)->lock);
/* relock the mutex associated with the condition in accordance with the posix thread specification */
EnterCriticalSection (&(*mutex)->lock);
win_thread_cond_signal(win_thread_cond_t* cond)
{
int have_waiters;
win_thread_cond_signal(win_thread_cond_t* cond)
{
int have_waiters;
EnterCriticalSection (&((*cond)->waiters_count_lock));
have_waiters = (*cond)->waiters_count > 0;
LeaveCriticalSection (&((*cond)->waiters_count_lock));
EnterCriticalSection (&((*cond)->waiters_count_lock));
have_waiters = (*cond)->waiters_count > 0;
LeaveCriticalSection (&((*cond)->waiters_count_lock));
if(!SetEvent((*cond)->events[SIGNAL]))
return 1;
if(!SetEvent((*cond)->events[SIGNAL]))
return 1;
win_thread_cond_broadcast(win_thread_cond_t* cond)
{
int have_waiters;
win_thread_cond_broadcast(win_thread_cond_t* cond)
{
int have_waiters;
EnterCriticalSection (&((*cond)->waiters_count_lock));
have_waiters = (*cond)->waiters_count > 0;
LeaveCriticalSection (&((*cond)->waiters_count_lock));
if (have_waiters)
EnterCriticalSection (&((*cond)->waiters_count_lock));
have_waiters = (*cond)->waiters_count > 0;
LeaveCriticalSection (&((*cond)->waiters_count_lock));
if (have_waiters)
- SetEvent((*cond)->events[BROADCAST]);
+ SetEvent((*cond)->events[BROADCAST]);
win_thread_cond_destroy(win_thread_cond_t* cond)
{
int result = 0;
win_thread_cond_destroy(win_thread_cond_t* cond)
{
int result = 0;
if(!CloseHandle((*cond)->events[SIGNAL]))
result= 1;
if(!CloseHandle((*cond)->events[SIGNAL]))
result= 1;
+void
+win_thread_yield(void)
+{
+ Sleep(0);
+}
+
int
win_thread_cond_destroy(win_thread_cond_t* cond);
int
win_thread_cond_destroy(win_thread_cond_t* cond);
+/*
+ * Forces the current thread to relinquish use of its processor.
+ */
+void
+win_thread_yield(void);
+
#ifdef __cplusplus
extern }
#endif
#ifdef __cplusplus
extern }
#endif