#include <objc/thr.h>
#include "runtime.h"
#ifndef __OBJC__
#define __OBJC__
#endif
#include <windows.h>
static DWORD __objc_data_tls = (DWORD)-1;
int
__objc_init_thread_system(void)
{
if ((__objc_data_tls = TlsAlloc()) != (DWORD)-1)
return 0;
else
return -1;
}
int
__objc_close_thread_system(void)
{
if (__objc_data_tls != (DWORD)-1)
TlsFree(__objc_data_tls);
return 0;
}
objc_thread_t
__objc_thread_detach(void (*func)(void *arg), void *arg)
{
DWORD thread_id = 0;
HANDLE win32_handle;
if (!(win32_handle = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)func,
arg, 0, &thread_id)))
thread_id = 0;
return (objc_thread_t)thread_id;
}
int
__objc_thread_set_priority(int priority)
{
int sys_priority = 0;
switch (priority)
{
case OBJC_THREAD_INTERACTIVE_PRIORITY:
sys_priority = THREAD_PRIORITY_NORMAL;
break;
default:
case OBJC_THREAD_BACKGROUND_PRIORITY:
sys_priority = THREAD_PRIORITY_BELOW_NORMAL;
break;
case OBJC_THREAD_LOW_PRIORITY:
sys_priority = THREAD_PRIORITY_LOWEST;
break;
}
if (SetThreadPriority(GetCurrentThread(), sys_priority))
return 0;
else
return -1;
}
int
__objc_thread_get_priority(void)
{
int sys_priority;
sys_priority = GetThreadPriority(GetCurrentThread());
switch (sys_priority)
{
case THREAD_PRIORITY_HIGHEST:
case THREAD_PRIORITY_TIME_CRITICAL:
case THREAD_PRIORITY_ABOVE_NORMAL:
case THREAD_PRIORITY_NORMAL:
return OBJC_THREAD_INTERACTIVE_PRIORITY;
default:
case THREAD_PRIORITY_BELOW_NORMAL:
return OBJC_THREAD_BACKGROUND_PRIORITY;
case THREAD_PRIORITY_IDLE:
case THREAD_PRIORITY_LOWEST:
return OBJC_THREAD_LOW_PRIORITY;
}
return -1;
}
void
__objc_thread_yield(void)
{
Sleep(0);
}
int
__objc_thread_exit(void)
{
ExitThread(__objc_thread_exit_status);
return -1;
}
objc_thread_t
__objc_thread_id(void)
{
return (objc_thread_t)GetCurrentThreadId();
}
int
__objc_thread_set_data(void *value)
{
if (TlsSetValue(__objc_data_tls, value))
return 0;
else
return -1;
}
void *
__objc_thread_get_data(void)
{
return TlsGetValue(__objc_data_tls);
}
int
__objc_mutex_allocate(objc_mutex_t mutex)
{
if ((mutex->backend = (void *)CreateMutex(NULL, 0, NULL)) == NULL)
return -1;
else
return 0;
}
int
__objc_mutex_deallocate(objc_mutex_t mutex)
{
CloseHandle((HANDLE)(mutex->backend));
return 0;
}
int
__objc_mutex_lock(objc_mutex_t mutex)
{
int status;
status = WaitForSingleObject((HANDLE)(mutex->backend), INFINITE);
if (status != WAIT_OBJECT_0 && status != WAIT_ABANDONED)
return -1;
else
return 0;
}
int
__objc_mutex_trylock(objc_mutex_t mutex)
{
int status;
status = WaitForSingleObject((HANDLE)(mutex->backend), 0);
if (status != WAIT_OBJECT_0 && status != WAIT_ABANDONED)
return -1;
else
return 0;
}
int
__objc_mutex_unlock(objc_mutex_t mutex)
{
if (ReleaseMutex((HANDLE)(mutex->backend)) == 0)
return -1;
else
return 0;
}
int
__objc_condition_allocate(objc_condition_t condition)
{
return -1;
}
int
__objc_condition_deallocate(objc_condition_t condition)
{
return -1;
}
int
__objc_condition_wait(objc_condition_t condition, objc_mutex_t mutex)
{
return -1;
}
int
__objc_condition_broadcast(objc_condition_t condition)
{
return -1;
}
int
__objc_condition_signal(objc_condition_t condition)
{
return -1;
}