#include <config.h>
#include <process.h>
#include <isc/thread.h>
isc_result_t
isc_thread_create(isc_threadfunc_t start, isc_threadarg_t arg,
isc_thread_t *threadp)
{
isc_thread_t thread;
unsigned int id;
thread = (isc_thread_t)_beginthreadex(NULL, 0, start, arg, 0, &id);
if (thread == NULL) {
return (ISC_R_UNEXPECTED);
}
*threadp = thread;
return (ISC_R_SUCCESS);
}
isc_result_t
isc_thread_join(isc_thread_t thread, isc_threadresult_t *rp) {
DWORD result;
DWORD threadrc;
result = WaitForSingleObject(thread, INFINITE);
if (result != WAIT_OBJECT_0) {
return (ISC_R_UNEXPECTED);
}
if (rp != NULL) {
if(!GetExitCodeThread(thread, &threadrc)) {
return (ISC_R_UNEXPECTED);
}
*rp = threadrc;
}
(void)CloseHandle(thread);
return (ISC_R_SUCCESS);
}
void
isc_thread_setconcurrency(unsigned int level) {
}
void *
isc_thread_key_getspecific(isc_thread_key_t key) {
return(TlsGetValue(key));
}
int
isc_thread_key_setspecific(isc_thread_key_t key, void *value) {
return (TlsSetValue(key, value) ? 0 : GetLastError());
}
int
isc_thread_key_create(isc_thread_key_t *key, void (*func)(void *)) {
*key = TlsAlloc();
return ((*key != -1) ? 0 : GetLastError());
}
int
isc_thread_key_delete(isc_thread_key_t key) {
return (TlsFree(key) ? 0 : GetLastError());
}