annotate Python/thread.c @ 33145:28a205ecb4dd legacy-trunk

The attached patch fixes FTBFS on GNU/k*BSD. The problem happens on GNU/k*BSD because GNU/k*BSD uses gnu pth to provide pthreads, but will also happen on any system that does the same. python fails to build because it doesn't detect gnu pth in pthread emulation. See C comments in patch for details. patch taken from http://bugs.debian.org/264315
author Matthias Klose <doko@ubuntu.com>
date Mon, 16 Aug 2004 11:35:51 +0000
parents 2abc52c3d4c2
children 0c26db381673
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
1418
b1bb74a2b593 Port to Solaris 2.3.
Sjoerd Mullender <sjoerd@acm.org>
parents: 1350
diff changeset
48 #endif /* _POSIX_THREADS */
923
72aceed365d4 * Makefile adapted to changes below.
Guido van Rossum <guido@python.org>
parents:
diff changeset
49
72aceed365d4 * Makefile adapted to changes below.
Guido van Rossum <guido@python.org>
parents:
diff changeset
50
4839
4567e158d20c Rename DEBUG macro to Py_DEBUG
Guido van Rossum <guido@python.org>
parents: 4596
diff changeset
51 #ifdef Py_DEBUG
1848
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1418
diff changeset
52 static int thread_debug = 0;
23992
95da99187c57 Silence compiler warning
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 23777
diff changeset
53 #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
54 #define d2printf(args) ((thread_debug & 8) && printf args)
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1418
diff changeset
55 #else
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1418
diff changeset
56 #define dprintf(args)
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1418
diff changeset
57 #define d2printf(args)
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1418
diff changeset
58 #endif
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1418
diff changeset
59
923
72aceed365d4 * Makefile adapted to changes below.
Guido van Rossum <guido@python.org>
parents:
diff changeset
60 static int initialized;
72aceed365d4 * Makefile adapted to changes below.
Guido van Rossum <guido@python.org>
parents:
diff changeset
61
13689
9db86b27278f Prototype yet another forward declaration.
Thomas Wouters <thomas@python.org>
parents: 13658
diff changeset
62 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
63
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13256
diff changeset
64 void PyThread_init_thread(void)
1004
5d7142ea01b7 adapted SV module to the new svideo library.
Sjoerd Mullender <sjoerd@acm.org>
parents: 961
diff changeset
65 {
4839
4567e158d20c Rename DEBUG macro to Py_DEBUG
Guido van Rossum <guido@python.org>
parents: 4596
diff changeset
66 #ifdef Py_DEBUG
1418
b1bb74a2b593 Port to Solaris 2.3.
Sjoerd Mullender <sjoerd@acm.org>
parents: 1350
diff changeset
67 char *p = getenv("THREADDEBUG");
b1bb74a2b593 Port to Solaris 2.3.
Sjoerd Mullender <sjoerd@acm.org>
parents: 1350
diff changeset
68
b1bb74a2b593 Port to Solaris 2.3.
Sjoerd Mullender <sjoerd@acm.org>
parents: 1350
diff changeset
69 if (p) {
b1bb74a2b593 Port to Solaris 2.3.
Sjoerd Mullender <sjoerd@acm.org>
parents: 1350
diff changeset
70 if (*p)
b1bb74a2b593 Port to Solaris 2.3.
Sjoerd Mullender <sjoerd@acm.org>
parents: 1350
diff changeset
71 thread_debug = atoi(p);
b1bb74a2b593 Port to Solaris 2.3.
Sjoerd Mullender <sjoerd@acm.org>
parents: 1350
diff changeset
72 else
b1bb74a2b593 Port to Solaris 2.3.
Sjoerd Mullender <sjoerd@acm.org>
parents: 1350
diff changeset
73 thread_debug = 1;
b1bb74a2b593 Port to Solaris 2.3.
Sjoerd Mullender <sjoerd@acm.org>
parents: 1350
diff changeset
74 }
4839
4567e158d20c Rename DEBUG macro to Py_DEBUG
Guido van Rossum <guido@python.org>
parents: 4596
diff changeset
75 #endif /* Py_DEBUG */
1004
5d7142ea01b7 adapted SV module to the new svideo library.
Sjoerd Mullender <sjoerd@acm.org>
parents: 961
diff changeset
76 if (initialized)
5d7142ea01b7 adapted SV module to the new svideo library.
Sjoerd Mullender <sjoerd@acm.org>
parents: 961
diff changeset
77 return;
5d7142ea01b7 adapted SV module to the new svideo library.
Sjoerd Mullender <sjoerd@acm.org>
parents: 961
diff changeset
78 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
79 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
80 PyThread__init_thread();
923
72aceed365d4 * Makefile adapted to changes below.
Guido van Rossum <guido@python.org>
parents:
diff changeset
81 }
72aceed365d4 * Makefile adapted to changes below.
Guido van Rossum <guido@python.org>
parents:
diff changeset
82
1848
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1418
diff changeset
83 #ifdef SGI_THREADS
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1418
diff changeset
84 #include "thread_sgi.h"
1418
b1bb74a2b593 Port to Solaris 2.3.
Sjoerd Mullender <sjoerd@acm.org>
parents: 1350
diff changeset
85 #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
86
1848
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1418
diff changeset
87 #ifdef SOLARIS_THREADS
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1418
diff changeset
88 #include "thread_solaris.h"
923
72aceed365d4 * Makefile adapted to changes below.
Guido van Rossum <guido@python.org>
parents:
diff changeset
89 #endif
1848
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1418
diff changeset
90
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1418
diff changeset
91 #ifdef SUN_LWP
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1418
diff changeset
92 #include "thread_lwp.h"
923
72aceed365d4 * Makefile adapted to changes below.
Guido van Rossum <guido@python.org>
parents:
diff changeset
93 #endif
72aceed365d4 * Makefile adapted to changes below.
Guido van Rossum <guido@python.org>
parents:
diff changeset
94
14674
756c8c6535fe Make better use of GNU Pth -- patch by Andy Dustman.
Guido van Rossum <guido@python.org>
parents: 14375
diff changeset
95 #ifdef HAVE_PTH
12611
b320cf3a98b9 Andy Dustman: add GNU pth user-space thread support.
Guido van Rossum <guido@python.org>
parents: 12475
diff changeset
96 #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
97 #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
98 #endif
756c8c6535fe Make better use of GNU Pth -- patch by Andy Dustman.
Guido van Rossum <guido@python.org>
parents: 14375
diff changeset
99
1848
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1418
diff changeset
100 #ifdef _POSIX_THREADS
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1418
diff changeset
101 #include "thread_pthread.h"
923
72aceed365d4 * Makefile adapted to changes below.
Guido van Rossum <guido@python.org>
parents:
diff changeset
102 #endif
72aceed365d4 * Makefile adapted to changes below.
Guido van Rossum <guido@python.org>
parents:
diff changeset
103
1848
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1418
diff changeset
104 #ifdef C_THREADS
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1418
diff changeset
105 #include "thread_cthread.h"
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1418
diff changeset
106 #endif
923
72aceed365d4 * Makefile adapted to changes below.
Guido van Rossum <guido@python.org>
parents:
diff changeset
107
2152
1a52351a00b2 nt thread support
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
108 #ifdef NT_THREADS
1a52351a00b2 nt thread support
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
109 #include "thread_nt.h"
1a52351a00b2 nt thread support
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
110 #endif
1a52351a00b2 nt thread support
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
111
6626
5e31d381fa47 os2 patch by Jeff Rush
Guido van Rossum <guido@python.org>
parents: 5599
diff changeset
112 #ifdef OS2_THREADS
5e31d381fa47 os2 patch by Jeff Rush
Guido van Rossum <guido@python.org>
parents: 5599
diff changeset
113 #include "thread_os2.h"
5e31d381fa47 os2 patch by Jeff Rush
Guido van Rossum <guido@python.org>
parents: 5599
diff changeset
114 #endif
5e31d381fa47 os2 patch by Jeff Rush
Guido van Rossum <guido@python.org>
parents: 5599
diff changeset
115
8822
bd47ee068b83 Changes for BeOS, QNX and long long, by Chris Herborth.
Guido van Rossum <guido@python.org>
parents: 6626
diff changeset
116 #ifdef BEOS_THREADS
bd47ee068b83 Changes for BeOS, QNX and long long, by Chris Herborth.
Guido van Rossum <guido@python.org>
parents: 6626
diff changeset
117 #include "thread_beos.h"
bd47ee068b83 Changes for BeOS, QNX and long long, by Chris Herborth.
Guido van Rossum <guido@python.org>
parents: 6626
diff changeset
118 #endif
bd47ee068b83 Changes for BeOS, QNX and long long, by Chris Herborth.
Guido van Rossum <guido@python.org>
parents: 6626
diff changeset
119
10530
d834ecdf8c26 Changes by Mark Hammond for Windows CE. Mostly of the form
Guido van Rossum <guido@python.org>
parents: 9679
diff changeset
120 #ifdef WINCE_THREADS
d834ecdf8c26 Changes by Mark Hammond for Windows CE. Mostly of the form
Guido van Rossum <guido@python.org>
parents: 9679
diff changeset
121 #include "thread_wince.h"
d834ecdf8c26 Changes by Mark Hammond for Windows CE. Mostly of the form
Guido van Rossum <guido@python.org>
parents: 9679
diff changeset
122 #endif
d834ecdf8c26 Changes by Mark Hammond for Windows CE. Mostly of the form
Guido van Rossum <guido@python.org>
parents: 9679
diff changeset
123
22206
b898c0feb754 Patch #504224: add plan9 threads include to thread.c.
Martin v. Löwis <martin@v.loewis.de>
parents: 21712
diff changeset
124 #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
125 #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
126 #endif
b898c0feb754 Patch #504224: add plan9 threads include to thread.c.
Martin v. Löwis <martin@v.loewis.de>
parents: 21712
diff changeset
127
23777
bec1b942e0bc Patch #488073: AtheOS port.
Martin v. Löwis <martin@v.loewis.de>
parents: 22509
diff changeset
128 #ifdef ATHEOS_THREADS
bec1b942e0bc Patch #488073: AtheOS port.
Martin v. Löwis <martin@v.loewis.de>
parents: 22509
diff changeset
129 #include "thread_atheos.h"
bec1b942e0bc Patch #488073: AtheOS port.
Martin v. Löwis <martin@v.loewis.de>
parents: 22509
diff changeset
130 #endif
bec1b942e0bc Patch #488073: AtheOS port.
Martin v. Löwis <martin@v.loewis.de>
parents: 22509
diff changeset
131
961
a31e07847063 New thread.c from Sjoerd, supports _exit_prog(). Use this in goaway()
Guido van Rossum <guido@python.org>
parents: 926
diff changeset
132 /*
1848
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1418
diff changeset
133 #ifdef FOOBAR_THREADS
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1418
diff changeset
134 #include "thread_foobar.h"
923
72aceed365d4 * Makefile adapted to changes below.
Guido van Rossum <guido@python.org>
parents:
diff changeset
135 #endif
1848
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1418
diff changeset
136 */
28694
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
137
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
138 #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
139 /* 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
140 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
141
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
142 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
143 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
144 */
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
145 /*
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
146 * Per-thread data ("key") support.
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
147 */
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
148
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
149 struct key {
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
150 struct key *next;
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
151 long id;
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
152 int key;
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
153 void *value;
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
154 };
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
155
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
156 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
157 static int nkeys = 0;
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
158 static PyThread_type_lock keymutex = NULL;
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
159
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
160 static struct key *find_key(int key, void *value)
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
161 {
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
162 struct key *p;
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
163 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
164 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
165 if (p->id == id && p->key == key)
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
166 return p;
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
167 }
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
168 if (value == NULL)
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
169 return NULL;
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
170 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
171 if (p != NULL) {
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
172 p->id = id;
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
173 p->key = key;
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
174 p->value = value;
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
175 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
176 p->next = keyhead;
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
177 keyhead = p;
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
178 PyThread_release_lock(keymutex);
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
179 }
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
180 return p;
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
181 }
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
182
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
183 int PyThread_create_key(void)
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
184 {
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
185 if (keymutex == NULL)
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
186 keymutex = PyThread_allocate_lock();
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
187 return ++nkeys;
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
188 }
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
189
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
190 void PyThread_delete_key(int key)
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
191 {
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
192 struct key *p, **q;
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
193 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
194 q = &keyhead;
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
195 while ((p = *q) != NULL) {
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
196 if (p->key == key) {
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
197 *q = p->next;
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
198 free((void *)p);
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
199 /* 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
200 }
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
201 else
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
202 q = &p->next;
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
203 }
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
204 PyThread_release_lock(keymutex);
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
205 }
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
206
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
207 int PyThread_set_key_value(int key, void *value)
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
208 {
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
209 struct key *p = find_key(key, value);
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
210 if (p == NULL)
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
211 return -1;
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
212 else
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
213 return 0;
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
214 }
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
215
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
216 void *PyThread_get_key_value(int key)
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
217 {
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
218 struct key *p = find_key(key, NULL);
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
219 if (p == NULL)
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
220 return NULL;
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
221 else
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
222 return p->value;
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
223 }
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
224
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
225 void PyThread_delete_key_value(int key)
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
226 {
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
227 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
228 struct key *p, **q;
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
229 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
230 q = &keyhead;
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
231 while ((p = *q) != NULL) {
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
232 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
233 *q = p->next;
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
234 free((void *)p);
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
235 /* 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
236 break;
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
237 }
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
238 else
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
239 q = &p->next;
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
240 }
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
241 PyThread_release_lock(keymutex);
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
242 }
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
243
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
244 #endif /* Py_HAVE_NATIVE_TLS */