Mercurial > cpython-lru_cache-weakref
annotate Python/thread_nt.h @ 75143:88aede44ded1
Fix test failure in test_cmd_line by initializing the hash secret at the earliest point.
| author | Antoine Pitrou <solipsis@pitrou.net> |
|---|---|
| date | Tue, 21 Feb 2012 19:08:26 +0100 |
| parents | 9b12af6e9ea9 |
| children | 978326f98316 |
| rev | line source |
|---|---|
| 2152 | 1 |
| 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 | 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> |
|
39442
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
38673
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> |
|
39442
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
38673
diff
changeset
|
10 #endif |
| 2152 | 11 |
|
69068
9b12af6e9ea9
Issue #11618: Fix the timeout logic in threading.Lock.acquire() under
Antoine Pitrou <solipsis@pitrou.net>
parents:
68257
diff
changeset
|
12 #define PNRMUTEX HANDLE |
|
38673
a19c20c5e5c7
Merge the rest of the trunk.
Thomas Wouters <thomas@python.org>
parents:
38453
diff
changeset
|
13 |
|
69068
9b12af6e9ea9
Issue #11618: Fix the timeout logic in threading.Lock.acquire() under
Antoine Pitrou <solipsis@pitrou.net>
parents:
68257
diff
changeset
|
14 PNRMUTEX |
|
9b12af6e9ea9
Issue #11618: Fix the timeout logic in threading.Lock.acquire() under
Antoine Pitrou <solipsis@pitrou.net>
parents:
68257
diff
changeset
|
15 AllocNonRecursiveMutex() |
|
12584
cde4da18c4fa
Fast NonRecursiveMutex support by Yakov Markovitch, markovitch@iso.ru,
Guido van Rossum <guido@python.org>
parents:
11673
diff
changeset
|
16 { |
|
69068
9b12af6e9ea9
Issue #11618: Fix the timeout logic in threading.Lock.acquire() under
Antoine Pitrou <solipsis@pitrou.net>
parents:
68257
diff
changeset
|
17 return CreateSemaphore(NULL, 1, 1, NULL); |
|
12584
cde4da18c4fa
Fast NonRecursiveMutex support by Yakov Markovitch, markovitch@iso.ru,
Guido van Rossum <guido@python.org>
parents:
11673
diff
changeset
|
18 } |
|
cde4da18c4fa
Fast NonRecursiveMutex support by Yakov Markovitch, markovitch@iso.ru,
Guido van Rossum <guido@python.org>
parents:
11673
diff
changeset
|
19 |
|
38673
a19c20c5e5c7
Merge the rest of the trunk.
Thomas Wouters <thomas@python.org>
parents:
38453
diff
changeset
|
20 VOID |
|
69068
9b12af6e9ea9
Issue #11618: Fix the timeout logic in threading.Lock.acquire() under
Antoine Pitrou <solipsis@pitrou.net>
parents:
68257
diff
changeset
|
21 FreeNonRecursiveMutex(PNRMUTEX mutex) |
|
12584
cde4da18c4fa
Fast NonRecursiveMutex support by Yakov Markovitch, markovitch@iso.ru,
Guido van Rossum <guido@python.org>
parents:
11673
diff
changeset
|
22 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
23 /* No in-use check */ |
|
69068
9b12af6e9ea9
Issue #11618: Fix the timeout logic in threading.Lock.acquire() under
Antoine Pitrou <solipsis@pitrou.net>
parents:
68257
diff
changeset
|
24 CloseHandle(mutex); |
|
12584
cde4da18c4fa
Fast NonRecursiveMutex support by Yakov Markovitch, markovitch@iso.ru,
Guido van Rossum <guido@python.org>
parents:
11673
diff
changeset
|
25 } |
|
cde4da18c4fa
Fast NonRecursiveMutex support by Yakov Markovitch, markovitch@iso.ru,
Guido van Rossum <guido@python.org>
parents:
11673
diff
changeset
|
26 |
|
38673
a19c20c5e5c7
Merge the rest of the trunk.
Thomas Wouters <thomas@python.org>
parents:
38453
diff
changeset
|
27 DWORD |
|
60598
01d1fd775d16
Issue #7316: the acquire() method of lock objects in the :mod:`threading`
Antoine Pitrou <solipsis@pitrou.net>
parents:
59089
diff
changeset
|
28 EnterNonRecursiveMutex(PNRMUTEX mutex, DWORD milliseconds) |
|
12584
cde4da18c4fa
Fast NonRecursiveMutex support by Yakov Markovitch, markovitch@iso.ru,
Guido van Rossum <guido@python.org>
parents:
11673
diff
changeset
|
29 { |
|
69068
9b12af6e9ea9
Issue #11618: Fix the timeout logic in threading.Lock.acquire() under
Antoine Pitrou <solipsis@pitrou.net>
parents:
68257
diff
changeset
|
30 return WaitForSingleObject(mutex, milliseconds); |
|
12584
cde4da18c4fa
Fast NonRecursiveMutex support by Yakov Markovitch, markovitch@iso.ru,
Guido van Rossum <guido@python.org>
parents:
11673
diff
changeset
|
31 } |
|
cde4da18c4fa
Fast NonRecursiveMutex support by Yakov Markovitch, markovitch@iso.ru,
Guido van Rossum <guido@python.org>
parents:
11673
diff
changeset
|
32 |
|
38673
a19c20c5e5c7
Merge the rest of the trunk.
Thomas Wouters <thomas@python.org>
parents:
38453
diff
changeset
|
33 BOOL |
|
a19c20c5e5c7
Merge the rest of the trunk.
Thomas Wouters <thomas@python.org>
parents:
38453
diff
changeset
|
34 LeaveNonRecursiveMutex(PNRMUTEX mutex) |
|
12584
cde4da18c4fa
Fast NonRecursiveMutex support by Yakov Markovitch, markovitch@iso.ru,
Guido van Rossum <guido@python.org>
parents:
11673
diff
changeset
|
35 { |
|
69068
9b12af6e9ea9
Issue #11618: Fix the timeout logic in threading.Lock.acquire() under
Antoine Pitrou <solipsis@pitrou.net>
parents:
68257
diff
changeset
|
36 return ReleaseSemaphore(mutex, 1, NULL); |
|
12584
cde4da18c4fa
Fast NonRecursiveMutex support by Yakov Markovitch, markovitch@iso.ru,
Guido van Rossum <guido@python.org>
parents:
11673
diff
changeset
|
37 } |
|
cde4da18c4fa
Fast NonRecursiveMutex support by Yakov Markovitch, markovitch@iso.ru,
Guido van Rossum <guido@python.org>
parents:
11673
diff
changeset
|
38 |
|
9679
877d23bd5bdc
Thanks to Chris Herborth, the thread primitives now have proper Py*
Guido van Rossum <guido@python.org>
parents:
6029
diff
changeset
|
39 long PyThread_get_thread_ident(void); |
| 2152 | 40 |
| 41 /* | |
| 42 * Initialization of the C package, should not be needed. | |
| 43 */ | |
|
38673
a19c20c5e5c7
Merge the rest of the trunk.
Thomas Wouters <thomas@python.org>
parents:
38453
diff
changeset
|
44 static void |
|
a19c20c5e5c7
Merge the rest of the trunk.
Thomas Wouters <thomas@python.org>
parents:
38453
diff
changeset
|
45 PyThread__init_thread(void) |
| 2152 | 46 { |
| 47 } | |
| 48 | |
| 49 /* | |
| 50 * Thread support. | |
| 51 */ | |
|
20468
ebfd87e87884
Partial patch from SF #452266, by Jason Petrone.
Guido van Rossum <guido@python.org>
parents:
19568
diff
changeset
|
52 |
|
ebfd87e87884
Partial patch from SF #452266, by Jason Petrone.
Guido van Rossum <guido@python.org>
parents:
19568
diff
changeset
|
53 typedef struct { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
54 void (*func)(void*); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
55 void *arg; |
|
20468
ebfd87e87884
Partial patch from SF #452266, by Jason Petrone.
Guido van Rossum <guido@python.org>
parents:
19568
diff
changeset
|
56 } callobj; |
|
ebfd87e87884
Partial patch from SF #452266, by Jason Petrone.
Guido van Rossum <guido@python.org>
parents:
19568
diff
changeset
|
57 |
|
50745
2b2707ff8bb7
Merged revisions 68455,68476,68542 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
41716
diff
changeset
|
58 /* thunker to call adapt between the function type used by the system's |
|
2b2707ff8bb7
Merged revisions 68455,68476,68542 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
41716
diff
changeset
|
59 thread start function and the internally used one. */ |
|
2b2707ff8bb7
Merged revisions 68455,68476,68542 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
41716
diff
changeset
|
60 #if defined(MS_WINCE) |
|
2b2707ff8bb7
Merged revisions 68455,68476,68542 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
41716
diff
changeset
|
61 static DWORD WINAPI |
|
2b2707ff8bb7
Merged revisions 68455,68476,68542 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
41716
diff
changeset
|
62 #else |
|
2b2707ff8bb7
Merged revisions 68455,68476,68542 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
41716
diff
changeset
|
63 static unsigned __stdcall |
|
2b2707ff8bb7
Merged revisions 68455,68476,68542 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
41716
diff
changeset
|
64 #endif |
|
20468
ebfd87e87884
Partial patch from SF #452266, by Jason Petrone.
Guido van Rossum <guido@python.org>
parents:
19568
diff
changeset
|
65 bootstrap(void *call) |
|
ebfd87e87884
Partial patch from SF #452266, by Jason Petrone.
Guido van Rossum <guido@python.org>
parents:
19568
diff
changeset
|
66 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
67 callobj *obj = (callobj*)call; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
68 void (*func)(void*) = obj->func; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
69 void *arg = obj->arg; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
70 HeapFree(GetProcessHeap(), 0, obj); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
71 func(arg); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
72 return 0; |
|
20468
ebfd87e87884
Partial patch from SF #452266, by Jason Petrone.
Guido van Rossum <guido@python.org>
parents:
19568
diff
changeset
|
73 } |
|
ebfd87e87884
Partial patch from SF #452266, by Jason Petrone.
Guido van Rossum <guido@python.org>
parents:
19568
diff
changeset
|
74 |
|
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
|
75 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
|
76 PyThread_start_new_thread(void (*func)(void *), void *arg) |
| 2152 | 77 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
78 HANDLE hThread; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
79 unsigned threadID; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
80 callobj *obj; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
81 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
82 dprintf(("%ld: PyThread_start_new_thread called\n", |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
83 PyThread_get_thread_ident())); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
84 if (!initialized) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
85 PyThread_init_thread(); |
| 2152 | 86 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
87 obj = (callobj*)HeapAlloc(GetProcessHeap(), 0, sizeof(*obj)); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
88 if (!obj) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
89 return -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
90 obj->func = func; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
91 obj->arg = arg; |
|
50745
2b2707ff8bb7
Merged revisions 68455,68476,68542 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
41716
diff
changeset
|
92 #if defined(MS_WINCE) |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
93 hThread = CreateThread(NULL, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
94 Py_SAFE_DOWNCAST(_pythread_stacksize, Py_ssize_t, SIZE_T), |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
95 bootstrap, obj, 0, &threadID); |
|
50745
2b2707ff8bb7
Merged revisions 68455,68476,68542 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
41716
diff
changeset
|
96 #else |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
97 hThread = (HANDLE)_beginthreadex(0, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
98 Py_SAFE_DOWNCAST(_pythread_stacksize, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
99 Py_ssize_t, unsigned int), |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
100 bootstrap, obj, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
101 0, &threadID); |
|
50745
2b2707ff8bb7
Merged revisions 68455,68476,68542 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
41716
diff
changeset
|
102 #endif |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
103 if (hThread == 0) { |
|
50745
2b2707ff8bb7
Merged revisions 68455,68476,68542 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
41716
diff
changeset
|
104 #if defined(MS_WINCE) |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
105 /* Save error in variable, to prevent PyThread_get_thread_ident |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
106 from clobbering it. */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
107 unsigned e = GetLastError(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
108 dprintf(("%ld: PyThread_start_new_thread failed, win32 error code %u\n", |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
109 PyThread_get_thread_ident(), e)); |
|
50745
2b2707ff8bb7
Merged revisions 68455,68476,68542 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
41716
diff
changeset
|
110 #else |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
111 /* I've seen errno == EAGAIN here, which means "there are |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
112 * too many threads". |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
113 */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
114 int e = errno; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
115 dprintf(("%ld: PyThread_start_new_thread failed, errno %d\n", |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
116 PyThread_get_thread_ident(), e)); |
|
50745
2b2707ff8bb7
Merged revisions 68455,68476,68542 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
41716
diff
changeset
|
117 #endif |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
118 threadID = (unsigned)-1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
119 HeapFree(GetProcessHeap(), 0, obj); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
120 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
121 else { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
122 dprintf(("%ld: PyThread_start_new_thread succeeded: %p\n", |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
123 PyThread_get_thread_ident(), (void*)hThread)); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
124 CloseHandle(hThread); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
125 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
126 return (long) threadID; |
| 2152 | 127 } |
| 128 | |
| 129 /* | |
| 130 * Return the thread Id instead of an handle. The Id is said to uniquely identify the | |
| 131 * thread in the system | |
| 132 */ | |
|
38673
a19c20c5e5c7
Merge the rest of the trunk.
Thomas Wouters <thomas@python.org>
parents:
38453
diff
changeset
|
133 long |
|
a19c20c5e5c7
Merge the rest of the trunk.
Thomas Wouters <thomas@python.org>
parents:
38453
diff
changeset
|
134 PyThread_get_thread_ident(void) |
| 2152 | 135 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
136 if (!initialized) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
137 PyThread_init_thread(); |
|
12584
cde4da18c4fa
Fast NonRecursiveMutex support by Yakov Markovitch, markovitch@iso.ru,
Guido van Rossum <guido@python.org>
parents:
11673
diff
changeset
|
138 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
139 return GetCurrentThreadId(); |
| 2152 | 140 } |
| 141 | |
|
38673
a19c20c5e5c7
Merge the rest of the trunk.
Thomas Wouters <thomas@python.org>
parents:
38453
diff
changeset
|
142 void |
|
a19c20c5e5c7
Merge the rest of the trunk.
Thomas Wouters <thomas@python.org>
parents:
38453
diff
changeset
|
143 PyThread_exit_thread(void) |
| 2152 | 144 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
145 dprintf(("%ld: PyThread_exit_thread called\n", PyThread_get_thread_ident())); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
146 if (!initialized) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
147 exit(0); |
|
50745
2b2707ff8bb7
Merged revisions 68455,68476,68542 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
41716
diff
changeset
|
148 #if defined(MS_WINCE) |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
149 ExitThread(0); |
|
50745
2b2707ff8bb7
Merged revisions 68455,68476,68542 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
41716
diff
changeset
|
150 #else |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
151 _endthreadex(0); |
|
50745
2b2707ff8bb7
Merged revisions 68455,68476,68542 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
41716
diff
changeset
|
152 #endif |
| 2152 | 153 } |
| 154 | |
| 155 /* | |
| 156 * Lock support. It has too be implemented as semaphores. | |
| 157 * I [Dag] tried to implement it with mutex but I could find a way to | |
| 158 * tell whether a thread already own the lock or not. | |
| 159 */ | |
|
38673
a19c20c5e5c7
Merge the rest of the trunk.
Thomas Wouters <thomas@python.org>
parents:
38453
diff
changeset
|
160 PyThread_type_lock |
|
a19c20c5e5c7
Merge the rest of the trunk.
Thomas Wouters <thomas@python.org>
parents:
38453
diff
changeset
|
161 PyThread_allocate_lock(void) |
| 2152 | 162 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
163 PNRMUTEX aLock; |
| 2152 | 164 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
165 dprintf(("PyThread_allocate_lock called\n")); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
166 if (!initialized) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
167 PyThread_init_thread(); |
| 2152 | 168 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
169 aLock = AllocNonRecursiveMutex() ; |
| 2152 | 170 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
171 dprintf(("%ld: PyThread_allocate_lock() -> %p\n", PyThread_get_thread_ident(), aLock)); |
| 2152 | 172 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
173 return (PyThread_type_lock) aLock; |
| 2152 | 174 } |
| 175 | |
|
38673
a19c20c5e5c7
Merge the rest of the trunk.
Thomas Wouters <thomas@python.org>
parents:
38453
diff
changeset
|
176 void |
|
a19c20c5e5c7
Merge the rest of the trunk.
Thomas Wouters <thomas@python.org>
parents:
38453
diff
changeset
|
177 PyThread_free_lock(PyThread_type_lock aLock) |
| 2152 | 178 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
179 dprintf(("%ld: PyThread_free_lock(%p) called\n", PyThread_get_thread_ident(),aLock)); |
| 2152 | 180 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
181 FreeNonRecursiveMutex(aLock) ; |
| 2152 | 182 } |
| 183 | |
| 184 /* | |
| 185 * Return 1 on success if the lock was acquired | |
| 186 * | |
| 187 * and 0 if the lock was not acquired. This means a 0 is returned | |
| 188 * if the lock has already been acquired by this thread! | |
| 189 */ | |
|
66946
b750c45a772c
Issue #8844: Regular and recursive lock acquisitions can now be interrupted
Antoine Pitrou <solipsis@pitrou.net>
parents:
64844
diff
changeset
|
190 PyLockStatus |
|
b750c45a772c
Issue #8844: Regular and recursive lock acquisitions can now be interrupted
Antoine Pitrou <solipsis@pitrou.net>
parents:
64844
diff
changeset
|
191 PyThread_acquire_lock_timed(PyThread_type_lock aLock, |
|
b750c45a772c
Issue #8844: Regular and recursive lock acquisitions can now be interrupted
Antoine Pitrou <solipsis@pitrou.net>
parents:
64844
diff
changeset
|
192 PY_TIMEOUT_T microseconds, int intr_flag) |
| 2152 | 193 { |
|
66946
b750c45a772c
Issue #8844: Regular and recursive lock acquisitions can now be interrupted
Antoine Pitrou <solipsis@pitrou.net>
parents:
64844
diff
changeset
|
194 /* Fow now, intr_flag does nothing on Windows, and lock acquires are |
|
b750c45a772c
Issue #8844: Regular and recursive lock acquisitions can now be interrupted
Antoine Pitrou <solipsis@pitrou.net>
parents:
64844
diff
changeset
|
195 * uninterruptible. */ |
|
b750c45a772c
Issue #8844: Regular and recursive lock acquisitions can now be interrupted
Antoine Pitrou <solipsis@pitrou.net>
parents:
64844
diff
changeset
|
196 PyLockStatus success; |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60598
diff
changeset
|
197 PY_TIMEOUT_T milliseconds; |
| 2152 | 198 |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60598
diff
changeset
|
199 if (microseconds >= 0) { |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60598
diff
changeset
|
200 milliseconds = microseconds / 1000; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60598
diff
changeset
|
201 if (microseconds % 1000 > 0) |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60598
diff
changeset
|
202 ++milliseconds; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60598
diff
changeset
|
203 if ((DWORD) milliseconds != milliseconds) |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60598
diff
changeset
|
204 Py_FatalError("Timeout too large for a DWORD, " |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60598
diff
changeset
|
205 "please check PY_TIMEOUT_MAX"); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60598
diff
changeset
|
206 } |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60598
diff
changeset
|
207 else |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60598
diff
changeset
|
208 milliseconds = INFINITE; |
| 2152 | 209 |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60598
diff
changeset
|
210 dprintf(("%ld: PyThread_acquire_lock_timed(%p, %lld) called\n", |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60598
diff
changeset
|
211 PyThread_get_thread_ident(), aLock, microseconds)); |
|
60598
01d1fd775d16
Issue #7316: the acquire() method of lock objects in the :mod:`threading`
Antoine Pitrou <solipsis@pitrou.net>
parents:
59089
diff
changeset
|
212 |
|
66946
b750c45a772c
Issue #8844: Regular and recursive lock acquisitions can now be interrupted
Antoine Pitrou <solipsis@pitrou.net>
parents:
64844
diff
changeset
|
213 if (aLock && EnterNonRecursiveMutex((PNRMUTEX)aLock, |
|
b750c45a772c
Issue #8844: Regular and recursive lock acquisitions can now be interrupted
Antoine Pitrou <solipsis@pitrou.net>
parents:
64844
diff
changeset
|
214 (DWORD)milliseconds) == WAIT_OBJECT_0) { |
|
b750c45a772c
Issue #8844: Regular and recursive lock acquisitions can now be interrupted
Antoine Pitrou <solipsis@pitrou.net>
parents:
64844
diff
changeset
|
215 success = PY_LOCK_ACQUIRED; |
|
b750c45a772c
Issue #8844: Regular and recursive lock acquisitions can now be interrupted
Antoine Pitrou <solipsis@pitrou.net>
parents:
64844
diff
changeset
|
216 } |
|
b750c45a772c
Issue #8844: Regular and recursive lock acquisitions can now be interrupted
Antoine Pitrou <solipsis@pitrou.net>
parents:
64844
diff
changeset
|
217 else { |
|
b750c45a772c
Issue #8844: Regular and recursive lock acquisitions can now be interrupted
Antoine Pitrou <solipsis@pitrou.net>
parents:
64844
diff
changeset
|
218 success = PY_LOCK_FAILURE; |
|
b750c45a772c
Issue #8844: Regular and recursive lock acquisitions can now be interrupted
Antoine Pitrou <solipsis@pitrou.net>
parents:
64844
diff
changeset
|
219 } |
|
60598
01d1fd775d16
Issue #7316: the acquire() method of lock objects in the :mod:`threading`
Antoine Pitrou <solipsis@pitrou.net>
parents:
59089
diff
changeset
|
220 |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60598
diff
changeset
|
221 dprintf(("%ld: PyThread_acquire_lock(%p, %lld) -> %d\n", |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60598
diff
changeset
|
222 PyThread_get_thread_ident(), aLock, microseconds, success)); |
| 2152 | 223 |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60598
diff
changeset
|
224 return success; |
| 2152 | 225 } |
|
38673
a19c20c5e5c7
Merge the rest of the trunk.
Thomas Wouters <thomas@python.org>
parents:
38453
diff
changeset
|
226 int |
|
a19c20c5e5c7
Merge the rest of the trunk.
Thomas Wouters <thomas@python.org>
parents:
38453
diff
changeset
|
227 PyThread_acquire_lock(PyThread_type_lock aLock, int waitflag) |
| 2152 | 228 { |
|
66946
b750c45a772c
Issue #8844: Regular and recursive lock acquisitions can now be interrupted
Antoine Pitrou <solipsis@pitrou.net>
parents:
64844
diff
changeset
|
229 return PyThread_acquire_lock_timed(aLock, waitflag ? -1 : 0, 0); |
| 2152 | 230 } |
| 231 | |
|
38673
a19c20c5e5c7
Merge the rest of the trunk.
Thomas Wouters <thomas@python.org>
parents:
38453
diff
changeset
|
232 void |
|
a19c20c5e5c7
Merge the rest of the trunk.
Thomas Wouters <thomas@python.org>
parents:
38453
diff
changeset
|
233 PyThread_release_lock(PyThread_type_lock aLock) |
| 2152 | 234 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
235 dprintf(("%ld: PyThread_release_lock(%p) called\n", PyThread_get_thread_ident(),aLock)); |
| 2152 | 236 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
237 if (!(aLock && LeaveNonRecursiveMutex((PNRMUTEX) aLock))) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
238 dprintf(("%ld: Could not PyThread_release_lock(%p) error: %ld\n", PyThread_get_thread_ident(), aLock, GetLastError())); |
| 2152 | 239 } |
|
39442
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
38673
diff
changeset
|
240 |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
38673
diff
changeset
|
241 /* minimum/maximum thread stack sizes supported */ |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
242 #define THREAD_MIN_STACKSIZE 0x8000 /* 32kB */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
243 #define THREAD_MAX_STACKSIZE 0x10000000 /* 256MB */ |
|
39442
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
38673
diff
changeset
|
244 |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
38673
diff
changeset
|
245 /* set the thread stack size. |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
38673
diff
changeset
|
246 * Return 0 if size is valid, -1 otherwise. |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
38673
diff
changeset
|
247 */ |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
38673
diff
changeset
|
248 static int |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
38673
diff
changeset
|
249 _pythread_nt_set_stacksize(size_t size) |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
38673
diff
changeset
|
250 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
251 /* set to default */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
252 if (size == 0) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
253 _pythread_stacksize = 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
254 return 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
255 } |
|
39442
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
38673
diff
changeset
|
256 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
257 /* valid range? */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
258 if (size >= THREAD_MIN_STACKSIZE && size < THREAD_MAX_STACKSIZE) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
259 _pythread_stacksize = size; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
260 return 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
261 } |
|
39442
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
38673
diff
changeset
|
262 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
263 return -1; |
|
39442
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
38673
diff
changeset
|
264 } |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
38673
diff
changeset
|
265 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
266 #define THREAD_SET_STACKSIZE(x) _pythread_nt_set_stacksize(x) |
|
50745
2b2707ff8bb7
Merged revisions 68455,68476,68542 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
41716
diff
changeset
|
267 |
|
2b2707ff8bb7
Merged revisions 68455,68476,68542 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
41716
diff
changeset
|
268 |
|
2b2707ff8bb7
Merged revisions 68455,68476,68542 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
41716
diff
changeset
|
269 /* use native Windows TLS functions */ |
|
2b2707ff8bb7
Merged revisions 68455,68476,68542 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
41716
diff
changeset
|
270 #define Py_HAVE_NATIVE_TLS |
|
2b2707ff8bb7
Merged revisions 68455,68476,68542 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
41716
diff
changeset
|
271 |
|
2b2707ff8bb7
Merged revisions 68455,68476,68542 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
41716
diff
changeset
|
272 #ifdef Py_HAVE_NATIVE_TLS |
|
2b2707ff8bb7
Merged revisions 68455,68476,68542 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
41716
diff
changeset
|
273 int |
|
2b2707ff8bb7
Merged revisions 68455,68476,68542 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
41716
diff
changeset
|
274 PyThread_create_key(void) |
|
2b2707ff8bb7
Merged revisions 68455,68476,68542 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
41716
diff
changeset
|
275 { |
|
64844
8e428b8e7d81
issue 9786 Native TLS support for pthreads
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
61466
diff
changeset
|
276 DWORD result= TlsAlloc(); |
|
8e428b8e7d81
issue 9786 Native TLS support for pthreads
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
61466
diff
changeset
|
277 if (result == TLS_OUT_OF_INDEXES) |
|
8e428b8e7d81
issue 9786 Native TLS support for pthreads
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
61466
diff
changeset
|
278 return -1; |
|
8e428b8e7d81
issue 9786 Native TLS support for pthreads
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
61466
diff
changeset
|
279 return (int)result; |
|
50745
2b2707ff8bb7
Merged revisions 68455,68476,68542 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
41716
diff
changeset
|
280 } |
|
2b2707ff8bb7
Merged revisions 68455,68476,68542 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
41716
diff
changeset
|
281 |
|
2b2707ff8bb7
Merged revisions 68455,68476,68542 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
41716
diff
changeset
|
282 void |
|
2b2707ff8bb7
Merged revisions 68455,68476,68542 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
41716
diff
changeset
|
283 PyThread_delete_key(int key) |
|
2b2707ff8bb7
Merged revisions 68455,68476,68542 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
41716
diff
changeset
|
284 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
285 TlsFree(key); |
|
50745
2b2707ff8bb7
Merged revisions 68455,68476,68542 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
41716
diff
changeset
|
286 } |
|
2b2707ff8bb7
Merged revisions 68455,68476,68542 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
41716
diff
changeset
|
287 |
|
2b2707ff8bb7
Merged revisions 68455,68476,68542 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
41716
diff
changeset
|
288 /* We must be careful to emulate the strange semantics implemented in thread.c, |
|
2b2707ff8bb7
Merged revisions 68455,68476,68542 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
41716
diff
changeset
|
289 * where the value is only set if it hasn't been set before. |
|
2b2707ff8bb7
Merged revisions 68455,68476,68542 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
41716
diff
changeset
|
290 */ |
|
2b2707ff8bb7
Merged revisions 68455,68476,68542 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
41716
diff
changeset
|
291 int |
|
2b2707ff8bb7
Merged revisions 68455,68476,68542 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
41716
diff
changeset
|
292 PyThread_set_key_value(int key, void *value) |
|
2b2707ff8bb7
Merged revisions 68455,68476,68542 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
41716
diff
changeset
|
293 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
294 BOOL ok; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
295 void *oldvalue; |
|
50745
2b2707ff8bb7
Merged revisions 68455,68476,68542 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
41716
diff
changeset
|
296 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
297 assert(value != NULL); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
298 oldvalue = TlsGetValue(key); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
299 if (oldvalue != NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
300 /* ignore value if already set */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
301 return 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
302 ok = TlsSetValue(key, value); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
303 if (!ok) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
304 return -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
305 return 0; |
|
50745
2b2707ff8bb7
Merged revisions 68455,68476,68542 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
41716
diff
changeset
|
306 } |
|
2b2707ff8bb7
Merged revisions 68455,68476,68542 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
41716
diff
changeset
|
307 |
|
2b2707ff8bb7
Merged revisions 68455,68476,68542 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
41716
diff
changeset
|
308 void * |
|
2b2707ff8bb7
Merged revisions 68455,68476,68542 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
41716
diff
changeset
|
309 PyThread_get_key_value(int key) |
|
2b2707ff8bb7
Merged revisions 68455,68476,68542 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
41716
diff
changeset
|
310 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
311 /* because TLS is used in the Py_END_ALLOW_THREAD macro, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
312 * it is necessary to preserve the windows error state, because |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
313 * it is assumed to be preserved across the call to the macro. |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
314 * Ideally, the macro should be fixed, but it is simpler to |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
315 * do it here. |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
316 */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
317 DWORD error = GetLastError(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
318 void *result = TlsGetValue(key); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
319 SetLastError(error); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
320 return result; |
|
50745
2b2707ff8bb7
Merged revisions 68455,68476,68542 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
41716
diff
changeset
|
321 } |
|
2b2707ff8bb7
Merged revisions 68455,68476,68542 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
41716
diff
changeset
|
322 |
|
2b2707ff8bb7
Merged revisions 68455,68476,68542 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
41716
diff
changeset
|
323 void |
|
2b2707ff8bb7
Merged revisions 68455,68476,68542 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
41716
diff
changeset
|
324 PyThread_delete_key_value(int key) |
|
2b2707ff8bb7
Merged revisions 68455,68476,68542 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
41716
diff
changeset
|
325 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
326 /* NULL is used as "key missing", and it is also the default |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
327 * given by TlsGetValue() if nothing has been set yet. |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
328 */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
329 TlsSetValue(key, NULL); |
|
50745
2b2707ff8bb7
Merged revisions 68455,68476,68542 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
41716
diff
changeset
|
330 } |
|
2b2707ff8bb7
Merged revisions 68455,68476,68542 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
41716
diff
changeset
|
331 |
|
2b2707ff8bb7
Merged revisions 68455,68476,68542 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
41716
diff
changeset
|
332 /* reinitialization of TLS is not necessary after fork when using |
|
2b2707ff8bb7
Merged revisions 68455,68476,68542 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
41716
diff
changeset
|
333 * the native TLS functions. And forking isn't supported on Windows either. |
|
2b2707ff8bb7
Merged revisions 68455,68476,68542 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
41716
diff
changeset
|
334 */ |
|
2b2707ff8bb7
Merged revisions 68455,68476,68542 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
41716
diff
changeset
|
335 void |
|
2b2707ff8bb7
Merged revisions 68455,68476,68542 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
41716
diff
changeset
|
336 PyThread_ReInitTLS(void) |
|
2b2707ff8bb7
Merged revisions 68455,68476,68542 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
41716
diff
changeset
|
337 {} |
|
2b2707ff8bb7
Merged revisions 68455,68476,68542 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
41716
diff
changeset
|
338 |
|
2b2707ff8bb7
Merged revisions 68455,68476,68542 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
41716
diff
changeset
|
339 #endif |
