diff options
author | Gurusamy Sarathy <gsar@cpan.org> | 1997-11-12 01:22:26 +0000 |
---|---|---|
committer | Gurusamy Sarathy <gsar@cpan.org> | 1997-11-12 01:22:26 +0000 |
commit | 4b026b9ec580787cd32d43ab9381ecc2040179be (patch) | |
tree | cb8f631bca7bc73f38024763711ed56a32d71425 /win32 | |
parent | e7cd54d7e2bd82a89f30e2f71675be1f5d3be34d (diff) | |
download | perl-4b026b9ec580787cd32d43ab9381ecc2040179be.tar.gz |
Minor tweaks to add a thread_intern struct that should ultimately
contain all the win32-specific statics.
Win32 branch now passes all tests with or w/o USE_THREADS.
p4raw-id: //depot/win32/perl@235
Diffstat (limited to 'win32')
-rw-r--r-- | win32/win32thread.c | 5 | ||||
-rw-r--r-- | win32/win32thread.h | 73 |
2 files changed, 43 insertions, 35 deletions
diff --git a/win32/win32thread.c b/win32/win32thread.c index dfa9a0c733..a9ca8e849d 100644 --- a/win32/win32thread.c +++ b/win32/win32thread.c @@ -18,8 +18,8 @@ void init_thread_intern(struct thread *thr) { #ifdef USE_THREADS - /* GetCurrentThread() retrurns a pseudo handle, need - this to convert it into a handle another thread can use + /* Set thr->self. GetCurrentThread() retrurns a pseudo handle, need + this to convert it into a handle another thread can use. */ DuplicateHandle(GetCurrentProcess(), GetCurrentThread(), @@ -28,6 +28,7 @@ init_thread_intern(struct thread *thr) 0, FALSE, DUPLICATE_SAME_ACCESS); + /* XXX init thr->i here */ #endif } diff --git a/win32/win32thread.h b/win32/win32thread.h index 75aa25b632..5bb6e6de59 100644 --- a/win32/win32thread.h +++ b/win32/win32thread.h @@ -4,20 +4,21 @@ typedef struct win32_cond { LONG waiters; HANDLE sem; } perl_cond; typedef DWORD perl_key; typedef HANDLE perl_thread; -/* XXX Critical Sections used instead of mutexes: lightweight, +#ifndef DONT_USE_CRITICAL_SECTION + +/* 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 + * HANDLE to it for use elsewhere. */ - -#ifndef DONT_USE_CRITICAL_SECTION typedef CRITICAL_SECTION perl_mutex; #define MUTEX_INIT(m) InitializeCriticalSection(m) #define MUTEX_LOCK(m) EnterCriticalSection(m) #define MUTEX_UNLOCK(m) LeaveCriticalSection(m) #define MUTEX_DESTROY(m) DeleteCriticalSection(m) + #else -typedef HANDLE perl_mutex; +typedef HANDLE perl_mutex; #define MUTEX_INIT(m) \ STMT_START { \ if ((*(m) = CreateMutex(NULL,FALSE,NULL)) == NULL) \ @@ -46,44 +47,46 @@ typedef HANDLE perl_mutex; * so there's no separate mutex protecting access to (c)->waiters */ #define COND_INIT(c) \ - STMT_START { \ - (c)->waiters = 0; \ - (c)->sem = CreateSemaphore(NULL,0,LONG_MAX,NULL); \ - if ((c)->sem == NULL) \ - croak("panic: COND_INIT (%ld)",GetLastError()); \ + STMT_START { \ + (c)->waiters = 0; \ + (c)->sem = CreateSemaphore(NULL,0,LONG_MAX,NULL); \ + if ((c)->sem == NULL) \ + croak("panic: COND_INIT (%ld)",GetLastError()); \ } STMT_END #define COND_SIGNAL(c) \ - STMT_START { \ - if (ReleaseSemaphore((c)->sem,1,NULL) == 0) \ - croak("panic: COND_SIGNAL (%ld)",GetLastError()); \ + STMT_START { \ + if ((c)->waiters > 0 && \ + ReleaseSemaphore((c)->sem,1,NULL) == 0) \ + croak("panic: COND_SIGNAL (%ld)",GetLastError()); \ } STMT_END #define COND_BROADCAST(c) \ - STMT_START { \ - if ((c)->waiters > 0 && \ - ReleaseSemaphore((c)->sem,(c)->waiters,NULL) == 0) \ - croak("panic: COND_BROADCAST (%ld)",GetLastError());\ + STMT_START { \ + if ((c)->waiters > 0 && \ + ReleaseSemaphore((c)->sem,(c)->waiters,NULL) == 0) \ + croak("panic: COND_BROADCAST (%ld)",GetLastError());\ } STMT_END #define COND_WAIT(c, m) \ - STMT_START { \ - (c)->waiters++; \ - MUTEX_UNLOCK(m); \ - /* Note that there's no race here, since a \ - * COND_BROADCAST() on another thread will have seen the\ - * right number of waiters (i.e. including this one) */ \ - if (WaitForSingleObject((c)->sem,INFINITE)==WAIT_FAILED)\ - croak("panic: COND_WAIT (%ld)",GetLastError()); \ - MUTEX_LOCK(m); \ - (c)->waiters--; \ + STMT_START { \ + (c)->waiters++; \ + MUTEX_UNLOCK(m); \ + /* Note that there's no race here, since a \ + * COND_BROADCAST() on another thread will have seen the\ + * right number of waiters (i.e. including this one) */ \ + if (WaitForSingleObject((c)->sem,INFINITE)==WAIT_FAILED)\ + croak("panic: COND_WAIT (%ld)",GetLastError()); \ + /* XXX there may be an inconsequential race here */ \ + MUTEX_LOCK(m); \ + (c)->waiters--; \ } STMT_END #define COND_DESTROY(c) \ - STMT_START { \ - (c)->waiters = 0; \ - if (CloseHandle((c)->sem) == 0) \ - croak("panic: COND_DESTROY (%ld)",GetLastError()); \ + STMT_START { \ + (c)->waiters = 0; \ + if (CloseHandle((c)->sem) == 0) \ + croak("panic: COND_DESTROY (%ld)",GetLastError()); \ } STMT_END #define DETACH(t) \ @@ -110,12 +113,16 @@ END_EXTERN_C #define INIT_THREADS NOOP #define ALLOC_THREAD_KEY Perl_alloc_thread_key() -#define INIT_THREAD_INTERN(thr) Perl_init_thread_intern(thr) +#define HAVE_THREAD_INTERN + +struct thread_intern { + int dummy; /* XXX for now */ +}; #define JOIN(t, avp) \ STMT_START { \ if ((WaitForSingleObject((t)->self,INFINITE) == WAIT_FAILED) \ - || (GetExitCodeThread((t)->self,(LPDWORD)(avp)) == 0)) \ + || (GetExitCodeThread((t)->self,(LPDWORD)(avp)) == 0)) \ croak("panic: JOIN"); \ } STMT_END |