annotate Python/thread.c @ 30929:54ff68e973ee legacy-trunk

* Migrate set() and frozenset() from the sandbox. * Install the unittests, docs, newsitem, include file, and makefile update. * Exercise the new functions whereever sets.py was being used. Includes the docs for libfuncs.tex. Separate docs for the types are forthcoming.
author Raymond Hettinger <python@rcn.com>
date Sun, 16 Nov 2003 16:17:49 +0000
parents 1a817694ecbd
children 633be43bed17 4c8160088b34
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
10530
d834ecdf8c26 Changes by Mark Hammond for Windows CE. Mostly of the form
Guido van Rossum <guido@python.org>
parents: 9679
diff changeset
10 #ifndef DONT_HAVE_STDIO_H
1848
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1418
diff changeset
11 #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
12 #endif
1848
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1418
diff changeset
13
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1418
diff changeset
14 #ifdef HAVE_STDLIB_H
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1418
diff changeset
15 #include <stdlib.h>
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1418
diff changeset
16 #else
10530
d834ecdf8c26 Changes by Mark Hammond for Windows CE. Mostly of the form
Guido van Rossum <guido@python.org>
parents: 9679
diff changeset
17 #ifdef Py_DEBUG
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13256
diff changeset
18 extern char *getenv(const char *);
1848
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1418
diff changeset
19 #endif
10530
d834ecdf8c26 Changes by Mark Hammond for Windows CE. Mostly of the form
Guido van Rossum <guido@python.org>
parents: 9679
diff changeset
20 #endif
1848
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1418
diff changeset
21
5599
b5e51ae9f832 DG/UX thread patches (Ross Andrus)
Guido van Rossum <guido@python.org>
parents: 5381
diff changeset
22 #ifdef __DGUX
b5e51ae9f832 DG/UX thread patches (Ross Andrus)
Guido van Rossum <guido@python.org>
parents: 5381
diff changeset
23 #define _USING_POSIX4A_DRAFT6
b5e51ae9f832 DG/UX thread patches (Ross Andrus)
Guido van Rossum <guido@python.org>
parents: 5381
diff changeset
24 #endif
b5e51ae9f832 DG/UX thread patches (Ross Andrus)
Guido van Rossum <guido@python.org>
parents: 5381
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
15047
457f0df46dd9 Donn Cave <donn@u.washington.edu>:
Fred Drake <fdrake@acm.org>
parents: 14674
diff changeset
48 #if defined(__MWERKS__) && !defined(__BEOS__)
12475
c27f484aefff Jack Jansen: Posix threads are now supported on the Macintosh too.
Guido van Rossum <guido@python.org>
parents: 10530
diff changeset
49 #define _POSIX_THREADS
c27f484aefff Jack Jansen: Posix threads are now supported on the Macintosh too.
Guido van Rossum <guido@python.org>
parents: 10530
diff changeset
50 #endif
c27f484aefff Jack Jansen: Posix threads are now supported on the Macintosh too.
Guido van Rossum <guido@python.org>
parents: 10530
diff changeset
51
1418
b1bb74a2b593 Port to Solaris 2.3.
Sjoerd Mullender <sjoerd@acm.org>
parents: 1350
diff changeset
52 #endif /* _POSIX_THREADS */
923
72aceed365d4 * Makefile adapted to changes below.
Guido van Rossum <guido@python.org>
parents:
diff changeset
53
72aceed365d4 * Makefile adapted to changes below.
Guido van Rossum <guido@python.org>
parents:
diff changeset
54
4839
4567e158d20c Rename DEBUG macro to Py_DEBUG
Guido van Rossum <guido@python.org>
parents: 4596
diff changeset
55 #ifdef Py_DEBUG
1848
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1418
diff changeset
56 static int thread_debug = 0;
23992
95da99187c57 Silence compiler warning
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 23777
diff changeset
57 #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
58 #define d2printf(args) ((thread_debug & 8) && printf args)
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1418
diff changeset
59 #else
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1418
diff changeset
60 #define dprintf(args)
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1418
diff changeset
61 #define d2printf(args)
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1418
diff changeset
62 #endif
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1418
diff changeset
63
923
72aceed365d4 * Makefile adapted to changes below.
Guido van Rossum <guido@python.org>
parents:
diff changeset
64 static int initialized;
72aceed365d4 * Makefile adapted to changes below.
Guido van Rossum <guido@python.org>
parents:
diff changeset
65
13689
9db86b27278f Prototype yet another forward declaration.
Thomas Wouters <thomas@python.org>
parents: 13658
diff changeset
66 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
67
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13256
diff changeset
68 void PyThread_init_thread(void)
1004
5d7142ea01b7 adapted SV module to the new svideo library.
Sjoerd Mullender <sjoerd@acm.org>
parents: 961
diff changeset
69 {
4839
4567e158d20c Rename DEBUG macro to Py_DEBUG
Guido van Rossum <guido@python.org>
parents: 4596
diff changeset
70 #ifdef Py_DEBUG
1418
b1bb74a2b593 Port to Solaris 2.3.
Sjoerd Mullender <sjoerd@acm.org>
parents: 1350
diff changeset
71 char *p = getenv("THREADDEBUG");
b1bb74a2b593 Port to Solaris 2.3.
Sjoerd Mullender <sjoerd@acm.org>
parents: 1350
diff changeset
72
b1bb74a2b593 Port to Solaris 2.3.
Sjoerd Mullender <sjoerd@acm.org>
parents: 1350
diff changeset
73 if (p) {
b1bb74a2b593 Port to Solaris 2.3.
Sjoerd Mullender <sjoerd@acm.org>
parents: 1350
diff changeset
74 if (*p)
b1bb74a2b593 Port to Solaris 2.3.
Sjoerd Mullender <sjoerd@acm.org>
parents: 1350
diff changeset
75 thread_debug = atoi(p);
b1bb74a2b593 Port to Solaris 2.3.
Sjoerd Mullender <sjoerd@acm.org>
parents: 1350
diff changeset
76 else
b1bb74a2b593 Port to Solaris 2.3.
Sjoerd Mullender <sjoerd@acm.org>
parents: 1350
diff changeset
77 thread_debug = 1;
b1bb74a2b593 Port to Solaris 2.3.
Sjoerd Mullender <sjoerd@acm.org>
parents: 1350
diff changeset
78 }
4839
4567e158d20c Rename DEBUG macro to Py_DEBUG
Guido van Rossum <guido@python.org>
parents: 4596
diff changeset
79 #endif /* Py_DEBUG */
1004
5d7142ea01b7 adapted SV module to the new svideo library.
Sjoerd Mullender <sjoerd@acm.org>
parents: 961
diff changeset
80 if (initialized)
5d7142ea01b7 adapted SV module to the new svideo library.
Sjoerd Mullender <sjoerd@acm.org>
parents: 961
diff changeset
81 return;
5d7142ea01b7 adapted SV module to the new svideo library.
Sjoerd Mullender <sjoerd@acm.org>
parents: 961
diff changeset
82 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
83 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
84 PyThread__init_thread();
923
72aceed365d4 * Makefile adapted to changes below.
Guido van Rossum <guido@python.org>
parents:
diff changeset
85 }
72aceed365d4 * Makefile adapted to changes below.
Guido van Rossum <guido@python.org>
parents:
diff changeset
86
1848
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1418
diff changeset
87 #ifdef SGI_THREADS
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1418
diff changeset
88 #include "thread_sgi.h"
1418
b1bb74a2b593 Port to Solaris 2.3.
Sjoerd Mullender <sjoerd@acm.org>
parents: 1350
diff changeset
89 #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
90
1848
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1418
diff changeset
91 #ifdef SOLARIS_THREADS
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1418
diff changeset
92 #include "thread_solaris.h"
923
72aceed365d4 * Makefile adapted to changes below.
Guido van Rossum <guido@python.org>
parents:
diff changeset
93 #endif
1848
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1418
diff changeset
94
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1418
diff changeset
95 #ifdef SUN_LWP
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1418
diff changeset
96 #include "thread_lwp.h"
923
72aceed365d4 * Makefile adapted to changes below.
Guido van Rossum <guido@python.org>
parents:
diff changeset
97 #endif
72aceed365d4 * Makefile adapted to changes below.
Guido van Rossum <guido@python.org>
parents:
diff changeset
98
14674
756c8c6535fe Make better use of GNU Pth -- patch by Andy Dustman.
Guido van Rossum <guido@python.org>
parents: 14375
diff changeset
99 #ifdef HAVE_PTH
12611
b320cf3a98b9 Andy Dustman: add GNU pth user-space thread support.
Guido van Rossum <guido@python.org>
parents: 12475
diff changeset
100 #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
101 #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
102 #endif
756c8c6535fe Make better use of GNU Pth -- patch by Andy Dustman.
Guido van Rossum <guido@python.org>
parents: 14375
diff changeset
103
1848
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1418
diff changeset
104 #ifdef _POSIX_THREADS
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1418
diff changeset
105 #include "thread_pthread.h"
923
72aceed365d4 * Makefile adapted to changes below.
Guido van Rossum <guido@python.org>
parents:
diff changeset
106 #endif
72aceed365d4 * Makefile adapted to changes below.
Guido van Rossum <guido@python.org>
parents:
diff changeset
107
1848
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1418
diff changeset
108 #ifdef C_THREADS
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1418
diff changeset
109 #include "thread_cthread.h"
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1418
diff changeset
110 #endif
923
72aceed365d4 * Makefile adapted to changes below.
Guido van Rossum <guido@python.org>
parents:
diff changeset
111
2152
1a52351a00b2 nt thread support
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
112 #ifdef NT_THREADS
1a52351a00b2 nt thread support
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
113 #include "thread_nt.h"
1a52351a00b2 nt thread support
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
114 #endif
1a52351a00b2 nt thread support
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
115
6626
5e31d381fa47 os2 patch by Jeff Rush
Guido van Rossum <guido@python.org>
parents: 5599
diff changeset
116 #ifdef OS2_THREADS
5e31d381fa47 os2 patch by Jeff Rush
Guido van Rossum <guido@python.org>
parents: 5599
diff changeset
117 #include "thread_os2.h"
5e31d381fa47 os2 patch by Jeff Rush
Guido van Rossum <guido@python.org>
parents: 5599
diff changeset
118 #endif
5e31d381fa47 os2 patch by Jeff Rush
Guido van Rossum <guido@python.org>
parents: 5599
diff changeset
119
8822
bd47ee068b83 Changes for BeOS, QNX and long long, by Chris Herborth.
Guido van Rossum <guido@python.org>
parents: 6626
diff changeset
120 #ifdef BEOS_THREADS
bd47ee068b83 Changes for BeOS, QNX and long long, by Chris Herborth.
Guido van Rossum <guido@python.org>
parents: 6626
diff changeset
121 #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
122 #endif
bd47ee068b83 Changes for BeOS, QNX and long long, by Chris Herborth.
Guido van Rossum <guido@python.org>
parents: 6626
diff changeset
123
10530
d834ecdf8c26 Changes by Mark Hammond for Windows CE. Mostly of the form
Guido van Rossum <guido@python.org>
parents: 9679
diff changeset
124 #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
125 #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
126 #endif
d834ecdf8c26 Changes by Mark Hammond for Windows CE. Mostly of the form
Guido van Rossum <guido@python.org>
parents: 9679
diff changeset
127
22206
b898c0feb754 Patch #504224: add plan9 threads include to thread.c.
Martin v. Löwis <martin@v.loewis.de>
parents: 21712
diff changeset
128 #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
129 #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
130 #endif
b898c0feb754 Patch #504224: add plan9 threads include to thread.c.
Martin v. Löwis <martin@v.loewis.de>
parents: 21712
diff changeset
131
23777
bec1b942e0bc Patch #488073: AtheOS port.
Martin v. Löwis <martin@v.loewis.de>
parents: 22509
diff changeset
132 #ifdef ATHEOS_THREADS
bec1b942e0bc Patch #488073: AtheOS port.
Martin v. Löwis <martin@v.loewis.de>
parents: 22509
diff changeset
133 #include "thread_atheos.h"
bec1b942e0bc Patch #488073: AtheOS port.
Martin v. Löwis <martin@v.loewis.de>
parents: 22509
diff changeset
134 #endif
bec1b942e0bc Patch #488073: AtheOS port.
Martin v. Löwis <martin@v.loewis.de>
parents: 22509
diff changeset
135
961
a31e07847063 New thread.c from Sjoerd, supports _exit_prog(). Use this in goaway()
Guido van Rossum <guido@python.org>
parents: 926
diff changeset
136 /*
1848
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1418
diff changeset
137 #ifdef FOOBAR_THREADS
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1418
diff changeset
138 #include "thread_foobar.h"
923
72aceed365d4 * Makefile adapted to changes below.
Guido van Rossum <guido@python.org>
parents:
diff changeset
139 #endif
1848
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1418
diff changeset
140 */
28694
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 #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
143 /* 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
144 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
145
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
146 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
147 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
148 */
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
149 /*
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
150 * 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
151 */
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
152
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
153 struct key {
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
154 struct key *next;
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
155 long id;
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
156 int key;
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
157 void *value;
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
158 };
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 *keyhead = NULL;
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
161 static int nkeys = 0;
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
162 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
163
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
164 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
165 {
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
166 struct key *p;
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
167 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
168 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
169 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
170 return p;
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
171 }
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
172 if (value == NULL)
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
173 return NULL;
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
174 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
175 if (p != NULL) {
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
176 p->id = id;
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
177 p->key = key;
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
178 p->value = value;
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
179 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
180 p->next = keyhead;
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
181 keyhead = p;
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
182 PyThread_release_lock(keymutex);
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
183 }
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
184 return p;
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
185 }
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
186
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
187 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
188 {
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
189 if (keymutex == NULL)
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
190 keymutex = PyThread_allocate_lock();
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
191 return ++nkeys;
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
192 }
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
193
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
194 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
195 {
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
196 struct key *p, **q;
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
197 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
198 q = &keyhead;
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
199 while ((p = *q) != NULL) {
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
200 if (p->key == key) {
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
201 *q = p->next;
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
202 free((void *)p);
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
203 /* 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
204 }
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
205 else
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
206 q = &p->next;
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
207 }
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
208 PyThread_release_lock(keymutex);
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
209 }
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
210
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
211 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
212 {
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
213 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
214 if (p == NULL)
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
215 return -1;
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
216 else
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
217 return 0;
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
218 }
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
219
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
220 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
221 {
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
222 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
223 if (p == NULL)
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
224 return NULL;
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
225 else
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
226 return p->value;
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 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
230 {
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
231 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
232 struct key *p, **q;
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
233 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
234 q = &keyhead;
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
235 while ((p = *q) != NULL) {
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
236 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
237 *q = p->next;
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
238 free((void *)p);
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
239 /* 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
240 break;
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
241 }
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
242 else
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
243 q = &p->next;
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
244 }
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
245 PyThread_release_lock(keymutex);
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
246 }
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
247
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
248 #endif /* Py_HAVE_NATIVE_TLS */