annotate Python/thread.c @ 43292:876b7ef4775d

Merged revisions 57778-58052 via svnmerge from svn+ssh://pythondev@svn.python.org/python/trunk ........ r57820 | georg.brandl | 2007-08-31 08:59:27 +0200 (Fri, 31 Aug 2007) | 2 lines Document new shorthand notation for index entries. ........ r57827 | georg.brandl | 2007-08-31 10:47:51 +0200 (Fri, 31 Aug 2007) | 2 lines Fix subitem markup. ........ r57833 | martin.v.loewis | 2007-08-31 12:01:07 +0200 (Fri, 31 Aug 2007) | 1 line Mark registry components as 64-bit on Win64. ........ r57854 | bill.janssen | 2007-08-31 21:02:23 +0200 (Fri, 31 Aug 2007) | 1 line deprecate use of FakeSocket ........ r57855 | bill.janssen | 2007-08-31 21:02:46 +0200 (Fri, 31 Aug 2007) | 1 line remove mentions of socket.ssl in comments ........ r57856 | bill.janssen | 2007-08-31 21:03:31 +0200 (Fri, 31 Aug 2007) | 1 line remove use of non-existent SSLFakeSocket in apparently untested code ........ r57859 | martin.v.loewis | 2007-09-01 08:36:03 +0200 (Sat, 01 Sep 2007) | 3 lines Bug #1737210: Change Manufacturer of Windows installer to PSF. Will backport to 2.5. ........ r57865 | georg.brandl | 2007-09-01 09:51:24 +0200 (Sat, 01 Sep 2007) | 2 lines Fix RST link (backport from Py3k). ........ r57876 | georg.brandl | 2007-09-01 17:49:49 +0200 (Sat, 01 Sep 2007) | 2 lines Document sets' ">" and "<" operations (backport from py3k). ........ r57878 | skip.montanaro | 2007-09-01 19:40:03 +0200 (Sat, 01 Sep 2007) | 4 lines Added a note and examples to explain that re.split does not split on an empty pattern match. (issue 852532). ........ r57879 | walter.doerwald | 2007-09-01 20:18:09 +0200 (Sat, 01 Sep 2007) | 2 lines Fix wrong function names. ........ r57880 | walter.doerwald | 2007-09-01 20:34:05 +0200 (Sat, 01 Sep 2007) | 2 lines Fix typo. ........ r57889 | andrew.kuchling | 2007-09-01 22:31:59 +0200 (Sat, 01 Sep 2007) | 1 line Markup fix ........ r57892 | andrew.kuchling | 2007-09-01 22:43:36 +0200 (Sat, 01 Sep 2007) | 1 line Add various items ........ r57895 | andrew.kuchling | 2007-09-01 23:17:58 +0200 (Sat, 01 Sep 2007) | 1 line Wording change ........ r57896 | andrew.kuchling | 2007-09-01 23:18:31 +0200 (Sat, 01 Sep 2007) | 1 line Add more items ........ r57904 | ronald.oussoren | 2007-09-02 11:46:07 +0200 (Sun, 02 Sep 2007) | 3 lines Macosx: this patch ensures that the value of MACOSX_DEPLOYMENT_TARGET used by the Makefile is also used at configure-time. ........ r57925 | georg.brandl | 2007-09-03 09:16:46 +0200 (Mon, 03 Sep 2007) | 2 lines Fix #883466: don't allow Unicode as arguments to quopri and uu codecs. ........ r57936 | matthias.klose | 2007-09-04 01:33:04 +0200 (Tue, 04 Sep 2007) | 2 lines - Added support for linking the bsddb module against BerkeleyDB 4.6.x. ........ r57954 | mark.summerfield | 2007-09-04 10:16:15 +0200 (Tue, 04 Sep 2007) | 3 lines Added cross-references plus a note about dict & list shallow copying. ........ r57958 | martin.v.loewis | 2007-09-04 11:51:57 +0200 (Tue, 04 Sep 2007) | 3 lines Document that we rely on the OS to release the crypto context. Fixes #1626801. ........ r57960 | martin.v.loewis | 2007-09-04 15:13:14 +0200 (Tue, 04 Sep 2007) | 3 lines Patch #1388440: Add set_completion_display_matches_hook and get_completion_type to readline. ........ r57961 | martin.v.loewis | 2007-09-04 16:19:28 +0200 (Tue, 04 Sep 2007) | 3 lines Patch #1031213: Decode source line in SyntaxErrors back to its original source encoding. Will backport to 2.5. ........ r57972 | matthias.klose | 2007-09-04 20:17:36 +0200 (Tue, 04 Sep 2007) | 3 lines - Makefile.pre.in(buildbottest): Run an optional script pybuildbot.identify to include some information about the build environment. ........ r57973 | matthias.klose | 2007-09-04 21:05:38 +0200 (Tue, 04 Sep 2007) | 2 lines - Makefile.pre.in(buildbottest): Remove whitespace at eol. ........ r57975 | matthias.klose | 2007-09-04 22:46:02 +0200 (Tue, 04 Sep 2007) | 2 lines - Fix libffi configure for hppa*-*-linux* | parisc*-*-linux*. ........ r57980 | bill.janssen | 2007-09-05 02:46:27 +0200 (Wed, 05 Sep 2007) | 1 line SSL certificate distinguished names should be represented by tuples ........ r57985 | martin.v.loewis | 2007-09-05 08:39:17 +0200 (Wed, 05 Sep 2007) | 3 lines Patch #1105: Explain that one needs to build the solution to get dependencies right. ........ r57987 | armin.rigo | 2007-09-05 09:51:21 +0200 (Wed, 05 Sep 2007) | 4 lines PyDict_GetItem() returns a borrowed reference. There are probably a number of places that are open to attacks such as the following one, in bltinmodule.c:min_max(). ........ r57991 | martin.v.loewis | 2007-09-05 13:47:34 +0200 (Wed, 05 Sep 2007) | 3 lines Patch #786737: Allow building in a tree of symlinks pointing to a readonly source. ........ r57993 | georg.brandl | 2007-09-05 15:36:44 +0200 (Wed, 05 Sep 2007) | 2 lines Backport from Py3k: Bug #1684991: explain lookup semantics for __special__ methods (new-style classes only). ........ r58004 | armin.rigo | 2007-09-06 10:30:51 +0200 (Thu, 06 Sep 2007) | 4 lines Patch #1733973 by peaker: ptrace_enter_call() assumes no exception is currently set. This assumption is broken when throwing into a generator. ........ r58006 | armin.rigo | 2007-09-06 11:30:38 +0200 (Thu, 06 Sep 2007) | 4 lines PyDict_GetItem() returns a borrowed reference. This attack is against ceval.c:IMPORT_NAME, which calls an object (__builtin__.__import__) without holding a reference to it. ........ r58013 | georg.brandl | 2007-09-06 16:49:56 +0200 (Thu, 06 Sep 2007) | 2 lines Backport from 3k: #1116: fix reference to old filename. ........ r58021 | thomas.heller | 2007-09-06 22:26:20 +0200 (Thu, 06 Sep 2007) | 1 line Fix typo: c_float represents to C float type. ........ r58022 | skip.montanaro | 2007-09-07 00:29:06 +0200 (Fri, 07 Sep 2007) | 3 lines If this is correct for py3k branch and it's already in the release25-maint branch, seems like it ought to be on the trunk as well. ........ r58023 | gregory.p.smith | 2007-09-07 00:59:59 +0200 (Fri, 07 Sep 2007) | 4 lines Apply the fix from Issue1112 to make this test more robust and keep windows happy. ........ r58031 | brett.cannon | 2007-09-07 05:17:50 +0200 (Fri, 07 Sep 2007) | 4 lines Make uuid1 and uuid4 tests conditional on whether ctypes can be imported; implementation of either function depends on ctypes but uuid as a whole does not. ........ r58032 | brett.cannon | 2007-09-07 06:18:30 +0200 (Fri, 07 Sep 2007) | 6 lines Fix a crasher where Python code managed to infinitely recurse in C code without ever going back out to Python code in PyObject_Call(). Required introducing a static RuntimeError instance so that normalizing an exception there is no reliance on a recursive call that would put the exception system over the recursion check itself. ........ r58034 | thomas.heller | 2007-09-07 08:32:17 +0200 (Fri, 07 Sep 2007) | 1 line Add a 'c_longdouble' type to the ctypes module. ........ r58035 | thomas.heller | 2007-09-07 11:30:40 +0200 (Fri, 07 Sep 2007) | 1 line Remove unneeded #include. ........ r58036 | thomas.heller | 2007-09-07 11:33:24 +0200 (Fri, 07 Sep 2007) | 6 lines Backport from py3k branch: Add a workaround for a strange bug on win64, when _ctypes is compiled with the SDK compiler. This should fix the failing Lib\ctypes\test\test_as_parameter.py test. ........ r58037 | georg.brandl | 2007-09-07 16:14:40 +0200 (Fri, 07 Sep 2007) | 2 lines Fix a wrong indentation for sublists. ........ r58043 | georg.brandl | 2007-09-07 22:10:49 +0200 (Fri, 07 Sep 2007) | 2 lines #1095: ln -f doesn't work portably, fix in Makefile. ........ r58049 | skip.montanaro | 2007-09-08 02:34:17 +0200 (Sat, 08 Sep 2007) | 1 line be explicit about the actual location of the missing file ........
author Thomas Wouters <thomas@python.org>
date Sat, 08 Sep 2007 17:39:28 +0000
parents a5e984eda45a
children fb5a6330f71b
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1198
2937897a7d8b * Added Fixcprt.py: script to fix copyright message.
Guido van Rossum <guido@python.org>
parents: 1186
diff changeset
1
1848
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1418
diff changeset
2 /* Thread package.
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1418
diff changeset
3 This is intended to be usable independently from Python.
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1418
diff changeset
4 The implementation for system foobar is in a file thread_foobar.h
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1418
diff changeset
5 which is included by this file dependent on config settings.
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1418
diff changeset
6 Stuff shared by all thread_*.h files is collected here. */
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1418
diff changeset
7
21712
c64fc56f6072 Include <unistd.h> in Python.h. Fixes #500924.
Martin v. Löwis <martin@v.loewis.de>
parents: 20468
diff changeset
8 #include "Python.h"
1848
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1418
diff changeset
9
33145
28a205ecb4dd The attached patch fixes FTBFS on GNU/k*BSD. The problem happens on GNU/k*BSD
Matthias Klose <doko@ubuntu.com>
parents: 31504
diff changeset
10
28a205ecb4dd The attached patch fixes FTBFS on GNU/k*BSD. The problem happens on GNU/k*BSD
Matthias Klose <doko@ubuntu.com>
parents: 31504
diff changeset
11 #ifndef _POSIX_THREADS
28a205ecb4dd The attached patch fixes FTBFS on GNU/k*BSD. The problem happens on GNU/k*BSD
Matthias Klose <doko@ubuntu.com>
parents: 31504
diff changeset
12 /* This means pthreads are not implemented in libc headers, hence the macro
28a205ecb4dd The attached patch fixes FTBFS on GNU/k*BSD. The problem happens on GNU/k*BSD
Matthias Klose <doko@ubuntu.com>
parents: 31504
diff changeset
13 not present in unistd.h. But they still can be implemented as an external
28a205ecb4dd The attached patch fixes FTBFS on GNU/k*BSD. The problem happens on GNU/k*BSD
Matthias Klose <doko@ubuntu.com>
parents: 31504
diff changeset
14 library (e.g. gnu pth in pthread emulation) */
28a205ecb4dd The attached patch fixes FTBFS on GNU/k*BSD. The problem happens on GNU/k*BSD
Matthias Klose <doko@ubuntu.com>
parents: 31504
diff changeset
15 # ifdef HAVE_PTHREAD_H
28a205ecb4dd The attached patch fixes FTBFS on GNU/k*BSD. The problem happens on GNU/k*BSD
Matthias Klose <doko@ubuntu.com>
parents: 31504
diff changeset
16 # include <pthread.h> /* _POSIX_THREADS */
28a205ecb4dd The attached patch fixes FTBFS on GNU/k*BSD. The problem happens on GNU/k*BSD
Matthias Klose <doko@ubuntu.com>
parents: 31504
diff changeset
17 # endif
28a205ecb4dd The attached patch fixes FTBFS on GNU/k*BSD. The problem happens on GNU/k*BSD
Matthias Klose <doko@ubuntu.com>
parents: 31504
diff changeset
18 #endif
28a205ecb4dd The attached patch fixes FTBFS on GNU/k*BSD. The problem happens on GNU/k*BSD
Matthias Klose <doko@ubuntu.com>
parents: 31504
diff changeset
19
10530
d834ecdf8c26 Changes by Mark Hammond for Windows CE. Mostly of the form
Guido van Rossum <guido@python.org>
parents: 9679
diff changeset
20 #ifndef DONT_HAVE_STDIO_H
1848
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1418
diff changeset
21 #include <stdio.h>
10530
d834ecdf8c26 Changes by Mark Hammond for Windows CE. Mostly of the form
Guido van Rossum <guido@python.org>
parents: 9679
diff changeset
22 #endif
1848
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1418
diff changeset
23
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1418
diff changeset
24 #include <stdlib.h>
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1418
diff changeset
25
5381
339d4129d3f7 Ugly hack for SGI IRIX 6.2. Apparently _POSIX_THREADS is defined even
Guido van Rossum <guido@python.org>
parents: 4839
diff changeset
26 #ifdef __sgi
339d4129d3f7 Ugly hack for SGI IRIX 6.2. Apparently _POSIX_THREADS is defined even
Guido van Rossum <guido@python.org>
parents: 4839
diff changeset
27 #ifndef HAVE_PTHREAD_H /* XXX Need to check in configure.in */
339d4129d3f7 Ugly hack for SGI IRIX 6.2. Apparently _POSIX_THREADS is defined even
Guido van Rossum <guido@python.org>
parents: 4839
diff changeset
28 #undef _POSIX_THREADS
339d4129d3f7 Ugly hack for SGI IRIX 6.2. Apparently _POSIX_THREADS is defined even
Guido van Rossum <guido@python.org>
parents: 4839
diff changeset
29 #endif
339d4129d3f7 Ugly hack for SGI IRIX 6.2. Apparently _POSIX_THREADS is defined even
Guido van Rossum <guido@python.org>
parents: 4839
diff changeset
30 #endif
339d4129d3f7 Ugly hack for SGI IRIX 6.2. Apparently _POSIX_THREADS is defined even
Guido van Rossum <guido@python.org>
parents: 4839
diff changeset
31
9203
07dae6fdae79 Renamed thread.h to pythread.h.
Guido van Rossum <guido@python.org>
parents: 8822
diff changeset
32 #include "pythread.h"
923
72aceed365d4 * Makefile adapted to changes below.
Guido van Rossum <guido@python.org>
parents:
diff changeset
33
1848
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1418
diff changeset
34 #ifndef _POSIX_THREADS
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1418
diff changeset
35
923
72aceed365d4 * Makefile adapted to changes below.
Guido van Rossum <guido@python.org>
parents:
diff changeset
36 #ifdef __sgi
1848
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1418
diff changeset
37 #define SGI_THREADS
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1418
diff changeset
38 #endif
961
a31e07847063 New thread.c from Sjoerd, supports _exit_prog(). Use this in goaway()
Guido van Rossum <guido@python.org>
parents: 926
diff changeset
39
1848
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1418
diff changeset
40 #ifdef HAVE_THREAD_H
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1418
diff changeset
41 #define SOLARIS_THREADS
923
72aceed365d4 * Makefile adapted to changes below.
Guido van Rossum <guido@python.org>
parents:
diff changeset
42 #endif
72aceed365d4 * Makefile adapted to changes below.
Guido van Rossum <guido@python.org>
parents:
diff changeset
43
1848
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1418
diff changeset
44 #if defined(sun) && !defined(SOLARIS_THREADS)
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1418
diff changeset
45 #define SUN_LWP
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1418
diff changeset
46 #endif
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1418
diff changeset
47
35549
b19cf73c54a7 (backport from HEAD)
Guido van Rossum <guido@python.org>
parents: 33712
diff changeset
48 /* Check if we're running on HP-UX and _SC_THREADS is defined. If so, then
b19cf73c54a7 (backport from HEAD)
Guido van Rossum <guido@python.org>
parents: 33712
diff changeset
49 enough of the Posix threads package is implimented to support python
b19cf73c54a7 (backport from HEAD)
Guido van Rossum <guido@python.org>
parents: 33712
diff changeset
50 threads.
b19cf73c54a7 (backport from HEAD)
Guido van Rossum <guido@python.org>
parents: 33712
diff changeset
51
b19cf73c54a7 (backport from HEAD)
Guido van Rossum <guido@python.org>
parents: 33712
diff changeset
52 This is valid for HP-UX 11.23 running on an ia64 system. If needed, add
b19cf73c54a7 (backport from HEAD)
Guido van Rossum <guido@python.org>
parents: 33712
diff changeset
53 a check of __ia64 to verify that we're running on a ia64 system instead
b19cf73c54a7 (backport from HEAD)
Guido van Rossum <guido@python.org>
parents: 33712
diff changeset
54 of a pa-risc system.
b19cf73c54a7 (backport from HEAD)
Guido van Rossum <guido@python.org>
parents: 33712
diff changeset
55 */
b19cf73c54a7 (backport from HEAD)
Guido van Rossum <guido@python.org>
parents: 33712
diff changeset
56 #ifdef __hpux
b19cf73c54a7 (backport from HEAD)
Guido van Rossum <guido@python.org>
parents: 33712
diff changeset
57 #ifdef _SC_THREADS
b19cf73c54a7 (backport from HEAD)
Guido van Rossum <guido@python.org>
parents: 33712
diff changeset
58 #define _POSIX_THREADS
b19cf73c54a7 (backport from HEAD)
Guido van Rossum <guido@python.org>
parents: 33712
diff changeset
59 #endif
b19cf73c54a7 (backport from HEAD)
Guido van Rossum <guido@python.org>
parents: 33712
diff changeset
60 #endif
b19cf73c54a7 (backport from HEAD)
Guido van Rossum <guido@python.org>
parents: 33712
diff changeset
61
1418
b1bb74a2b593 Port to Solaris 2.3.
Sjoerd Mullender <sjoerd@acm.org>
parents: 1350
diff changeset
62 #endif /* _POSIX_THREADS */
923
72aceed365d4 * Makefile adapted to changes below.
Guido van Rossum <guido@python.org>
parents:
diff changeset
63
72aceed365d4 * Makefile adapted to changes below.
Guido van Rossum <guido@python.org>
parents:
diff changeset
64
4839
4567e158d20c Rename DEBUG macro to Py_DEBUG
Guido van Rossum <guido@python.org>
parents: 4596
diff changeset
65 #ifdef Py_DEBUG
1848
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1418
diff changeset
66 static int thread_debug = 0;
23992
95da99187c57 Silence compiler warning
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 23777
diff changeset
67 #define dprintf(args) (void)((thread_debug & 1) && printf args)
1848
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1418
diff changeset
68 #define d2printf(args) ((thread_debug & 8) && printf args)
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1418
diff changeset
69 #else
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1418
diff changeset
70 #define dprintf(args)
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1418
diff changeset
71 #define d2printf(args)
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1418
diff changeset
72 #endif
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1418
diff changeset
73
923
72aceed365d4 * Makefile adapted to changes below.
Guido van Rossum <guido@python.org>
parents:
diff changeset
74 static int initialized;
72aceed365d4 * Makefile adapted to changes below.
Guido van Rossum <guido@python.org>
parents:
diff changeset
75
13689
9db86b27278f Prototype yet another forward declaration.
Thomas Wouters <thomas@python.org>
parents: 13658
diff changeset
76 static void PyThread__init_thread(void); /* Forward */
1004
5d7142ea01b7 adapted SV module to the new svideo library.
Sjoerd Mullender <sjoerd@acm.org>
parents: 961
diff changeset
77
38673
a19c20c5e5c7 Merge the rest of the trunk.
Thomas Wouters <thomas@python.org>
parents: 35549
diff changeset
78 void
a19c20c5e5c7 Merge the rest of the trunk.
Thomas Wouters <thomas@python.org>
parents: 35549
diff changeset
79 PyThread_init_thread(void)
1004
5d7142ea01b7 adapted SV module to the new svideo library.
Sjoerd Mullender <sjoerd@acm.org>
parents: 961
diff changeset
80 {
4839
4567e158d20c Rename DEBUG macro to Py_DEBUG
Guido van Rossum <guido@python.org>
parents: 4596
diff changeset
81 #ifdef Py_DEBUG
1418
b1bb74a2b593 Port to Solaris 2.3.
Sjoerd Mullender <sjoerd@acm.org>
parents: 1350
diff changeset
82 char *p = getenv("THREADDEBUG");
b1bb74a2b593 Port to Solaris 2.3.
Sjoerd Mullender <sjoerd@acm.org>
parents: 1350
diff changeset
83
b1bb74a2b593 Port to Solaris 2.3.
Sjoerd Mullender <sjoerd@acm.org>
parents: 1350
diff changeset
84 if (p) {
b1bb74a2b593 Port to Solaris 2.3.
Sjoerd Mullender <sjoerd@acm.org>
parents: 1350
diff changeset
85 if (*p)
b1bb74a2b593 Port to Solaris 2.3.
Sjoerd Mullender <sjoerd@acm.org>
parents: 1350
diff changeset
86 thread_debug = atoi(p);
b1bb74a2b593 Port to Solaris 2.3.
Sjoerd Mullender <sjoerd@acm.org>
parents: 1350
diff changeset
87 else
b1bb74a2b593 Port to Solaris 2.3.
Sjoerd Mullender <sjoerd@acm.org>
parents: 1350
diff changeset
88 thread_debug = 1;
b1bb74a2b593 Port to Solaris 2.3.
Sjoerd Mullender <sjoerd@acm.org>
parents: 1350
diff changeset
89 }
4839
4567e158d20c Rename DEBUG macro to Py_DEBUG
Guido van Rossum <guido@python.org>
parents: 4596
diff changeset
90 #endif /* Py_DEBUG */
1004
5d7142ea01b7 adapted SV module to the new svideo library.
Sjoerd Mullender <sjoerd@acm.org>
parents: 961
diff changeset
91 if (initialized)
5d7142ea01b7 adapted SV module to the new svideo library.
Sjoerd Mullender <sjoerd@acm.org>
parents: 961
diff changeset
92 return;
5d7142ea01b7 adapted SV module to the new svideo library.
Sjoerd Mullender <sjoerd@acm.org>
parents: 961
diff changeset
93 initialized = 1;
9679
877d23bd5bdc Thanks to Chris Herborth, the thread primitives now have proper Py*
Guido van Rossum <guido@python.org>
parents: 9589
diff changeset
94 dprintf(("PyThread_init_thread called\n"));
877d23bd5bdc Thanks to Chris Herborth, the thread primitives now have proper Py*
Guido van Rossum <guido@python.org>
parents: 9589
diff changeset
95 PyThread__init_thread();
923
72aceed365d4 * Makefile adapted to changes below.
Guido van Rossum <guido@python.org>
parents:
diff changeset
96 }
72aceed365d4 * Makefile adapted to changes below.
Guido van Rossum <guido@python.org>
parents:
diff changeset
97
39442
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38673
diff changeset
98 /* Support for runtime thread stack size tuning.
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38673
diff changeset
99 A value of 0 means using the platform's default stack size
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38673
diff changeset
100 or the size specified by the THREAD_STACK_SIZE macro. */
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38673
diff changeset
101 static size_t _pythread_stacksize = 0;
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38673
diff changeset
102
1848
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1418
diff changeset
103 #ifdef SGI_THREADS
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1418
diff changeset
104 #include "thread_sgi.h"
1418
b1bb74a2b593 Port to Solaris 2.3.
Sjoerd Mullender <sjoerd@acm.org>
parents: 1350
diff changeset
105 #endif
961
a31e07847063 New thread.c from Sjoerd, supports _exit_prog(). Use this in goaway()
Guido van Rossum <guido@python.org>
parents: 926
diff changeset
106
1848
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1418
diff changeset
107 #ifdef SOLARIS_THREADS
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1418
diff changeset
108 #include "thread_solaris.h"
923
72aceed365d4 * Makefile adapted to changes below.
Guido van Rossum <guido@python.org>
parents:
diff changeset
109 #endif
1848
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1418
diff changeset
110
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1418
diff changeset
111 #ifdef SUN_LWP
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1418
diff changeset
112 #include "thread_lwp.h"
923
72aceed365d4 * Makefile adapted to changes below.
Guido van Rossum <guido@python.org>
parents:
diff changeset
113 #endif
72aceed365d4 * Makefile adapted to changes below.
Guido van Rossum <guido@python.org>
parents:
diff changeset
114
14674
756c8c6535fe Make better use of GNU Pth -- patch by Andy Dustman.
Guido van Rossum <guido@python.org>
parents: 14375
diff changeset
115 #ifdef HAVE_PTH
12611
b320cf3a98b9 Andy Dustman: add GNU pth user-space thread support.
Guido van Rossum <guido@python.org>
parents: 12475
diff changeset
116 #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
117 #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
118 #endif
756c8c6535fe Make better use of GNU Pth -- patch by Andy Dustman.
Guido van Rossum <guido@python.org>
parents: 14375
diff changeset
119
1848
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1418
diff changeset
120 #ifdef _POSIX_THREADS
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1418
diff changeset
121 #include "thread_pthread.h"
923
72aceed365d4 * Makefile adapted to changes below.
Guido van Rossum <guido@python.org>
parents:
diff changeset
122 #endif
72aceed365d4 * Makefile adapted to changes below.
Guido van Rossum <guido@python.org>
parents:
diff changeset
123
1848
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1418
diff changeset
124 #ifdef C_THREADS
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1418
diff changeset
125 #include "thread_cthread.h"
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1418
diff changeset
126 #endif
923
72aceed365d4 * Makefile adapted to changes below.
Guido van Rossum <guido@python.org>
parents:
diff changeset
127
2152
1a52351a00b2 nt thread support
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
128 #ifdef NT_THREADS
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
5e31d381fa47 os2 patch by Jeff Rush
Guido van Rossum <guido@python.org>
parents: 5599
diff changeset
133 #include "thread_os2.h"
5e31d381fa47 os2 patch by Jeff Rush
Guido van Rossum <guido@python.org>
parents: 5599
diff changeset
134 #endif
5e31d381fa47 os2 patch by Jeff Rush
Guido van Rossum <guido@python.org>
parents: 5599
diff changeset
135
10530
d834ecdf8c26 Changes by Mark Hammond for Windows CE. Mostly of the form
Guido van Rossum <guido@python.org>
parents: 9679
diff changeset
136 #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
137 #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
138 #endif
d834ecdf8c26 Changes by Mark Hammond for Windows CE. Mostly of the form
Guido van Rossum <guido@python.org>
parents: 9679
diff changeset
139
22206
b898c0feb754 Patch #504224: add plan9 threads include to thread.c.
Martin v. Löwis <martin@v.loewis.de>
parents: 21712
diff changeset
140 #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
141 #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
142 #endif
b898c0feb754 Patch #504224: add plan9 threads include to thread.c.
Martin v. Löwis <martin@v.loewis.de>
parents: 21712
diff changeset
143
23777
bec1b942e0bc Patch #488073: AtheOS port.
Martin v. Löwis <martin@v.loewis.de>
parents: 22509
diff changeset
144 #ifdef ATHEOS_THREADS
bec1b942e0bc Patch #488073: AtheOS port.
Martin v. Löwis <martin@v.loewis.de>
parents: 22509
diff changeset
145 #include "thread_atheos.h"
bec1b942e0bc Patch #488073: AtheOS port.
Martin v. Löwis <martin@v.loewis.de>
parents: 22509
diff changeset
146 #endif
bec1b942e0bc Patch #488073: AtheOS port.
Martin v. Löwis <martin@v.loewis.de>
parents: 22509
diff changeset
147
961
a31e07847063 New thread.c from Sjoerd, supports _exit_prog(). Use this in goaway()
Guido van Rossum <guido@python.org>
parents: 926
diff changeset
148 /*
1848
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1418
diff changeset
149 #ifdef FOOBAR_THREADS
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1418
diff changeset
150 #include "thread_foobar.h"
923
72aceed365d4 * Makefile adapted to changes below.
Guido van Rossum <guido@python.org>
parents:
diff changeset
151 #endif
1848
b724599401ff Merge back to main trunk
Guido van Rossum <guido@python.org>
parents: 1418
diff changeset
152 */
28694
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
153
39442
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38673
diff changeset
154 /* return the current thread stack size */
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38673
diff changeset
155 size_t
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38673
diff changeset
156 PyThread_get_stacksize(void)
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38673
diff changeset
157 {
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38673
diff changeset
158 return _pythread_stacksize;
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38673
diff changeset
159 }
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38673
diff changeset
160
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38673
diff changeset
161 /* 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
162 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
163 Return 0 if stack size is valid,
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38673
diff changeset
164 -1 if stack size value is invalid,
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38673
diff changeset
165 -2 if setting stack size is not supported. */
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38673
diff changeset
166 int
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38673
diff changeset
167 PyThread_set_stacksize(size_t size)
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 #if defined(THREAD_SET_STACKSIZE)
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38673
diff changeset
170 return THREAD_SET_STACKSIZE(size);
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38673
diff changeset
171 #else
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38673
diff changeset
172 return -2;
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38673
diff changeset
173 #endif
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38673
diff changeset
174 }
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38673
diff changeset
175
28694
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
176 #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
177 /* 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
178 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
179
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
180 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
181 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
182 */
33705
891042c94aed Document the results of painful reverse-engineering of the "portable TLS"
Tim Peters <tim.peters@gmail.com>
parents: 33699
diff changeset
183 /* ------------------------------------------------------------------------
891042c94aed Document the results of painful reverse-engineering of the "portable TLS"
Tim Peters <tim.peters@gmail.com>
parents: 33699
diff changeset
184 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
185
891042c94aed Document the results of painful reverse-engineering of the "portable TLS"
Tim Peters <tim.peters@gmail.com>
parents: 33699
diff changeset
186 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
187 across threads.
891042c94aed Document the results of painful reverse-engineering of the "portable TLS"
Tim Peters <tim.peters@gmail.com>
parents: 33699
diff changeset
188
891042c94aed Document the results of painful reverse-engineering of the "portable TLS"
Tim Peters <tim.peters@gmail.com>
parents: 33699
diff changeset
189 Use PyThread_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
190 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
191 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
192 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
193
891042c94aed Document the results of painful reverse-engineering of the "portable TLS"
Tim Peters <tim.peters@gmail.com>
parents: 33699
diff changeset
194 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
195 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
196 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
197
891042c94aed Document the results of painful reverse-engineering of the "portable TLS"
Tim Peters <tim.peters@gmail.com>
parents: 33699
diff changeset
198 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
199 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
200 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
201
891042c94aed Document the results of painful reverse-engineering of the "portable TLS"
Tim Peters <tim.peters@gmail.com>
parents: 33699
diff changeset
202 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
203 Python exception.
28694
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
204
33705
891042c94aed Document the results of painful reverse-engineering of the "portable TLS"
Tim Peters <tim.peters@gmail.com>
parents: 33699
diff changeset
205 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
206 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
207 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
208 them either.
891042c94aed Document the results of painful reverse-engineering of the "portable TLS"
Tim Peters <tim.peters@gmail.com>
parents: 33699
diff changeset
209
891042c94aed Document the results of painful reverse-engineering of the "portable TLS"
Tim Peters <tim.peters@gmail.com>
parents: 33699
diff changeset
210 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
211 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
212 next paragraph).
891042c94aed Document the results of painful reverse-engineering of the "portable TLS"
Tim Peters <tim.peters@gmail.com>
parents: 33699
diff changeset
213
891042c94aed Document the results of painful reverse-engineering of the "portable TLS"
Tim Peters <tim.peters@gmail.com>
parents: 33699
diff changeset
214 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
215 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
216 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
217 ------------------------------------------------------------------------ */
891042c94aed Document the results of painful reverse-engineering of the "portable TLS"
Tim Peters <tim.peters@gmail.com>
parents: 33699
diff changeset
218
891042c94aed Document the results of painful reverse-engineering of the "portable TLS"
Tim Peters <tim.peters@gmail.com>
parents: 33699
diff changeset
219 /* 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
220 * 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
221 * 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
222 */
28694
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
223 struct key {
33705
891042c94aed Document the results of painful reverse-engineering of the "portable TLS"
Tim Peters <tim.peters@gmail.com>
parents: 33699
diff changeset
224 /* Next record in the list, or NULL if this is the last record. */
28694
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
225 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
226
891042c94aed Document the results of painful reverse-engineering of the "portable TLS"
Tim Peters <tim.peters@gmail.com>
parents: 33699
diff changeset
227 /* The thread id, according to PyThread_get_thread_ident(). */
28694
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
228 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
229
891042c94aed Document the results of painful reverse-engineering of the "portable TLS"
Tim Peters <tim.peters@gmail.com>
parents: 33699
diff changeset
230 /* The key and its associated value. */
28694
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
231 int key;
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
232 void *value;
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
233 };
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
234
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
235 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
236 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
237 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
238
33705
891042c94aed Document the results of painful reverse-engineering of the "portable TLS"
Tim Peters <tim.peters@gmail.com>
parents: 33699
diff changeset
239 /* Internal helper.
891042c94aed Document the results of painful reverse-engineering of the "portable TLS"
Tim Peters <tim.peters@gmail.com>
parents: 33699
diff changeset
240 * 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
241 * 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
242 * 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
243 * 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
244 * 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
245 * 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
246 * 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
247 * 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
248 * 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
249 * 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
250 *
baa2653f7a76 find_key(): This routine wasn't thread-correct, and accounts for the
Tim Peters <tim.peters@gmail.com>
parents: 33705
diff changeset
251 * 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
252 * 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
253 * 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
254 * 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
255 * 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
256 * 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
257 * 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
258 * 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
259 */
33699
0c26db381673 Style guide & consistency changes. No semantic changes.
Tim Peters <tim.peters@gmail.com>
parents: 33145
diff changeset
260 static struct key *
0c26db381673 Style guide & consistency changes. No semantic changes.
Tim Peters <tim.peters@gmail.com>
parents: 33145
diff changeset
261 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
262 {
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
263 struct key *p;
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
264 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
265
39442
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38673
diff changeset
266 if (!keymutex)
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38673
diff changeset
267 return NULL;
33712
baa2653f7a76 find_key(): This routine wasn't thread-correct, and accounts for the
Tim Peters <tim.peters@gmail.com>
parents: 33705
diff changeset
268 PyThread_acquire_lock(keymutex, 1);
28694
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
269 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
270 if (p->id == id && p->key == key)
33712
baa2653f7a76 find_key(): This routine wasn't thread-correct, and accounts for the
Tim Peters <tim.peters@gmail.com>
parents: 33705
diff changeset
271 goto Done;
28694
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
272 }
33712
baa2653f7a76 find_key(): This routine wasn't thread-correct, and accounts for the
Tim Peters <tim.peters@gmail.com>
parents: 33705
diff changeset
273 if (value == NULL) {
baa2653f7a76 find_key(): This routine wasn't thread-correct, and accounts for the
Tim Peters <tim.peters@gmail.com>
parents: 33705
diff changeset
274 assert(p == NULL);
baa2653f7a76 find_key(): This routine wasn't thread-correct, and accounts for the
Tim Peters <tim.peters@gmail.com>
parents: 33705
diff changeset
275 goto Done;
baa2653f7a76 find_key(): This routine wasn't thread-correct, and accounts for the
Tim Peters <tim.peters@gmail.com>
parents: 33705
diff changeset
276 }
28694
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
277 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
278 if (p != NULL) {
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
279 p->id = id;
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
280 p->key = key;
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
281 p->value = value;
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
282 p->next = keyhead;
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
283 keyhead = p;
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
284 }
33712
baa2653f7a76 find_key(): This routine wasn't thread-correct, and accounts for the
Tim Peters <tim.peters@gmail.com>
parents: 33705
diff changeset
285 Done:
baa2653f7a76 find_key(): This routine wasn't thread-correct, and accounts for the
Tim Peters <tim.peters@gmail.com>
parents: 33705
diff changeset
286 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
287 return p;
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
288 }
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
289
33705
891042c94aed Document the results of painful reverse-engineering of the "portable TLS"
Tim Peters <tim.peters@gmail.com>
parents: 33699
diff changeset
290 /* 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
291 * 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
292 * 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
293 */
33699
0c26db381673 Style guide & consistency changes. No semantic changes.
Tim Peters <tim.peters@gmail.com>
parents: 33145
diff changeset
294 int
0c26db381673 Style guide & consistency changes. No semantic changes.
Tim Peters <tim.peters@gmail.com>
parents: 33145
diff changeset
295 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
296 {
33705
891042c94aed Document the results of painful reverse-engineering of the "portable TLS"
Tim Peters <tim.peters@gmail.com>
parents: 33699
diff changeset
297 /* All parts of this function are wrong if it's called by multiple
891042c94aed Document the results of painful reverse-engineering of the "portable TLS"
Tim Peters <tim.peters@gmail.com>
parents: 33699
diff changeset
298 * threads simultaneously.
891042c94aed Document the results of painful reverse-engineering of the "portable TLS"
Tim Peters <tim.peters@gmail.com>
parents: 33699
diff changeset
299 */
28694
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
300 if (keymutex == NULL)
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
301 keymutex = PyThread_allocate_lock();
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
302 return ++nkeys;
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
303 }
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
304
33705
891042c94aed Document the results of painful reverse-engineering of the "portable TLS"
Tim Peters <tim.peters@gmail.com>
parents: 33699
diff changeset
305 /* 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
306 void
0c26db381673 Style guide & consistency changes. No semantic changes.
Tim Peters <tim.peters@gmail.com>
parents: 33145
diff changeset
307 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
308 {
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
309 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
310
28694
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
311 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
312 q = &keyhead;
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
313 while ((p = *q) != NULL) {
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
314 if (p->key == key) {
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
315 *q = p->next;
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
316 free((void *)p);
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
317 /* 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
318 }
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
319 else
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
320 q = &p->next;
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
321 }
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
322 PyThread_release_lock(keymutex);
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
323 }
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
324
33705
891042c94aed Document the results of painful reverse-engineering of the "portable TLS"
Tim Peters <tim.peters@gmail.com>
parents: 33699
diff changeset
325 /* 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
326 * 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
327 * 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
328 * 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
329 * 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
330 */
33699
0c26db381673 Style guide & consistency changes. No semantic changes.
Tim Peters <tim.peters@gmail.com>
parents: 33145
diff changeset
331 int
0c26db381673 Style guide & consistency changes. No semantic changes.
Tim Peters <tim.peters@gmail.com>
parents: 33145
diff changeset
332 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
333 {
33705
891042c94aed Document the results of painful reverse-engineering of the "portable TLS"
Tim Peters <tim.peters@gmail.com>
parents: 33699
diff changeset
334 struct key *p;
891042c94aed Document the results of painful reverse-engineering of the "portable TLS"
Tim Peters <tim.peters@gmail.com>
parents: 33699
diff changeset
335
891042c94aed Document the results of painful reverse-engineering of the "portable TLS"
Tim Peters <tim.peters@gmail.com>
parents: 33699
diff changeset
336 assert(value != NULL);
891042c94aed Document the results of painful reverse-engineering of the "portable TLS"
Tim Peters <tim.peters@gmail.com>
parents: 33699
diff changeset
337 p = find_key(key, value);
28694
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
338 if (p == NULL)
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
339 return -1;
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
340 else
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
341 return 0;
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
342 }
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
343
33705
891042c94aed Document the results of painful reverse-engineering of the "portable TLS"
Tim Peters <tim.peters@gmail.com>
parents: 33699
diff changeset
344 /* 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
345 * 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
346 */
33699
0c26db381673 Style guide & consistency changes. No semantic changes.
Tim Peters <tim.peters@gmail.com>
parents: 33145
diff changeset
347 void *
0c26db381673 Style guide & consistency changes. No semantic changes.
Tim Peters <tim.peters@gmail.com>
parents: 33145
diff changeset
348 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
349 {
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
350 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
351
28694
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
352 if (p == NULL)
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
353 return NULL;
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
354 else
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
355 return p->value;
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
356 }
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
357
33705
891042c94aed Document the results of painful reverse-engineering of the "portable TLS"
Tim Peters <tim.peters@gmail.com>
parents: 33699
diff changeset
358 /* 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
359 void
0c26db381673 Style guide & consistency changes. No semantic changes.
Tim Peters <tim.peters@gmail.com>
parents: 33145
diff changeset
360 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
361 {
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
362 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
363 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
364
28694
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
365 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
366 q = &keyhead;
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
367 while ((p = *q) != NULL) {
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
368 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
369 *q = p->next;
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
370 free((void *)p);
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
371 /* 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
372 break;
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
373 }
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
374 else
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
375 q = &p->next;
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
376 }
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
377 PyThread_release_lock(keymutex);
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
378 }
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
379
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24315
diff changeset
380 #endif /* Py_HAVE_NATIVE_TLS */