annotate Python/thread.c @ 56729:f5c563a7de75

Disable GNU pth support
author Antoine Pitrou <solipsis@pitrou.net>
date Sat, 24 Oct 2009 20:35:52 +0000
parents 0c1238cabe92
children 6ca642d4f42f
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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
b19cf73c54a7 (backport from HEAD)
Guido van Rossum <guido@python.org>
parents: 33712
diff changeset
48 /* Check if we're running on HP-UX and _SC_THREADS is defined. If so, then
b19cf73c54a7 (backport from HEAD)
Guido van Rossum <guido@python.org>
parents: 33712
diff changeset
49 enough of the Posix threads package is implimented to support python
b19cf73c54a7 (backport from HEAD)
Guido van Rossum <guido@python.org>
parents: 33712
diff changeset
50 threads.
b19cf73c54a7 (backport from HEAD)
Guido van Rossum <guido@python.org>
parents: 33712
diff changeset
51
b19cf73c54a7 (backport from HEAD)
Guido van Rossum <guido@python.org>
parents: 33712
diff changeset
52 This is valid for HP-UX 11.23 running on an ia64 system. If needed, add
b19cf73c54a7 (backport from HEAD)
Guido van Rossum <guido@python.org>
parents: 33712
diff changeset
53 a check of __ia64 to verify that we're running on a ia64 system instead
b19cf73c54a7 (backport from HEAD)
Guido van Rossum <guido@python.org>
parents: 33712
diff changeset
54 of a pa-risc system.
b19cf73c54a7 (backport from HEAD)
Guido van Rossum <guido@python.org>
parents: 33712
diff changeset
55 */
b19cf73c54a7 (backport from HEAD)
Guido van Rossum <guido@python.org>
parents: 33712
diff changeset
56 #ifdef __hpux
b19cf73c54a7 (backport from HEAD)
Guido van Rossum <guido@python.org>
parents: 33712
diff changeset
57 #ifdef _SC_THREADS
b19cf73c54a7 (backport from HEAD)
Guido van Rossum <guido@python.org>
parents: 33712
diff changeset
58 #define _POSIX_THREADS
b19cf73c54a7 (backport from HEAD)
Guido van Rossum <guido@python.org>
parents: 33712
diff changeset
59 #endif
b19cf73c54a7 (backport from HEAD)
Guido van Rossum <guido@python.org>
parents: 33712
diff changeset
60 #endif
b19cf73c54a7 (backport from HEAD)
Guido van Rossum <guido@python.org>
parents: 33712
diff changeset
61
1418
b1bb74a2b593 Port to Solaris 2.3.
Sjoerd Mullender <sjoerd@acm.org>
parents: 1350
diff changeset
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
38673
a19c20c5e5c7 Merge the rest of the trunk.
Thomas Wouters <thomas@python.org>
parents: 35549
diff changeset
78 void
a19c20c5e5c7 Merge the rest of the trunk.
Thomas Wouters <thomas@python.org>
parents: 35549
diff changeset
79 PyThread_init_thread(void)
1004
5d7142ea01b7 adapted SV module to the new svideo library.
Sjoerd Mullender <sjoerd@acm.org>
parents: 961
diff changeset
80 {
4839
4567e158d20c Rename DEBUG macro to Py_DEBUG
Guido van Rossum <guido@python.org>
parents: 4596
diff changeset
81 #ifdef Py_DEBUG
44587
fb5a6330f71b Merged revisions 59822-59841 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 42645
diff changeset
82 char *p = Py_GETENV("PYTHONTHREADDEBUG");
1418
b1bb74a2b593 Port to Solaris 2.3.
Sjoerd Mullender <sjoerd@acm.org>
parents: 1350
diff changeset
83
b1bb74a2b593 Port to Solaris 2.3.
Sjoerd Mullender <sjoerd@acm.org>
parents: 1350
diff changeset
84 if (p) {
b1bb74a2b593 Port to Solaris 2.3.
Sjoerd Mullender <sjoerd@acm.org>
parents: 1350
diff changeset
85 if (*p)
b1bb74a2b593 Port to Solaris 2.3.
Sjoerd Mullender <sjoerd@acm.org>
parents: 1350
diff changeset
86 thread_debug = atoi(p);
b1bb74a2b593 Port to Solaris 2.3.
Sjoerd Mullender <sjoerd@acm.org>
parents: 1350
diff changeset
87 else
b1bb74a2b593 Port to Solaris 2.3.
Sjoerd Mullender <sjoerd@acm.org>
parents: 1350
diff changeset
88 thread_debug = 1;
b1bb74a2b593 Port to Solaris 2.3.
Sjoerd Mullender <sjoerd@acm.org>
parents: 1350
diff changeset
89 }
4839
4567e158d20c Rename DEBUG macro to Py_DEBUG
Guido van Rossum <guido@python.org>
parents: 4596
diff changeset
90 #endif /* Py_DEBUG */
1004
5d7142ea01b7 adapted SV module to the new svideo library.
Sjoerd Mullender <sjoerd@acm.org>
parents: 961
diff changeset
91 if (initialized)
5d7142ea01b7 adapted SV module to the new svideo library.
Sjoerd Mullender <sjoerd@acm.org>
parents: 961
diff changeset
92 return;
5d7142ea01b7 adapted SV module to the new svideo library.
Sjoerd Mullender <sjoerd@acm.org>
parents: 961
diff changeset
93 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
94 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
95 PyThread__init_thread();
923
72aceed365d4 * Makefile adapted to changes below.
Guido van Rossum <guido@python.org>
parents:
diff changeset
96 }
72aceed365d4 * Makefile adapted to changes below.
Guido van Rossum <guido@python.org>
parents:
diff changeset
97
39442
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38673
diff changeset
98 /* Support for runtime thread stack size tuning.
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38673
diff changeset
99 A value of 0 means using the platform's default stack size
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38673
diff changeset
100 or the size specified by the THREAD_STACK_SIZE macro. */
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38673
diff changeset
101 static size_t _pythread_stacksize = 0;
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38673
diff changeset
102
1848
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1418
diff changeset
103 #ifdef SGI_THREADS
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1418
diff changeset
104 #include "thread_sgi.h"
1418
b1bb74a2b593 Port to Solaris 2.3.
Sjoerd Mullender <sjoerd@acm.org>
parents: 1350
diff changeset
105 #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
106
1848
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1418
diff changeset
107 #ifdef SOLARIS_THREADS
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1418
diff changeset
108 #include "thread_solaris.h"
923
72aceed365d4 * Makefile adapted to changes below.
Guido van Rossum <guido@python.org>
parents:
diff changeset
109 #endif
1848
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1418
diff changeset
110
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1418
diff changeset
111 #ifdef SUN_LWP
56728
0c1238cabe92 Disable support for SunOS LWP
Antoine Pitrou <solipsis@pitrou.net>
parents: 56727
diff changeset
112 #error SunOS lightweight processes are now unsupported, and code will be removed in 3.3.
1848
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1418
diff changeset
113 #include "thread_lwp.h"
923
72aceed365d4 * Makefile adapted to changes below.
Guido van Rossum <guido@python.org>
parents:
diff changeset
114 #endif
72aceed365d4 * Makefile adapted to changes below.
Guido van Rossum <guido@python.org>
parents:
diff changeset
115
14674
756c8c6535fe Make better use of GNU Pth -- patch by Andy Dustman.
Guido van Rossum <guido@python.org>
parents: 14375
diff changeset
116 #ifdef HAVE_PTH
56729
f5c563a7de75 Disable GNU pth support
Antoine Pitrou <solipsis@pitrou.net>
parents: 56728
diff changeset
117 #error GNU pth threads are now unsupported, and code will be removed in 3.3.
12611
b320cf3a98b9 Andy Dustman: add GNU pth user-space thread support.
Guido van Rossum <guido@python.org>
parents: 12475
diff changeset
118 #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
119 #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
120 #endif
756c8c6535fe Make better use of GNU Pth -- patch by Andy Dustman.
Guido van Rossum <guido@python.org>
parents: 14375
diff changeset
121
1848
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1418
diff changeset
122 #ifdef _POSIX_THREADS
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1418
diff changeset
123 #include "thread_pthread.h"
923
72aceed365d4 * Makefile adapted to changes below.
Guido van Rossum <guido@python.org>
parents:
diff changeset
124 #endif
72aceed365d4 * Makefile adapted to changes below.
Guido van Rossum <guido@python.org>
parents:
diff changeset
125
1848
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1418
diff changeset
126 #ifdef C_THREADS
56727
b54da5caab36 Disable support for Mach C Threads.
Antoine Pitrou <solipsis@pitrou.net>
parents: 56726
diff changeset
127 #error Mach C Threads are now unsupported, and code will be removed in 3.3.
1848
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1418
diff changeset
128 #include "thread_cthread.h"
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1418
diff changeset
129 #endif
923
72aceed365d4 * Makefile adapted to changes below.
Guido van Rossum <guido@python.org>
parents:
diff changeset
130
2152
1a52351a00b2 nt thread support
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
131 #ifdef NT_THREADS
1a52351a00b2 nt thread support
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
132 #include "thread_nt.h"
1a52351a00b2 nt thread support
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
133 #endif
1a52351a00b2 nt thread support
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
134
6626
5e31d381fa47 os2 patch by Jeff Rush
Guido van Rossum <guido@python.org>
parents: 5599
diff changeset
135 #ifdef OS2_THREADS
5e31d381fa47 os2 patch by Jeff Rush
Guido van Rossum <guido@python.org>
parents: 5599
diff changeset
136 #include "thread_os2.h"
5e31d381fa47 os2 patch by Jeff Rush
Guido van Rossum <guido@python.org>
parents: 5599
diff changeset
137 #endif
5e31d381fa47 os2 patch by Jeff Rush
Guido van Rossum <guido@python.org>
parents: 5599
diff changeset
138
22206
b898c0feb754 Patch #504224: add plan9 threads include to thread.c.
Martin v. Löwis <martin@v.loewis.de>
parents: 21712
diff changeset
139 #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
140 #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
141 #endif
b898c0feb754 Patch #504224: add plan9 threads include to thread.c.
Martin v. Löwis <martin@v.loewis.de>
parents: 21712
diff changeset
142
961
a31e07847063 New thread.c from Sjoerd, supports _exit_prog(). Use this in goaway()
Guido van Rossum <guido@python.org>
parents: 926
diff changeset
143 /*
1848
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1418
diff changeset
144 #ifdef FOOBAR_THREADS
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1418
diff changeset
145 #include "thread_foobar.h"
923
72aceed365d4 * Makefile adapted to changes below.
Guido van Rossum <guido@python.org>
parents:
diff changeset
146 #endif
1848
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1418
diff changeset
147 */
28694
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
148
39442
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38673
diff changeset
149 /* return the current thread stack size */
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38673
diff changeset
150 size_t
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38673
diff changeset
151 PyThread_get_stacksize(void)
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38673
diff changeset
152 {
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38673
diff changeset
153 return _pythread_stacksize;
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38673
diff changeset
154 }
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38673
diff changeset
155
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38673
diff changeset
156 /* Only platforms defining a THREAD_SET_STACKSIZE() macro
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38673
diff changeset
157 in thread_<platform>.h support changing the stack size.
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38673
diff changeset
158 Return 0 if stack size is valid,
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38673
diff changeset
159 -1 if stack size value is invalid,
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38673
diff changeset
160 -2 if setting stack size is not supported. */
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38673
diff changeset
161 int
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38673
diff changeset
162 PyThread_set_stacksize(size_t size)
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38673
diff changeset
163 {
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38673
diff changeset
164 #if defined(THREAD_SET_STACKSIZE)
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38673
diff changeset
165 return THREAD_SET_STACKSIZE(size);
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38673
diff changeset
166 #else
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38673
diff changeset
167 return -2;
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38673
diff changeset
168 #endif
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38673
diff changeset
169 }
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38673
diff changeset
170
28694
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
171 #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
172 /* 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
173 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
174
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
175 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
176 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
177 */
33705
891042c94aed Document the results of painful reverse-engineering of the "portable TLS"
Tim Peters <tim.peters@gmail.com>
parents: 33699
diff changeset
178 /* ------------------------------------------------------------------------
891042c94aed Document the results of painful reverse-engineering of the "portable TLS"
Tim Peters <tim.peters@gmail.com>
parents: 33699
diff changeset
179 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
180
891042c94aed Document the results of painful reverse-engineering of the "portable TLS"
Tim Peters <tim.peters@gmail.com>
parents: 33699
diff changeset
181 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
182 across threads.
891042c94aed Document the results of painful reverse-engineering of the "portable TLS"
Tim Peters <tim.peters@gmail.com>
parents: 33699
diff changeset
183
891042c94aed Document the results of painful reverse-engineering of the "portable TLS"
Tim Peters <tim.peters@gmail.com>
parents: 33699
diff changeset
184 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
185 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
186 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
187 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
188
891042c94aed Document the results of painful reverse-engineering of the "portable TLS"
Tim Peters <tim.peters@gmail.com>
parents: 33699
diff changeset
189 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
190 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
191 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
192
891042c94aed Document the results of painful reverse-engineering of the "portable TLS"
Tim Peters <tim.peters@gmail.com>
parents: 33699
diff changeset
193 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
194 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
195 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
196
891042c94aed Document the results of painful reverse-engineering of the "portable TLS"
Tim Peters <tim.peters@gmail.com>
parents: 33699
diff changeset
197 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
198 Python exception.
28694
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
199
33705
891042c94aed Document the results of painful reverse-engineering of the "portable TLS"
Tim Peters <tim.peters@gmail.com>
parents: 33699
diff changeset
200 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
201 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
202 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
203 them either.
891042c94aed Document the results of painful reverse-engineering of the "portable TLS"
Tim Peters <tim.peters@gmail.com>
parents: 33699
diff changeset
204
891042c94aed Document the results of painful reverse-engineering of the "portable TLS"
Tim Peters <tim.peters@gmail.com>
parents: 33699
diff changeset
205 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
206 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
207 next paragraph).
891042c94aed Document the results of painful reverse-engineering of the "portable TLS"
Tim Peters <tim.peters@gmail.com>
parents: 33699
diff changeset
208
891042c94aed Document the results of painful reverse-engineering of the "portable TLS"
Tim Peters <tim.peters@gmail.com>
parents: 33699
diff changeset
209 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
210 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
211 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
212 ------------------------------------------------------------------------ */
891042c94aed Document the results of painful reverse-engineering of the "portable TLS"
Tim Peters <tim.peters@gmail.com>
parents: 33699
diff changeset
213
891042c94aed Document the results of painful reverse-engineering of the "portable TLS"
Tim Peters <tim.peters@gmail.com>
parents: 33699
diff changeset
214 /* 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
215 * 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
216 * 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
217 */
28694
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
218 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
219 /* 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
220 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
221
891042c94aed Document the results of painful reverse-engineering of the "portable TLS"
Tim Peters <tim.peters@gmail.com>
parents: 33699
diff changeset
222 /* 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
223 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
224
891042c94aed Document the results of painful reverse-engineering of the "portable TLS"
Tim Peters <tim.peters@gmail.com>
parents: 33699
diff changeset
225 /* 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
226 int key;
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
227 void *value;
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
228 };
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
229
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
230 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
231 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
232 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
233
33705
891042c94aed Document the results of painful reverse-engineering of the "portable TLS"
Tim Peters <tim.peters@gmail.com>
parents: 33699
diff changeset
234 /* Internal helper.
891042c94aed Document the results of painful reverse-engineering of the "portable TLS"
Tim Peters <tim.peters@gmail.com>
parents: 33699
diff changeset
235 * 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
236 * 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
237 * 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
238 * 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
239 * 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
240 * 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
241 * 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
242 * 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
243 * 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
244 * 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
245 *
baa2653f7a76 find_key(): This routine wasn't thread-correct, and accounts for the
Tim Peters <tim.peters@gmail.com>
parents: 33705
diff changeset
246 * 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
247 * 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
248 * 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
249 * 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
250 * 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
251 * 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
252 * 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
253 * 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
254 */
33699
0c26db381673 Style guide & consistency changes. No semantic changes.
Tim Peters <tim.peters@gmail.com>
parents: 33145
diff changeset
255 static struct key *
0c26db381673 Style guide & consistency changes. No semantic changes.
Tim Peters <tim.peters@gmail.com>
parents: 33145
diff changeset
256 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
257 {
48680
7779af388aec Merged revisions 65459,65472,65481,65518,65536,65581,65609,65637,65641,65644-65645 via svnmerge from
Georg Brandl <georg@python.org>
parents: 47665
diff changeset
258 struct key *p, *prev_p;
28694
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
259 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
260
39442
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38673
diff changeset
261 if (!keymutex)
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38673
diff changeset
262 return NULL;
33712
baa2653f7a76 find_key(): This routine wasn't thread-correct, and accounts for the
Tim Peters <tim.peters@gmail.com>
parents: 33705
diff changeset
263 PyThread_acquire_lock(keymutex, 1);
48680
7779af388aec Merged revisions 65459,65472,65481,65518,65536,65581,65609,65637,65641,65644-65645 via svnmerge from
Georg Brandl <georg@python.org>
parents: 47665
diff changeset
264 prev_p = NULL;
28694
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
265 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
266 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
267 goto Done;
48680
7779af388aec Merged revisions 65459,65472,65481,65518,65536,65581,65609,65637,65641,65644-65645 via svnmerge from
Georg Brandl <georg@python.org>
parents: 47665
diff changeset
268 /* Sanity check. These states should never happen but if
7779af388aec Merged revisions 65459,65472,65481,65518,65536,65581,65609,65637,65641,65644-65645 via svnmerge from
Georg Brandl <georg@python.org>
parents: 47665
diff changeset
269 * they do we must abort. Otherwise we'll end up spinning in
7779af388aec Merged revisions 65459,65472,65481,65518,65536,65581,65609,65637,65641,65644-65645 via svnmerge from
Georg Brandl <georg@python.org>
parents: 47665
diff changeset
270 * in a tight loop with the lock held. A similar check is done
7779af388aec Merged revisions 65459,65472,65481,65518,65536,65581,65609,65637,65641,65644-65645 via svnmerge from
Georg Brandl <georg@python.org>
parents: 47665
diff changeset
271 * in pystate.c tstate_delete_common(). */
7779af388aec Merged revisions 65459,65472,65481,65518,65536,65581,65609,65637,65641,65644-65645 via svnmerge from
Georg Brandl <georg@python.org>
parents: 47665
diff changeset
272 if (p == prev_p)
7779af388aec Merged revisions 65459,65472,65481,65518,65536,65581,65609,65637,65641,65644-65645 via svnmerge from
Georg Brandl <georg@python.org>
parents: 47665
diff changeset
273 Py_FatalError("tls find_key: small circular list(!)");
7779af388aec Merged revisions 65459,65472,65481,65518,65536,65581,65609,65637,65641,65644-65645 via svnmerge from
Georg Brandl <georg@python.org>
parents: 47665
diff changeset
274 prev_p = p;
7779af388aec Merged revisions 65459,65472,65481,65518,65536,65581,65609,65637,65641,65644-65645 via svnmerge from
Georg Brandl <georg@python.org>
parents: 47665
diff changeset
275 if (p->next == keyhead)
7779af388aec Merged revisions 65459,65472,65481,65518,65536,65581,65609,65637,65641,65644-65645 via svnmerge from
Georg Brandl <georg@python.org>
parents: 47665
diff changeset
276 Py_FatalError("tls find_key: circular list(!)");
28694
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
277 }
33712
baa2653f7a76 find_key(): This routine wasn't thread-correct, and accounts for the
Tim Peters <tim.peters@gmail.com>
parents: 33705
diff changeset
278 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
279 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
280 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
281 }
28694
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
282 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
283 if (p != NULL) {
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
284 p->id = id;
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
285 p->key = key;
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
286 p->value = value;
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
287 p->next = keyhead;
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
288 keyhead = p;
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
289 }
33712
baa2653f7a76 find_key(): This routine wasn't thread-correct, and accounts for the
Tim Peters <tim.peters@gmail.com>
parents: 33705
diff changeset
290 Done:
baa2653f7a76 find_key(): This routine wasn't thread-correct, and accounts for the
Tim Peters <tim.peters@gmail.com>
parents: 33705
diff changeset
291 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
292 return p;
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
293 }
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
294
33705
891042c94aed Document the results of painful reverse-engineering of the "portable TLS"
Tim Peters <tim.peters@gmail.com>
parents: 33699
diff changeset
295 /* 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
296 * 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
297 * 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
298 */
33699
0c26db381673 Style guide & consistency changes. No semantic changes.
Tim Peters <tim.peters@gmail.com>
parents: 33145
diff changeset
299 int
0c26db381673 Style guide & consistency changes. No semantic changes.
Tim Peters <tim.peters@gmail.com>
parents: 33145
diff changeset
300 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
301 {
33705
891042c94aed Document the results of painful reverse-engineering of the "portable TLS"
Tim Peters <tim.peters@gmail.com>
parents: 33699
diff changeset
302 /* 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
303 * threads simultaneously.
891042c94aed Document the results of painful reverse-engineering of the "portable TLS"
Tim Peters <tim.peters@gmail.com>
parents: 33699
diff changeset
304 */
28694
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
305 if (keymutex == NULL)
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
306 keymutex = PyThread_allocate_lock();
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
307 return ++nkeys;
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
308 }
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
309
33705
891042c94aed Document the results of painful reverse-engineering of the "portable TLS"
Tim Peters <tim.peters@gmail.com>
parents: 33699
diff changeset
310 /* 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
311 void
0c26db381673 Style guide & consistency changes. No semantic changes.
Tim Peters <tim.peters@gmail.com>
parents: 33145
diff changeset
312 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
313 {
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
314 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
315
28694
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
316 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
317 q = &keyhead;
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
318 while ((p = *q) != NULL) {
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
319 if (p->key == key) {
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
320 *q = p->next;
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
321 free((void *)p);
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
322 /* 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
323 }
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
324 else
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
325 q = &p->next;
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
326 }
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
327 PyThread_release_lock(keymutex);
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
328 }
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
329
33705
891042c94aed Document the results of painful reverse-engineering of the "portable TLS"
Tim Peters <tim.peters@gmail.com>
parents: 33699
diff changeset
330 /* 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
331 * 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
332 * 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
333 * 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
334 * 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
335 */
33699
0c26db381673 Style guide & consistency changes. No semantic changes.
Tim Peters <tim.peters@gmail.com>
parents: 33145
diff changeset
336 int
0c26db381673 Style guide & consistency changes. No semantic changes.
Tim Peters <tim.peters@gmail.com>
parents: 33145
diff changeset
337 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
338 {
33705
891042c94aed Document the results of painful reverse-engineering of the "portable TLS"
Tim Peters <tim.peters@gmail.com>
parents: 33699
diff changeset
339 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
340
891042c94aed Document the results of painful reverse-engineering of the "portable TLS"
Tim Peters <tim.peters@gmail.com>
parents: 33699
diff changeset
341 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
342 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
343 if (p == NULL)
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
344 return -1;
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
345 else
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
346 return 0;
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
33705
891042c94aed Document the results of painful reverse-engineering of the "portable TLS"
Tim Peters <tim.peters@gmail.com>
parents: 33699
diff changeset
349 /* 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
350 * 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
351 */
33699
0c26db381673 Style guide & consistency changes. No semantic changes.
Tim Peters <tim.peters@gmail.com>
parents: 33145
diff changeset
352 void *
0c26db381673 Style guide & consistency changes. No semantic changes.
Tim Peters <tim.peters@gmail.com>
parents: 33145
diff changeset
353 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
354 {
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
355 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
356
28694
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
357 if (p == NULL)
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
358 return NULL;
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
359 else
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
360 return p->value;
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
361 }
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
362
33705
891042c94aed Document the results of painful reverse-engineering of the "portable TLS"
Tim Peters <tim.peters@gmail.com>
parents: 33699
diff changeset
363 /* 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
364 void
0c26db381673 Style guide & consistency changes. No semantic changes.
Tim Peters <tim.peters@gmail.com>
parents: 33145
diff changeset
365 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
366 {
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
367 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
368 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
369
28694
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
370 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
371 q = &keyhead;
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
372 while ((p = *q) != NULL) {
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
373 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
374 *q = p->next;
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
375 free((void *)p);
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
376 /* 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
377 break;
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
378 }
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
379 else
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
380 q = &p->next;
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
381 }
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
382 PyThread_release_lock(keymutex);
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
383 }
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
384
47665
71cb7ea4f110 Merged revisions 64212 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 44587
diff changeset
385 /* Forget everything not associated with the current thread id.
71cb7ea4f110 Merged revisions 64212 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 44587
diff changeset
386 * This function is called from PyOS_AfterFork(). It is necessary
71cb7ea4f110 Merged revisions 64212 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 44587
diff changeset
387 * because other thread ids which were in use at the time of the fork
71cb7ea4f110 Merged revisions 64212 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 44587
diff changeset
388 * may be reused for new threads created in the forked process.
71cb7ea4f110 Merged revisions 64212 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 44587
diff changeset
389 */
71cb7ea4f110 Merged revisions 64212 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 44587
diff changeset
390 void
71cb7ea4f110 Merged revisions 64212 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 44587
diff changeset
391 PyThread_ReInitTLS(void)
71cb7ea4f110 Merged revisions 64212 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 44587
diff changeset
392 {
71cb7ea4f110 Merged revisions 64212 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 44587
diff changeset
393 long id = PyThread_get_thread_ident();
71cb7ea4f110 Merged revisions 64212 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 44587
diff changeset
394 struct key *p, **q;
71cb7ea4f110 Merged revisions 64212 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 44587
diff changeset
395
71cb7ea4f110 Merged revisions 64212 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 44587
diff changeset
396 if (!keymutex)
71cb7ea4f110 Merged revisions 64212 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 44587
diff changeset
397 return;
71cb7ea4f110 Merged revisions 64212 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 44587
diff changeset
398
71cb7ea4f110 Merged revisions 64212 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 44587
diff changeset
399 /* As with interpreter_lock in PyEval_ReInitThreads()
71cb7ea4f110 Merged revisions 64212 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 44587
diff changeset
400 we just create a new lock without freeing the old one */
71cb7ea4f110 Merged revisions 64212 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 44587
diff changeset
401 keymutex = PyThread_allocate_lock();
71cb7ea4f110 Merged revisions 64212 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 44587
diff changeset
402
71cb7ea4f110 Merged revisions 64212 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 44587
diff changeset
403 /* Delete all keys which do not match the current thread id */
71cb7ea4f110 Merged revisions 64212 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 44587
diff changeset
404 q = &keyhead;
71cb7ea4f110 Merged revisions 64212 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 44587
diff changeset
405 while ((p = *q) != NULL) {
71cb7ea4f110 Merged revisions 64212 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 44587
diff changeset
406 if (p->id != id) {
71cb7ea4f110 Merged revisions 64212 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 44587
diff changeset
407 *q = p->next;
71cb7ea4f110 Merged revisions 64212 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 44587
diff changeset
408 free((void *)p);
71cb7ea4f110 Merged revisions 64212 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 44587
diff changeset
409 /* NB This does *not* free p->value! */
71cb7ea4f110 Merged revisions 64212 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 44587
diff changeset
410 }
71cb7ea4f110 Merged revisions 64212 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 44587
diff changeset
411 else
71cb7ea4f110 Merged revisions 64212 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 44587
diff changeset
412 q = &p->next;
71cb7ea4f110 Merged revisions 64212 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 44587
diff changeset
413 }
71cb7ea4f110 Merged revisions 64212 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 44587
diff changeset
414 }
71cb7ea4f110 Merged revisions 64212 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 44587
diff changeset
415
28694
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
416 #endif /* Py_HAVE_NATIVE_TLS */