diff options
author | Malcolm Beattie <mbeattie@sable.ox.ac.uk> | 1997-10-24 13:50:59 +0000 |
---|---|---|
committer | Malcolm Beattie <mbeattie@sable.ox.ac.uk> | 1997-10-24 13:50:59 +0000 |
commit | ea0efc06fdad2019ffceb86d079dd853e9d79cea (patch) | |
tree | 7fedea92fa5ecf04cfd8d38fc6a0d997d14ac2d6 /win32/win32thread.h | |
parent | 4f01c5a5705fca4c6743c9938e82ea378a5b35e8 (diff) | |
download | perl-ea0efc06fdad2019ffceb86d079dd853e9d79cea.tar.gz |
Improve internal threading API. Introduce win32/win32thread.[ch]
to use new API and patch win32 makefile stuff a little.
p4raw-id: //depot/perl@172
Diffstat (limited to 'win32/win32thread.h')
-rw-r--r-- | win32/win32thread.h | 102 |
1 files changed, 102 insertions, 0 deletions
diff --git a/win32/win32thread.h b/win32/win32thread.h new file mode 100644 index 0000000000..46e0a58fb6 --- /dev/null +++ b/win32/win32thread.h @@ -0,0 +1,102 @@ +/*typedef CRITICAL_SECTION perl_mutex;*/ +typedef HANDLE perl_mutex; +typedef HANDLE perl_cond; +typedef DWORD perl_key; +typedef HANDLE perl_thread; + +/* XXX Critical Sections used instead of mutexes: lightweight, + * but can't be communicated to child processes, and can't get + * HANDLE to it for use elsewhere + */ +/* +#define MUTEX_INIT(m) InitializeCriticalSection(m) +#define MUTEX_LOCK(m) EnterCriticalSection(m) +#define MUTEX_UNLOCK(m) LeaveCriticalSection(m) +#define MUTEX_DESTROY(m) DeleteCriticalSection(m) +*/ + +#define MUTEX_INIT(m) \ + STMT_START { \ + if ((*(m) = CreateMutex(NULL,FALSE,NULL)) == NULL) \ + croak("panic: MUTEX_INIT"); \ + } STMT_END +#define MUTEX_LOCK(m) \ + STMT_START { \ + if (WaitForSingleObject(*(m),INFINITE) == WAIT_FAILED) \ + croak("panic: MUTEX_LOCK"); \ + } STMT_END +#define MUTEX_UNLOCK(m) \ + STMT_START { \ + if (ReleaseMutex(*(m)) == 0) \ + croak("panic: MUTEX_UNLOCK"); \ + } STMT_END +#define MUTEX_DESTROY(m) \ + STMT_START { \ + if (CloseHandle(*(m)) == 0) \ + croak("panic: MUTEX_DESTROY"); \ + } STMT_END + +#define COND_INIT(c) \ + STMT_START { \ + if ((*(c) = CreateEvent(NULL,TRUE,FALSE,NULL)) == NULL) \ + croak("panic: COND_INIT"); \ + } STMT_END +#define COND_SIGNAL(c) \ + STMT_START { \ + if (PulseEvent(*(c)) == 0) \ + croak("panic: COND_SIGNAL (%ld)",GetLastError()); \ + } STMT_END +#define COND_BROADCAST(c) \ + STMT_START { \ + if (PulseEvent(*(c)) == 0) \ + croak("panic: COND_BROADCAST"); \ + } STMT_END +/* #define COND_WAIT(c, m) \ + STMT_START { \ + if (WaitForSingleObject(*(c),INFINITE) == WAIT_FAILED) \ + croak("panic: COND_WAIT"); \ + } STMT_END +*/ +#define COND_WAIT(c, m) \ + STMT_START { \ + if (SignalObjectAndWait(*(m),*(c),INFINITE,FALSE) == WAIT_FAILED)\ + croak("panic: COND_WAIT"); \ + else \ + MUTEX_LOCK(m); \ + } STMT_END +#define COND_DESTROY(c) \ + STMT_START { \ + if (CloseHandle(*(c)) == 0) \ + croak("panic: COND_DESTROY"); \ + } STMT_END + +#define DETACH(t) \ + STMT_START { \ + if (CloseHandle((t)->Tself) == 0) { \ + MUTEX_UNLOCK(&(t)->mutex); \ + croak("panic: DETACH"); \ + } \ + } STMT_END + +#define THR ((struct thread *) TlsGetValue(thr_key)) + +#define HAVE_THREAD_INTERN + +#define JOIN(t, avp) \ + STMT_START { \ + if ((WaitForSingleObject((t)->Tself,INFINITE) == WAIT_FAILED) \ + || (GetExitCodeThread((t)->Tself,(LPDWORD)(avp)) == 0)) \ + croak("panic: JOIN"); \ + } STMT_END + +#define SET_THR(t) \ + STMT_START { \ + if (TlsSetValue(thr_key, (void *) (t)) == 0) \ + croak("panic: TlsSetValue"); \ + } STMT_END + +#define THREAD_CREATE(t, f) thread_create(t, f) +#define THREAD_POST_CREATE(t) NOOP +#define THREAD_RET_TYPE DWORD WINAPI +#define THREAD_RET_CAST(p) ((DWORD)(p)) +#define YIELD Sleep(0) |