Mercurial > cpython-lru_cache-weakref
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 |
| 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 |
|
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 | 144 |
| 145 /* | |
| 146 * Initialization of the C package, should not be needed. | |
| 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 | 150 { |
| 151 } | |
| 152 | |
| 153 /* | |
| 154 * Thread support. | |
| 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 | 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 | 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 | 231 } |
| 232 | |
| 233 /* | |
| 234 * Return the thread Id instead of an handle. The Id is said to uniquely identify the | |
| 235 * thread in the system | |
| 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 | 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 | 244 } |
| 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 | 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 | 257 } |
| 258 | |
| 259 /* | |
| 260 * Lock support. It has too be implemented as semaphores. | |
| 261 * I [Dag] tried to implement it with mutex but I could find a way to | |
| 262 * tell whether a thread already own the lock or not. | |
| 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 | 266 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
267 PNRMUTEX aLock; |
| 2152 | 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 | 272 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
273 aLock = AllocNonRecursiveMutex() ; |
| 2152 | 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 | 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 | 278 } |
| 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 | 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 | 284 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50745
diff
changeset
|
285 FreeNonRecursiveMutex(aLock) ; |
| 2152 | 286 } |
| 287 | |
| 288 /* | |
| 289 * Return 1 on success if the lock was acquired | |
| 290 * | |
| 291 * and 0 if the lock was not acquired. This means a 0 is returned | |
| 292 * if the lock has already been acquired by this thread! | |
| 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 | 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 | 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 | 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 | 327 |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60598
diff
changeset
|
328 return success; |
| 2152 | 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 | 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 | 334 } |
| 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 | 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 | 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 | 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 |
