annotate Python/thread.c @ 69710:2b21fcf3d9a9

Issue #11223: Replace threading._info() by sys.thread_info
author Victor Stinner <victor.stinner@haypocalc.com>
date Sat, 30 Apr 2011 14:53:09 +0200
parents 64008d17fb54
children 0aa3f90f0830
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 #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
11 /* 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
12 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
13 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
14 # 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
15 # 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
16 # 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
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
10530
d834ecdf8c26 Changes by Mark Hammond for Windows CE. Mostly of the form
Guido van Rossum <guido@python.org>
parents: 9679
diff changeset
19 #ifndef DONT_HAVE_STDIO_H
1848
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1418
diff changeset
20 #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
21 #endif
1848
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1418
diff changeset
22
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1418
diff changeset
23 #include <stdlib.h>
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1418
diff changeset
24
9203
07dae6fdae79 Renamed thread.h to pythread.h.
Guido van Rossum <guido@python.org>
parents: 8822
diff changeset
25 #include "pythread.h"
923
72aceed365d4 * Makefile adapted to changes below.
Guido van Rossum <guido@python.org>
parents:
diff changeset
26
1848
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1418
diff changeset
27 #ifndef _POSIX_THREADS
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1418
diff changeset
28
923
72aceed365d4 * Makefile adapted to changes below.
Guido van Rossum <guido@python.org>
parents:
diff changeset
29 #ifdef __sgi
1848
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1418
diff changeset
30 #define SGI_THREADS
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1418
diff changeset
31 #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
32
1848
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1418
diff changeset
33 #ifdef HAVE_THREAD_H
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1418
diff changeset
34 #define SOLARIS_THREADS
923
72aceed365d4 * Makefile adapted to changes below.
Guido van Rossum <guido@python.org>
parents:
diff changeset
35 #endif
72aceed365d4 * Makefile adapted to changes below.
Guido van Rossum <guido@python.org>
parents:
diff changeset
36
1848
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1418
diff changeset
37 #if defined(sun) && !defined(SOLARIS_THREADS)
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1418
diff changeset
38 #define SUN_LWP
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1418
diff changeset
39 #endif
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1418
diff changeset
40
35549
b19cf73c54a7 (backport from HEAD)
Guido van Rossum <guido@python.org>
parents: 33712
diff changeset
41 /* Check if we're running on HP-UX and _SC_THREADS is defined. If so, then
68585
bf94b6a73fc8 #11565: Fix several typos. Patch by Piotr Kasprzyk.
Ezio Melotti <ezio.melotti@gmail.com>
parents: 61467
diff changeset
42 enough of the Posix threads package is implemented to support python
35549
b19cf73c54a7 (backport from HEAD)
Guido van Rossum <guido@python.org>
parents: 33712
diff changeset
43 threads.
b19cf73c54a7 (backport from HEAD)
Guido van Rossum <guido@python.org>
parents: 33712
diff changeset
44
b19cf73c54a7 (backport from HEAD)
Guido van Rossum <guido@python.org>
parents: 33712
diff changeset
45 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
46 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
47 of a pa-risc system.
b19cf73c54a7 (backport from HEAD)
Guido van Rossum <guido@python.org>
parents: 33712
diff changeset
48 */
b19cf73c54a7 (backport from HEAD)
Guido van Rossum <guido@python.org>
parents: 33712
diff changeset
49 #ifdef __hpux
b19cf73c54a7 (backport from HEAD)
Guido van Rossum <guido@python.org>
parents: 33712
diff changeset
50 #ifdef _SC_THREADS
b19cf73c54a7 (backport from HEAD)
Guido van Rossum <guido@python.org>
parents: 33712
diff changeset
51 #define _POSIX_THREADS
b19cf73c54a7 (backport from HEAD)
Guido van Rossum <guido@python.org>
parents: 33712
diff changeset
52 #endif
b19cf73c54a7 (backport from HEAD)
Guido van Rossum <guido@python.org>
parents: 33712
diff changeset
53 #endif
b19cf73c54a7 (backport from HEAD)
Guido van Rossum <guido@python.org>
parents: 33712
diff changeset
54
1418
b1bb74a2b593 Port to Solaris 2.3.
Sjoerd Mullender <sjoerd@acm.org>
parents: 1350
diff changeset
55 #endif /* _POSIX_THREADS */
923
72aceed365d4 * Makefile adapted to changes below.
Guido van Rossum <guido@python.org>
parents:
diff changeset
56
72aceed365d4 * Makefile adapted to changes below.
Guido van Rossum <guido@python.org>
parents:
diff changeset
57
4839
4567e158d20c Rename DEBUG macro to Py_DEBUG
Guido van Rossum <guido@python.org>
parents: 4596
diff changeset
58 #ifdef Py_DEBUG
1848
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1418
diff changeset
59 static int thread_debug = 0;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
60 #define dprintf(args) (void)((thread_debug & 1) && printf args)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
61 #define d2printf(args) ((thread_debug & 8) && printf args)
1848
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1418
diff changeset
62 #else
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1418
diff changeset
63 #define dprintf(args)
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1418
diff changeset
64 #define d2printf(args)
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1418
diff changeset
65 #endif
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1418
diff changeset
66
923
72aceed365d4 * Makefile adapted to changes below.
Guido van Rossum <guido@python.org>
parents:
diff changeset
67 static int initialized;
72aceed365d4 * Makefile adapted to changes below.
Guido van Rossum <guido@python.org>
parents:
diff changeset
68
13689
9db86b27278f Prototype yet another forward declaration.
Thomas Wouters <thomas@python.org>
parents: 13658
diff changeset
69 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
70
38673
a19c20c5e5c7 Merge the rest of the trunk.
Thomas Wouters <thomas@python.org>
parents: 35549
diff changeset
71 void
a19c20c5e5c7 Merge the rest of the trunk.
Thomas Wouters <thomas@python.org>
parents: 35549
diff changeset
72 PyThread_init_thread(void)
1004
5d7142ea01b7 adapted SV module to the new svideo library.
Sjoerd Mullender <sjoerd@acm.org>
parents: 961
diff changeset
73 {
4839
4567e158d20c Rename DEBUG macro to Py_DEBUG
Guido van Rossum <guido@python.org>
parents: 4596
diff changeset
74 #ifdef Py_DEBUG
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
75 char *p = Py_GETENV("PYTHONTHREADDEBUG");
1418
b1bb74a2b593 Port to Solaris 2.3.
Sjoerd Mullender <sjoerd@acm.org>
parents: 1350
diff changeset
76
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
77 if (p) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
78 if (*p)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
79 thread_debug = atoi(p);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
80 else
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
81 thread_debug = 1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
82 }
4839
4567e158d20c Rename DEBUG macro to Py_DEBUG
Guido van Rossum <guido@python.org>
parents: 4596
diff changeset
83 #endif /* Py_DEBUG */
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
84 if (initialized)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
85 return;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
86 initialized = 1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
87 dprintf(("PyThread_init_thread called\n"));
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
88 PyThread__init_thread();
923
72aceed365d4 * Makefile adapted to changes below.
Guido van Rossum <guido@python.org>
parents:
diff changeset
89 }
72aceed365d4 * Makefile adapted to changes below.
Guido van Rossum <guido@python.org>
parents:
diff changeset
90
39442
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38673
diff changeset
91 /* Support for runtime thread stack size tuning.
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38673
diff changeset
92 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
93 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
94 static size_t _pythread_stacksize = 0;
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38673
diff changeset
95
1848
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1418
diff changeset
96 #ifdef SGI_THREADS
56730
6ca642d4f42f Disable support for Irix threads
Antoine Pitrou <solipsis@pitrou.net>
parents: 56729
diff changeset
97 #error SGI Irix 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
98 #include "thread_sgi.h"
1418
b1bb74a2b593 Port to Solaris 2.3.
Sjoerd Mullender <sjoerd@acm.org>
parents: 1350
diff changeset
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
69457
383a7301616b Issue #11223: Add threading._info() function providing informations about the
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68586
diff changeset
102 #define PYTHREAD_NAME "solaris"
1848
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1418
diff changeset
103 #include "thread_solaris.h"
923
72aceed365d4 * Makefile adapted to changes below.
Guido van Rossum <guido@python.org>
parents:
diff changeset
104 #endif
1848
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1418
diff changeset
105
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1418
diff changeset
106 #ifdef SUN_LWP
56728
0c1238cabe92 Disable support for SunOS LWP
Antoine Pitrou <solipsis@pitrou.net>
parents: 56727
diff changeset
107 #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
108 #include "thread_lwp.h"
923
72aceed365d4 * Makefile adapted to changes below.
Guido van Rossum <guido@python.org>
parents:
diff changeset
109 #endif
72aceed365d4 * Makefile adapted to changes below.
Guido van Rossum <guido@python.org>
parents:
diff changeset
110
14674
756c8c6535fe Make better use of GNU Pth -- patch by Andy Dustman.
Guido van Rossum <guido@python.org>
parents: 14375
diff changeset
111 #ifdef HAVE_PTH
56729
f5c563a7de75 Disable GNU pth support
Antoine Pitrou <solipsis@pitrou.net>
parents: 56728
diff changeset
112 #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
113 #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
114 #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
115 #endif
756c8c6535fe Make better use of GNU Pth -- patch by Andy Dustman.
Guido van Rossum <guido@python.org>
parents: 14375
diff changeset
116
1848
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1418
diff changeset
117 #ifdef _POSIX_THREADS
69457
383a7301616b Issue #11223: Add threading._info() function providing informations about the
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68586
diff changeset
118 #define PYTHREAD_NAME "pthread"
1848
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1418
diff changeset
119 #include "thread_pthread.h"
923
72aceed365d4 * Makefile adapted to changes below.
Guido van Rossum <guido@python.org>
parents:
diff changeset
120 #endif
72aceed365d4 * Makefile adapted to changes below.
Guido van Rossum <guido@python.org>
parents:
diff changeset
121
1848
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1418
diff changeset
122 #ifdef C_THREADS
56727
b54da5caab36 Disable support for Mach C Threads.
Antoine Pitrou <solipsis@pitrou.net>
parents: 56726
diff changeset
123 #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
124 #include "thread_cthread.h"
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1418
diff changeset
125 #endif
923
72aceed365d4 * Makefile adapted to changes below.
Guido van Rossum <guido@python.org>
parents:
diff changeset
126
2152
1a52351a00b2 nt thread support
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
127 #ifdef NT_THREADS
69457
383a7301616b Issue #11223: Add threading._info() function providing informations about the
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68586
diff changeset
128 #define PYTHREAD_NAME "nt"
2152
1a52351a00b2 nt thread support
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
129 #include "thread_nt.h"
1a52351a00b2 nt thread support
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
130 #endif
1a52351a00b2 nt thread support
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
131
6626
5e31d381fa47 os2 patch by Jeff Rush
Guido van Rossum <guido@python.org>
parents: 5599
diff changeset
132 #ifdef OS2_THREADS
69457
383a7301616b Issue #11223: Add threading._info() function providing informations about the
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68586
diff changeset
133 #define PYTHREAD_NAME "os2"
6626
5e31d381fa47 os2 patch by Jeff Rush
Guido van Rossum <guido@python.org>
parents: 5599
diff changeset
134 #include "thread_os2.h"
5e31d381fa47 os2 patch by Jeff Rush
Guido van Rossum <guido@python.org>
parents: 5599
diff changeset
135 #endif
5e31d381fa47 os2 patch by Jeff Rush
Guido van Rossum <guido@python.org>
parents: 5599
diff changeset
136
22206
b898c0feb754 Patch #504224: add plan9 threads include to thread.c.
Martin v. Löwis <martin@v.loewis.de>
parents: 21712
diff changeset
137 #ifdef PLAN9_THREADS
69457
383a7301616b Issue #11223: Add threading._info() function providing informations about the
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68586
diff changeset
138 #define PYTHREAD_NAME "plan9"
22206
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
961
a31e07847063 New thread.c from Sjoerd, supports _exit_prog(). Use this in goaway()
Guido van Rossum <guido@python.org>
parents: 926
diff changeset
142 /*
1848
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1418
diff changeset
143 #ifdef FOOBAR_THREADS
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1418
diff changeset
144 #include "thread_foobar.h"
923
72aceed365d4 * Makefile adapted to changes below.
Guido van Rossum <guido@python.org>
parents:
diff changeset
145 #endif
1848
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1418
diff changeset
146 */
28694
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
147
39442
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38673
diff changeset
148 /* return the current thread stack size */
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38673
diff changeset
149 size_t
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38673
diff changeset
150 PyThread_get_stacksize(void)
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38673
diff changeset
151 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
152 return _pythread_stacksize;
39442
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38673
diff changeset
153 }
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 /* 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
156 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
157 Return 0 if stack size is valid,
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
158 -1 if stack size value is invalid,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
159 -2 if setting stack size is not supported. */
39442
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38673
diff changeset
160 int
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38673
diff changeset
161 PyThread_set_stacksize(size_t size)
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38673
diff changeset
162 {
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38673
diff changeset
163 #if defined(THREAD_SET_STACKSIZE)
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
164 return THREAD_SET_STACKSIZE(size);
39442
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38673
diff changeset
165 #else
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
166 return -2;
39442
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38673
diff changeset
167 #endif
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38673
diff changeset
168 }
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38673
diff changeset
169
28694
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
170 #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
171 /* 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
172 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
173
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
174 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
175 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
176 */
33705
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 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
179
891042c94aed Document the results of painful reverse-engineering of the "portable TLS"
Tim Peters <tim.peters@gmail.com>
parents: 33699
diff changeset
180 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
181 across threads.
891042c94aed Document the results of painful reverse-engineering of the "portable TLS"
Tim Peters <tim.peters@gmail.com>
parents: 33699
diff changeset
182
891042c94aed Document the results of painful reverse-engineering of the "portable TLS"
Tim Peters <tim.peters@gmail.com>
parents: 33699
diff changeset
183 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
184 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
185 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
186 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
187
891042c94aed Document the results of painful reverse-engineering of the "portable TLS"
Tim Peters <tim.peters@gmail.com>
parents: 33699
diff changeset
188 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
189 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
190 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
191
891042c94aed Document the results of painful reverse-engineering of the "portable TLS"
Tim Peters <tim.peters@gmail.com>
parents: 33699
diff changeset
192 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
193 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
194 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
195
891042c94aed Document the results of painful reverse-engineering of the "portable TLS"
Tim Peters <tim.peters@gmail.com>
parents: 33699
diff changeset
196 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
197 Python exception.
28694
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
198
33705
891042c94aed Document the results of painful reverse-engineering of the "portable TLS"
Tim Peters <tim.peters@gmail.com>
parents: 33699
diff changeset
199 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
200 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
201 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
202 them either.
891042c94aed Document the results of painful reverse-engineering of the "portable TLS"
Tim Peters <tim.peters@gmail.com>
parents: 33699
diff changeset
203
891042c94aed Document the results of painful reverse-engineering of the "portable TLS"
Tim Peters <tim.peters@gmail.com>
parents: 33699
diff changeset
204 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
205 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
206 next paragraph).
891042c94aed Document the results of painful reverse-engineering of the "portable TLS"
Tim Peters <tim.peters@gmail.com>
parents: 33699
diff changeset
207
891042c94aed Document the results of painful reverse-engineering of the "portable TLS"
Tim Peters <tim.peters@gmail.com>
parents: 33699
diff changeset
208 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
209 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
210 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
211 ------------------------------------------------------------------------ */
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 /* 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
214 * 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
215 * 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
216 */
28694
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
217 struct key {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
218 /* Next record in the list, or NULL if this is the last record. */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
219 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
220
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
221 /* The thread id, according to PyThread_get_thread_ident(). */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
222 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
223
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
224 /* The key and its associated value. */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
225 int key;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
226 void *value;
28694
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
227 };
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 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
230 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
231 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
232
33705
891042c94aed Document the results of painful reverse-engineering of the "portable TLS"
Tim Peters <tim.peters@gmail.com>
parents: 33699
diff changeset
233 /* Internal helper.
891042c94aed Document the results of painful reverse-engineering of the "portable TLS"
Tim Peters <tim.peters@gmail.com>
parents: 33699
diff changeset
234 * 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
235 * 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
236 * 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
237 * 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
238 * 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
239 * 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
240 * 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
241 * 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
242 * 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
243 * 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
244 *
baa2653f7a76 find_key(): This routine wasn't thread-correct, and accounts for the
Tim Peters <tim.peters@gmail.com>
parents: 33705
diff changeset
245 * 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
246 * 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
247 * 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
248 * 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
249 * 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
250 * 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
251 * 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
252 * 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
253 */
33699
0c26db381673 Style guide & consistency changes. No semantic changes.
Tim Peters <tim.peters@gmail.com>
parents: 33145
diff changeset
254 static struct key *
0c26db381673 Style guide & consistency changes. No semantic changes.
Tim Peters <tim.peters@gmail.com>
parents: 33145
diff changeset
255 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
256 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
257 struct key *p, *prev_p;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
258 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
259
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
260 if (!keymutex)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
261 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
262 PyThread_acquire_lock(keymutex, 1);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
263 prev_p = NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
264 for (p = keyhead; p != NULL; p = p->next) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
265 if (p->id == id && p->key == key)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
266 goto Done;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
267 /* Sanity check. These states should never happen but if
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
268 * they do we must abort. Otherwise we'll end up spinning in
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
269 * in a tight loop with the lock held. A similar check is done
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
270 * in pystate.c tstate_delete_common(). */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
271 if (p == prev_p)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
272 Py_FatalError("tls find_key: small circular list(!)");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
273 prev_p = p;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
274 if (p->next == keyhead)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
275 Py_FatalError("tls find_key: circular list(!)");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
276 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
277 if (value == NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
278 assert(p == NULL);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
279 goto Done;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
280 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
281 p = (struct key *)malloc(sizeof(struct key));
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
282 if (p != NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
283 p->id = id;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
284 p->key = key;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
285 p->value = value;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
286 p->next = keyhead;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
287 keyhead = p;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
288 }
33712
baa2653f7a76 find_key(): This routine wasn't thread-correct, and accounts for the
Tim Peters <tim.peters@gmail.com>
parents: 33705
diff changeset
289 Done:
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
290 PyThread_release_lock(keymutex);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
291 return p;
28694
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
33705
891042c94aed Document the results of painful reverse-engineering of the "portable TLS"
Tim Peters <tim.peters@gmail.com>
parents: 33699
diff changeset
294 /* 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
295 * 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
296 * 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
297 */
33699
0c26db381673 Style guide & consistency changes. No semantic changes.
Tim Peters <tim.peters@gmail.com>
parents: 33145
diff changeset
298 int
0c26db381673 Style guide & consistency changes. No semantic changes.
Tim Peters <tim.peters@gmail.com>
parents: 33145
diff changeset
299 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
300 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
301 /* All parts of this function are wrong if it's called by multiple
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
302 * threads simultaneously.
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
303 */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
304 if (keymutex == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
305 keymutex = PyThread_allocate_lock();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
306 return ++nkeys;
28694
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
307 }
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
308
33705
891042c94aed Document the results of painful reverse-engineering of the "portable TLS"
Tim Peters <tim.peters@gmail.com>
parents: 33699
diff changeset
309 /* 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
310 void
0c26db381673 Style guide & consistency changes. No semantic changes.
Tim Peters <tim.peters@gmail.com>
parents: 33145
diff changeset
311 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
312 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
313 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
314
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
315 PyThread_acquire_lock(keymutex, 1);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
316 q = &keyhead;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
317 while ((p = *q) != NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
318 if (p->key == key) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
319 *q = p->next;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
320 free((void *)p);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
321 /* NB This does *not* free p->value! */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
322 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
323 else
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
324 q = &p->next;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
325 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
326 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
327 }
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
328
33705
891042c94aed Document the results of painful reverse-engineering of the "portable TLS"
Tim Peters <tim.peters@gmail.com>
parents: 33699
diff changeset
329 /* 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
330 * 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
331 * 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
332 * 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
333 * 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
334 */
33699
0c26db381673 Style guide & consistency changes. No semantic changes.
Tim Peters <tim.peters@gmail.com>
parents: 33145
diff changeset
335 int
0c26db381673 Style guide & consistency changes. No semantic changes.
Tim Peters <tim.peters@gmail.com>
parents: 33145
diff changeset
336 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
337 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
338 struct key *p;
33705
891042c94aed Document the results of painful reverse-engineering of the "portable TLS"
Tim Peters <tim.peters@gmail.com>
parents: 33699
diff changeset
339
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
340 assert(value != NULL);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
341 p = find_key(key, value);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
342 if (p == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
343 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
344 else
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
345 return 0;
28694
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
346 }
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
347
33705
891042c94aed Document the results of painful reverse-engineering of the "portable TLS"
Tim Peters <tim.peters@gmail.com>
parents: 33699
diff changeset
348 /* 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
349 * 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
350 */
33699
0c26db381673 Style guide & consistency changes. No semantic changes.
Tim Peters <tim.peters@gmail.com>
parents: 33145
diff changeset
351 void *
0c26db381673 Style guide & consistency changes. No semantic changes.
Tim Peters <tim.peters@gmail.com>
parents: 33145
diff changeset
352 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
353 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
354 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
355
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
356 if (p == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
357 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
358 else
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
359 return p->value;
28694
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
360 }
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
361
33705
891042c94aed Document the results of painful reverse-engineering of the "portable TLS"
Tim Peters <tim.peters@gmail.com>
parents: 33699
diff changeset
362 /* 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
363 void
0c26db381673 Style guide & consistency changes. No semantic changes.
Tim Peters <tim.peters@gmail.com>
parents: 33145
diff changeset
364 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
365 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
366 long id = PyThread_get_thread_ident();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
367 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
368
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
369 PyThread_acquire_lock(keymutex, 1);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
370 q = &keyhead;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
371 while ((p = *q) != NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
372 if (p->key == key && p->id == id) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
373 *q = p->next;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
374 free((void *)p);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
375 /* NB This does *not* free p->value! */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
376 break;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
377 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
378 else
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
379 q = &p->next;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
380 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
381 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
382 }
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
383
47665
71cb7ea4f110 Merged revisions 64212 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 44587
diff changeset
384 /* 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
385 * 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
386 * 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
387 * 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
388 */
71cb7ea4f110 Merged revisions 64212 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 44587
diff changeset
389 void
71cb7ea4f110 Merged revisions 64212 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 44587
diff changeset
390 PyThread_ReInitTLS(void)
71cb7ea4f110 Merged revisions 64212 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 44587
diff changeset
391 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
392 long id = PyThread_get_thread_ident();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
393 struct key *p, **q;
47665
71cb7ea4f110 Merged revisions 64212 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 44587
diff changeset
394
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
395 if (!keymutex)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
396 return;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
397
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
398 /* As with interpreter_lock in PyEval_ReInitThreads()
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
399 we just create a new lock without freeing the old one */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
400 keymutex = PyThread_allocate_lock();
47665
71cb7ea4f110 Merged revisions 64212 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 44587
diff changeset
401
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
402 /* Delete all keys which do not match the current thread id */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
403 q = &keyhead;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
404 while ((p = *q) != NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
405 if (p->id != id) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
406 *q = p->next;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
407 free((void *)p);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
408 /* NB This does *not* free p->value! */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
409 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
410 else
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
411 q = &p->next;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50745
diff changeset
412 }
47665
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
28694
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
415 #endif /* Py_HAVE_NATIVE_TLS */
69457
383a7301616b Issue #11223: Add threading._info() function providing informations about the
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68586
diff changeset
416
69710
2b21fcf3d9a9 Issue #11223: Replace threading._info() by sys.thread_info
Victor Stinner <victor.stinner@haypocalc.com>
parents: 69466
diff changeset
417 PyDoc_STRVAR(threadinfo__doc__,
2b21fcf3d9a9 Issue #11223: Replace threading._info() by sys.thread_info
Victor Stinner <victor.stinner@haypocalc.com>
parents: 69466
diff changeset
418 "sys.thread_info\n\
2b21fcf3d9a9 Issue #11223: Replace threading._info() by sys.thread_info
Victor Stinner <victor.stinner@haypocalc.com>
parents: 69466
diff changeset
419 \n\
2b21fcf3d9a9 Issue #11223: Replace threading._info() by sys.thread_info
Victor Stinner <victor.stinner@haypocalc.com>
parents: 69466
diff changeset
420 A struct sequence holding information about the thread implementation.");
2b21fcf3d9a9 Issue #11223: Replace threading._info() by sys.thread_info
Victor Stinner <victor.stinner@haypocalc.com>
parents: 69466
diff changeset
421
2b21fcf3d9a9 Issue #11223: Replace threading._info() by sys.thread_info
Victor Stinner <victor.stinner@haypocalc.com>
parents: 69466
diff changeset
422 static PyStructSequence_Field threadinfo_fields[] = {
2b21fcf3d9a9 Issue #11223: Replace threading._info() by sys.thread_info
Victor Stinner <victor.stinner@haypocalc.com>
parents: 69466
diff changeset
423 {"name", "name of the thread implementation"},
2b21fcf3d9a9 Issue #11223: Replace threading._info() by sys.thread_info
Victor Stinner <victor.stinner@haypocalc.com>
parents: 69466
diff changeset
424 {"lock", "name of the lock implementation"},
2b21fcf3d9a9 Issue #11223: Replace threading._info() by sys.thread_info
Victor Stinner <victor.stinner@haypocalc.com>
parents: 69466
diff changeset
425 {"version", "name and version of the thread library"},
2b21fcf3d9a9 Issue #11223: Replace threading._info() by sys.thread_info
Victor Stinner <victor.stinner@haypocalc.com>
parents: 69466
diff changeset
426 {0}
2b21fcf3d9a9 Issue #11223: Replace threading._info() by sys.thread_info
Victor Stinner <victor.stinner@haypocalc.com>
parents: 69466
diff changeset
427 };
2b21fcf3d9a9 Issue #11223: Replace threading._info() by sys.thread_info
Victor Stinner <victor.stinner@haypocalc.com>
parents: 69466
diff changeset
428
2b21fcf3d9a9 Issue #11223: Replace threading._info() by sys.thread_info
Victor Stinner <victor.stinner@haypocalc.com>
parents: 69466
diff changeset
429 static PyStructSequence_Desc threadinfo_desc = {
2b21fcf3d9a9 Issue #11223: Replace threading._info() by sys.thread_info
Victor Stinner <victor.stinner@haypocalc.com>
parents: 69466
diff changeset
430 "sys.thread_info", /* name */
2b21fcf3d9a9 Issue #11223: Replace threading._info() by sys.thread_info
Victor Stinner <victor.stinner@haypocalc.com>
parents: 69466
diff changeset
431 threadinfo__doc__, /* doc */
2b21fcf3d9a9 Issue #11223: Replace threading._info() by sys.thread_info
Victor Stinner <victor.stinner@haypocalc.com>
parents: 69466
diff changeset
432 threadinfo_fields, /* fields */
2b21fcf3d9a9 Issue #11223: Replace threading._info() by sys.thread_info
Victor Stinner <victor.stinner@haypocalc.com>
parents: 69466
diff changeset
433 3
2b21fcf3d9a9 Issue #11223: Replace threading._info() by sys.thread_info
Victor Stinner <victor.stinner@haypocalc.com>
parents: 69466
diff changeset
434 };
2b21fcf3d9a9 Issue #11223: Replace threading._info() by sys.thread_info
Victor Stinner <victor.stinner@haypocalc.com>
parents: 69466
diff changeset
435
2b21fcf3d9a9 Issue #11223: Replace threading._info() by sys.thread_info
Victor Stinner <victor.stinner@haypocalc.com>
parents: 69466
diff changeset
436 static PyTypeObject ThreadInfoType;
2b21fcf3d9a9 Issue #11223: Replace threading._info() by sys.thread_info
Victor Stinner <victor.stinner@haypocalc.com>
parents: 69466
diff changeset
437
69457
383a7301616b Issue #11223: Add threading._info() function providing informations about the
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68586
diff changeset
438 PyObject*
69710
2b21fcf3d9a9 Issue #11223: Replace threading._info() by sys.thread_info
Victor Stinner <victor.stinner@haypocalc.com>
parents: 69466
diff changeset
439 PyThread_GetInfo(void)
69457
383a7301616b Issue #11223: Add threading._info() function providing informations about the
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68586
diff changeset
440 {
69710
2b21fcf3d9a9 Issue #11223: Replace threading._info() by sys.thread_info
Victor Stinner <victor.stinner@haypocalc.com>
parents: 69466
diff changeset
441 PyObject *threadinfo, *value;
2b21fcf3d9a9 Issue #11223: Replace threading._info() by sys.thread_info
Victor Stinner <victor.stinner@haypocalc.com>
parents: 69466
diff changeset
442 int pos = 0;
69466
64008d17fb54 Issue #11223: fix compiler warnings
Victor Stinner <victor.stinner@haypocalc.com>
parents: 69457
diff changeset
443 #if (defined(_POSIX_THREADS) && defined(HAVE_CONFSTR) \
64008d17fb54 Issue #11223: fix compiler warnings
Victor Stinner <victor.stinner@haypocalc.com>
parents: 69457
diff changeset
444 && defined(_CS_GNU_LIBPTHREAD_VERSION))
69457
383a7301616b Issue #11223: Add threading._info() function providing informations about the
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68586
diff changeset
445 char buffer[255];
383a7301616b Issue #11223: Add threading._info() function providing informations about the
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68586
diff changeset
446 int len;
69466
64008d17fb54 Issue #11223: fix compiler warnings
Victor Stinner <victor.stinner@haypocalc.com>
parents: 69457
diff changeset
447 #endif
69457
383a7301616b Issue #11223: Add threading._info() function providing informations about the
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68586
diff changeset
448
69710
2b21fcf3d9a9 Issue #11223: Replace threading._info() by sys.thread_info
Victor Stinner <victor.stinner@haypocalc.com>
parents: 69466
diff changeset
449 if (ThreadInfoType.tp_name == 0)
2b21fcf3d9a9 Issue #11223: Replace threading._info() by sys.thread_info
Victor Stinner <victor.stinner@haypocalc.com>
parents: 69466
diff changeset
450 PyStructSequence_InitType(&ThreadInfoType, &threadinfo_desc);
2b21fcf3d9a9 Issue #11223: Replace threading._info() by sys.thread_info
Victor Stinner <victor.stinner@haypocalc.com>
parents: 69466
diff changeset
451
2b21fcf3d9a9 Issue #11223: Replace threading._info() by sys.thread_info
Victor Stinner <victor.stinner@haypocalc.com>
parents: 69466
diff changeset
452 threadinfo = PyStructSequence_New(&ThreadInfoType);
2b21fcf3d9a9 Issue #11223: Replace threading._info() by sys.thread_info
Victor Stinner <victor.stinner@haypocalc.com>
parents: 69466
diff changeset
453 if (threadinfo == NULL)
69457
383a7301616b Issue #11223: Add threading._info() function providing informations about the
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68586
diff changeset
454 return NULL;
383a7301616b Issue #11223: Add threading._info() function providing informations about the
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68586
diff changeset
455
383a7301616b Issue #11223: Add threading._info() function providing informations about the
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68586
diff changeset
456 value = PyUnicode_FromString(PYTHREAD_NAME);
69710
2b21fcf3d9a9 Issue #11223: Replace threading._info() by sys.thread_info
Victor Stinner <victor.stinner@haypocalc.com>
parents: 69466
diff changeset
457 if (value == NULL) {
2b21fcf3d9a9 Issue #11223: Replace threading._info() by sys.thread_info
Victor Stinner <victor.stinner@haypocalc.com>
parents: 69466
diff changeset
458 Py_DECREF(threadinfo);
2b21fcf3d9a9 Issue #11223: Replace threading._info() by sys.thread_info
Victor Stinner <victor.stinner@haypocalc.com>
parents: 69466
diff changeset
459 return NULL;
2b21fcf3d9a9 Issue #11223: Replace threading._info() by sys.thread_info
Victor Stinner <victor.stinner@haypocalc.com>
parents: 69466
diff changeset
460 }
2b21fcf3d9a9 Issue #11223: Replace threading._info() by sys.thread_info
Victor Stinner <victor.stinner@haypocalc.com>
parents: 69466
diff changeset
461 PyStructSequence_SET_ITEM(threadinfo, pos++, value);
69457
383a7301616b Issue #11223: Add threading._info() function providing informations about the
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68586
diff changeset
462
383a7301616b Issue #11223: Add threading._info() function providing informations about the
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68586
diff changeset
463 #ifdef _POSIX_THREADS
383a7301616b Issue #11223: Add threading._info() function providing informations about the
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68586
diff changeset
464 #ifdef USE_SEMAPHORES
383a7301616b Issue #11223: Add threading._info() function providing informations about the
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68586
diff changeset
465 value = PyUnicode_FromString("semaphore");
383a7301616b Issue #11223: Add threading._info() function providing informations about the
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68586
diff changeset
466 #else
383a7301616b Issue #11223: Add threading._info() function providing informations about the
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68586
diff changeset
467 value = PyUnicode_FromString("mutex+cond");
383a7301616b Issue #11223: Add threading._info() function providing informations about the
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68586
diff changeset
468 #endif
69710
2b21fcf3d9a9 Issue #11223: Replace threading._info() by sys.thread_info
Victor Stinner <victor.stinner@haypocalc.com>
parents: 69466
diff changeset
469 if (value == NULL) {
2b21fcf3d9a9 Issue #11223: Replace threading._info() by sys.thread_info
Victor Stinner <victor.stinner@haypocalc.com>
parents: 69466
diff changeset
470 Py_DECREF(threadinfo);
69457
383a7301616b Issue #11223: Add threading._info() function providing informations about the
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68586
diff changeset
471 return NULL;
69710
2b21fcf3d9a9 Issue #11223: Replace threading._info() by sys.thread_info
Victor Stinner <victor.stinner@haypocalc.com>
parents: 69466
diff changeset
472 }
2b21fcf3d9a9 Issue #11223: Replace threading._info() by sys.thread_info
Victor Stinner <victor.stinner@haypocalc.com>
parents: 69466
diff changeset
473 #else
2b21fcf3d9a9 Issue #11223: Replace threading._info() by sys.thread_info
Victor Stinner <victor.stinner@haypocalc.com>
parents: 69466
diff changeset
474 Py_INCREF(Py_None);
2b21fcf3d9a9 Issue #11223: Replace threading._info() by sys.thread_info
Victor Stinner <victor.stinner@haypocalc.com>
parents: 69466
diff changeset
475 value = Py_None;
2b21fcf3d9a9 Issue #11223: Replace threading._info() by sys.thread_info
Victor Stinner <victor.stinner@haypocalc.com>
parents: 69466
diff changeset
476 #endif
2b21fcf3d9a9 Issue #11223: Replace threading._info() by sys.thread_info
Victor Stinner <victor.stinner@haypocalc.com>
parents: 69466
diff changeset
477 PyStructSequence_SET_ITEM(threadinfo, pos++, value);
69457
383a7301616b Issue #11223: Add threading._info() function providing informations about the
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68586
diff changeset
478
69710
2b21fcf3d9a9 Issue #11223: Replace threading._info() by sys.thread_info
Victor Stinner <victor.stinner@haypocalc.com>
parents: 69466
diff changeset
479 #if (defined(_POSIX_THREADS) && defined(HAVE_CONFSTR) \
2b21fcf3d9a9 Issue #11223: Replace threading._info() by sys.thread_info
Victor Stinner <victor.stinner@haypocalc.com>
parents: 69466
diff changeset
480 && defined(_CS_GNU_LIBPTHREAD_VERSION))
2b21fcf3d9a9 Issue #11223: Replace threading._info() by sys.thread_info
Victor Stinner <victor.stinner@haypocalc.com>
parents: 69466
diff changeset
481 value = NULL;
69457
383a7301616b Issue #11223: Add threading._info() function providing informations about the
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68586
diff changeset
482 len = confstr(_CS_GNU_LIBPTHREAD_VERSION, buffer, sizeof(buffer));
69710
2b21fcf3d9a9 Issue #11223: Replace threading._info() by sys.thread_info
Victor Stinner <victor.stinner@haypocalc.com>
parents: 69466
diff changeset
483 if (1 < len && len < sizeof(buffer)) {
69457
383a7301616b Issue #11223: Add threading._info() function providing informations about the
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68586
diff changeset
484 value = PyUnicode_DecodeFSDefaultAndSize(buffer, len-1);
383a7301616b Issue #11223: Add threading._info() function providing informations about the
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68586
diff changeset
485 if (value == NULL)
69710
2b21fcf3d9a9 Issue #11223: Replace threading._info() by sys.thread_info
Victor Stinner <victor.stinner@haypocalc.com>
parents: 69466
diff changeset
486 PyErr_Clear();
69457
383a7301616b Issue #11223: Add threading._info() function providing informations about the
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68586
diff changeset
487 }
69710
2b21fcf3d9a9 Issue #11223: Replace threading._info() by sys.thread_info
Victor Stinner <victor.stinner@haypocalc.com>
parents: 69466
diff changeset
488 if (value == NULL)
69457
383a7301616b Issue #11223: Add threading._info() function providing informations about the
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68586
diff changeset
489 #endif
69710
2b21fcf3d9a9 Issue #11223: Replace threading._info() by sys.thread_info
Victor Stinner <victor.stinner@haypocalc.com>
parents: 69466
diff changeset
490 {
2b21fcf3d9a9 Issue #11223: Replace threading._info() by sys.thread_info
Victor Stinner <victor.stinner@haypocalc.com>
parents: 69466
diff changeset
491 Py_INCREF(Py_None);
2b21fcf3d9a9 Issue #11223: Replace threading._info() by sys.thread_info
Victor Stinner <victor.stinner@haypocalc.com>
parents: 69466
diff changeset
492 value = Py_None;
2b21fcf3d9a9 Issue #11223: Replace threading._info() by sys.thread_info
Victor Stinner <victor.stinner@haypocalc.com>
parents: 69466
diff changeset
493 }
2b21fcf3d9a9 Issue #11223: Replace threading._info() by sys.thread_info
Victor Stinner <victor.stinner@haypocalc.com>
parents: 69466
diff changeset
494 PyStructSequence_SET_ITEM(threadinfo, pos++, value);
2b21fcf3d9a9 Issue #11223: Replace threading._info() by sys.thread_info
Victor Stinner <victor.stinner@haypocalc.com>
parents: 69466
diff changeset
495 return threadinfo;
69457
383a7301616b Issue #11223: Add threading._info() function providing informations about the
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68586
diff changeset
496 }