#include "win_thread.h"
#include <string.h>
+#include <stdio.h>
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)
{
-
- ExitThread(exit_code);
-
- free(*thread);
- *thread = NULL;
+ win_thread_t ___thread = *thread;
+
+ CloseHandle(___thread->handle);
+ free(___thread);
+ ___thread = NULL;
+
+ ExitThread(exit_code);
+
+
return 0;
}
int
win_thread_mutex_init(win_thread_mutex_t* mutex)
{
+
*mutex = xbt_new0(s_win_thread_mutex_t,1);
if(!*mutex)
/* initialize the critical section object */
InitializeCriticalSection(&((*mutex)->lock));
-
return 0;
}
int
win_thread_mutex_lock(win_thread_mutex_t* mutex){
- EnterCriticalSection (&((*mutex)->lock));
+ EnterCriticalSection(&((*mutex)->lock));
+
return 0;
}
int
win_thread_mutex_destroy(win_thread_mutex_t* mutex){
-
+
DeleteCriticalSection(&((*mutex)->lock));
free(*mutex);
int
win_thread_cond_init(win_thread_cond_t* cond){
-
+
*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 */
return 1;
}
-
return 0;
}
unsigned long wait_result;
int is_last_waiter;
-
+
/* 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);
-
return 0;
}
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));
if(!SetEvent((*cond)->events[SIGNAL]))
return 1;
+
}
return 0;
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)
- SetEvent((*cond)->events[BROADCAST]);
+ SetEvent((*cond)->events[BROADCAST]);
return 0;
}
win_thread_cond_destroy(win_thread_cond_t* cond)
{
int result = 0;
-
+
if(!CloseHandle((*cond)->events[SIGNAL]))
result= 1;
return result;
}
+void
+win_thread_yield(void)
+{
+ Sleep(0);
+}
+