Initial (untested) merge of all non-ansi changes on ansiperl branch
[p5sagit/p5-mst-13.2.git] / win32 / win32thread.c
CommitLineData
ea0efc06 1#include "EXTERN.h"
2#include "perl.h"
d55594ae 3
4void
5Perl_alloc_thread_key(void)
6{
7#ifdef USE_THREADS
8 static int key_allocated = 0;
9 if (!key_allocated) {
10 if ((thr_key = TlsAlloc()) == TLS_OUT_OF_INDEXES)
11 croak("panic: TlsAlloc");
12 key_allocated = 1;
13 }
14#endif
15}
ea0efc06 16
17void
18init_thread_intern(struct thread *thr)
19{
d55594ae 20#ifdef USE_THREADS
21 /* GetCurrentThread() retrurns a pseudo handle, need
22 this to convert it into a handle another thread can use
23 */
ea0efc06 24 DuplicateHandle(GetCurrentProcess(),
25 GetCurrentThread(),
26 GetCurrentProcess(),
46930d8f 27 &thr->self,
ea0efc06 28 0,
29 FALSE,
30 DUPLICATE_SAME_ACCESS);
d55594ae 31#endif
ea0efc06 32}
33
d55594ae 34#ifdef USE_THREADS
ea0efc06 35int
d55594ae 36Perl_thread_create(struct thread *thr, thread_func_t *fn)
ea0efc06 37{
38 DWORD junk;
39
40 MUTEX_LOCK(&thr->mutex);
d55594ae 41 DEBUG_L(PerlIO_printf(PerlIO_stderr(),
42 "%p: create OS thread\n", thr));
46930d8f 43 thr->self = CreateThread(NULL, 0, fn, (void*)thr, 0, &junk);
d55594ae 44 DEBUG_L(PerlIO_printf(PerlIO_stderr(),
45 "%p: OS thread = %p, id=%ld\n", thr, thr->self, junk));
ea0efc06 46 MUTEX_UNLOCK(&thr->mutex);
46930d8f 47 return thr->self ? 0 : -1;
ea0efc06 48}
d55594ae 49#endif