annotate Python/thread_nt.h @ 50674:c8f793e159bb legacy-trunk

Issue 4293: Make Py_AddPendingCall() thread safe
author Kristján Valur Jónsson <kristjan@ccpgames.com>
date Fri, 09 Jan 2009 20:31:26 +0000
parents fdcca8793eb9
children 5302f806537a
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
2152
1a52351a00b2 nt thread support
Guido van Rossum <guido@python.org>
parents:
diff changeset
1
1a52351a00b2 nt thread support
Guido van Rossum <guido@python.org>
parents:
diff changeset
2 /* This code implemented by Dag.Gruneau@elsa.preseco.comm.se */
12584
cde4da18c4fa Fast NonRecursiveMutex support by Yakov Markovitch, markovitch@iso.ru,
Guido van Rossum <guido@python.org>
parents: 11673
diff changeset
3 /* Fast NonRecursiveMutex support by Yakov Markovitch, markovitch@iso.ru */
22092
7a3e03b541ff SF patch 522961: Leak in Python/thread_nt.h, from Gerald S. Williams.
Tim Peters <tim.peters@gmail.com>
parents: 21766
diff changeset
4 /* Eliminated some memory leaks, gsw@agere.com */
2152
1a52351a00b2 nt thread support
Guido van Rossum <guido@python.org>
parents:
diff changeset
5
6029
68f2d7704180 Use _beginthread() and _endthread() in favor of CreateThread() and
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
6 #include <windows.h>
68f2d7704180 Use _beginthread() and _endthread() in favor of CreateThread() and
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
7 #include <limits.h>
38716
42808526511c Patch #1495999: Part two of Windows CE changes.
Martin v. Löwis <martin@v.loewis.de>
parents: 38592
diff changeset
8 #ifdef HAVE_PROCESS_H
6029
68f2d7704180 Use _beginthread() and _endthread() in favor of CreateThread() and
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
9 #include <process.h>
38716
42808526511c Patch #1495999: Part two of Windows CE changes.
Martin v. Löwis <martin@v.loewis.de>
parents: 38592
diff changeset
10 #endif
2152
1a52351a00b2 nt thread support
Guido van Rossum <guido@python.org>
parents:
diff changeset
11
12584
cde4da18c4fa Fast NonRecursiveMutex support by Yakov Markovitch, markovitch@iso.ru,
Guido van Rossum <guido@python.org>
parents: 11673
diff changeset
12 typedef struct NRMUTEX {
cde4da18c4fa Fast NonRecursiveMutex support by Yakov Markovitch, markovitch@iso.ru,
Guido van Rossum <guido@python.org>
parents: 11673
diff changeset
13 LONG owned ;
cde4da18c4fa Fast NonRecursiveMutex support by Yakov Markovitch, markovitch@iso.ru,
Guido van Rossum <guido@python.org>
parents: 11673
diff changeset
14 DWORD thread_id ;
cde4da18c4fa Fast NonRecursiveMutex support by Yakov Markovitch, markovitch@iso.ru,
Guido van Rossum <guido@python.org>
parents: 11673
diff changeset
15 HANDLE hevent ;
cde4da18c4fa Fast NonRecursiveMutex support by Yakov Markovitch, markovitch@iso.ru,
Guido van Rossum <guido@python.org>
parents: 11673
diff changeset
16 } NRMUTEX, *PNRMUTEX ;
cde4da18c4fa Fast NonRecursiveMutex support by Yakov Markovitch, markovitch@iso.ru,
Guido van Rossum <guido@python.org>
parents: 11673
diff changeset
17
38579
19430cdff2bd clean up function declarations to conform to PEP-7 style.
Andrew MacIntyre <andymac@bullseye.apana.org.au>
parents: 38578
diff changeset
18
19430cdff2bd clean up function declarations to conform to PEP-7 style.
Andrew MacIntyre <andymac@bullseye.apana.org.au>
parents: 38578
diff changeset
19 BOOL
19430cdff2bd clean up function declarations to conform to PEP-7 style.
Andrew MacIntyre <andymac@bullseye.apana.org.au>
parents: 38578
diff changeset
20 InitializeNonRecursiveMutex(PNRMUTEX mutex)
12584
cde4da18c4fa Fast NonRecursiveMutex support by Yakov Markovitch, markovitch@iso.ru,
Guido van Rossum <guido@python.org>
parents: 11673
diff changeset
21 {
cde4da18c4fa Fast NonRecursiveMutex support by Yakov Markovitch, markovitch@iso.ru,
Guido van Rossum <guido@python.org>
parents: 11673
diff changeset
22 mutex->owned = -1 ; /* No threads have entered NonRecursiveMutex */
cde4da18c4fa Fast NonRecursiveMutex support by Yakov Markovitch, markovitch@iso.ru,
Guido van Rossum <guido@python.org>
parents: 11673
diff changeset
23 mutex->thread_id = 0 ;
cde4da18c4fa Fast NonRecursiveMutex support by Yakov Markovitch, markovitch@iso.ru,
Guido van Rossum <guido@python.org>
parents: 11673
diff changeset
24 mutex->hevent = CreateEvent(NULL, FALSE, FALSE, NULL) ;
cde4da18c4fa Fast NonRecursiveMutex support by Yakov Markovitch, markovitch@iso.ru,
Guido van Rossum <guido@python.org>
parents: 11673
diff changeset
25 return mutex->hevent != NULL ; /* TRUE if the mutex is created */
cde4da18c4fa Fast NonRecursiveMutex support by Yakov Markovitch, markovitch@iso.ru,
Guido van Rossum <guido@python.org>
parents: 11673
diff changeset
26 }
cde4da18c4fa Fast NonRecursiveMutex support by Yakov Markovitch, markovitch@iso.ru,
Guido van Rossum <guido@python.org>
parents: 11673
diff changeset
27
38579
19430cdff2bd clean up function declarations to conform to PEP-7 style.
Andrew MacIntyre <andymac@bullseye.apana.org.au>
parents: 38578
diff changeset
28 VOID
19430cdff2bd clean up function declarations to conform to PEP-7 style.
Andrew MacIntyre <andymac@bullseye.apana.org.au>
parents: 38578
diff changeset
29 DeleteNonRecursiveMutex(PNRMUTEX mutex)
12584
cde4da18c4fa Fast NonRecursiveMutex support by Yakov Markovitch, markovitch@iso.ru,
Guido van Rossum <guido@python.org>
parents: 11673
diff changeset
30 {
cde4da18c4fa Fast NonRecursiveMutex support by Yakov Markovitch, markovitch@iso.ru,
Guido van Rossum <guido@python.org>
parents: 11673
diff changeset
31 /* No in-use check */
cde4da18c4fa Fast NonRecursiveMutex support by Yakov Markovitch, markovitch@iso.ru,
Guido van Rossum <guido@python.org>
parents: 11673
diff changeset
32 CloseHandle(mutex->hevent) ;
cde4da18c4fa Fast NonRecursiveMutex support by Yakov Markovitch, markovitch@iso.ru,
Guido van Rossum <guido@python.org>
parents: 11673
diff changeset
33 mutex->hevent = NULL ; /* Just in case */
cde4da18c4fa Fast NonRecursiveMutex support by Yakov Markovitch, markovitch@iso.ru,
Guido van Rossum <guido@python.org>
parents: 11673
diff changeset
34 }
cde4da18c4fa Fast NonRecursiveMutex support by Yakov Markovitch, markovitch@iso.ru,
Guido van Rossum <guido@python.org>
parents: 11673
diff changeset
35
38579
19430cdff2bd clean up function declarations to conform to PEP-7 style.
Andrew MacIntyre <andymac@bullseye.apana.org.au>
parents: 38578
diff changeset
36 DWORD
19430cdff2bd clean up function declarations to conform to PEP-7 style.
Andrew MacIntyre <andymac@bullseye.apana.org.au>
parents: 38578
diff changeset
37 EnterNonRecursiveMutex(PNRMUTEX mutex, BOOL wait)
12584
cde4da18c4fa Fast NonRecursiveMutex support by Yakov Markovitch, markovitch@iso.ru,
Guido van Rossum <guido@python.org>
parents: 11673
diff changeset
38 {
cde4da18c4fa Fast NonRecursiveMutex support by Yakov Markovitch, markovitch@iso.ru,
Guido van Rossum <guido@python.org>
parents: 11673
diff changeset
39 /* Assume that the thread waits successfully */
cde4da18c4fa Fast NonRecursiveMutex support by Yakov Markovitch, markovitch@iso.ru,
Guido van Rossum <guido@python.org>
parents: 11673
diff changeset
40 DWORD ret ;
cde4da18c4fa Fast NonRecursiveMutex support by Yakov Markovitch, markovitch@iso.ru,
Guido van Rossum <guido@python.org>
parents: 11673
diff changeset
41
cde4da18c4fa Fast NonRecursiveMutex support by Yakov Markovitch, markovitch@iso.ru,
Guido van Rossum <guido@python.org>
parents: 11673
diff changeset
42 /* InterlockedIncrement(&mutex->owned) == 0 means that no thread currently owns the mutex */
cde4da18c4fa Fast NonRecursiveMutex support by Yakov Markovitch, markovitch@iso.ru,
Guido van Rossum <guido@python.org>
parents: 11673
diff changeset
43 if (!wait)
cde4da18c4fa Fast NonRecursiveMutex support by Yakov Markovitch, markovitch@iso.ru,
Guido van Rossum <guido@python.org>
parents: 11673
diff changeset
44 {
41590
1c1705bf36b8 Fix problems in x64 build that were discovered by the testsuite:
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 41525
diff changeset
45 if (InterlockedCompareExchange(&mutex->owned, 0, -1) != -1)
12584
cde4da18c4fa Fast NonRecursiveMutex support by Yakov Markovitch, markovitch@iso.ru,
Guido van Rossum <guido@python.org>
parents: 11673
diff changeset
46 return WAIT_TIMEOUT ;
cde4da18c4fa Fast NonRecursiveMutex support by Yakov Markovitch, markovitch@iso.ru,
Guido van Rossum <guido@python.org>
parents: 11673
diff changeset
47 ret = WAIT_OBJECT_0 ;
cde4da18c4fa Fast NonRecursiveMutex support by Yakov Markovitch, markovitch@iso.ru,
Guido van Rossum <guido@python.org>
parents: 11673
diff changeset
48 }
cde4da18c4fa Fast NonRecursiveMutex support by Yakov Markovitch, markovitch@iso.ru,
Guido van Rossum <guido@python.org>
parents: 11673
diff changeset
49 else
cde4da18c4fa Fast NonRecursiveMutex support by Yakov Markovitch, markovitch@iso.ru,
Guido van Rossum <guido@python.org>
parents: 11673
diff changeset
50 ret = InterlockedIncrement(&mutex->owned) ?
cde4da18c4fa Fast NonRecursiveMutex support by Yakov Markovitch, markovitch@iso.ru,
Guido van Rossum <guido@python.org>
parents: 11673
diff changeset
51 /* Some thread owns the mutex, let's wait... */
cde4da18c4fa Fast NonRecursiveMutex support by Yakov Markovitch, markovitch@iso.ru,
Guido van Rossum <guido@python.org>
parents: 11673
diff changeset
52 WaitForSingleObject(mutex->hevent, INFINITE) : WAIT_OBJECT_0 ;
cde4da18c4fa Fast NonRecursiveMutex support by Yakov Markovitch, markovitch@iso.ru,
Guido van Rossum <guido@python.org>
parents: 11673
diff changeset
53
cde4da18c4fa Fast NonRecursiveMutex support by Yakov Markovitch, markovitch@iso.ru,
Guido van Rossum <guido@python.org>
parents: 11673
diff changeset
54 mutex->thread_id = GetCurrentThreadId() ; /* We own it */
cde4da18c4fa Fast NonRecursiveMutex support by Yakov Markovitch, markovitch@iso.ru,
Guido van Rossum <guido@python.org>
parents: 11673
diff changeset
55 return ret ;
cde4da18c4fa Fast NonRecursiveMutex support by Yakov Markovitch, markovitch@iso.ru,
Guido van Rossum <guido@python.org>
parents: 11673
diff changeset
56 }
cde4da18c4fa Fast NonRecursiveMutex support by Yakov Markovitch, markovitch@iso.ru,
Guido van Rossum <guido@python.org>
parents: 11673
diff changeset
57
38579
19430cdff2bd clean up function declarations to conform to PEP-7 style.
Andrew MacIntyre <andymac@bullseye.apana.org.au>
parents: 38578
diff changeset
58 BOOL
19430cdff2bd clean up function declarations to conform to PEP-7 style.
Andrew MacIntyre <andymac@bullseye.apana.org.au>
parents: 38578
diff changeset
59 LeaveNonRecursiveMutex(PNRMUTEX mutex)
12584
cde4da18c4fa Fast NonRecursiveMutex support by Yakov Markovitch, markovitch@iso.ru,
Guido van Rossum <guido@python.org>
parents: 11673
diff changeset
60 {
cde4da18c4fa Fast NonRecursiveMutex support by Yakov Markovitch, markovitch@iso.ru,
Guido van Rossum <guido@python.org>
parents: 11673
diff changeset
61 /* We don't own the mutex */
cde4da18c4fa Fast NonRecursiveMutex support by Yakov Markovitch, markovitch@iso.ru,
Guido van Rossum <guido@python.org>
parents: 11673
diff changeset
62 mutex->thread_id = 0 ;
cde4da18c4fa Fast NonRecursiveMutex support by Yakov Markovitch, markovitch@iso.ru,
Guido van Rossum <guido@python.org>
parents: 11673
diff changeset
63 return
cde4da18c4fa Fast NonRecursiveMutex support by Yakov Markovitch, markovitch@iso.ru,
Guido van Rossum <guido@python.org>
parents: 11673
diff changeset
64 InterlockedDecrement(&mutex->owned) < 0 ||
cde4da18c4fa Fast NonRecursiveMutex support by Yakov Markovitch, markovitch@iso.ru,
Guido van Rossum <guido@python.org>
parents: 11673
diff changeset
65 SetEvent(mutex->hevent) ; /* Other threads are waiting, wake one on them up */
cde4da18c4fa Fast NonRecursiveMutex support by Yakov Markovitch, markovitch@iso.ru,
Guido van Rossum <guido@python.org>
parents: 11673
diff changeset
66 }
cde4da18c4fa Fast NonRecursiveMutex support by Yakov Markovitch, markovitch@iso.ru,
Guido van Rossum <guido@python.org>
parents: 11673
diff changeset
67
38579
19430cdff2bd clean up function declarations to conform to PEP-7 style.
Andrew MacIntyre <andymac@bullseye.apana.org.au>
parents: 38578
diff changeset
68 PNRMUTEX
19430cdff2bd clean up function declarations to conform to PEP-7 style.
Andrew MacIntyre <andymac@bullseye.apana.org.au>
parents: 38578
diff changeset
69 AllocNonRecursiveMutex(void)
12584
cde4da18c4fa Fast NonRecursiveMutex support by Yakov Markovitch, markovitch@iso.ru,
Guido van Rossum <guido@python.org>
parents: 11673
diff changeset
70 {
cde4da18c4fa Fast NonRecursiveMutex support by Yakov Markovitch, markovitch@iso.ru,
Guido van Rossum <guido@python.org>
parents: 11673
diff changeset
71 PNRMUTEX mutex = (PNRMUTEX)malloc(sizeof(NRMUTEX)) ;
cde4da18c4fa Fast NonRecursiveMutex support by Yakov Markovitch, markovitch@iso.ru,
Guido van Rossum <guido@python.org>
parents: 11673
diff changeset
72 if (mutex && !InitializeNonRecursiveMutex(mutex))
cde4da18c4fa Fast NonRecursiveMutex support by Yakov Markovitch, markovitch@iso.ru,
Guido van Rossum <guido@python.org>
parents: 11673
diff changeset
73 {
cde4da18c4fa Fast NonRecursiveMutex support by Yakov Markovitch, markovitch@iso.ru,
Guido van Rossum <guido@python.org>
parents: 11673
diff changeset
74 free(mutex) ;
cde4da18c4fa Fast NonRecursiveMutex support by Yakov Markovitch, markovitch@iso.ru,
Guido van Rossum <guido@python.org>
parents: 11673
diff changeset
75 mutex = NULL ;
cde4da18c4fa Fast NonRecursiveMutex support by Yakov Markovitch, markovitch@iso.ru,
Guido van Rossum <guido@python.org>
parents: 11673
diff changeset
76 }
cde4da18c4fa Fast NonRecursiveMutex support by Yakov Markovitch, markovitch@iso.ru,
Guido van Rossum <guido@python.org>
parents: 11673
diff changeset
77 return mutex ;
cde4da18c4fa Fast NonRecursiveMutex support by Yakov Markovitch, markovitch@iso.ru,
Guido van Rossum <guido@python.org>
parents: 11673
diff changeset
78 }
cde4da18c4fa Fast NonRecursiveMutex support by Yakov Markovitch, markovitch@iso.ru,
Guido van Rossum <guido@python.org>
parents: 11673
diff changeset
79
38579
19430cdff2bd clean up function declarations to conform to PEP-7 style.
Andrew MacIntyre <andymac@bullseye.apana.org.au>
parents: 38578
diff changeset
80 void
19430cdff2bd clean up function declarations to conform to PEP-7 style.
Andrew MacIntyre <andymac@bullseye.apana.org.au>
parents: 38578
diff changeset
81 FreeNonRecursiveMutex(PNRMUTEX mutex)
12584
cde4da18c4fa Fast NonRecursiveMutex support by Yakov Markovitch, markovitch@iso.ru,
Guido van Rossum <guido@python.org>
parents: 11673
diff changeset
82 {
cde4da18c4fa Fast NonRecursiveMutex support by Yakov Markovitch, markovitch@iso.ru,
Guido van Rossum <guido@python.org>
parents: 11673
diff changeset
83 if (mutex)
cde4da18c4fa Fast NonRecursiveMutex support by Yakov Markovitch, markovitch@iso.ru,
Guido van Rossum <guido@python.org>
parents: 11673
diff changeset
84 {
cde4da18c4fa Fast NonRecursiveMutex support by Yakov Markovitch, markovitch@iso.ru,
Guido van Rossum <guido@python.org>
parents: 11673
diff changeset
85 DeleteNonRecursiveMutex(mutex) ;
cde4da18c4fa Fast NonRecursiveMutex support by Yakov Markovitch, markovitch@iso.ru,
Guido van Rossum <guido@python.org>
parents: 11673
diff changeset
86 free(mutex) ;
cde4da18c4fa Fast NonRecursiveMutex support by Yakov Markovitch, markovitch@iso.ru,
Guido van Rossum <guido@python.org>
parents: 11673
diff changeset
87 }
cde4da18c4fa Fast NonRecursiveMutex support by Yakov Markovitch, markovitch@iso.ru,
Guido van Rossum <guido@python.org>
parents: 11673
diff changeset
88 }
cde4da18c4fa Fast NonRecursiveMutex support by Yakov Markovitch, markovitch@iso.ru,
Guido van Rossum <guido@python.org>
parents: 11673
diff changeset
89
9679
877d23bd5bdc Thanks to Chris Herborth, the thread primitives now have proper Py*
Guido van Rossum <guido@python.org>
parents: 6029
diff changeset
90 long PyThread_get_thread_ident(void);
2152
1a52351a00b2 nt thread support
Guido van Rossum <guido@python.org>
parents:
diff changeset
91
1a52351a00b2 nt thread support
Guido van Rossum <guido@python.org>
parents:
diff changeset
92 /*
1a52351a00b2 nt thread support
Guido van Rossum <guido@python.org>
parents:
diff changeset
93 * Initialization of the C package, should not be needed.
1a52351a00b2 nt thread support
Guido van Rossum <guido@python.org>
parents:
diff changeset
94 */
38579
19430cdff2bd clean up function declarations to conform to PEP-7 style.
Andrew MacIntyre <andymac@bullseye.apana.org.au>
parents: 38578
diff changeset
95 static void
19430cdff2bd clean up function declarations to conform to PEP-7 style.
Andrew MacIntyre <andymac@bullseye.apana.org.au>
parents: 38578
diff changeset
96 PyThread__init_thread(void)
2152
1a52351a00b2 nt thread support
Guido van Rossum <guido@python.org>
parents:
diff changeset
97 {
1a52351a00b2 nt thread support
Guido van Rossum <guido@python.org>
parents:
diff changeset
98 }
1a52351a00b2 nt thread support
Guido van Rossum <guido@python.org>
parents:
diff changeset
99
1a52351a00b2 nt thread support
Guido van Rossum <guido@python.org>
parents:
diff changeset
100 /*
1a52351a00b2 nt thread support
Guido van Rossum <guido@python.org>
parents:
diff changeset
101 * Thread support.
1a52351a00b2 nt thread support
Guido van Rossum <guido@python.org>
parents:
diff changeset
102 */
20468
ebfd87e87884 Partial patch from SF #452266, by Jason Petrone.
Guido van Rossum <guido@python.org>
parents: 19568
diff changeset
103
ebfd87e87884 Partial patch from SF #452266, by Jason Petrone.
Guido van Rossum <guido@python.org>
parents: 19568
diff changeset
104 typedef struct {
ebfd87e87884 Partial patch from SF #452266, by Jason Petrone.
Guido van Rossum <guido@python.org>
parents: 19568
diff changeset
105 void (*func)(void*);
29755
59da5b57c61b An Anonymous Coward on c.l.py posted a little program with bizarre
Tim Peters <tim.peters@gmail.com>
parents: 22092
diff changeset
106 void *arg;
20468
ebfd87e87884 Partial patch from SF #452266, by Jason Petrone.
Guido van Rossum <guido@python.org>
parents: 19568
diff changeset
107 } callobj;
ebfd87e87884 Partial patch from SF #452266, by Jason Petrone.
Guido van Rossum <guido@python.org>
parents: 19568
diff changeset
108
50669
fdcca8793eb9 Issue 3582. Improved thread support and TLS for Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 41590
diff changeset
109 /* thunker to call a __cdecl function instead of a __stdcall */
fdcca8793eb9 Issue 3582. Improved thread support and TLS for Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 41590
diff changeset
110 static unsigned __stdcall
20468
ebfd87e87884 Partial patch from SF #452266, by Jason Petrone.
Guido van Rossum <guido@python.org>
parents: 19568
diff changeset
111 bootstrap(void *call)
ebfd87e87884 Partial patch from SF #452266, by Jason Petrone.
Guido van Rossum <guido@python.org>
parents: 19568
diff changeset
112 {
ebfd87e87884 Partial patch from SF #452266, by Jason Petrone.
Guido van Rossum <guido@python.org>
parents: 19568
diff changeset
113 callobj *obj = (callobj*)call;
ebfd87e87884 Partial patch from SF #452266, by Jason Petrone.
Guido van Rossum <guido@python.org>
parents: 19568
diff changeset
114 void (*func)(void*) = obj->func;
ebfd87e87884 Partial patch from SF #452266, by Jason Petrone.
Guido van Rossum <guido@python.org>
parents: 19568
diff changeset
115 void *arg = obj->arg;
50669
fdcca8793eb9 Issue 3582. Improved thread support and TLS for Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 41590
diff changeset
116 HeapFree(GetProcessHeap(), 0, obj);
20468
ebfd87e87884 Partial patch from SF #452266, by Jason Petrone.
Guido van Rossum <guido@python.org>
parents: 19568
diff changeset
117 func(arg);
ebfd87e87884 Partial patch from SF #452266, by Jason Petrone.
Guido van Rossum <guido@python.org>
parents: 19568
diff changeset
118 return 0;
ebfd87e87884 Partial patch from SF #452266, by Jason Petrone.
Guido van Rossum <guido@python.org>
parents: 19568
diff changeset
119 }
ebfd87e87884 Partial patch from SF #452266, by Jason Petrone.
Guido van Rossum <guido@python.org>
parents: 19568
diff changeset
120
29755
59da5b57c61b An Anonymous Coward on c.l.py posted a little program with bizarre
Tim Peters <tim.peters@gmail.com>
parents: 22092
diff changeset
121 long
59da5b57c61b An Anonymous Coward on c.l.py posted a little program with bizarre
Tim Peters <tim.peters@gmail.com>
parents: 22092
diff changeset
122 PyThread_start_new_thread(void (*func)(void *), void *arg)
2152
1a52351a00b2 nt thread support
Guido van Rossum <guido@python.org>
parents:
diff changeset
123 {
50669
fdcca8793eb9 Issue 3582. Improved thread support and TLS for Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 41590
diff changeset
124 HANDLE hThread;
fdcca8793eb9 Issue 3582. Improved thread support and TLS for Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 41590
diff changeset
125 unsigned threadID;
fdcca8793eb9 Issue 3582. Improved thread support and TLS for Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 41590
diff changeset
126 callobj *obj;
fdcca8793eb9 Issue 3582. Improved thread support and TLS for Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 41590
diff changeset
127
29755
59da5b57c61b An Anonymous Coward on c.l.py posted a little program with bizarre
Tim Peters <tim.peters@gmail.com>
parents: 22092
diff changeset
128 dprintf(("%ld: PyThread_start_new_thread called\n",
59da5b57c61b An Anonymous Coward on c.l.py posted a little program with bizarre
Tim Peters <tim.peters@gmail.com>
parents: 22092
diff changeset
129 PyThread_get_thread_ident()));
2152
1a52351a00b2 nt thread support
Guido van Rossum <guido@python.org>
parents:
diff changeset
130 if (!initialized)
9679
877d23bd5bdc Thanks to Chris Herborth, the thread primitives now have proper Py*
Guido van Rossum <guido@python.org>
parents: 6029
diff changeset
131 PyThread_init_thread();
2152
1a52351a00b2 nt thread support
Guido van Rossum <guido@python.org>
parents:
diff changeset
132
50669
fdcca8793eb9 Issue 3582. Improved thread support and TLS for Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 41590
diff changeset
133 obj = (callobj*)HeapAlloc(GetProcessHeap(), 0, sizeof(*obj));
fdcca8793eb9 Issue 3582. Improved thread support and TLS for Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 41590
diff changeset
134 if (!obj)
29755
59da5b57c61b An Anonymous Coward on c.l.py posted a little program with bizarre
Tim Peters <tim.peters@gmail.com>
parents: 22092
diff changeset
135 return -1;
50669
fdcca8793eb9 Issue 3582. Improved thread support and TLS for Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 41590
diff changeset
136 obj->func = func;
fdcca8793eb9 Issue 3582. Improved thread support and TLS for Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 41590
diff changeset
137 obj->arg = arg;
fdcca8793eb9 Issue 3582. Improved thread support and TLS for Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 41590
diff changeset
138 hThread = (HANDLE)_beginthreadex(0,
41590
1c1705bf36b8 Fix problems in x64 build that were discovered by the testsuite:
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 41525
diff changeset
139 Py_SAFE_DOWNCAST(_pythread_stacksize,
50669
fdcca8793eb9 Issue 3582. Improved thread support and TLS for Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 41590
diff changeset
140 Py_ssize_t, unsigned int),
fdcca8793eb9 Issue 3582. Improved thread support and TLS for Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 41590
diff changeset
141 bootstrap, obj,
fdcca8793eb9 Issue 3582. Improved thread support and TLS for Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 41590
diff changeset
142 0, &threadID);
fdcca8793eb9 Issue 3582. Improved thread support and TLS for Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 41590
diff changeset
143 if (hThread == 0) {
29755
59da5b57c61b An Anonymous Coward on c.l.py posted a little program with bizarre
Tim Peters <tim.peters@gmail.com>
parents: 22092
diff changeset
144 /* I've seen errno == EAGAIN here, which means "there are
59da5b57c61b An Anonymous Coward on c.l.py posted a little program with bizarre
Tim Peters <tim.peters@gmail.com>
parents: 22092
diff changeset
145 * too many threads".
59da5b57c61b An Anonymous Coward on c.l.py posted a little program with bizarre
Tim Peters <tim.peters@gmail.com>
parents: 22092
diff changeset
146 */
50669
fdcca8793eb9 Issue 3582. Improved thread support and TLS for Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 41590
diff changeset
147 dprintf(("%ld: PyThread_start_new_thread failed, errno %d\n",
fdcca8793eb9 Issue 3582. Improved thread support and TLS for Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 41590
diff changeset
148 PyThread_get_thread_ident(), errno));
fdcca8793eb9 Issue 3582. Improved thread support and TLS for Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 41590
diff changeset
149 threadID = (unsigned)-1;
fdcca8793eb9 Issue 3582. Improved thread support and TLS for Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 41590
diff changeset
150 HeapFree(GetProcessHeap(), 0, obj);
2152
1a52351a00b2 nt thread support
Guido van Rossum <guido@python.org>
parents:
diff changeset
151 }
29755
59da5b57c61b An Anonymous Coward on c.l.py posted a little program with bizarre
Tim Peters <tim.peters@gmail.com>
parents: 22092
diff changeset
152 else {
59da5b57c61b An Anonymous Coward on c.l.py posted a little program with bizarre
Tim Peters <tim.peters@gmail.com>
parents: 22092
diff changeset
153 dprintf(("%ld: PyThread_start_new_thread succeeded: %p\n",
50669
fdcca8793eb9 Issue 3582. Improved thread support and TLS for Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 41590
diff changeset
154 PyThread_get_thread_ident(), (void*)hThread));
29755
59da5b57c61b An Anonymous Coward on c.l.py posted a little program with bizarre
Tim Peters <tim.peters@gmail.com>
parents: 22092
diff changeset
155 /* wait for thread to initialize, so we can get its id */
50669
fdcca8793eb9 Issue 3582. Improved thread support and TLS for Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 41590
diff changeset
156 CloseHandle(hThread);
29755
59da5b57c61b An Anonymous Coward on c.l.py posted a little program with bizarre
Tim Peters <tim.peters@gmail.com>
parents: 22092
diff changeset
157 }
50669
fdcca8793eb9 Issue 3582. Improved thread support and TLS for Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 41590
diff changeset
158 return (long) threadID;
2152
1a52351a00b2 nt thread support
Guido van Rossum <guido@python.org>
parents:
diff changeset
159 }
1a52351a00b2 nt thread support
Guido van Rossum <guido@python.org>
parents:
diff changeset
160
1a52351a00b2 nt thread support
Guido van Rossum <guido@python.org>
parents:
diff changeset
161 /*
1a52351a00b2 nt thread support
Guido van Rossum <guido@python.org>
parents:
diff changeset
162 * Return the thread Id instead of an handle. The Id is said to uniquely identify the
1a52351a00b2 nt thread support
Guido van Rossum <guido@python.org>
parents:
diff changeset
163 * thread in the system
1a52351a00b2 nt thread support
Guido van Rossum <guido@python.org>
parents:
diff changeset
164 */
38579
19430cdff2bd clean up function declarations to conform to PEP-7 style.
Andrew MacIntyre <andymac@bullseye.apana.org.au>
parents: 38578
diff changeset
165 long
19430cdff2bd clean up function declarations to conform to PEP-7 style.
Andrew MacIntyre <andymac@bullseye.apana.org.au>
parents: 38578
diff changeset
166 PyThread_get_thread_ident(void)
2152
1a52351a00b2 nt thread support
Guido van Rossum <guido@python.org>
parents:
diff changeset
167 {
1a52351a00b2 nt thread support
Guido van Rossum <guido@python.org>
parents:
diff changeset
168 if (!initialized)
9679
877d23bd5bdc Thanks to Chris Herborth, the thread primitives now have proper Py*
Guido van Rossum <guido@python.org>
parents: 6029
diff changeset
169 PyThread_init_thread();
12584
cde4da18c4fa Fast NonRecursiveMutex support by Yakov Markovitch, markovitch@iso.ru,
Guido van Rossum <guido@python.org>
parents: 11673
diff changeset
170
2152
1a52351a00b2 nt thread support
Guido van Rossum <guido@python.org>
parents:
diff changeset
171 return GetCurrentThreadId();
1a52351a00b2 nt thread support
Guido van Rossum <guido@python.org>
parents:
diff changeset
172 }
1a52351a00b2 nt thread support
Guido van Rossum <guido@python.org>
parents:
diff changeset
173
38579
19430cdff2bd clean up function declarations to conform to PEP-7 style.
Andrew MacIntyre <andymac@bullseye.apana.org.au>
parents: 38578
diff changeset
174 void
19430cdff2bd clean up function declarations to conform to PEP-7 style.
Andrew MacIntyre <andymac@bullseye.apana.org.au>
parents: 38578
diff changeset
175 PyThread_exit_thread(void)
2152
1a52351a00b2 nt thread support
Guido van Rossum <guido@python.org>
parents:
diff changeset
176 {
50669
fdcca8793eb9 Issue 3582. Improved thread support and TLS for Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 41590
diff changeset
177 dprintf(("%ld: PyThread_exit_thread called\n", PyThread_get_thread_ident()));
fdcca8793eb9 Issue 3582. Improved thread support and TLS for Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 41590
diff changeset
178 if (!initialized)
fdcca8793eb9 Issue 3582. Improved thread support and TLS for Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 41590
diff changeset
179 exit(0);
fdcca8793eb9 Issue 3582. Improved thread support and TLS for Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 41590
diff changeset
180 _endthreadex(0);
2152
1a52351a00b2 nt thread support
Guido van Rossum <guido@python.org>
parents:
diff changeset
181 }
1a52351a00b2 nt thread support
Guido van Rossum <guido@python.org>
parents:
diff changeset
182
1a52351a00b2 nt thread support
Guido van Rossum <guido@python.org>
parents:
diff changeset
183 #ifndef NO_EXIT_PROG
50669
fdcca8793eb9 Issue 3582. Improved thread support and TLS for Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 41590
diff changeset
184 void
fdcca8793eb9 Issue 3582. Improved thread support and TLS for Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 41590
diff changeset
185 PyThread_exit_prog(int status)
2152
1a52351a00b2 nt thread support
Guido van Rossum <guido@python.org>
parents:
diff changeset
186 {
9679
877d23bd5bdc Thanks to Chris Herborth, the thread primitives now have proper Py*
Guido van Rossum <guido@python.org>
parents: 6029
diff changeset
187 dprintf(("PyThread_exit_prog(%d) called\n", status));
2152
1a52351a00b2 nt thread support
Guido van Rossum <guido@python.org>
parents:
diff changeset
188 if (!initialized)
50669
fdcca8793eb9 Issue 3582. Improved thread support and TLS for Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 41590
diff changeset
189 exit(status);
2152
1a52351a00b2 nt thread support
Guido van Rossum <guido@python.org>
parents:
diff changeset
190 }
1a52351a00b2 nt thread support
Guido van Rossum <guido@python.org>
parents:
diff changeset
191 #endif /* NO_EXIT_PROG */
1a52351a00b2 nt thread support
Guido van Rossum <guido@python.org>
parents:
diff changeset
192
1a52351a00b2 nt thread support
Guido van Rossum <guido@python.org>
parents:
diff changeset
193 /*
1a52351a00b2 nt thread support
Guido van Rossum <guido@python.org>
parents:
diff changeset
194 * Lock support. It has too be implemented as semaphores.
1a52351a00b2 nt thread support
Guido van Rossum <guido@python.org>
parents:
diff changeset
195 * I [Dag] tried to implement it with mutex but I could find a way to
1a52351a00b2 nt thread support
Guido van Rossum <guido@python.org>
parents:
diff changeset
196 * tell whether a thread already own the lock or not.
1a52351a00b2 nt thread support
Guido van Rossum <guido@python.org>
parents:
diff changeset
197 */
38579
19430cdff2bd clean up function declarations to conform to PEP-7 style.
Andrew MacIntyre <andymac@bullseye.apana.org.au>
parents: 38578
diff changeset
198 PyThread_type_lock
19430cdff2bd clean up function declarations to conform to PEP-7 style.
Andrew MacIntyre <andymac@bullseye.apana.org.au>
parents: 38578
diff changeset
199 PyThread_allocate_lock(void)
2152
1a52351a00b2 nt thread support
Guido van Rossum <guido@python.org>
parents:
diff changeset
200 {
12584
cde4da18c4fa Fast NonRecursiveMutex support by Yakov Markovitch, markovitch@iso.ru,
Guido van Rossum <guido@python.org>
parents: 11673
diff changeset
201 PNRMUTEX aLock;
2152
1a52351a00b2 nt thread support
Guido van Rossum <guido@python.org>
parents:
diff changeset
202
9679
877d23bd5bdc Thanks to Chris Herborth, the thread primitives now have proper Py*
Guido van Rossum <guido@python.org>
parents: 6029
diff changeset
203 dprintf(("PyThread_allocate_lock called\n"));
2152
1a52351a00b2 nt thread support
Guido van Rossum <guido@python.org>
parents:
diff changeset
204 if (!initialized)
9679
877d23bd5bdc Thanks to Chris Herborth, the thread primitives now have proper Py*
Guido van Rossum <guido@python.org>
parents: 6029
diff changeset
205 PyThread_init_thread();
2152
1a52351a00b2 nt thread support
Guido van Rossum <guido@python.org>
parents:
diff changeset
206
12584
cde4da18c4fa Fast NonRecursiveMutex support by Yakov Markovitch, markovitch@iso.ru,
Guido van Rossum <guido@python.org>
parents: 11673
diff changeset
207 aLock = AllocNonRecursiveMutex() ;
2152
1a52351a00b2 nt thread support
Guido van Rossum <guido@python.org>
parents:
diff changeset
208
13210
ff243b0f16ee Trent Mick <trentm@activestate.com>:
Fred Drake <fdrake@acm.org>
parents: 13138
diff changeset
209 dprintf(("%ld: PyThread_allocate_lock() -> %p\n", PyThread_get_thread_ident(), aLock));
2152
1a52351a00b2 nt thread support
Guido van Rossum <guido@python.org>
parents:
diff changeset
210
9679
877d23bd5bdc Thanks to Chris Herborth, the thread primitives now have proper Py*
Guido van Rossum <guido@python.org>
parents: 6029
diff changeset
211 return (PyThread_type_lock) aLock;
2152
1a52351a00b2 nt thread support
Guido van Rossum <guido@python.org>
parents:
diff changeset
212 }
1a52351a00b2 nt thread support
Guido van Rossum <guido@python.org>
parents:
diff changeset
213
38579
19430cdff2bd clean up function declarations to conform to PEP-7 style.
Andrew MacIntyre <andymac@bullseye.apana.org.au>
parents: 38578
diff changeset
214 void
19430cdff2bd clean up function declarations to conform to PEP-7 style.
Andrew MacIntyre <andymac@bullseye.apana.org.au>
parents: 38578
diff changeset
215 PyThread_free_lock(PyThread_type_lock aLock)
2152
1a52351a00b2 nt thread support
Guido van Rossum <guido@python.org>
parents:
diff changeset
216 {
13210
ff243b0f16ee Trent Mick <trentm@activestate.com>:
Fred Drake <fdrake@acm.org>
parents: 13138
diff changeset
217 dprintf(("%ld: PyThread_free_lock(%p) called\n", PyThread_get_thread_ident(),aLock));
2152
1a52351a00b2 nt thread support
Guido van Rossum <guido@python.org>
parents:
diff changeset
218
12584
cde4da18c4fa Fast NonRecursiveMutex support by Yakov Markovitch, markovitch@iso.ru,
Guido van Rossum <guido@python.org>
parents: 11673
diff changeset
219 FreeNonRecursiveMutex(aLock) ;
2152
1a52351a00b2 nt thread support
Guido van Rossum <guido@python.org>
parents:
diff changeset
220 }
1a52351a00b2 nt thread support
Guido van Rossum <guido@python.org>
parents:
diff changeset
221
1a52351a00b2 nt thread support
Guido van Rossum <guido@python.org>
parents:
diff changeset
222 /*
1a52351a00b2 nt thread support
Guido van Rossum <guido@python.org>
parents:
diff changeset
223 * Return 1 on success if the lock was acquired
1a52351a00b2 nt thread support
Guido van Rossum <guido@python.org>
parents:
diff changeset
224 *
1a52351a00b2 nt thread support
Guido van Rossum <guido@python.org>
parents:
diff changeset
225 * and 0 if the lock was not acquired. This means a 0 is returned
1a52351a00b2 nt thread support
Guido van Rossum <guido@python.org>
parents:
diff changeset
226 * if the lock has already been acquired by this thread!
1a52351a00b2 nt thread support
Guido van Rossum <guido@python.org>
parents:
diff changeset
227 */
38579
19430cdff2bd clean up function declarations to conform to PEP-7 style.
Andrew MacIntyre <andymac@bullseye.apana.org.au>
parents: 38578
diff changeset
228 int
19430cdff2bd clean up function declarations to conform to PEP-7 style.
Andrew MacIntyre <andymac@bullseye.apana.org.au>
parents: 38578
diff changeset
229 PyThread_acquire_lock(PyThread_type_lock aLock, int waitflag)
2152
1a52351a00b2 nt thread support
Guido van Rossum <guido@python.org>
parents:
diff changeset
230 {
12584
cde4da18c4fa Fast NonRecursiveMutex support by Yakov Markovitch, markovitch@iso.ru,
Guido van Rossum <guido@python.org>
parents: 11673
diff changeset
231 int success ;
2152
1a52351a00b2 nt thread support
Guido van Rossum <guido@python.org>
parents:
diff changeset
232
13210
ff243b0f16ee Trent Mick <trentm@activestate.com>:
Fred Drake <fdrake@acm.org>
parents: 13138
diff changeset
233 dprintf(("%ld: PyThread_acquire_lock(%p, %d) called\n", PyThread_get_thread_ident(),aLock, waitflag));
2152
1a52351a00b2 nt thread support
Guido van Rossum <guido@python.org>
parents:
diff changeset
234
35217
b86392f55b59 bug [ 1234979 ] Lock.acquire treats only 1 as True
Georg Brandl <georg@python.org>
parents: 29755
diff changeset
235 success = aLock && EnterNonRecursiveMutex((PNRMUTEX) aLock, (waitflag ? INFINITE : 0)) == WAIT_OBJECT_0 ;
2152
1a52351a00b2 nt thread support
Guido van Rossum <guido@python.org>
parents:
diff changeset
236
13210
ff243b0f16ee Trent Mick <trentm@activestate.com>:
Fred Drake <fdrake@acm.org>
parents: 13138
diff changeset
237 dprintf(("%ld: PyThread_acquire_lock(%p, %d) -> %d\n", PyThread_get_thread_ident(),aLock, waitflag, success));
2152
1a52351a00b2 nt thread support
Guido van Rossum <guido@python.org>
parents:
diff changeset
238
1a52351a00b2 nt thread support
Guido van Rossum <guido@python.org>
parents:
diff changeset
239 return success;
1a52351a00b2 nt thread support
Guido van Rossum <guido@python.org>
parents:
diff changeset
240 }
1a52351a00b2 nt thread support
Guido van Rossum <guido@python.org>
parents:
diff changeset
241
38579
19430cdff2bd clean up function declarations to conform to PEP-7 style.
Andrew MacIntyre <andymac@bullseye.apana.org.au>
parents: 38578
diff changeset
242 void
19430cdff2bd clean up function declarations to conform to PEP-7 style.
Andrew MacIntyre <andymac@bullseye.apana.org.au>
parents: 38578
diff changeset
243 PyThread_release_lock(PyThread_type_lock aLock)
2152
1a52351a00b2 nt thread support
Guido van Rossum <guido@python.org>
parents:
diff changeset
244 {
13210
ff243b0f16ee Trent Mick <trentm@activestate.com>:
Fred Drake <fdrake@acm.org>
parents: 13138
diff changeset
245 dprintf(("%ld: PyThread_release_lock(%p) called\n", PyThread_get_thread_ident(),aLock));
2152
1a52351a00b2 nt thread support
Guido van Rossum <guido@python.org>
parents:
diff changeset
246
12584
cde4da18c4fa Fast NonRecursiveMutex support by Yakov Markovitch, markovitch@iso.ru,
Guido van Rossum <guido@python.org>
parents: 11673
diff changeset
247 if (!(aLock && LeaveNonRecursiveMutex((PNRMUTEX) aLock)))
41525
b68272449df4 Merge change 54909 from release25-maint: Fix several minor issues discovered using code analysis in VisualStudio 2005 Team Edition
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 38794
diff changeset
248 dprintf(("%ld: Could not PyThread_release_lock(%p) error: %ld\n", PyThread_get_thread_ident(), aLock, GetLastError()));
2152
1a52351a00b2 nt thread support
Guido van Rossum <guido@python.org>
parents:
diff changeset
249 }
38794
f7d23bca599f Patch #1454481: Make thread stack size runtime tunable.
Andrew MacIntyre <andymac@bullseye.apana.org.au>
parents: 38716
diff changeset
250
f7d23bca599f Patch #1454481: Make thread stack size runtime tunable.
Andrew MacIntyre <andymac@bullseye.apana.org.au>
parents: 38716
diff changeset
251 /* minimum/maximum thread stack sizes supported */
f7d23bca599f Patch #1454481: Make thread stack size runtime tunable.
Andrew MacIntyre <andymac@bullseye.apana.org.au>
parents: 38716
diff changeset
252 #define THREAD_MIN_STACKSIZE 0x8000 /* 32kB */
f7d23bca599f Patch #1454481: Make thread stack size runtime tunable.
Andrew MacIntyre <andymac@bullseye.apana.org.au>
parents: 38716
diff changeset
253 #define THREAD_MAX_STACKSIZE 0x10000000 /* 256MB */
f7d23bca599f Patch #1454481: Make thread stack size runtime tunable.
Andrew MacIntyre <andymac@bullseye.apana.org.au>
parents: 38716
diff changeset
254
f7d23bca599f Patch #1454481: Make thread stack size runtime tunable.
Andrew MacIntyre <andymac@bullseye.apana.org.au>
parents: 38716
diff changeset
255 /* set the thread stack size.
f7d23bca599f Patch #1454481: Make thread stack size runtime tunable.
Andrew MacIntyre <andymac@bullseye.apana.org.au>
parents: 38716
diff changeset
256 * Return 0 if size is valid, -1 otherwise.
f7d23bca599f Patch #1454481: Make thread stack size runtime tunable.
Andrew MacIntyre <andymac@bullseye.apana.org.au>
parents: 38716
diff changeset
257 */
f7d23bca599f Patch #1454481: Make thread stack size runtime tunable.
Andrew MacIntyre <andymac@bullseye.apana.org.au>
parents: 38716
diff changeset
258 static int
f7d23bca599f Patch #1454481: Make thread stack size runtime tunable.
Andrew MacIntyre <andymac@bullseye.apana.org.au>
parents: 38716
diff changeset
259 _pythread_nt_set_stacksize(size_t size)
f7d23bca599f Patch #1454481: Make thread stack size runtime tunable.
Andrew MacIntyre <andymac@bullseye.apana.org.au>
parents: 38716
diff changeset
260 {
f7d23bca599f Patch #1454481: Make thread stack size runtime tunable.
Andrew MacIntyre <andymac@bullseye.apana.org.au>
parents: 38716
diff changeset
261 /* set to default */
f7d23bca599f Patch #1454481: Make thread stack size runtime tunable.
Andrew MacIntyre <andymac@bullseye.apana.org.au>
parents: 38716
diff changeset
262 if (size == 0) {
f7d23bca599f Patch #1454481: Make thread stack size runtime tunable.
Andrew MacIntyre <andymac@bullseye.apana.org.au>
parents: 38716
diff changeset
263 _pythread_stacksize = 0;
f7d23bca599f Patch #1454481: Make thread stack size runtime tunable.
Andrew MacIntyre <andymac@bullseye.apana.org.au>
parents: 38716
diff changeset
264 return 0;
f7d23bca599f Patch #1454481: Make thread stack size runtime tunable.
Andrew MacIntyre <andymac@bullseye.apana.org.au>
parents: 38716
diff changeset
265 }
f7d23bca599f Patch #1454481: Make thread stack size runtime tunable.
Andrew MacIntyre <andymac@bullseye.apana.org.au>
parents: 38716
diff changeset
266
f7d23bca599f Patch #1454481: Make thread stack size runtime tunable.
Andrew MacIntyre <andymac@bullseye.apana.org.au>
parents: 38716
diff changeset
267 /* valid range? */
f7d23bca599f Patch #1454481: Make thread stack size runtime tunable.
Andrew MacIntyre <andymac@bullseye.apana.org.au>
parents: 38716
diff changeset
268 if (size >= THREAD_MIN_STACKSIZE && size < THREAD_MAX_STACKSIZE) {
f7d23bca599f Patch #1454481: Make thread stack size runtime tunable.
Andrew MacIntyre <andymac@bullseye.apana.org.au>
parents: 38716
diff changeset
269 _pythread_stacksize = size;
f7d23bca599f Patch #1454481: Make thread stack size runtime tunable.
Andrew MacIntyre <andymac@bullseye.apana.org.au>
parents: 38716
diff changeset
270 return 0;
f7d23bca599f Patch #1454481: Make thread stack size runtime tunable.
Andrew MacIntyre <andymac@bullseye.apana.org.au>
parents: 38716
diff changeset
271 }
f7d23bca599f Patch #1454481: Make thread stack size runtime tunable.
Andrew MacIntyre <andymac@bullseye.apana.org.au>
parents: 38716
diff changeset
272
f7d23bca599f Patch #1454481: Make thread stack size runtime tunable.
Andrew MacIntyre <andymac@bullseye.apana.org.au>
parents: 38716
diff changeset
273 return -1;
f7d23bca599f Patch #1454481: Make thread stack size runtime tunable.
Andrew MacIntyre <andymac@bullseye.apana.org.au>
parents: 38716
diff changeset
274 }
f7d23bca599f Patch #1454481: Make thread stack size runtime tunable.
Andrew MacIntyre <andymac@bullseye.apana.org.au>
parents: 38716
diff changeset
275
f7d23bca599f Patch #1454481: Make thread stack size runtime tunable.
Andrew MacIntyre <andymac@bullseye.apana.org.au>
parents: 38716
diff changeset
276 #define THREAD_SET_STACKSIZE(x) _pythread_nt_set_stacksize(x)
50669
fdcca8793eb9 Issue 3582. Improved thread support and TLS for Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 41590
diff changeset
277
fdcca8793eb9 Issue 3582. Improved thread support and TLS for Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 41590
diff changeset
278
fdcca8793eb9 Issue 3582. Improved thread support and TLS for Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 41590
diff changeset
279 /* use native Windows TLS functions */
fdcca8793eb9 Issue 3582. Improved thread support and TLS for Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 41590
diff changeset
280 #define Py_HAVE_NATIVE_TLS
fdcca8793eb9 Issue 3582. Improved thread support and TLS for Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 41590
diff changeset
281
fdcca8793eb9 Issue 3582. Improved thread support and TLS for Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 41590
diff changeset
282 #ifdef Py_HAVE_NATIVE_TLS
fdcca8793eb9 Issue 3582. Improved thread support and TLS for Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 41590
diff changeset
283 int
fdcca8793eb9 Issue 3582. Improved thread support and TLS for Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 41590
diff changeset
284 PyThread_create_key(void)
fdcca8793eb9 Issue 3582. Improved thread support and TLS for Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 41590
diff changeset
285 {
fdcca8793eb9 Issue 3582. Improved thread support and TLS for Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 41590
diff changeset
286 return (int) TlsAlloc();
fdcca8793eb9 Issue 3582. Improved thread support and TLS for Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 41590
diff changeset
287 }
fdcca8793eb9 Issue 3582. Improved thread support and TLS for Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 41590
diff changeset
288
fdcca8793eb9 Issue 3582. Improved thread support and TLS for Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 41590
diff changeset
289 void
fdcca8793eb9 Issue 3582. Improved thread support and TLS for Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 41590
diff changeset
290 PyThread_delete_key(int key)
fdcca8793eb9 Issue 3582. Improved thread support and TLS for Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 41590
diff changeset
291 {
fdcca8793eb9 Issue 3582. Improved thread support and TLS for Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 41590
diff changeset
292 TlsFree(key);
fdcca8793eb9 Issue 3582. Improved thread support and TLS for Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 41590
diff changeset
293 }
fdcca8793eb9 Issue 3582. Improved thread support and TLS for Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 41590
diff changeset
294
fdcca8793eb9 Issue 3582. Improved thread support and TLS for Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 41590
diff changeset
295 /* We must be careful to emulate the strange semantics implemented in thread.c,
fdcca8793eb9 Issue 3582. Improved thread support and TLS for Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 41590
diff changeset
296 * where the value is only set if it hasn't been set before.
fdcca8793eb9 Issue 3582. Improved thread support and TLS for Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 41590
diff changeset
297 */
fdcca8793eb9 Issue 3582. Improved thread support and TLS for Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 41590
diff changeset
298 int
fdcca8793eb9 Issue 3582. Improved thread support and TLS for Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 41590
diff changeset
299 PyThread_set_key_value(int key, void *value)
fdcca8793eb9 Issue 3582. Improved thread support and TLS for Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 41590
diff changeset
300 {
fdcca8793eb9 Issue 3582. Improved thread support and TLS for Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 41590
diff changeset
301 BOOL ok;
fdcca8793eb9 Issue 3582. Improved thread support and TLS for Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 41590
diff changeset
302 void *oldvalue;
fdcca8793eb9 Issue 3582. Improved thread support and TLS for Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 41590
diff changeset
303
fdcca8793eb9 Issue 3582. Improved thread support and TLS for Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 41590
diff changeset
304 assert(value != NULL);
fdcca8793eb9 Issue 3582. Improved thread support and TLS for Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 41590
diff changeset
305 oldvalue = TlsGetValue(key);
fdcca8793eb9 Issue 3582. Improved thread support and TLS for Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 41590
diff changeset
306 if (oldvalue != NULL)
fdcca8793eb9 Issue 3582. Improved thread support and TLS for Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 41590
diff changeset
307 /* ignore value if already set */
fdcca8793eb9 Issue 3582. Improved thread support and TLS for Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 41590
diff changeset
308 return 0;
fdcca8793eb9 Issue 3582. Improved thread support and TLS for Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 41590
diff changeset
309 ok = TlsSetValue(key, value);
fdcca8793eb9 Issue 3582. Improved thread support and TLS for Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 41590
diff changeset
310 if (!ok)
fdcca8793eb9 Issue 3582. Improved thread support and TLS for Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 41590
diff changeset
311 return -1;
fdcca8793eb9 Issue 3582. Improved thread support and TLS for Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 41590
diff changeset
312 return 0;
fdcca8793eb9 Issue 3582. Improved thread support and TLS for Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 41590
diff changeset
313 }
fdcca8793eb9 Issue 3582. Improved thread support and TLS for Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 41590
diff changeset
314
fdcca8793eb9 Issue 3582. Improved thread support and TLS for Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 41590
diff changeset
315 void *
fdcca8793eb9 Issue 3582. Improved thread support and TLS for Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 41590
diff changeset
316 PyThread_get_key_value(int key)
fdcca8793eb9 Issue 3582. Improved thread support and TLS for Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 41590
diff changeset
317 {
fdcca8793eb9 Issue 3582. Improved thread support and TLS for Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 41590
diff changeset
318 return TlsGetValue(key);
fdcca8793eb9 Issue 3582. Improved thread support and TLS for Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 41590
diff changeset
319 }
fdcca8793eb9 Issue 3582. Improved thread support and TLS for Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 41590
diff changeset
320
fdcca8793eb9 Issue 3582. Improved thread support and TLS for Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 41590
diff changeset
321 void
fdcca8793eb9 Issue 3582. Improved thread support and TLS for Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 41590
diff changeset
322 PyThread_delete_key_value(int key)
fdcca8793eb9 Issue 3582. Improved thread support and TLS for Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 41590
diff changeset
323 {
fdcca8793eb9 Issue 3582. Improved thread support and TLS for Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 41590
diff changeset
324 /* NULL is used as "key missing", and it is also the default
fdcca8793eb9 Issue 3582. Improved thread support and TLS for Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 41590
diff changeset
325 * given by TlsGetValue() if nothing has been set yet.
fdcca8793eb9 Issue 3582. Improved thread support and TLS for Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 41590
diff changeset
326 */
fdcca8793eb9 Issue 3582. Improved thread support and TLS for Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 41590
diff changeset
327 TlsSetValue(key, NULL);
fdcca8793eb9 Issue 3582. Improved thread support and TLS for Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 41590
diff changeset
328 }
fdcca8793eb9 Issue 3582. Improved thread support and TLS for Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 41590
diff changeset
329
fdcca8793eb9 Issue 3582. Improved thread support and TLS for Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 41590
diff changeset
330 /* reinitialization of TLS is not necessary after fork when using
fdcca8793eb9 Issue 3582. Improved thread support and TLS for Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 41590
diff changeset
331 * the native TLS functions. And forking isn't supported on Windows either.
fdcca8793eb9 Issue 3582. Improved thread support and TLS for Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 41590
diff changeset
332 */
fdcca8793eb9 Issue 3582. Improved thread support and TLS for Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 41590
diff changeset
333 void
fdcca8793eb9 Issue 3582. Improved thread support and TLS for Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 41590
diff changeset
334 PyThread_ReInitTLS(void)
fdcca8793eb9 Issue 3582. Improved thread support and TLS for Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 41590
diff changeset
335 {}
fdcca8793eb9 Issue 3582. Improved thread support and TLS for Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 41590
diff changeset
336
fdcca8793eb9 Issue 3582. Improved thread support and TLS for Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 41590
diff changeset
337 #endif