annotate Python/thread_nt.h @ 87690:66c1c9f32567 default tip

Add use_weakref option to functools.lru_cache The use_weakref option makes lru_cache create weak references to the function arguments when creating the cache key, which prevents them from staying in the memory forever even after all other references to them are gone. This is a proof of concept for http://bugs.python.org/issue19859
author Radomir Dopieralski <devel@sheep.art.pl>
date Tue, 03 Dec 2013 16:02:48 +0100
parents 9af1905f20af
children
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>
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
1a52351a00b2 nt thread support
Guido van Rossum <guido@python.org>
parents:
diff changeset
11
77513
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 69068
diff changeset
12 /* options */
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 69068
diff changeset
13 #ifndef _PY_USE_CV_LOCKS
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 69068
diff changeset
14 #define _PY_USE_CV_LOCKS 1 /* use locks based on cond vars */
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 69068
diff changeset
15 #endif
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 69068
diff changeset
16
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 69068
diff changeset
17 /* Now, define a non-recursive mutex using either condition variables
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 69068
diff changeset
18 * and critical sections (fast) or using operating system mutexes
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 69068
diff changeset
19 * (slow)
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 69068
diff changeset
20 */
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 69068
diff changeset
21
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 69068
diff changeset
22 #if _PY_USE_CV_LOCKS
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 69068
diff changeset
23
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 69068
diff changeset
24 #include "condvar.h"
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 69068
diff changeset
25
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 69068
diff changeset
26 typedef struct _NRMUTEX
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 69068
diff changeset
27 {
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 69068
diff changeset
28 PyMUTEX_T cs;
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 69068
diff changeset
29 PyCOND_T cv;
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 69068
diff changeset
30 int locked;
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 69068
diff changeset
31 } NRMUTEX;
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 69068
diff changeset
32 typedef NRMUTEX *PNRMUTEX;
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 69068
diff changeset
33
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 69068
diff changeset
34 PNRMUTEX
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 69068
diff changeset
35 AllocNonRecursiveMutex()
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 69068
diff changeset
36 {
84497
9af1905f20af Issue #18203: Replace malloc() with PyMem_RawMalloc() to allocate thread locks
Victor Stinner <victor.stinner@gmail.com>
parents: 81712
diff changeset
37 PNRMUTEX m = (PNRMUTEX)PyMem_RawMalloc(sizeof(NRMUTEX));
77513
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 69068
diff changeset
38 if (!m)
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 69068
diff changeset
39 return NULL;
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 69068
diff changeset
40 if (PyCOND_INIT(&m->cv))
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 69068
diff changeset
41 goto fail;
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 69068
diff changeset
42 if (PyMUTEX_INIT(&m->cs)) {
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 69068
diff changeset
43 PyCOND_FINI(&m->cv);
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 69068
diff changeset
44 goto fail;
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 69068
diff changeset
45 }
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 69068
diff changeset
46 m->locked = 0;
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 69068
diff changeset
47 return m;
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 69068
diff changeset
48 fail:
84497
9af1905f20af Issue #18203: Replace malloc() with PyMem_RawMalloc() to allocate thread locks
Victor Stinner <victor.stinner@gmail.com>
parents: 81712
diff changeset
49 PyMem_RawFree(m);
77513
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 69068
diff changeset
50 return NULL;
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 69068
diff changeset
51 }
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 69068
diff changeset
52
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 69068
diff changeset
53 VOID
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 69068
diff changeset
54 FreeNonRecursiveMutex(PNRMUTEX mutex)
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 69068
diff changeset
55 {
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 69068
diff changeset
56 if (mutex) {
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 69068
diff changeset
57 PyCOND_FINI(&mutex->cv);
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 69068
diff changeset
58 PyMUTEX_FINI(&mutex->cs);
84497
9af1905f20af Issue #18203: Replace malloc() with PyMem_RawMalloc() to allocate thread locks
Victor Stinner <victor.stinner@gmail.com>
parents: 81712
diff changeset
59 PyMem_RawFree(mutex);
77513
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 69068
diff changeset
60 }
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 69068
diff changeset
61 }
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 69068
diff changeset
62
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 69068
diff changeset
63 DWORD
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 69068
diff changeset
64 EnterNonRecursiveMutex(PNRMUTEX mutex, DWORD milliseconds)
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 69068
diff changeset
65 {
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 69068
diff changeset
66 DWORD result = WAIT_OBJECT_0;
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 69068
diff changeset
67 if (PyMUTEX_LOCK(&mutex->cs))
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 69068
diff changeset
68 return WAIT_FAILED;
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 69068
diff changeset
69 if (milliseconds == INFINITE) {
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 69068
diff changeset
70 while (mutex->locked) {
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 69068
diff changeset
71 if (PyCOND_WAIT(&mutex->cv, &mutex->cs)) {
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 69068
diff changeset
72 result = WAIT_FAILED;
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 69068
diff changeset
73 break;
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 69068
diff changeset
74 }
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 69068
diff changeset
75 }
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 69068
diff changeset
76 } else if (milliseconds != 0) {
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 69068
diff changeset
77 /* wait at least until the target */
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 69068
diff changeset
78 DWORD now, target = GetTickCount() + milliseconds;
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 69068
diff changeset
79 while (mutex->locked) {
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 69068
diff changeset
80 if (PyCOND_TIMEDWAIT(&mutex->cv, &mutex->cs, milliseconds*1000) < 0) {
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 69068
diff changeset
81 result = WAIT_FAILED;
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 69068
diff changeset
82 break;
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 69068
diff changeset
83 }
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 69068
diff changeset
84 now = GetTickCount();
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 69068
diff changeset
85 if (target <= now)
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 69068
diff changeset
86 break;
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 69068
diff changeset
87 milliseconds = target-now;
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 69068
diff changeset
88 }
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 69068
diff changeset
89 }
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 69068
diff changeset
90 if (!mutex->locked) {
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 69068
diff changeset
91 mutex->locked = 1;
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 69068
diff changeset
92 result = WAIT_OBJECT_0;
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 69068
diff changeset
93 } else if (result == WAIT_OBJECT_0)
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 69068
diff changeset
94 result = WAIT_TIMEOUT;
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 69068
diff changeset
95 /* else, it is WAIT_FAILED */
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 69068
diff changeset
96 PyMUTEX_UNLOCK(&mutex->cs); /* must ignore result here */
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 69068
diff changeset
97 return result;
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 69068
diff changeset
98 }
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 69068
diff changeset
99
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 69068
diff changeset
100 BOOL
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 69068
diff changeset
101 LeaveNonRecursiveMutex(PNRMUTEX mutex)
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 69068
diff changeset
102 {
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 69068
diff changeset
103 BOOL result;
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 69068
diff changeset
104 if (PyMUTEX_LOCK(&mutex->cs))
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 69068
diff changeset
105 return FALSE;
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 69068
diff changeset
106 mutex->locked = 0;
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 69068
diff changeset
107 result = PyCOND_SIGNAL(&mutex->cv);
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 69068
diff changeset
108 result &= PyMUTEX_UNLOCK(&mutex->cs);
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 69068
diff changeset
109 return result;
84497
9af1905f20af Issue #18203: Replace malloc() with PyMem_RawMalloc() to allocate thread locks
Victor Stinner <victor.stinner@gmail.com>
parents: 81712
diff changeset
110 }
77513
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 69068
diff changeset
111
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 69068
diff changeset
112 #else /* if ! _PY_USE_CV_LOCKS */
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 69068
diff changeset
113
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 69068
diff changeset
114 /* NR-locks based on a kernel mutex */
69068
9b12af6e9ea9 Issue #11618: Fix the timeout logic in threading.Lock.acquire() under
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
115 #define PNRMUTEX HANDLE
38673
a19c20c5e5c7 Merge the rest of the trunk.
Thomas Wouters <thomas@python.org>
parents: 38232
diff changeset
116
69068
9b12af6e9ea9 Issue #11618: Fix the timeout logic in threading.Lock.acquire() under
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
117 PNRMUTEX
9b12af6e9ea9 Issue #11618: Fix the timeout logic in threading.Lock.acquire() under
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
118 AllocNonRecursiveMutex()
12584
cde4da18c4fa Fast NonRecursiveMutex support by Yakov Markovitch, markovitch@iso.ru,
Guido van Rossum <guido@python.org>
parents: 11673
diff changeset
119 {
69068
9b12af6e9ea9 Issue #11618: Fix the timeout logic in threading.Lock.acquire() under
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
120 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
121 }
cde4da18c4fa Fast NonRecursiveMutex support by Yakov Markovitch, markovitch@iso.ru,
Guido van Rossum <guido@python.org>
parents: 11673
diff changeset
122
38673
a19c20c5e5c7 Merge the rest of the trunk.
Thomas Wouters <thomas@python.org>
parents: 38232
diff changeset
123 VOID
69068
9b12af6e9ea9 Issue #11618: Fix the timeout logic in threading.Lock.acquire() under
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
124 FreeNonRecursiveMutex(PNRMUTEX mutex)
12584
cde4da18c4fa Fast NonRecursiveMutex support by Yakov Markovitch, markovitch@iso.ru,
Guido van Rossum <guido@python.org>
parents: 11673
diff changeset
125 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
126 /* 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
127 CloseHandle(mutex);
12584
cde4da18c4fa Fast NonRecursiveMutex support by Yakov Markovitch, markovitch@iso.ru,
Guido van Rossum <guido@python.org>
parents: 11673
diff changeset
128 }
cde4da18c4fa Fast NonRecursiveMutex support by Yakov Markovitch, markovitch@iso.ru,
Guido van Rossum <guido@python.org>
parents: 11673
diff changeset
129
38673
a19c20c5e5c7 Merge the rest of the trunk.
Thomas Wouters <thomas@python.org>
parents: 38232
diff changeset
130 DWORD
60598
01d1fd775d16 Issue #7316: the acquire() method of lock objects in the :mod:`threading`
Antoine Pitrou <solipsis@pitrou.net>
parents: 59089
diff changeset
131 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
132 {
81712
b71b6517af63 Replace WaitForSingleObject with WaitForSingleObjectEx,
Martin v. Löwis <martin@v.loewis.de>
parents: 77513
diff changeset
133 return WaitForSingleObjectEx(mutex, milliseconds, FALSE);
12584
cde4da18c4fa Fast NonRecursiveMutex support by Yakov Markovitch, markovitch@iso.ru,
Guido van Rossum <guido@python.org>
parents: 11673
diff changeset
134 }
cde4da18c4fa Fast NonRecursiveMutex support by Yakov Markovitch, markovitch@iso.ru,
Guido van Rossum <guido@python.org>
parents: 11673
diff changeset
135
38673
a19c20c5e5c7 Merge the rest of the trunk.
Thomas Wouters <thomas@python.org>
parents: 38232
diff changeset
136 BOOL
a19c20c5e5c7 Merge the rest of the trunk.
Thomas Wouters <thomas@python.org>
parents: 38232
diff changeset
137 LeaveNonRecursiveMutex(PNRMUTEX mutex)
12584
cde4da18c4fa Fast NonRecursiveMutex support by Yakov Markovitch, markovitch@iso.ru,
Guido van Rossum <guido@python.org>
parents: 11673
diff changeset
138 {
69068
9b12af6e9ea9 Issue #11618: Fix the timeout logic in threading.Lock.acquire() under
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
139 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
140 }
77513
978326f98316 Issue #15038: Optimize python Locks on Windows
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 69068
diff changeset
141 #endif /* _PY_USE_CV_LOCKS */
12584
cde4da18c4fa Fast NonRecursiveMutex support by Yakov Markovitch, markovitch@iso.ru,
Guido van Rossum <guido@python.org>
parents: 11673
diff changeset
142
9679
877d23bd5bdc Thanks to Chris Herborth, the thread primitives now have proper Py*
Guido van Rossum <guido@python.org>
parents: 6029
diff changeset
143 long PyThread_get_thread_ident(void);
2152
1a52351a00b2 nt thread support
Guido van Rossum <guido@python.org>
parents:
diff changeset
144
1a52351a00b2 nt thread support
Guido van Rossum <guido@python.org>
parents:
diff changeset
145 /*
1a52351a00b2 nt thread support
Guido van Rossum <guido@python.org>
parents:
diff changeset
146 * Initialization of the C package, should not be needed.
1a52351a00b2 nt thread support
Guido van Rossum <guido@python.org>
parents:
diff changeset
147 */
38673
a19c20c5e5c7 Merge the rest of the trunk.
Thomas Wouters <thomas@python.org>
parents: 38232
diff changeset
148 static void
a19c20c5e5c7 Merge the rest of the trunk.
Thomas Wouters <thomas@python.org>
parents: 38232
diff changeset
149 PyThread__init_thread(void)
2152
1a52351a00b2 nt thread support
Guido van Rossum <guido@python.org>
parents:
diff changeset
150 {
1a52351a00b2 nt thread support
Guido van Rossum <guido@python.org>
parents:
diff changeset
151 }
1a52351a00b2 nt thread support
Guido van Rossum <guido@python.org>
parents:
diff changeset
152
1a52351a00b2 nt thread support
Guido van Rossum <guido@python.org>
parents:
diff changeset
153 /*
1a52351a00b2 nt thread support
Guido van Rossum <guido@python.org>
parents:
diff changeset
154 * Thread support.
1a52351a00b2 nt thread support
Guido van Rossum <guido@python.org>
parents:
diff changeset
155 */
20468
ebfd87e87884 Partial patch from SF #452266, by Jason Petrone.
Guido van Rossum <guido@python.org>
parents: 19568
diff changeset
156
ebfd87e87884 Partial patch from SF #452266, by Jason Petrone.
Guido van Rossum <guido@python.org>
parents: 19568
diff changeset
157 typedef struct {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
158 void (*func)(void*);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
159 void *arg;
20468
ebfd87e87884 Partial patch from SF #452266, by Jason Petrone.
Guido van Rossum <guido@python.org>
parents: 19568
diff changeset
160 } callobj;
ebfd87e87884 Partial patch from SF #452266, by Jason Petrone.
Guido van Rossum <guido@python.org>
parents: 19568
diff changeset
161
50745
2b2707ff8bb7 Merged revisions 68455,68476,68542 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents: 41716
diff changeset
162 /* 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
163 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
164 #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
165 static DWORD WINAPI
2b2707ff8bb7 Merged revisions 68455,68476,68542 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents: 41716
diff changeset
166 #else
2b2707ff8bb7 Merged revisions 68455,68476,68542 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents: 41716
diff changeset
167 static unsigned __stdcall
2b2707ff8bb7 Merged revisions 68455,68476,68542 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents: 41716
diff changeset
168 #endif
20468
ebfd87e87884 Partial patch from SF #452266, by Jason Petrone.
Guido van Rossum <guido@python.org>
parents: 19568
diff changeset
169 bootstrap(void *call)
ebfd87e87884 Partial patch from SF #452266, by Jason Petrone.
Guido van Rossum <guido@python.org>
parents: 19568
diff changeset
170 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
171 callobj *obj = (callobj*)call;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
172 void (*func)(void*) = obj->func;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
173 void *arg = obj->arg;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
174 HeapFree(GetProcessHeap(), 0, obj);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
175 func(arg);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
176 return 0;
20468
ebfd87e87884 Partial patch from SF #452266, by Jason Petrone.
Guido van Rossum <guido@python.org>
parents: 19568
diff changeset
177 }
ebfd87e87884 Partial patch from SF #452266, by Jason Petrone.
Guido van Rossum <guido@python.org>
parents: 19568
diff changeset
178
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
179 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
180 PyThread_start_new_thread(void (*func)(void *), void *arg)
2152
1a52351a00b2 nt thread support
Guido van Rossum <guido@python.org>
parents:
diff changeset
181 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
182 HANDLE hThread;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
183 unsigned threadID;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
184 callobj *obj;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
185
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
186 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
187 PyThread_get_thread_ident()));
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
188 if (!initialized)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
189 PyThread_init_thread();
2152
1a52351a00b2 nt thread support
Guido van Rossum <guido@python.org>
parents:
diff changeset
190
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
191 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
192 if (!obj)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
193 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
194 obj->func = func;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
195 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
196 #if defined(MS_WINCE)
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
197 hThread = CreateThread(NULL,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
198 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
199 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
200 #else
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
201 hThread = (HANDLE)_beginthreadex(0,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
202 Py_SAFE_DOWNCAST(_pythread_stacksize,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
203 Py_ssize_t, unsigned int),
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
204 bootstrap, obj,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
205 0, &threadID);
50745
2b2707ff8bb7 Merged revisions 68455,68476,68542 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents: 41716
diff changeset
206 #endif
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
207 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
208 #if defined(MS_WINCE)
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
209 /* 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
210 from clobbering it. */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
211 unsigned e = GetLastError();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
212 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
213 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
214 #else
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
215 /* 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
216 * too many threads".
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
217 */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
218 int e = errno;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
219 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
220 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
221 #endif
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
222 threadID = (unsigned)-1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
223 HeapFree(GetProcessHeap(), 0, obj);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
224 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
225 else {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
226 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
227 PyThread_get_thread_ident(), (void*)hThread));
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
228 CloseHandle(hThread);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
229 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
230 return (long) threadID;
2152
1a52351a00b2 nt thread support
Guido van Rossum <guido@python.org>
parents:
diff changeset
231 }
1a52351a00b2 nt thread support
Guido van Rossum <guido@python.org>
parents:
diff changeset
232
1a52351a00b2 nt thread support
Guido van Rossum <guido@python.org>
parents:
diff changeset
233 /*
1a52351a00b2 nt thread support
Guido van Rossum <guido@python.org>
parents:
diff changeset
234 * 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
235 * thread in the system
1a52351a00b2 nt thread support
Guido van Rossum <guido@python.org>
parents:
diff changeset
236 */
38673
a19c20c5e5c7 Merge the rest of the trunk.
Thomas Wouters <thomas@python.org>
parents: 38232
diff changeset
237 long
a19c20c5e5c7 Merge the rest of the trunk.
Thomas Wouters <thomas@python.org>
parents: 38232
diff changeset
238 PyThread_get_thread_ident(void)
2152
1a52351a00b2 nt thread support
Guido van Rossum <guido@python.org>
parents:
diff changeset
239 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
240 if (!initialized)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
241 PyThread_init_thread();
12584
cde4da18c4fa Fast NonRecursiveMutex support by Yakov Markovitch, markovitch@iso.ru,
Guido van Rossum <guido@python.org>
parents: 11673
diff changeset
242
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
243 return GetCurrentThreadId();
2152
1a52351a00b2 nt thread support
Guido van Rossum <guido@python.org>
parents:
diff changeset
244 }
1a52351a00b2 nt thread support
Guido van Rossum <guido@python.org>
parents:
diff changeset
245
38673
a19c20c5e5c7 Merge the rest of the trunk.
Thomas Wouters <thomas@python.org>
parents: 38232
diff changeset
246 void
a19c20c5e5c7 Merge the rest of the trunk.
Thomas Wouters <thomas@python.org>
parents: 38232
diff changeset
247 PyThread_exit_thread(void)
2152
1a52351a00b2 nt thread support
Guido van Rossum <guido@python.org>
parents:
diff changeset
248 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
249 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
250 if (!initialized)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
251 exit(0);
50745
2b2707ff8bb7 Merged revisions 68455,68476,68542 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents: 41716
diff changeset
252 #if defined(MS_WINCE)
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
253 ExitThread(0);
50745
2b2707ff8bb7 Merged revisions 68455,68476,68542 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents: 41716
diff changeset
254 #else
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
255 _endthreadex(0);
50745
2b2707ff8bb7 Merged revisions 68455,68476,68542 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents: 41716
diff changeset
256 #endif
2152
1a52351a00b2 nt thread support
Guido van Rossum <guido@python.org>
parents:
diff changeset
257 }
1a52351a00b2 nt thread support
Guido van Rossum <guido@python.org>
parents:
diff changeset
258
1a52351a00b2 nt thread support
Guido van Rossum <guido@python.org>
parents:
diff changeset
259 /*
1a52351a00b2 nt thread support
Guido van Rossum <guido@python.org>
parents:
diff changeset
260 * Lock support. It has too be implemented as semaphores.
1a52351a00b2 nt thread support
Guido van Rossum <guido@python.org>
parents:
diff changeset
261 * 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
262 * tell whether a thread already own the lock or not.
1a52351a00b2 nt thread support
Guido van Rossum <guido@python.org>
parents:
diff changeset
263 */
38673
a19c20c5e5c7 Merge the rest of the trunk.
Thomas Wouters <thomas@python.org>
parents: 38232
diff changeset
264 PyThread_type_lock
a19c20c5e5c7 Merge the rest of the trunk.
Thomas Wouters <thomas@python.org>
parents: 38232
diff changeset
265 PyThread_allocate_lock(void)
2152
1a52351a00b2 nt thread support
Guido van Rossum <guido@python.org>
parents:
diff changeset
266 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
267 PNRMUTEX aLock;
2152
1a52351a00b2 nt thread support
Guido van Rossum <guido@python.org>
parents:
diff changeset
268
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
269 dprintf(("PyThread_allocate_lock called\n"));
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
270 if (!initialized)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
271 PyThread_init_thread();
2152
1a52351a00b2 nt thread support
Guido van Rossum <guido@python.org>
parents:
diff changeset
272
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
273 aLock = AllocNonRecursiveMutex() ;
2152
1a52351a00b2 nt thread support
Guido van Rossum <guido@python.org>
parents:
diff changeset
274
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
275 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
276
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
277 return (PyThread_type_lock) aLock;
2152
1a52351a00b2 nt thread support
Guido van Rossum <guido@python.org>
parents:
diff changeset
278 }
1a52351a00b2 nt thread support
Guido van Rossum <guido@python.org>
parents:
diff changeset
279
38673
a19c20c5e5c7 Merge the rest of the trunk.
Thomas Wouters <thomas@python.org>
parents: 38232
diff changeset
280 void
a19c20c5e5c7 Merge the rest of the trunk.
Thomas Wouters <thomas@python.org>
parents: 38232
diff changeset
281 PyThread_free_lock(PyThread_type_lock aLock)
2152
1a52351a00b2 nt thread support
Guido van Rossum <guido@python.org>
parents:
diff changeset
282 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
283 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
284
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
285 FreeNonRecursiveMutex(aLock) ;
2152
1a52351a00b2 nt thread support
Guido van Rossum <guido@python.org>
parents:
diff changeset
286 }
1a52351a00b2 nt thread support
Guido van Rossum <guido@python.org>
parents:
diff changeset
287
1a52351a00b2 nt thread support
Guido van Rossum <guido@python.org>
parents:
diff changeset
288 /*
1a52351a00b2 nt thread support
Guido van Rossum <guido@python.org>
parents:
diff changeset
289 * Return 1 on success if the lock was acquired
1a52351a00b2 nt thread support
Guido van Rossum <guido@python.org>
parents:
diff changeset
290 *
1a52351a00b2 nt thread support
Guido van Rossum <guido@python.org>
parents:
diff changeset
291 * 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
292 * if the lock has already been acquired by this thread!
1a52351a00b2 nt thread support
Guido van Rossum <guido@python.org>
parents:
diff changeset
293 */
66946
b750c45a772c Issue #8844: Regular and recursive lock acquisitions can now be interrupted
Antoine Pitrou <solipsis@pitrou.net>
parents: 64844
diff changeset
294 PyLockStatus
b750c45a772c Issue #8844: Regular and recursive lock acquisitions can now be interrupted
Antoine Pitrou <solipsis@pitrou.net>
parents: 64844
diff changeset
295 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
296 PY_TIMEOUT_T microseconds, int intr_flag)
2152
1a52351a00b2 nt thread support
Guido van Rossum <guido@python.org>
parents:
diff changeset
297 {
66946
b750c45a772c Issue #8844: Regular and recursive lock acquisitions can now be interrupted
Antoine Pitrou <solipsis@pitrou.net>
parents: 64844
diff changeset
298 /* 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
299 * uninterruptible. */
b750c45a772c Issue #8844: Regular and recursive lock acquisitions can now be interrupted
Antoine Pitrou <solipsis@pitrou.net>
parents: 64844
diff changeset
300 PyLockStatus success;
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
301 PY_TIMEOUT_T milliseconds;
2152
1a52351a00b2 nt thread support
Guido van Rossum <guido@python.org>
parents:
diff changeset
302
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
303 if (microseconds >= 0) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
304 milliseconds = microseconds / 1000;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
305 if (microseconds % 1000 > 0)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
306 ++milliseconds;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
307 if ((DWORD) milliseconds != milliseconds)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
308 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
309 "please check PY_TIMEOUT_MAX");
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
310 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
311 else
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
312 milliseconds = INFINITE;
2152
1a52351a00b2 nt thread support
Guido van Rossum <guido@python.org>
parents:
diff changeset
313
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
314 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
315 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
316
66946
b750c45a772c Issue #8844: Regular and recursive lock acquisitions can now be interrupted
Antoine Pitrou <solipsis@pitrou.net>
parents: 64844
diff changeset
317 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
318 (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
319 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
320 }
b750c45a772c Issue #8844: Regular and recursive lock acquisitions can now be interrupted
Antoine Pitrou <solipsis@pitrou.net>
parents: 64844
diff changeset
321 else {
b750c45a772c Issue #8844: Regular and recursive lock acquisitions can now be interrupted
Antoine Pitrou <solipsis@pitrou.net>
parents: 64844
diff changeset
322 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
323 }
60598
01d1fd775d16 Issue #7316: the acquire() method of lock objects in the :mod:`threading`
Antoine Pitrou <solipsis@pitrou.net>
parents: 59089
diff changeset
324
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
325 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
326 PyThread_get_thread_ident(), aLock, microseconds, success));
2152
1a52351a00b2 nt thread support
Guido van Rossum <guido@python.org>
parents:
diff changeset
327
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
328 return success;
2152
1a52351a00b2 nt thread support
Guido van Rossum <guido@python.org>
parents:
diff changeset
329 }
38673
a19c20c5e5c7 Merge the rest of the trunk.
Thomas Wouters <thomas@python.org>
parents: 38232
diff changeset
330 int
a19c20c5e5c7 Merge the rest of the trunk.
Thomas Wouters <thomas@python.org>
parents: 38232
diff changeset
331 PyThread_acquire_lock(PyThread_type_lock aLock, int waitflag)
2152
1a52351a00b2 nt thread support
Guido van Rossum <guido@python.org>
parents:
diff changeset
332 {
66946
b750c45a772c Issue #8844: Regular and recursive lock acquisitions can now be interrupted
Antoine Pitrou <solipsis@pitrou.net>
parents: 64844
diff changeset
333 return PyThread_acquire_lock_timed(aLock, waitflag ? -1 : 0, 0);
2152
1a52351a00b2 nt thread support
Guido van Rossum <guido@python.org>
parents:
diff changeset
334 }
1a52351a00b2 nt thread support
Guido van Rossum <guido@python.org>
parents:
diff changeset
335
38673
a19c20c5e5c7 Merge the rest of the trunk.
Thomas Wouters <thomas@python.org>
parents: 38232
diff changeset
336 void
a19c20c5e5c7 Merge the rest of the trunk.
Thomas Wouters <thomas@python.org>
parents: 38232
diff changeset
337 PyThread_release_lock(PyThread_type_lock aLock)
2152
1a52351a00b2 nt thread support
Guido van Rossum <guido@python.org>
parents:
diff changeset
338 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
339 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
340
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
341 if (!(aLock && LeaveNonRecursiveMutex((PNRMUTEX) aLock)))
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
342 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
343 }
39442
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38673
diff changeset
344
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38673
diff changeset
345 /* 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
346 #define THREAD_MIN_STACKSIZE 0x8000 /* 32kB */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
347 #define THREAD_MAX_STACKSIZE 0x10000000 /* 256MB */
39442
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38673
diff changeset
348
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38673
diff changeset
349 /* set the thread stack size.
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38673
diff changeset
350 * 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
351 */
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38673
diff changeset
352 static int
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38673
diff changeset
353 _pythread_nt_set_stacksize(size_t size)
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38673
diff changeset
354 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
355 /* set to default */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
356 if (size == 0) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
357 _pythread_stacksize = 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
358 return 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
359 }
39442
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38673
diff changeset
360
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
361 /* valid range? */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
362 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
363 _pythread_stacksize = size;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
364 return 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
365 }
39442
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38673
diff changeset
366
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
367 return -1;
39442
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38673
diff changeset
368 }
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38673
diff changeset
369
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
370 #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
371
2b2707ff8bb7 Merged revisions 68455,68476,68542 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents: 41716
diff changeset
372
2b2707ff8bb7 Merged revisions 68455,68476,68542 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents: 41716
diff changeset
373 /* 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
374 #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
375
2b2707ff8bb7 Merged revisions 68455,68476,68542 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents: 41716
diff changeset
376 #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
377 int
2b2707ff8bb7 Merged revisions 68455,68476,68542 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents: 41716
diff changeset
378 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
379 {
64844
8e428b8e7d81 issue 9786 Native TLS support for pthreads
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 61466
diff changeset
380 DWORD result= TlsAlloc();
8e428b8e7d81 issue 9786 Native TLS support for pthreads
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 61466
diff changeset
381 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
382 return -1;
8e428b8e7d81 issue 9786 Native TLS support for pthreads
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 61466
diff changeset
383 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
384 }
2b2707ff8bb7 Merged revisions 68455,68476,68542 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents: 41716
diff changeset
385
2b2707ff8bb7 Merged revisions 68455,68476,68542 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents: 41716
diff changeset
386 void
2b2707ff8bb7 Merged revisions 68455,68476,68542 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents: 41716
diff changeset
387 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
388 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
389 TlsFree(key);
50745
2b2707ff8bb7 Merged revisions 68455,68476,68542 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents: 41716
diff changeset
390 }
2b2707ff8bb7 Merged revisions 68455,68476,68542 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents: 41716
diff changeset
391
2b2707ff8bb7 Merged revisions 68455,68476,68542 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents: 41716
diff changeset
392 /* 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
393 * 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
394 */
2b2707ff8bb7 Merged revisions 68455,68476,68542 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents: 41716
diff changeset
395 int
2b2707ff8bb7 Merged revisions 68455,68476,68542 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents: 41716
diff changeset
396 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
397 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
398 BOOL ok;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
399 void *oldvalue;
50745
2b2707ff8bb7 Merged revisions 68455,68476,68542 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents: 41716
diff changeset
400
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
401 assert(value != NULL);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
402 oldvalue = TlsGetValue(key);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
403 if (oldvalue != NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
404 /* ignore value if already set */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
405 return 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
406 ok = TlsSetValue(key, value);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
407 if (!ok)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
408 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
409 return 0;
50745
2b2707ff8bb7 Merged revisions 68455,68476,68542 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents: 41716
diff changeset
410 }
2b2707ff8bb7 Merged revisions 68455,68476,68542 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents: 41716
diff changeset
411
2b2707ff8bb7 Merged revisions 68455,68476,68542 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents: 41716
diff changeset
412 void *
2b2707ff8bb7 Merged revisions 68455,68476,68542 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents: 41716
diff changeset
413 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
414 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
415 /* 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
416 * 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
417 * 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
418 * 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
419 * do it here.
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
420 */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
421 DWORD error = GetLastError();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
422 void *result = TlsGetValue(key);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
423 SetLastError(error);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
424 return result;
50745
2b2707ff8bb7 Merged revisions 68455,68476,68542 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents: 41716
diff changeset
425 }
2b2707ff8bb7 Merged revisions 68455,68476,68542 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents: 41716
diff changeset
426
2b2707ff8bb7 Merged revisions 68455,68476,68542 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents: 41716
diff changeset
427 void
2b2707ff8bb7 Merged revisions 68455,68476,68542 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents: 41716
diff changeset
428 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
429 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
430 /* 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
431 * 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
432 */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
433 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
434 }
2b2707ff8bb7 Merged revisions 68455,68476,68542 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents: 41716
diff changeset
435
2b2707ff8bb7 Merged revisions 68455,68476,68542 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents: 41716
diff changeset
436 /* 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
437 * 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
438 */
2b2707ff8bb7 Merged revisions 68455,68476,68542 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents: 41716
diff changeset
439 void
2b2707ff8bb7 Merged revisions 68455,68476,68542 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents: 41716
diff changeset
440 PyThread_ReInitTLS(void)
2b2707ff8bb7 Merged revisions 68455,68476,68542 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents: 41716
diff changeset
441 {}
2b2707ff8bb7 Merged revisions 68455,68476,68542 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents: 41716
diff changeset
442
2b2707ff8bb7 Merged revisions 68455,68476,68542 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents: 41716
diff changeset
443 #endif