Mercurial > cpython-lru_cache-weakref
annotate Python/thread.c @ 35752:47496e7dbf2f legacy-trunk
Fix SF bug #1167751, Argument genexp corner case
Incorrect code was generated for:
foo(a = i for i in range(10))
This should have generated a SyntaxError. Fix the Grammar so
it raises a SyntaxError and test it.
I'm uncertain whether this should be backported. It makes
something that was Syntactically valid invalid. However,
the code would either be completely broken or do the wrong thing.
| author | Neal Norwitz <nnorwitz@gmail.com> |
|---|---|
| date | Fri, 21 Oct 2005 06:24:02 +0000 |
| parents | b19cf73c54a7 |
| children | 0b2b076e5908 a19c20c5e5c7 |
| rev | line source |
|---|---|
|
1198
2937897a7d8b
* Added Fixcprt.py: script to fix copyright message.
Guido van Rossum <guido@python.org>
parents:
1186
diff
changeset
|
1 |
|
1848
b724599401ff
Merge back to main trunk
Guido van Rossum <guido@python.org>
parents:
1418
diff
changeset
|
2 /* Thread package. |
|
b724599401ff
Merge back to main trunk
Guido van Rossum <guido@python.org>
parents:
1418
diff
changeset
|
3 This is intended to be usable independently from Python. |
|
b724599401ff
Merge back to main trunk
Guido van Rossum <guido@python.org>
parents:
1418
diff
changeset
|
4 The implementation for system foobar is in a file thread_foobar.h |
|
b724599401ff
Merge back to main trunk
Guido van Rossum <guido@python.org>
parents:
1418
diff
changeset
|
5 which is included by this file dependent on config settings. |
|
b724599401ff
Merge back to main trunk
Guido van Rossum <guido@python.org>
parents:
1418
diff
changeset
|
6 Stuff shared by all thread_*.h files is collected here. */ |
|
b724599401ff
Merge back to main trunk
Guido van Rossum <guido@python.org>
parents:
1418
diff
changeset
|
7 |
|
21712
c64fc56f6072
Include <unistd.h> in Python.h. Fixes #500924.
Martin v. Löwis <martin@v.loewis.de>
parents:
20468
diff
changeset
|
8 #include "Python.h" |
|
1848
b724599401ff
Merge back to main trunk
Guido van Rossum <guido@python.org>
parents:
1418
diff
changeset
|
9 |
|
33145
28a205ecb4dd
The attached patch fixes FTBFS on GNU/k*BSD. The problem happens on GNU/k*BSD
Matthias Klose <doko@ubuntu.com>
parents:
31504
diff
changeset
|
10 |
|
28a205ecb4dd
The attached patch fixes FTBFS on GNU/k*BSD. The problem happens on GNU/k*BSD
Matthias Klose <doko@ubuntu.com>
parents:
31504
diff
changeset
|
11 #ifndef _POSIX_THREADS |
|
28a205ecb4dd
The attached patch fixes FTBFS on GNU/k*BSD. The problem happens on GNU/k*BSD
Matthias Klose <doko@ubuntu.com>
parents:
31504
diff
changeset
|
12 /* This means pthreads are not implemented in libc headers, hence the macro |
|
28a205ecb4dd
The attached patch fixes FTBFS on GNU/k*BSD. The problem happens on GNU/k*BSD
Matthias Klose <doko@ubuntu.com>
parents:
31504
diff
changeset
|
13 not present in unistd.h. But they still can be implemented as an external |
|
28a205ecb4dd
The attached patch fixes FTBFS on GNU/k*BSD. The problem happens on GNU/k*BSD
Matthias Klose <doko@ubuntu.com>
parents:
31504
diff
changeset
|
14 library (e.g. gnu pth in pthread emulation) */ |
|
28a205ecb4dd
The attached patch fixes FTBFS on GNU/k*BSD. The problem happens on GNU/k*BSD
Matthias Klose <doko@ubuntu.com>
parents:
31504
diff
changeset
|
15 # ifdef HAVE_PTHREAD_H |
|
28a205ecb4dd
The attached patch fixes FTBFS on GNU/k*BSD. The problem happens on GNU/k*BSD
Matthias Klose <doko@ubuntu.com>
parents:
31504
diff
changeset
|
16 # include <pthread.h> /* _POSIX_THREADS */ |
|
28a205ecb4dd
The attached patch fixes FTBFS on GNU/k*BSD. The problem happens on GNU/k*BSD
Matthias Klose <doko@ubuntu.com>
parents:
31504
diff
changeset
|
17 # endif |
|
28a205ecb4dd
The attached patch fixes FTBFS on GNU/k*BSD. The problem happens on GNU/k*BSD
Matthias Klose <doko@ubuntu.com>
parents:
31504
diff
changeset
|
18 #endif |
|
28a205ecb4dd
The attached patch fixes FTBFS on GNU/k*BSD. The problem happens on GNU/k*BSD
Matthias Klose <doko@ubuntu.com>
parents:
31504
diff
changeset
|
19 |
|
10530
d834ecdf8c26
Changes by Mark Hammond for Windows CE. Mostly of the form
Guido van Rossum <guido@python.org>
parents:
9679
diff
changeset
|
20 #ifndef DONT_HAVE_STDIO_H |
|
1848
b724599401ff
Merge back to main trunk
Guido van Rossum <guido@python.org>
parents:
1418
diff
changeset
|
21 #include <stdio.h> |
|
10530
d834ecdf8c26
Changes by Mark Hammond for Windows CE. Mostly of the form
Guido van Rossum <guido@python.org>
parents:
9679
diff
changeset
|
22 #endif |
|
1848
b724599401ff
Merge back to main trunk
Guido van Rossum <guido@python.org>
parents:
1418
diff
changeset
|
23 |
|
b724599401ff
Merge back to main trunk
Guido van Rossum <guido@python.org>
parents:
1418
diff
changeset
|
24 #include <stdlib.h> |
|
b724599401ff
Merge back to main trunk
Guido van Rossum <guido@python.org>
parents:
1418
diff
changeset
|
25 |
|
5381
339d4129d3f7
Ugly hack for SGI IRIX 6.2. Apparently _POSIX_THREADS is defined even
Guido van Rossum <guido@python.org>
parents:
4839
diff
changeset
|
26 #ifdef __sgi |
|
339d4129d3f7
Ugly hack for SGI IRIX 6.2. Apparently _POSIX_THREADS is defined even
Guido van Rossum <guido@python.org>
parents:
4839
diff
changeset
|
27 #ifndef HAVE_PTHREAD_H /* XXX Need to check in configure.in */ |
|
339d4129d3f7
Ugly hack for SGI IRIX 6.2. Apparently _POSIX_THREADS is defined even
Guido van Rossum <guido@python.org>
parents:
4839
diff
changeset
|
28 #undef _POSIX_THREADS |
|
339d4129d3f7
Ugly hack for SGI IRIX 6.2. Apparently _POSIX_THREADS is defined even
Guido van Rossum <guido@python.org>
parents:
4839
diff
changeset
|
29 #endif |
|
339d4129d3f7
Ugly hack for SGI IRIX 6.2. Apparently _POSIX_THREADS is defined even
Guido van Rossum <guido@python.org>
parents:
4839
diff
changeset
|
30 #endif |
|
339d4129d3f7
Ugly hack for SGI IRIX 6.2. Apparently _POSIX_THREADS is defined even
Guido van Rossum <guido@python.org>
parents:
4839
diff
changeset
|
31 |
|
9203
07dae6fdae79
Renamed thread.h to pythread.h.
Guido van Rossum <guido@python.org>
parents:
8822
diff
changeset
|
32 #include "pythread.h" |
|
923
72aceed365d4
* Makefile adapted to changes below.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
33 |
|
1848
b724599401ff
Merge back to main trunk
Guido van Rossum <guido@python.org>
parents:
1418
diff
changeset
|
34 #ifndef _POSIX_THREADS |
|
b724599401ff
Merge back to main trunk
Guido van Rossum <guido@python.org>
parents:
1418
diff
changeset
|
35 |
|
923
72aceed365d4
* Makefile adapted to changes below.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
36 #ifdef __sgi |
|
1848
b724599401ff
Merge back to main trunk
Guido van Rossum <guido@python.org>
parents:
1418
diff
changeset
|
37 #define SGI_THREADS |
|
b724599401ff
Merge back to main trunk
Guido van Rossum <guido@python.org>
parents:
1418
diff
changeset
|
38 #endif |
|
961
a31e07847063
New thread.c from Sjoerd, supports _exit_prog(). Use this in goaway()
Guido van Rossum <guido@python.org>
parents:
926
diff
changeset
|
39 |
|
1848
b724599401ff
Merge back to main trunk
Guido van Rossum <guido@python.org>
parents:
1418
diff
changeset
|
40 #ifdef HAVE_THREAD_H |
|
b724599401ff
Merge back to main trunk
Guido van Rossum <guido@python.org>
parents:
1418
diff
changeset
|
41 #define SOLARIS_THREADS |
|
923
72aceed365d4
* Makefile adapted to changes below.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
42 #endif |
|
72aceed365d4
* Makefile adapted to changes below.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
43 |
|
1848
b724599401ff
Merge back to main trunk
Guido van Rossum <guido@python.org>
parents:
1418
diff
changeset
|
44 #if defined(sun) && !defined(SOLARIS_THREADS) |
|
b724599401ff
Merge back to main trunk
Guido van Rossum <guido@python.org>
parents:
1418
diff
changeset
|
45 #define SUN_LWP |
|
b724599401ff
Merge back to main trunk
Guido van Rossum <guido@python.org>
parents:
1418
diff
changeset
|
46 #endif |
|
b724599401ff
Merge back to main trunk
Guido van Rossum <guido@python.org>
parents:
1418
diff
changeset
|
47 |
| 35549 | 48 /* Check if we're running on HP-UX and _SC_THREADS is defined. If so, then |
| 49 enough of the Posix threads package is implimented to support python | |
| 50 threads. | |
| 51 | |
| 52 This is valid for HP-UX 11.23 running on an ia64 system. If needed, add | |
| 53 a check of __ia64 to verify that we're running on a ia64 system instead | |
| 54 of a pa-risc system. | |
| 55 */ | |
| 56 #ifdef __hpux | |
| 57 #ifdef _SC_THREADS | |
| 58 #define _POSIX_THREADS | |
| 59 #endif | |
| 60 #endif | |
| 61 | |
| 1418 | 62 #endif /* _POSIX_THREADS */ |
|
923
72aceed365d4
* Makefile adapted to changes below.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
63 |
|
72aceed365d4
* Makefile adapted to changes below.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
64 |
|
4839
4567e158d20c
Rename DEBUG macro to Py_DEBUG
Guido van Rossum <guido@python.org>
parents:
4596
diff
changeset
|
65 #ifdef Py_DEBUG |
|
1848
b724599401ff
Merge back to main trunk
Guido van Rossum <guido@python.org>
parents:
1418
diff
changeset
|
66 static int thread_debug = 0; |
|
23992
95da99187c57
Silence compiler warning
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
23777
diff
changeset
|
67 #define dprintf(args) (void)((thread_debug & 1) && printf args) |
|
1848
b724599401ff
Merge back to main trunk
Guido van Rossum <guido@python.org>
parents:
1418
diff
changeset
|
68 #define d2printf(args) ((thread_debug & 8) && printf args) |
|
b724599401ff
Merge back to main trunk
Guido van Rossum <guido@python.org>
parents:
1418
diff
changeset
|
69 #else |
|
b724599401ff
Merge back to main trunk
Guido van Rossum <guido@python.org>
parents:
1418
diff
changeset
|
70 #define dprintf(args) |
|
b724599401ff
Merge back to main trunk
Guido van Rossum <guido@python.org>
parents:
1418
diff
changeset
|
71 #define d2printf(args) |
|
b724599401ff
Merge back to main trunk
Guido van Rossum <guido@python.org>
parents:
1418
diff
changeset
|
72 #endif |
|
b724599401ff
Merge back to main trunk
Guido van Rossum <guido@python.org>
parents:
1418
diff
changeset
|
73 |
|
923
72aceed365d4
* Makefile adapted to changes below.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
74 static int initialized; |
|
72aceed365d4
* Makefile adapted to changes below.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
75 |
|
13689
9db86b27278f
Prototype yet another forward declaration.
Thomas Wouters <thomas@python.org>
parents:
13658
diff
changeset
|
76 static void PyThread__init_thread(void); /* Forward */ |
|
1004
5d7142ea01b7
adapted SV module to the new svideo library.
Sjoerd Mullender <sjoerd@acm.org>
parents:
961
diff
changeset
|
77 |
|
13658
f79434ee41fa
Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents:
13256
diff
changeset
|
78 void PyThread_init_thread(void) |
|
1004
5d7142ea01b7
adapted SV module to the new svideo library.
Sjoerd Mullender <sjoerd@acm.org>
parents:
961
diff
changeset
|
79 { |
|
4839
4567e158d20c
Rename DEBUG macro to Py_DEBUG
Guido van Rossum <guido@python.org>
parents:
4596
diff
changeset
|
80 #ifdef Py_DEBUG |
| 1418 | 81 char *p = getenv("THREADDEBUG"); |
| 82 | |
| 83 if (p) { | |
| 84 if (*p) | |
| 85 thread_debug = atoi(p); | |
| 86 else | |
| 87 thread_debug = 1; | |
| 88 } | |
|
4839
4567e158d20c
Rename DEBUG macro to Py_DEBUG
Guido van Rossum <guido@python.org>
parents:
4596
diff
changeset
|
89 #endif /* Py_DEBUG */ |
|
1004
5d7142ea01b7
adapted SV module to the new svideo library.
Sjoerd Mullender <sjoerd@acm.org>
parents:
961
diff
changeset
|
90 if (initialized) |
|
5d7142ea01b7
adapted SV module to the new svideo library.
Sjoerd Mullender <sjoerd@acm.org>
parents:
961
diff
changeset
|
91 return; |
|
5d7142ea01b7
adapted SV module to the new svideo library.
Sjoerd Mullender <sjoerd@acm.org>
parents:
961
diff
changeset
|
92 initialized = 1; |
|
9679
877d23bd5bdc
Thanks to Chris Herborth, the thread primitives now have proper Py*
Guido van Rossum <guido@python.org>
parents:
9589
diff
changeset
|
93 dprintf(("PyThread_init_thread called\n")); |
|
877d23bd5bdc
Thanks to Chris Herborth, the thread primitives now have proper Py*
Guido van Rossum <guido@python.org>
parents:
9589
diff
changeset
|
94 PyThread__init_thread(); |
|
923
72aceed365d4
* Makefile adapted to changes below.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
95 } |
|
72aceed365d4
* Makefile adapted to changes below.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
96 |
|
1848
b724599401ff
Merge back to main trunk
Guido van Rossum <guido@python.org>
parents:
1418
diff
changeset
|
97 #ifdef SGI_THREADS |
|
b724599401ff
Merge back to main trunk
Guido van Rossum <guido@python.org>
parents:
1418
diff
changeset
|
98 #include "thread_sgi.h" |
| 1418 | 99 #endif |
|
961
a31e07847063
New thread.c from Sjoerd, supports _exit_prog(). Use this in goaway()
Guido van Rossum <guido@python.org>
parents:
926
diff
changeset
|
100 |
|
1848
b724599401ff
Merge back to main trunk
Guido van Rossum <guido@python.org>
parents:
1418
diff
changeset
|
101 #ifdef SOLARIS_THREADS |
|
b724599401ff
Merge back to main trunk
Guido van Rossum <guido@python.org>
parents:
1418
diff
changeset
|
102 #include "thread_solaris.h" |
|
923
72aceed365d4
* Makefile adapted to changes below.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
103 #endif |
|
1848
b724599401ff
Merge back to main trunk
Guido van Rossum <guido@python.org>
parents:
1418
diff
changeset
|
104 |
|
b724599401ff
Merge back to main trunk
Guido van Rossum <guido@python.org>
parents:
1418
diff
changeset
|
105 #ifdef SUN_LWP |
|
b724599401ff
Merge back to main trunk
Guido van Rossum <guido@python.org>
parents:
1418
diff
changeset
|
106 #include "thread_lwp.h" |
|
923
72aceed365d4
* Makefile adapted to changes below.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
107 #endif |
|
72aceed365d4
* Makefile adapted to changes below.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
108 |
|
14674
756c8c6535fe
Make better use of GNU Pth -- patch by Andy Dustman.
Guido van Rossum <guido@python.org>
parents:
14375
diff
changeset
|
109 #ifdef HAVE_PTH |
|
12611
b320cf3a98b9
Andy Dustman: add GNU pth user-space thread support.
Guido van Rossum <guido@python.org>
parents:
12475
diff
changeset
|
110 #include "thread_pth.h" |
|
30466
1a817694ecbd
Patch #805613: Fix usage of the PTH library.
Martin v. Löwis <martin@v.loewis.de>
parents:
28694
diff
changeset
|
111 #undef _POSIX_THREADS |
|
14674
756c8c6535fe
Make better use of GNU Pth -- patch by Andy Dustman.
Guido van Rossum <guido@python.org>
parents:
14375
diff
changeset
|
112 #endif |
|
756c8c6535fe
Make better use of GNU Pth -- patch by Andy Dustman.
Guido van Rossum <guido@python.org>
parents:
14375
diff
changeset
|
113 |
|
1848
b724599401ff
Merge back to main trunk
Guido van Rossum <guido@python.org>
parents:
1418
diff
changeset
|
114 #ifdef _POSIX_THREADS |
|
b724599401ff
Merge back to main trunk
Guido van Rossum <guido@python.org>
parents:
1418
diff
changeset
|
115 #include "thread_pthread.h" |
|
923
72aceed365d4
* Makefile adapted to changes below.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
116 #endif |
|
72aceed365d4
* Makefile adapted to changes below.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
117 |
|
1848
b724599401ff
Merge back to main trunk
Guido van Rossum <guido@python.org>
parents:
1418
diff
changeset
|
118 #ifdef C_THREADS |
|
b724599401ff
Merge back to main trunk
Guido van Rossum <guido@python.org>
parents:
1418
diff
changeset
|
119 #include "thread_cthread.h" |
|
b724599401ff
Merge back to main trunk
Guido van Rossum <guido@python.org>
parents:
1418
diff
changeset
|
120 #endif |
|
923
72aceed365d4
* Makefile adapted to changes below.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
121 |
| 2152 | 122 #ifdef NT_THREADS |
| 123 #include "thread_nt.h" | |
| 124 #endif | |
| 125 | |
|
6626
5e31d381fa47
os2 patch by Jeff Rush
Guido van Rossum <guido@python.org>
parents:
5599
diff
changeset
|
126 #ifdef OS2_THREADS |
|
5e31d381fa47
os2 patch by Jeff Rush
Guido van Rossum <guido@python.org>
parents:
5599
diff
changeset
|
127 #include "thread_os2.h" |
|
5e31d381fa47
os2 patch by Jeff Rush
Guido van Rossum <guido@python.org>
parents:
5599
diff
changeset
|
128 #endif |
|
5e31d381fa47
os2 patch by Jeff Rush
Guido van Rossum <guido@python.org>
parents:
5599
diff
changeset
|
129 |
|
8822
bd47ee068b83
Changes for BeOS, QNX and long long, by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
6626
diff
changeset
|
130 #ifdef BEOS_THREADS |
|
bd47ee068b83
Changes for BeOS, QNX and long long, by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
6626
diff
changeset
|
131 #include "thread_beos.h" |
|
bd47ee068b83
Changes for BeOS, QNX and long long, by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
6626
diff
changeset
|
132 #endif |
|
bd47ee068b83
Changes for BeOS, QNX and long long, by Chris Herborth.
Guido van Rossum <guido@python.org>
parents:
6626
diff
changeset
|
133 |
|
10530
d834ecdf8c26
Changes by Mark Hammond for Windows CE. Mostly of the form
Guido van Rossum <guido@python.org>
parents:
9679
diff
changeset
|
134 #ifdef WINCE_THREADS |
|
d834ecdf8c26
Changes by Mark Hammond for Windows CE. Mostly of the form
Guido van Rossum <guido@python.org>
parents:
9679
diff
changeset
|
135 #include "thread_wince.h" |
|
d834ecdf8c26
Changes by Mark Hammond for Windows CE. Mostly of the form
Guido van Rossum <guido@python.org>
parents:
9679
diff
changeset
|
136 #endif |
|
d834ecdf8c26
Changes by Mark Hammond for Windows CE. Mostly of the form
Guido van Rossum <guido@python.org>
parents:
9679
diff
changeset
|
137 |
|
22206
b898c0feb754
Patch #504224: add plan9 threads include to thread.c.
Martin v. Löwis <martin@v.loewis.de>
parents:
21712
diff
changeset
|
138 #ifdef PLAN9_THREADS |
|
b898c0feb754
Patch #504224: add plan9 threads include to thread.c.
Martin v. Löwis <martin@v.loewis.de>
parents:
21712
diff
changeset
|
139 #include "thread_plan9.h" |
|
b898c0feb754
Patch #504224: add plan9 threads include to thread.c.
Martin v. Löwis <martin@v.loewis.de>
parents:
21712
diff
changeset
|
140 #endif |
|
b898c0feb754
Patch #504224: add plan9 threads include to thread.c.
Martin v. Löwis <martin@v.loewis.de>
parents:
21712
diff
changeset
|
141 |
|
23777
bec1b942e0bc
Patch #488073: AtheOS port.
Martin v. Löwis <martin@v.loewis.de>
parents:
22509
diff
changeset
|
142 #ifdef ATHEOS_THREADS |
|
bec1b942e0bc
Patch #488073: AtheOS port.
Martin v. Löwis <martin@v.loewis.de>
parents:
22509
diff
changeset
|
143 #include "thread_atheos.h" |
|
bec1b942e0bc
Patch #488073: AtheOS port.
Martin v. Löwis <martin@v.loewis.de>
parents:
22509
diff
changeset
|
144 #endif |
|
bec1b942e0bc
Patch #488073: AtheOS port.
Martin v. Löwis <martin@v.loewis.de>
parents:
22509
diff
changeset
|
145 |
|
961
a31e07847063
New thread.c from Sjoerd, supports _exit_prog(). Use this in goaway()
Guido van Rossum <guido@python.org>
parents:
926
diff
changeset
|
146 /* |
|
1848
b724599401ff
Merge back to main trunk
Guido van Rossum <guido@python.org>
parents:
1418
diff
changeset
|
147 #ifdef FOOBAR_THREADS |
|
b724599401ff
Merge back to main trunk
Guido van Rossum <guido@python.org>
parents:
1418
diff
changeset
|
148 #include "thread_foobar.h" |
|
923
72aceed365d4
* Makefile adapted to changes below.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
149 #endif |
|
1848
b724599401ff
Merge back to main trunk
Guido van Rossum <guido@python.org>
parents:
1418
diff
changeset
|
150 */ |
|
28694
a4154dd5939a
New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents:
24315
diff
changeset
|
151 |
|
a4154dd5939a
New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents:
24315
diff
changeset
|
152 #ifndef Py_HAVE_NATIVE_TLS |
|
a4154dd5939a
New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents:
24315
diff
changeset
|
153 /* If the platform has not supplied a platform specific |
|
a4154dd5939a
New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents:
24315
diff
changeset
|
154 TLS implementation, provide our own. |
|
a4154dd5939a
New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents:
24315
diff
changeset
|
155 |
|
a4154dd5939a
New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents:
24315
diff
changeset
|
156 This code stolen from "thread_sgi.h", where it was the only |
|
a4154dd5939a
New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents:
24315
diff
changeset
|
157 implementation of an existing Python TLS API. |
|
a4154dd5939a
New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents:
24315
diff
changeset
|
158 */ |
|
33705
891042c94aed
Document the results of painful reverse-engineering of the "portable TLS"
Tim Peters <tim.peters@gmail.com>
parents:
33699
diff
changeset
|
159 /* ------------------------------------------------------------------------ |
|
891042c94aed
Document the results of painful reverse-engineering of the "portable TLS"
Tim Peters <tim.peters@gmail.com>
parents:
33699
diff
changeset
|
160 Per-thread data ("key") support. |
|
891042c94aed
Document the results of painful reverse-engineering of the "portable TLS"
Tim Peters <tim.peters@gmail.com>
parents:
33699
diff
changeset
|
161 |
|
891042c94aed
Document the results of painful reverse-engineering of the "portable TLS"
Tim Peters <tim.peters@gmail.com>
parents:
33699
diff
changeset
|
162 Use PyThread_create_key() to create a new key. This is typically shared |
|
891042c94aed
Document the results of painful reverse-engineering of the "portable TLS"
Tim Peters <tim.peters@gmail.com>
parents:
33699
diff
changeset
|
163 across threads. |
|
891042c94aed
Document the results of painful reverse-engineering of the "portable TLS"
Tim Peters <tim.peters@gmail.com>
parents:
33699
diff
changeset
|
164 |
|
891042c94aed
Document the results of painful reverse-engineering of the "portable TLS"
Tim Peters <tim.peters@gmail.com>
parents:
33699
diff
changeset
|
165 Use PyThread_set_key_value(thekey, value) to associate void* value with |
|
891042c94aed
Document the results of painful reverse-engineering of the "portable TLS"
Tim Peters <tim.peters@gmail.com>
parents:
33699
diff
changeset
|
166 thekey in the current thread. Each thread has a distinct mapping of thekey |
|
891042c94aed
Document the results of painful reverse-engineering of the "portable TLS"
Tim Peters <tim.peters@gmail.com>
parents:
33699
diff
changeset
|
167 to a void* value. Caution: if the current thread already has a mapping |
|
891042c94aed
Document the results of painful reverse-engineering of the "portable TLS"
Tim Peters <tim.peters@gmail.com>
parents:
33699
diff
changeset
|
168 for thekey, value is ignored. |
|
891042c94aed
Document the results of painful reverse-engineering of the "portable TLS"
Tim Peters <tim.peters@gmail.com>
parents:
33699
diff
changeset
|
169 |
|
891042c94aed
Document the results of painful reverse-engineering of the "portable TLS"
Tim Peters <tim.peters@gmail.com>
parents:
33699
diff
changeset
|
170 Use PyThread_get_key_value(thekey) to retrieve the void* value associated |
|
891042c94aed
Document the results of painful reverse-engineering of the "portable TLS"
Tim Peters <tim.peters@gmail.com>
parents:
33699
diff
changeset
|
171 with thekey in the current thread. This returns NULL if no value is |
|
891042c94aed
Document the results of painful reverse-engineering of the "portable TLS"
Tim Peters <tim.peters@gmail.com>
parents:
33699
diff
changeset
|
172 associated with thekey in the current thread. |
|
891042c94aed
Document the results of painful reverse-engineering of the "portable TLS"
Tim Peters <tim.peters@gmail.com>
parents:
33699
diff
changeset
|
173 |
|
891042c94aed
Document the results of painful reverse-engineering of the "portable TLS"
Tim Peters <tim.peters@gmail.com>
parents:
33699
diff
changeset
|
174 Use PyThread_delete_key_value(thekey) to forget the current thread's associated |
|
891042c94aed
Document the results of painful reverse-engineering of the "portable TLS"
Tim Peters <tim.peters@gmail.com>
parents:
33699
diff
changeset
|
175 value for thekey. PyThread_delete_key(thekey) forgets the values associated |
|
891042c94aed
Document the results of painful reverse-engineering of the "portable TLS"
Tim Peters <tim.peters@gmail.com>
parents:
33699
diff
changeset
|
176 with thekey across *all* threads. |
|
891042c94aed
Document the results of painful reverse-engineering of the "portable TLS"
Tim Peters <tim.peters@gmail.com>
parents:
33699
diff
changeset
|
177 |
|
891042c94aed
Document the results of painful reverse-engineering of the "portable TLS"
Tim Peters <tim.peters@gmail.com>
parents:
33699
diff
changeset
|
178 While some of these functions have error-return values, none set any |
|
891042c94aed
Document the results of painful reverse-engineering of the "portable TLS"
Tim Peters <tim.peters@gmail.com>
parents:
33699
diff
changeset
|
179 Python exception. |
|
28694
a4154dd5939a
New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents:
24315
diff
changeset
|
180 |
|
33705
891042c94aed
Document the results of painful reverse-engineering of the "portable TLS"
Tim Peters <tim.peters@gmail.com>
parents:
33699
diff
changeset
|
181 None of the functions does memory management on behalf of the void* values. |
|
891042c94aed
Document the results of painful reverse-engineering of the "portable TLS"
Tim Peters <tim.peters@gmail.com>
parents:
33699
diff
changeset
|
182 You need to allocate and deallocate them yourself. If the void* values |
|
891042c94aed
Document the results of painful reverse-engineering of the "portable TLS"
Tim Peters <tim.peters@gmail.com>
parents:
33699
diff
changeset
|
183 happen to be PyObject*, these functions don't do refcount operations on |
|
891042c94aed
Document the results of painful reverse-engineering of the "portable TLS"
Tim Peters <tim.peters@gmail.com>
parents:
33699
diff
changeset
|
184 them either. |
|
891042c94aed
Document the results of painful reverse-engineering of the "portable TLS"
Tim Peters <tim.peters@gmail.com>
parents:
33699
diff
changeset
|
185 |
|
891042c94aed
Document the results of painful reverse-engineering of the "portable TLS"
Tim Peters <tim.peters@gmail.com>
parents:
33699
diff
changeset
|
186 The GIL does not need to be held when calling these functions; they supply |
|
891042c94aed
Document the results of painful reverse-engineering of the "portable TLS"
Tim Peters <tim.peters@gmail.com>
parents:
33699
diff
changeset
|
187 their own locking. This isn't true of PyThread_create_key(), though (see |
|
891042c94aed
Document the results of painful reverse-engineering of the "portable TLS"
Tim Peters <tim.peters@gmail.com>
parents:
33699
diff
changeset
|
188 next paragraph). |
|
891042c94aed
Document the results of painful reverse-engineering of the "portable TLS"
Tim Peters <tim.peters@gmail.com>
parents:
33699
diff
changeset
|
189 |
|
891042c94aed
Document the results of painful reverse-engineering of the "portable TLS"
Tim Peters <tim.peters@gmail.com>
parents:
33699
diff
changeset
|
190 There's a hidden assumption that PyThread_create_key() will be called before |
|
891042c94aed
Document the results of painful reverse-engineering of the "portable TLS"
Tim Peters <tim.peters@gmail.com>
parents:
33699
diff
changeset
|
191 any of the other functions are called. There's also a hidden assumption |
|
891042c94aed
Document the results of painful reverse-engineering of the "portable TLS"
Tim Peters <tim.peters@gmail.com>
parents:
33699
diff
changeset
|
192 that calls to PyThread_create_key() are serialized externally. |
|
891042c94aed
Document the results of painful reverse-engineering of the "portable TLS"
Tim Peters <tim.peters@gmail.com>
parents:
33699
diff
changeset
|
193 ------------------------------------------------------------------------ */ |
|
891042c94aed
Document the results of painful reverse-engineering of the "portable TLS"
Tim Peters <tim.peters@gmail.com>
parents:
33699
diff
changeset
|
194 |
|
891042c94aed
Document the results of painful reverse-engineering of the "portable TLS"
Tim Peters <tim.peters@gmail.com>
parents:
33699
diff
changeset
|
195 /* A singly-linked list of struct key objects remembers all the key->value |
|
891042c94aed
Document the results of painful reverse-engineering of the "portable TLS"
Tim Peters <tim.peters@gmail.com>
parents:
33699
diff
changeset
|
196 * associations. File static keyhead heads the list. keymutex is used |
|
891042c94aed
Document the results of painful reverse-engineering of the "portable TLS"
Tim Peters <tim.peters@gmail.com>
parents:
33699
diff
changeset
|
197 * to enforce exclusion internally. |
|
891042c94aed
Document the results of painful reverse-engineering of the "portable TLS"
Tim Peters <tim.peters@gmail.com>
parents:
33699
diff
changeset
|
198 */ |
|
28694
a4154dd5939a
New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents:
24315
diff
changeset
|
199 struct key { |
|
33705
891042c94aed
Document the results of painful reverse-engineering of the "portable TLS"
Tim Peters <tim.peters@gmail.com>
parents:
33699
diff
changeset
|
200 /* Next record in the list, or NULL if this is the last record. */ |
|
28694
a4154dd5939a
New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents:
24315
diff
changeset
|
201 struct key *next; |
|
33705
891042c94aed
Document the results of painful reverse-engineering of the "portable TLS"
Tim Peters <tim.peters@gmail.com>
parents:
33699
diff
changeset
|
202 |
|
891042c94aed
Document the results of painful reverse-engineering of the "portable TLS"
Tim Peters <tim.peters@gmail.com>
parents:
33699
diff
changeset
|
203 /* The thread id, according to PyThread_get_thread_ident(). */ |
|
28694
a4154dd5939a
New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents:
24315
diff
changeset
|
204 long id; |
|
33705
891042c94aed
Document the results of painful reverse-engineering of the "portable TLS"
Tim Peters <tim.peters@gmail.com>
parents:
33699
diff
changeset
|
205 |
|
891042c94aed
Document the results of painful reverse-engineering of the "portable TLS"
Tim Peters <tim.peters@gmail.com>
parents:
33699
diff
changeset
|
206 /* The key and its associated value. */ |
|
28694
a4154dd5939a
New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents:
24315
diff
changeset
|
207 int key; |
|
a4154dd5939a
New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents:
24315
diff
changeset
|
208 void *value; |
|
a4154dd5939a
New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents:
24315
diff
changeset
|
209 }; |
|
a4154dd5939a
New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents:
24315
diff
changeset
|
210 |
|
a4154dd5939a
New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents:
24315
diff
changeset
|
211 static struct key *keyhead = NULL; |
|
a4154dd5939a
New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents:
24315
diff
changeset
|
212 static PyThread_type_lock keymutex = NULL; |
|
33705
891042c94aed
Document the results of painful reverse-engineering of the "portable TLS"
Tim Peters <tim.peters@gmail.com>
parents:
33699
diff
changeset
|
213 static int nkeys = 0; /* PyThread_create_key() hands out nkeys+1 next */ |
|
28694
a4154dd5939a
New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents:
24315
diff
changeset
|
214 |
|
33705
891042c94aed
Document the results of painful reverse-engineering of the "portable TLS"
Tim Peters <tim.peters@gmail.com>
parents:
33699
diff
changeset
|
215 /* Internal helper. |
|
891042c94aed
Document the results of painful reverse-engineering of the "portable TLS"
Tim Peters <tim.peters@gmail.com>
parents:
33699
diff
changeset
|
216 * If the current thread has a mapping for key, the appropriate struct key* |
|
891042c94aed
Document the results of painful reverse-engineering of the "portable TLS"
Tim Peters <tim.peters@gmail.com>
parents:
33699
diff
changeset
|
217 * is returned. NB: value is ignored in this case! |
|
891042c94aed
Document the results of painful reverse-engineering of the "portable TLS"
Tim Peters <tim.peters@gmail.com>
parents:
33699
diff
changeset
|
218 * If there is no mapping for key in the current thread, then: |
|
891042c94aed
Document the results of painful reverse-engineering of the "portable TLS"
Tim Peters <tim.peters@gmail.com>
parents:
33699
diff
changeset
|
219 * If value is NULL, NULL is returned. |
|
891042c94aed
Document the results of painful reverse-engineering of the "portable TLS"
Tim Peters <tim.peters@gmail.com>
parents:
33699
diff
changeset
|
220 * Else a mapping of key to value is created for the current thread, |
|
891042c94aed
Document the results of painful reverse-engineering of the "portable TLS"
Tim Peters <tim.peters@gmail.com>
parents:
33699
diff
changeset
|
221 * and a pointer to a new struct key* is returned; except that if |
|
891042c94aed
Document the results of painful reverse-engineering of the "portable TLS"
Tim Peters <tim.peters@gmail.com>
parents:
33699
diff
changeset
|
222 * malloc() can't find room for a new struct key*, NULL is returned. |
|
891042c94aed
Document the results of painful reverse-engineering of the "portable TLS"
Tim Peters <tim.peters@gmail.com>
parents:
33699
diff
changeset
|
223 * So when value==NULL, this acts like a pure lookup routine, and when |
|
891042c94aed
Document the results of painful reverse-engineering of the "portable TLS"
Tim Peters <tim.peters@gmail.com>
parents:
33699
diff
changeset
|
224 * value!=NULL, this acts like dict.setdefault(), returning an existing |
|
891042c94aed
Document the results of painful reverse-engineering of the "portable TLS"
Tim Peters <tim.peters@gmail.com>
parents:
33699
diff
changeset
|
225 * mapping if one exists, else creating a new mapping. |
|
33712
baa2653f7a76
find_key(): This routine wasn't thread-correct, and accounts for the
Tim Peters <tim.peters@gmail.com>
parents:
33705
diff
changeset
|
226 * |
|
baa2653f7a76
find_key(): This routine wasn't thread-correct, and accounts for the
Tim Peters <tim.peters@gmail.com>
parents:
33705
diff
changeset
|
227 * Caution: this used to be too clever, trying to hold keymutex only |
|
baa2653f7a76
find_key(): This routine wasn't thread-correct, and accounts for the
Tim Peters <tim.peters@gmail.com>
parents:
33705
diff
changeset
|
228 * around the "p->next = keyhead; keyhead = p" pair. That allowed |
|
baa2653f7a76
find_key(): This routine wasn't thread-correct, and accounts for the
Tim Peters <tim.peters@gmail.com>
parents:
33705
diff
changeset
|
229 * another thread to mutate the list, via key deletion, concurrent with |
|
baa2653f7a76
find_key(): This routine wasn't thread-correct, and accounts for the
Tim Peters <tim.peters@gmail.com>
parents:
33705
diff
changeset
|
230 * find_key() crawling over the list. Hilarity ensued. For example, when |
|
baa2653f7a76
find_key(): This routine wasn't thread-correct, and accounts for the
Tim Peters <tim.peters@gmail.com>
parents:
33705
diff
changeset
|
231 * the for-loop here does "p = p->next", p could end up pointing at a |
|
baa2653f7a76
find_key(): This routine wasn't thread-correct, and accounts for the
Tim Peters <tim.peters@gmail.com>
parents:
33705
diff
changeset
|
232 * record that PyThread_delete_key_value() was concurrently free()'ing. |
|
baa2653f7a76
find_key(): This routine wasn't thread-correct, and accounts for the
Tim Peters <tim.peters@gmail.com>
parents:
33705
diff
changeset
|
233 * That could lead to anything, from failing to find a key that exists, to |
|
baa2653f7a76
find_key(): This routine wasn't thread-correct, and accounts for the
Tim Peters <tim.peters@gmail.com>
parents:
33705
diff
changeset
|
234 * segfaults. Now we lock the whole routine. |
|
33705
891042c94aed
Document the results of painful reverse-engineering of the "portable TLS"
Tim Peters <tim.peters@gmail.com>
parents:
33699
diff
changeset
|
235 */ |
|
33699
0c26db381673
Style guide & consistency changes. No semantic changes.
Tim Peters <tim.peters@gmail.com>
parents:
33145
diff
changeset
|
236 static struct key * |
|
0c26db381673
Style guide & consistency changes. No semantic changes.
Tim Peters <tim.peters@gmail.com>
parents:
33145
diff
changeset
|
237 find_key(int key, void *value) |
|
28694
a4154dd5939a
New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents:
24315
diff
changeset
|
238 { |
|
a4154dd5939a
New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents:
24315
diff
changeset
|
239 struct key *p; |
|
a4154dd5939a
New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents:
24315
diff
changeset
|
240 long id = PyThread_get_thread_ident(); |
|
33705
891042c94aed
Document the results of painful reverse-engineering of the "portable TLS"
Tim Peters <tim.peters@gmail.com>
parents:
33699
diff
changeset
|
241 |
|
33712
baa2653f7a76
find_key(): This routine wasn't thread-correct, and accounts for the
Tim Peters <tim.peters@gmail.com>
parents:
33705
diff
changeset
|
242 PyThread_acquire_lock(keymutex, 1); |
|
28694
a4154dd5939a
New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents:
24315
diff
changeset
|
243 for (p = keyhead; p != NULL; p = p->next) { |
|
a4154dd5939a
New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents:
24315
diff
changeset
|
244 if (p->id == id && p->key == key) |
|
33712
baa2653f7a76
find_key(): This routine wasn't thread-correct, and accounts for the
Tim Peters <tim.peters@gmail.com>
parents:
33705
diff
changeset
|
245 goto Done; |
|
28694
a4154dd5939a
New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents:
24315
diff
changeset
|
246 } |
|
33712
baa2653f7a76
find_key(): This routine wasn't thread-correct, and accounts for the
Tim Peters <tim.peters@gmail.com>
parents:
33705
diff
changeset
|
247 if (value == NULL) { |
|
baa2653f7a76
find_key(): This routine wasn't thread-correct, and accounts for the
Tim Peters <tim.peters@gmail.com>
parents:
33705
diff
changeset
|
248 assert(p == NULL); |
|
baa2653f7a76
find_key(): This routine wasn't thread-correct, and accounts for the
Tim Peters <tim.peters@gmail.com>
parents:
33705
diff
changeset
|
249 goto Done; |
|
baa2653f7a76
find_key(): This routine wasn't thread-correct, and accounts for the
Tim Peters <tim.peters@gmail.com>
parents:
33705
diff
changeset
|
250 } |
|
28694
a4154dd5939a
New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents:
24315
diff
changeset
|
251 p = (struct key *)malloc(sizeof(struct key)); |
|
a4154dd5939a
New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents:
24315
diff
changeset
|
252 if (p != NULL) { |
|
a4154dd5939a
New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents:
24315
diff
changeset
|
253 p->id = id; |
|
a4154dd5939a
New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents:
24315
diff
changeset
|
254 p->key = key; |
|
a4154dd5939a
New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents:
24315
diff
changeset
|
255 p->value = value; |
|
a4154dd5939a
New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents:
24315
diff
changeset
|
256 p->next = keyhead; |
|
a4154dd5939a
New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents:
24315
diff
changeset
|
257 keyhead = p; |
|
a4154dd5939a
New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents:
24315
diff
changeset
|
258 } |
|
33712
baa2653f7a76
find_key(): This routine wasn't thread-correct, and accounts for the
Tim Peters <tim.peters@gmail.com>
parents:
33705
diff
changeset
|
259 Done: |
|
baa2653f7a76
find_key(): This routine wasn't thread-correct, and accounts for the
Tim Peters <tim.peters@gmail.com>
parents:
33705
diff
changeset
|
260 PyThread_release_lock(keymutex); |
|
28694
a4154dd5939a
New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents:
24315
diff
changeset
|
261 return p; |
|
a4154dd5939a
New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents:
24315
diff
changeset
|
262 } |
|
a4154dd5939a
New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents:
24315
diff
changeset
|
263 |
|
33705
891042c94aed
Document the results of painful reverse-engineering of the "portable TLS"
Tim Peters <tim.peters@gmail.com>
parents:
33699
diff
changeset
|
264 /* Return a new key. This must be called before any other functions in |
|
891042c94aed
Document the results of painful reverse-engineering of the "portable TLS"
Tim Peters <tim.peters@gmail.com>
parents:
33699
diff
changeset
|
265 * this family, and callers must arrange to serialize calls to this |
|
891042c94aed
Document the results of painful reverse-engineering of the "portable TLS"
Tim Peters <tim.peters@gmail.com>
parents:
33699
diff
changeset
|
266 * function. No violations are detected. |
|
891042c94aed
Document the results of painful reverse-engineering of the "portable TLS"
Tim Peters <tim.peters@gmail.com>
parents:
33699
diff
changeset
|
267 */ |
|
33699
0c26db381673
Style guide & consistency changes. No semantic changes.
Tim Peters <tim.peters@gmail.com>
parents:
33145
diff
changeset
|
268 int |
|
0c26db381673
Style guide & consistency changes. No semantic changes.
Tim Peters <tim.peters@gmail.com>
parents:
33145
diff
changeset
|
269 PyThread_create_key(void) |
|
28694
a4154dd5939a
New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents:
24315
diff
changeset
|
270 { |
|
33705
891042c94aed
Document the results of painful reverse-engineering of the "portable TLS"
Tim Peters <tim.peters@gmail.com>
parents:
33699
diff
changeset
|
271 /* All parts of this function are wrong if it's called by multiple |
|
891042c94aed
Document the results of painful reverse-engineering of the "portable TLS"
Tim Peters <tim.peters@gmail.com>
parents:
33699
diff
changeset
|
272 * threads simultaneously. |
|
891042c94aed
Document the results of painful reverse-engineering of the "portable TLS"
Tim Peters <tim.peters@gmail.com>
parents:
33699
diff
changeset
|
273 */ |
|
28694
a4154dd5939a
New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents:
24315
diff
changeset
|
274 if (keymutex == NULL) |
|
a4154dd5939a
New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents:
24315
diff
changeset
|
275 keymutex = PyThread_allocate_lock(); |
|
a4154dd5939a
New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents:
24315
diff
changeset
|
276 return ++nkeys; |
|
a4154dd5939a
New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents:
24315
diff
changeset
|
277 } |
|
a4154dd5939a
New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents:
24315
diff
changeset
|
278 |
|
33705
891042c94aed
Document the results of painful reverse-engineering of the "portable TLS"
Tim Peters <tim.peters@gmail.com>
parents:
33699
diff
changeset
|
279 /* Forget the associations for key across *all* threads. */ |
|
33699
0c26db381673
Style guide & consistency changes. No semantic changes.
Tim Peters <tim.peters@gmail.com>
parents:
33145
diff
changeset
|
280 void |
|
0c26db381673
Style guide & consistency changes. No semantic changes.
Tim Peters <tim.peters@gmail.com>
parents:
33145
diff
changeset
|
281 PyThread_delete_key(int key) |
|
28694
a4154dd5939a
New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents:
24315
diff
changeset
|
282 { |
|
a4154dd5939a
New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents:
24315
diff
changeset
|
283 struct key *p, **q; |
|
33705
891042c94aed
Document the results of painful reverse-engineering of the "portable TLS"
Tim Peters <tim.peters@gmail.com>
parents:
33699
diff
changeset
|
284 |
|
28694
a4154dd5939a
New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents:
24315
diff
changeset
|
285 PyThread_acquire_lock(keymutex, 1); |
|
a4154dd5939a
New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents:
24315
diff
changeset
|
286 q = &keyhead; |
|
a4154dd5939a
New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents:
24315
diff
changeset
|
287 while ((p = *q) != NULL) { |
|
a4154dd5939a
New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents:
24315
diff
changeset
|
288 if (p->key == key) { |
|
a4154dd5939a
New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents:
24315
diff
changeset
|
289 *q = p->next; |
|
a4154dd5939a
New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents:
24315
diff
changeset
|
290 free((void *)p); |
|
a4154dd5939a
New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents:
24315
diff
changeset
|
291 /* NB This does *not* free p->value! */ |
|
a4154dd5939a
New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents:
24315
diff
changeset
|
292 } |
|
a4154dd5939a
New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents:
24315
diff
changeset
|
293 else |
|
a4154dd5939a
New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents:
24315
diff
changeset
|
294 q = &p->next; |
|
a4154dd5939a
New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents:
24315
diff
changeset
|
295 } |
|
a4154dd5939a
New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents:
24315
diff
changeset
|
296 PyThread_release_lock(keymutex); |
|
a4154dd5939a
New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents:
24315
diff
changeset
|
297 } |
|
a4154dd5939a
New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents:
24315
diff
changeset
|
298 |
|
33705
891042c94aed
Document the results of painful reverse-engineering of the "portable TLS"
Tim Peters <tim.peters@gmail.com>
parents:
33699
diff
changeset
|
299 /* Confusing: If the current thread has an association for key, |
|
891042c94aed
Document the results of painful reverse-engineering of the "portable TLS"
Tim Peters <tim.peters@gmail.com>
parents:
33699
diff
changeset
|
300 * value is ignored, and 0 is returned. Else an attempt is made to create |
|
891042c94aed
Document the results of painful reverse-engineering of the "portable TLS"
Tim Peters <tim.peters@gmail.com>
parents:
33699
diff
changeset
|
301 * an association of key to value for the current thread. 0 is returned |
|
891042c94aed
Document the results of painful reverse-engineering of the "portable TLS"
Tim Peters <tim.peters@gmail.com>
parents:
33699
diff
changeset
|
302 * if that succeeds, but -1 is returned if there's not enough memory |
|
891042c94aed
Document the results of painful reverse-engineering of the "portable TLS"
Tim Peters <tim.peters@gmail.com>
parents:
33699
diff
changeset
|
303 * to create the association. value must not be NULL. |
|
891042c94aed
Document the results of painful reverse-engineering of the "portable TLS"
Tim Peters <tim.peters@gmail.com>
parents:
33699
diff
changeset
|
304 */ |
|
33699
0c26db381673
Style guide & consistency changes. No semantic changes.
Tim Peters <tim.peters@gmail.com>
parents:
33145
diff
changeset
|
305 int |
|
0c26db381673
Style guide & consistency changes. No semantic changes.
Tim Peters <tim.peters@gmail.com>
parents:
33145
diff
changeset
|
306 PyThread_set_key_value(int key, void *value) |
|
28694
a4154dd5939a
New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents:
24315
diff
changeset
|
307 { |
|
33705
891042c94aed
Document the results of painful reverse-engineering of the "portable TLS"
Tim Peters <tim.peters@gmail.com>
parents:
33699
diff
changeset
|
308 struct key *p; |
|
891042c94aed
Document the results of painful reverse-engineering of the "portable TLS"
Tim Peters <tim.peters@gmail.com>
parents:
33699
diff
changeset
|
309 |
|
891042c94aed
Document the results of painful reverse-engineering of the "portable TLS"
Tim Peters <tim.peters@gmail.com>
parents:
33699
diff
changeset
|
310 assert(value != NULL); |
|
891042c94aed
Document the results of painful reverse-engineering of the "portable TLS"
Tim Peters <tim.peters@gmail.com>
parents:
33699
diff
changeset
|
311 p = find_key(key, value); |
|
28694
a4154dd5939a
New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents:
24315
diff
changeset
|
312 if (p == NULL) |
|
a4154dd5939a
New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents:
24315
diff
changeset
|
313 return -1; |
|
a4154dd5939a
New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents:
24315
diff
changeset
|
314 else |
|
a4154dd5939a
New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents:
24315
diff
changeset
|
315 return 0; |
|
a4154dd5939a
New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents:
24315
diff
changeset
|
316 } |
|
a4154dd5939a
New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents:
24315
diff
changeset
|
317 |
|
33705
891042c94aed
Document the results of painful reverse-engineering of the "portable TLS"
Tim Peters <tim.peters@gmail.com>
parents:
33699
diff
changeset
|
318 /* Retrieve the value associated with key in the current thread, or NULL |
|
891042c94aed
Document the results of painful reverse-engineering of the "portable TLS"
Tim Peters <tim.peters@gmail.com>
parents:
33699
diff
changeset
|
319 * if the current thread doesn't have an association for key. |
|
891042c94aed
Document the results of painful reverse-engineering of the "portable TLS"
Tim Peters <tim.peters@gmail.com>
parents:
33699
diff
changeset
|
320 */ |
|
33699
0c26db381673
Style guide & consistency changes. No semantic changes.
Tim Peters <tim.peters@gmail.com>
parents:
33145
diff
changeset
|
321 void * |
|
0c26db381673
Style guide & consistency changes. No semantic changes.
Tim Peters <tim.peters@gmail.com>
parents:
33145
diff
changeset
|
322 PyThread_get_key_value(int key) |
|
28694
a4154dd5939a
New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents:
24315
diff
changeset
|
323 { |
|
a4154dd5939a
New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents:
24315
diff
changeset
|
324 struct key *p = find_key(key, NULL); |
|
33705
891042c94aed
Document the results of painful reverse-engineering of the "portable TLS"
Tim Peters <tim.peters@gmail.com>
parents:
33699
diff
changeset
|
325 |
|
28694
a4154dd5939a
New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents:
24315
diff
changeset
|
326 if (p == NULL) |
|
a4154dd5939a
New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents:
24315
diff
changeset
|
327 return NULL; |
|
a4154dd5939a
New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents:
24315
diff
changeset
|
328 else |
|
a4154dd5939a
New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents:
24315
diff
changeset
|
329 return p->value; |
|
a4154dd5939a
New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents:
24315
diff
changeset
|
330 } |
|
a4154dd5939a
New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents:
24315
diff
changeset
|
331 |
|
33705
891042c94aed
Document the results of painful reverse-engineering of the "portable TLS"
Tim Peters <tim.peters@gmail.com>
parents:
33699
diff
changeset
|
332 /* Forget the current thread's association for key, if any. */ |
|
33699
0c26db381673
Style guide & consistency changes. No semantic changes.
Tim Peters <tim.peters@gmail.com>
parents:
33145
diff
changeset
|
333 void |
|
0c26db381673
Style guide & consistency changes. No semantic changes.
Tim Peters <tim.peters@gmail.com>
parents:
33145
diff
changeset
|
334 PyThread_delete_key_value(int key) |
|
28694
a4154dd5939a
New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents:
24315
diff
changeset
|
335 { |
|
a4154dd5939a
New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents:
24315
diff
changeset
|
336 long id = PyThread_get_thread_ident(); |
|
a4154dd5939a
New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents:
24315
diff
changeset
|
337 struct key *p, **q; |
|
33705
891042c94aed
Document the results of painful reverse-engineering of the "portable TLS"
Tim Peters <tim.peters@gmail.com>
parents:
33699
diff
changeset
|
338 |
|
28694
a4154dd5939a
New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents:
24315
diff
changeset
|
339 PyThread_acquire_lock(keymutex, 1); |
|
a4154dd5939a
New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents:
24315
diff
changeset
|
340 q = &keyhead; |
|
a4154dd5939a
New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents:
24315
diff
changeset
|
341 while ((p = *q) != NULL) { |
|
a4154dd5939a
New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents:
24315
diff
changeset
|
342 if (p->key == key && p->id == id) { |
|
a4154dd5939a
New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents:
24315
diff
changeset
|
343 *q = p->next; |
|
a4154dd5939a
New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents:
24315
diff
changeset
|
344 free((void *)p); |
|
a4154dd5939a
New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents:
24315
diff
changeset
|
345 /* NB This does *not* free p->value! */ |
|
a4154dd5939a
New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents:
24315
diff
changeset
|
346 break; |
|
a4154dd5939a
New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents:
24315
diff
changeset
|
347 } |
|
a4154dd5939a
New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents:
24315
diff
changeset
|
348 else |
|
a4154dd5939a
New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents:
24315
diff
changeset
|
349 q = &p->next; |
|
a4154dd5939a
New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents:
24315
diff
changeset
|
350 } |
|
a4154dd5939a
New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents:
24315
diff
changeset
|
351 PyThread_release_lock(keymutex); |
|
a4154dd5939a
New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents:
24315
diff
changeset
|
352 } |
|
a4154dd5939a
New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents:
24315
diff
changeset
|
353 |
|
a4154dd5939a
New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents:
24315
diff
changeset
|
354 #endif /* Py_HAVE_NATIVE_TLS */ |
