Mercurial > cpython-lru_cache-weakref
annotate Python/pystate.c @ 58664:993f703a61ba
Merged revisions 77484,77487,77561,77570,77593,77603,77608,77667,77702-77703,77739,77858,77887,77889 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk
........
r77484 | skip.montanaro | 2010-01-13 19:12:34 -0600 (Wed, 13 Jan 2010) | 4 lines
Update PyEval_EvalFrame to PyEval_EvalFrameEx. This looks to have been done
partially before. Also add a comment describing how this might have to work
with different versions of the interpreter.
........
r77487 | ezio.melotti | 2010-01-14 05:34:10 -0600 (Thu, 14 Jan 2010) | 1 line
Fixed typo
........
r77561 | georg.brandl | 2010-01-17 02:42:30 -0600 (Sun, 17 Jan 2010) | 1 line
#7699: improve datetime docs: straightforward linking to strftime/strptime section, mark classmethods as such.
........
r77570 | georg.brandl | 2010-01-17 06:14:42 -0600 (Sun, 17 Jan 2010) | 1 line
Add note about usage of STRINGLIB_EMPTY.
........
r77593 | georg.brandl | 2010-01-17 17:33:53 -0600 (Sun, 17 Jan 2010) | 1 line
Fix internal reference.
........
r77603 | benjamin.peterson | 2010-01-18 17:07:56 -0600 (Mon, 18 Jan 2010) | 8 lines
data descriptors do not override the class dictionary if __get__ is not defined
Adjust documentation and add a test to verify this behavior.
See http://mail.python.org/pipermail/python-dev/2010-January/095637.html for
discussion.
........
r77608 | gregory.p.smith | 2010-01-19 02:19:03 -0600 (Tue, 19 Jan 2010) | 6 lines
Do not compile stubs for the sha2 series hashes in the openssl hashlib
module when the openssl version is too old to support them. That
leads both compiled code bloat and to unittests attempting to test
implementations that don't exist for comparison purposes on such
platforms.
........
r77667 | mark.dickinson | 2010-01-21 12:32:27 -0600 (Thu, 21 Jan 2010) | 1 line
Add two more test_strtod test values.
........
r77702 | georg.brandl | 2010-01-23 02:43:31 -0600 (Sat, 23 Jan 2010) | 1 line
#7762: fix refcount annotation of PyUnicode_Tailmatch().
........
r77703 | georg.brandl | 2010-01-23 02:47:54 -0600 (Sat, 23 Jan 2010) | 1 line
#7725: fix referencing issue.
........
r77739 | benjamin.peterson | 2010-01-24 21:52:52 -0600 (Sun, 24 Jan 2010) | 1 line
mention from_float() in error message
........
r77858 | georg.brandl | 2010-01-30 11:57:48 -0600 (Sat, 30 Jan 2010) | 1 line
#7802: fix invalid example (heh).
........
r77887 | georg.brandl | 2010-01-31 12:51:49 -0600 (Sun, 31 Jan 2010) | 5 lines
Fix-up ftplib documentation:
move exception descriptions to toplevel, not inside a class
remove attribution in "versionadded"
spell and grammar check docstring of FTP_TLS
........
r77889 | michael.foord | 2010-01-31 13:59:26 -0600 (Sun, 31 Jan 2010) | 1 line
Minor modification to unittest documentation.
........
| author | Benjamin Peterson <benjamin@python.org> |
|---|---|
| date | Wed, 03 Feb 2010 02:35:45 +0000 |
| parents | fdd6484f1210 |
| children | dd8527399582 |
| rev | line source |
|---|---|
|
5405
b7871ca930ad
Massive changes for separate thread state management.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1 |
|
b7871ca930ad
Massive changes for separate thread state management.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2 /* Thread and interpreter state structures and their interfaces */ |
|
b7871ca930ad
Massive changes for separate thread state management.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3 |
|
b7871ca930ad
Massive changes for separate thread state management.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4 #include "Python.h" |
|
b7871ca930ad
Massive changes for separate thread state management.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5 |
|
33713
517e4ec0df89
PyInterpreterState_New(), PyThreadState_New(): use malloc/free directly.
Tim Peters <tim.peters@gmail.com>
parents:
33711
diff
changeset
|
6 /* -------------------------------------------------------------------------- |
|
517e4ec0df89
PyInterpreterState_New(), PyThreadState_New(): use malloc/free directly.
Tim Peters <tim.peters@gmail.com>
parents:
33711
diff
changeset
|
7 CAUTION |
|
517e4ec0df89
PyInterpreterState_New(), PyThreadState_New(): use malloc/free directly.
Tim Peters <tim.peters@gmail.com>
parents:
33711
diff
changeset
|
8 |
|
517e4ec0df89
PyInterpreterState_New(), PyThreadState_New(): use malloc/free directly.
Tim Peters <tim.peters@gmail.com>
parents:
33711
diff
changeset
|
9 Always use malloc() and free() directly in this file. A number of these |
|
517e4ec0df89
PyInterpreterState_New(), PyThreadState_New(): use malloc/free directly.
Tim Peters <tim.peters@gmail.com>
parents:
33711
diff
changeset
|
10 functions are advertised as safe to call when the GIL isn't held, and in |
|
517e4ec0df89
PyInterpreterState_New(), PyThreadState_New(): use malloc/free directly.
Tim Peters <tim.peters@gmail.com>
parents:
33711
diff
changeset
|
11 a debug build Python redirects (e.g.) PyMem_NEW (etc) to Python's debugging |
|
517e4ec0df89
PyInterpreterState_New(), PyThreadState_New(): use malloc/free directly.
Tim Peters <tim.peters@gmail.com>
parents:
33711
diff
changeset
|
12 obmalloc functions. Those aren't thread-safe (they rely on the GIL to avoid |
|
517e4ec0df89
PyInterpreterState_New(), PyThreadState_New(): use malloc/free directly.
Tim Peters <tim.peters@gmail.com>
parents:
33711
diff
changeset
|
13 the expense of doing their own locking). |
|
517e4ec0df89
PyInterpreterState_New(), PyThreadState_New(): use malloc/free directly.
Tim Peters <tim.peters@gmail.com>
parents:
33711
diff
changeset
|
14 -------------------------------------------------------------------------- */ |
|
517e4ec0df89
PyInterpreterState_New(), PyThreadState_New(): use malloc/free directly.
Tim Peters <tim.peters@gmail.com>
parents:
33711
diff
changeset
|
15 |
|
18689
064de84385ca
Patch #412229: Add functions sys.getdlopenflags and sys.setdlopenflags.
Martin v. Löwis <martin@v.loewis.de>
parents:
18374
diff
changeset
|
16 #ifdef HAVE_DLOPEN |
|
064de84385ca
Patch #412229: Add functions sys.getdlopenflags and sys.setdlopenflags.
Martin v. Löwis <martin@v.loewis.de>
parents:
18374
diff
changeset
|
17 #ifdef HAVE_DLFCN_H |
|
064de84385ca
Patch #412229: Add functions sys.getdlopenflags and sys.setdlopenflags.
Martin v. Löwis <martin@v.loewis.de>
parents:
18374
diff
changeset
|
18 #include <dlfcn.h> |
|
064de84385ca
Patch #412229: Add functions sys.getdlopenflags and sys.setdlopenflags.
Martin v. Löwis <martin@v.loewis.de>
parents:
18374
diff
changeset
|
19 #endif |
|
064de84385ca
Patch #412229: Add functions sys.getdlopenflags and sys.setdlopenflags.
Martin v. Löwis <martin@v.loewis.de>
parents:
18374
diff
changeset
|
20 #ifndef RTLD_LAZY |
|
064de84385ca
Patch #412229: Add functions sys.getdlopenflags and sys.setdlopenflags.
Martin v. Löwis <martin@v.loewis.de>
parents:
18374
diff
changeset
|
21 #define RTLD_LAZY 1 |
|
064de84385ca
Patch #412229: Add functions sys.getdlopenflags and sys.setdlopenflags.
Martin v. Löwis <martin@v.loewis.de>
parents:
18374
diff
changeset
|
22 #endif |
|
064de84385ca
Patch #412229: Add functions sys.getdlopenflags and sys.setdlopenflags.
Martin v. Löwis <martin@v.loewis.de>
parents:
18374
diff
changeset
|
23 #endif |
|
064de84385ca
Patch #412229: Add functions sys.getdlopenflags and sys.setdlopenflags.
Martin v. Löwis <martin@v.loewis.de>
parents:
18374
diff
changeset
|
24 |
|
064de84385ca
Patch #412229: Add functions sys.getdlopenflags and sys.setdlopenflags.
Martin v. Löwis <martin@v.loewis.de>
parents:
18374
diff
changeset
|
25 |
| 11011 | 26 #ifdef WITH_THREAD |
| 27 #include "pythread.h" | |
| 28 static PyThread_type_lock head_mutex = NULL; /* Protects interp->tstate_head */ | |
|
13866
dfdb601cee1c
Removing warnings by gcc -Wall -- cast ugly || to void.
Moshe Zadka <moshez@math.huji.ac.il>
parents:
13658
diff
changeset
|
29 #define HEAD_INIT() (void)(head_mutex || (head_mutex = PyThread_allocate_lock())) |
| 11011 | 30 #define HEAD_LOCK() PyThread_acquire_lock(head_mutex, WAIT_LOCK) |
| 31 #define HEAD_UNLOCK() PyThread_release_lock(head_mutex) | |
| 35117 | 32 |
|
37879
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
36683
diff
changeset
|
33 #ifdef __cplusplus |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
36683
diff
changeset
|
34 extern "C" { |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
36683
diff
changeset
|
35 #endif |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
36683
diff
changeset
|
36 |
| 35117 | 37 /* The single PyInterpreterState used by this process' |
| 38 GILState implementation | |
| 39 */ | |
| 40 static PyInterpreterState *autoInterpreterState = NULL; | |
| 41 static int autoTLSkey = 0; | |
| 11011 | 42 #else |
| 43 #define HEAD_INIT() /* Nothing */ | |
| 44 #define HEAD_LOCK() /* Nothing */ | |
| 45 #define HEAD_UNLOCK() /* Nothing */ | |
| 46 #endif | |
| 47 | |
|
5926
8d2194e22e67
The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents:
5849
diff
changeset
|
48 static PyInterpreterState *interp_head = NULL; |
|
5405
b7871ca930ad
Massive changes for separate thread state management.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
49 |
|
9667
914f83e7fa0a
Make current_tstate a global, _PyThreadState_Current. This is to
Guido van Rossum <guido@python.org>
parents:
7970
diff
changeset
|
50 PyThreadState *_PyThreadState_Current = NULL; |
|
27978
4b99a701defe
- PyEval_GetFrame() is now declared to return a PyFrameObject *
Guido van Rossum <guido@python.org>
parents:
26109
diff
changeset
|
51 PyThreadFrameGetter _PyThreadState_GetFrame = NULL; |
|
5405
b7871ca930ad
Massive changes for separate thread state management.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
52 |
| 35661 | 53 #ifdef WITH_THREAD |
| 35117 | 54 static void _PyGILState_NoteThreadState(PyThreadState* tstate); |
| 35661 | 55 #endif |
| 35117 | 56 |
|
5405
b7871ca930ad
Massive changes for separate thread state management.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
57 |
|
b7871ca930ad
Massive changes for separate thread state management.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
58 PyInterpreterState * |
|
13658
f79434ee41fa
Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents:
13256
diff
changeset
|
59 PyInterpreterState_New(void) |
|
5405
b7871ca930ad
Massive changes for separate thread state management.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
60 { |
|
33713
517e4ec0df89
PyInterpreterState_New(), PyThreadState_New(): use malloc/free directly.
Tim Peters <tim.peters@gmail.com>
parents:
33711
diff
changeset
|
61 PyInterpreterState *interp = (PyInterpreterState *) |
|
517e4ec0df89
PyInterpreterState_New(), PyThreadState_New(): use malloc/free directly.
Tim Peters <tim.peters@gmail.com>
parents:
33711
diff
changeset
|
62 malloc(sizeof(PyInterpreterState)); |
|
5926
8d2194e22e67
The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents:
5849
diff
changeset
|
63 |
|
5405
b7871ca930ad
Massive changes for separate thread state management.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
64 if (interp != NULL) { |
| 11011 | 65 HEAD_INIT(); |
|
39442
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
37879
diff
changeset
|
66 #ifdef WITH_THREAD |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
37879
diff
changeset
|
67 if (head_mutex == NULL) |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
37879
diff
changeset
|
68 Py_FatalError("Can't initialize threads for interpreter"); |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
37879
diff
changeset
|
69 #endif |
|
5926
8d2194e22e67
The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents:
5849
diff
changeset
|
70 interp->modules = NULL; |
|
41554
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
40450
diff
changeset
|
71 interp->modules_reloading = NULL; |
|
47580
94f64f11fdd0
Implement PEP 3121: new module initialization and finalization API.
Martin v. Löwis <martin@v.loewis.de>
parents:
44834
diff
changeset
|
72 interp->modules_by_index = NULL; |
|
5405
b7871ca930ad
Massive changes for separate thread state management.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
73 interp->sysdict = NULL; |
|
5926
8d2194e22e67
The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents:
5849
diff
changeset
|
74 interp->builtins = NULL; |
|
8d2194e22e67
The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents:
5849
diff
changeset
|
75 interp->tstate_head = NULL; |
|
28325
850626d47574
Fixed SF bug #663074. The codec system was using global static
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
27978
diff
changeset
|
76 interp->codec_search_path = NULL; |
|
850626d47574
Fixed SF bug #663074. The codec system was using global static
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
27978
diff
changeset
|
77 interp->codec_search_cache = NULL; |
|
850626d47574
Fixed SF bug #663074. The codec system was using global static
Gustavo Niemeyer <gustavo@niemeyer.net>
parents:
27978
diff
changeset
|
78 interp->codec_error_registry = NULL; |
|
49613
efef5fc45a9a
Issue 3723: Fixed initialization of subinterpreters
Christian Heimes <christian@cheimes.de>
parents:
48680
diff
changeset
|
79 interp->codecs_initialized = 0; |
|
18689
064de84385ca
Patch #412229: Add functions sys.getdlopenflags and sys.setdlopenflags.
Martin v. Löwis <martin@v.loewis.de>
parents:
18374
diff
changeset
|
80 #ifdef HAVE_DLOPEN |
|
064de84385ca
Patch #412229: Add functions sys.getdlopenflags and sys.setdlopenflags.
Martin v. Löwis <martin@v.loewis.de>
parents:
18374
diff
changeset
|
81 #ifdef RTLD_NOW |
|
064de84385ca
Patch #412229: Add functions sys.getdlopenflags and sys.setdlopenflags.
Martin v. Löwis <martin@v.loewis.de>
parents:
18374
diff
changeset
|
82 interp->dlopenflags = RTLD_NOW; |
|
064de84385ca
Patch #412229: Add functions sys.getdlopenflags and sys.setdlopenflags.
Martin v. Löwis <martin@v.loewis.de>
parents:
18374
diff
changeset
|
83 #else |
|
064de84385ca
Patch #412229: Add functions sys.getdlopenflags and sys.setdlopenflags.
Martin v. Löwis <martin@v.loewis.de>
parents:
18374
diff
changeset
|
84 interp->dlopenflags = RTLD_LAZY; |
|
064de84385ca
Patch #412229: Add functions sys.getdlopenflags and sys.setdlopenflags.
Martin v. Löwis <martin@v.loewis.de>
parents:
18374
diff
changeset
|
85 #endif |
|
064de84385ca
Patch #412229: Add functions sys.getdlopenflags and sys.setdlopenflags.
Martin v. Löwis <martin@v.loewis.de>
parents:
18374
diff
changeset
|
86 #endif |
|
32301
41c59d80bbc5
Patch #510695: Add TSC profiling for the VM.
Martin v. Löwis <martin@v.loewis.de>
parents:
31797
diff
changeset
|
87 #ifdef WITH_TSC |
|
41c59d80bbc5
Patch #510695: Add TSC profiling for the VM.
Martin v. Löwis <martin@v.loewis.de>
parents:
31797
diff
changeset
|
88 interp->tscdump = 0; |
|
41c59d80bbc5
Patch #510695: Add TSC profiling for the VM.
Martin v. Löwis <martin@v.loewis.de>
parents:
31797
diff
changeset
|
89 #endif |
|
5926
8d2194e22e67
The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents:
5849
diff
changeset
|
90 |
|
14378
ca7316a00464
PyInterpreterState_New is not thread-safe, and the recent fix to _PyPclose
Tim Peters <tim.peters@gmail.com>
parents:
14375
diff
changeset
|
91 HEAD_LOCK(); |
|
5926
8d2194e22e67
The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents:
5849
diff
changeset
|
92 interp->next = interp_head; |
|
8d2194e22e67
The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents:
5849
diff
changeset
|
93 interp_head = interp; |
|
14378
ca7316a00464
PyInterpreterState_New is not thread-safe, and the recent fix to _PyPclose
Tim Peters <tim.peters@gmail.com>
parents:
14375
diff
changeset
|
94 HEAD_UNLOCK(); |
|
5405
b7871ca930ad
Massive changes for separate thread state management.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
95 } |
|
5926
8d2194e22e67
The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents:
5849
diff
changeset
|
96 |
|
5405
b7871ca930ad
Massive changes for separate thread state management.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
97 return interp; |
|
b7871ca930ad
Massive changes for separate thread state management.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
98 } |
|
b7871ca930ad
Massive changes for separate thread state management.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
99 |
|
b7871ca930ad
Massive changes for separate thread state management.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
100 |
|
b7871ca930ad
Massive changes for separate thread state management.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
101 void |
|
13658
f79434ee41fa
Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents:
13256
diff
changeset
|
102 PyInterpreterState_Clear(PyInterpreterState *interp) |
|
5926
8d2194e22e67
The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents:
5849
diff
changeset
|
103 { |
|
8d2194e22e67
The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents:
5849
diff
changeset
|
104 PyThreadState *p; |
| 11011 | 105 HEAD_LOCK(); |
|
5926
8d2194e22e67
The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents:
5849
diff
changeset
|
106 for (p = interp->tstate_head; p != NULL; p = p->next) |
|
8d2194e22e67
The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents:
5849
diff
changeset
|
107 PyThreadState_Clear(p); |
| 11011 | 108 HEAD_UNLOCK(); |
|
37879
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
36683
diff
changeset
|
109 Py_CLEAR(interp->codec_search_path); |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
36683
diff
changeset
|
110 Py_CLEAR(interp->codec_search_cache); |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
36683
diff
changeset
|
111 Py_CLEAR(interp->codec_error_registry); |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
36683
diff
changeset
|
112 Py_CLEAR(interp->modules); |
|
47580
94f64f11fdd0
Implement PEP 3121: new module initialization and finalization API.
Martin v. Löwis <martin@v.loewis.de>
parents:
44834
diff
changeset
|
113 Py_CLEAR(interp->modules_by_index); |
|
41554
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
40450
diff
changeset
|
114 Py_CLEAR(interp->modules_reloading); |
|
37879
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
36683
diff
changeset
|
115 Py_CLEAR(interp->sysdict); |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
36683
diff
changeset
|
116 Py_CLEAR(interp->builtins); |
|
5926
8d2194e22e67
The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents:
5849
diff
changeset
|
117 } |
|
8d2194e22e67
The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents:
5849
diff
changeset
|
118 |
|
8d2194e22e67
The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents:
5849
diff
changeset
|
119 |
|
8d2194e22e67
The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents:
5849
diff
changeset
|
120 static void |
|
13658
f79434ee41fa
Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents:
13256
diff
changeset
|
121 zapthreads(PyInterpreterState *interp) |
|
5926
8d2194e22e67
The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents:
5849
diff
changeset
|
122 { |
| 11011 | 123 PyThreadState *p; |
| 124 /* No need to lock the mutex here because this should only happen | |
| 125 when the threads are all really dead (XXX famous last words). */ | |
| 126 while ((p = interp->tstate_head) != NULL) { | |
|
5926
8d2194e22e67
The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents:
5849
diff
changeset
|
127 PyThreadState_Delete(p); |
|
8d2194e22e67
The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents:
5849
diff
changeset
|
128 } |
|
8d2194e22e67
The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents:
5849
diff
changeset
|
129 } |
|
8d2194e22e67
The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents:
5849
diff
changeset
|
130 |
|
8d2194e22e67
The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents:
5849
diff
changeset
|
131 |
|
8d2194e22e67
The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents:
5849
diff
changeset
|
132 void |
|
13658
f79434ee41fa
Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents:
13256
diff
changeset
|
133 PyInterpreterState_Delete(PyInterpreterState *interp) |
|
5405
b7871ca930ad
Massive changes for separate thread state management.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
134 { |
|
5926
8d2194e22e67
The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents:
5849
diff
changeset
|
135 PyInterpreterState **p; |
|
8d2194e22e67
The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents:
5849
diff
changeset
|
136 zapthreads(interp); |
|
14378
ca7316a00464
PyInterpreterState_New is not thread-safe, and the recent fix to _PyPclose
Tim Peters <tim.peters@gmail.com>
parents:
14375
diff
changeset
|
137 HEAD_LOCK(); |
|
5926
8d2194e22e67
The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents:
5849
diff
changeset
|
138 for (p = &interp_head; ; p = &(*p)->next) { |
|
8d2194e22e67
The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents:
5849
diff
changeset
|
139 if (*p == NULL) |
|
8d2194e22e67
The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents:
5849
diff
changeset
|
140 Py_FatalError( |
|
8d2194e22e67
The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents:
5849
diff
changeset
|
141 "PyInterpreterState_Delete: invalid interp"); |
|
8d2194e22e67
The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents:
5849
diff
changeset
|
142 if (*p == interp) |
|
8d2194e22e67
The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents:
5849
diff
changeset
|
143 break; |
|
8d2194e22e67
The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents:
5849
diff
changeset
|
144 } |
|
8d2194e22e67
The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents:
5849
diff
changeset
|
145 if (interp->tstate_head != NULL) |
|
8d2194e22e67
The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents:
5849
diff
changeset
|
146 Py_FatalError("PyInterpreterState_Delete: remaining threads"); |
|
8d2194e22e67
The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents:
5849
diff
changeset
|
147 *p = interp->next; |
|
14378
ca7316a00464
PyInterpreterState_New is not thread-safe, and the recent fix to _PyPclose
Tim Peters <tim.peters@gmail.com>
parents:
14375
diff
changeset
|
148 HEAD_UNLOCK(); |
|
33713
517e4ec0df89
PyInterpreterState_New(), PyThreadState_New(): use malloc/free directly.
Tim Peters <tim.peters@gmail.com>
parents:
33711
diff
changeset
|
149 free(interp); |
|
5405
b7871ca930ad
Massive changes for separate thread state management.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
150 } |
|
b7871ca930ad
Massive changes for separate thread state management.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
151 |
|
b7871ca930ad
Massive changes for separate thread state management.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
152 |
|
26109
e61b946474df
Assorted patches from Armin Rigo:
Michael W. Hudson <mwh@python.net>
parents:
25111
diff
changeset
|
153 /* Default implementation for _PyThreadState_GetFrame */ |
|
e61b946474df
Assorted patches from Armin Rigo:
Michael W. Hudson <mwh@python.net>
parents:
25111
diff
changeset
|
154 static struct _frame * |
|
e61b946474df
Assorted patches from Armin Rigo:
Michael W. Hudson <mwh@python.net>
parents:
25111
diff
changeset
|
155 threadstate_getframe(PyThreadState *self) |
|
e61b946474df
Assorted patches from Armin Rigo:
Michael W. Hudson <mwh@python.net>
parents:
25111
diff
changeset
|
156 { |
|
e61b946474df
Assorted patches from Armin Rigo:
Michael W. Hudson <mwh@python.net>
parents:
25111
diff
changeset
|
157 return self->frame; |
|
e61b946474df
Assorted patches from Armin Rigo:
Michael W. Hudson <mwh@python.net>
parents:
25111
diff
changeset
|
158 } |
|
e61b946474df
Assorted patches from Armin Rigo:
Michael W. Hudson <mwh@python.net>
parents:
25111
diff
changeset
|
159 |
|
5405
b7871ca930ad
Massive changes for separate thread state management.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
160 PyThreadState * |
|
13658
f79434ee41fa
Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents:
13256
diff
changeset
|
161 PyThreadState_New(PyInterpreterState *interp) |
|
5405
b7871ca930ad
Massive changes for separate thread state management.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
162 { |
|
33713
517e4ec0df89
PyInterpreterState_New(), PyThreadState_New(): use malloc/free directly.
Tim Peters <tim.peters@gmail.com>
parents:
33711
diff
changeset
|
163 PyThreadState *tstate = (PyThreadState *)malloc(sizeof(PyThreadState)); |
|
517e4ec0df89
PyInterpreterState_New(), PyThreadState_New(): use malloc/free directly.
Tim Peters <tim.peters@gmail.com>
parents:
33711
diff
changeset
|
164 |
|
26109
e61b946474df
Assorted patches from Armin Rigo:
Michael W. Hudson <mwh@python.net>
parents:
25111
diff
changeset
|
165 if (_PyThreadState_GetFrame == NULL) |
|
27978
4b99a701defe
- PyEval_GetFrame() is now declared to return a PyFrameObject *
Guido van Rossum <guido@python.org>
parents:
26109
diff
changeset
|
166 _PyThreadState_GetFrame = threadstate_getframe; |
|
5926
8d2194e22e67
The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents:
5849
diff
changeset
|
167 |
|
5405
b7871ca930ad
Massive changes for separate thread state management.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
168 if (tstate != NULL) { |
|
5926
8d2194e22e67
The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents:
5849
diff
changeset
|
169 tstate->interp = interp; |
|
5405
b7871ca930ad
Massive changes for separate thread state management.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
170 |
|
b7871ca930ad
Massive changes for separate thread state management.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
171 tstate->frame = NULL; |
|
b7871ca930ad
Massive changes for separate thread state management.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
172 tstate->recursion_depth = 0; |
|
42013
cd125fe83051
Make identifiers str (not str8) objects throughout.
Martin v. Löwis <martin@v.loewis.de>
parents:
41554
diff
changeset
|
173 tstate->overflowed = 0; |
|
cd125fe83051
Make identifiers str (not str8) objects throughout.
Martin v. Löwis <martin@v.loewis.de>
parents:
41554
diff
changeset
|
174 tstate->recursion_critical = 0; |
|
5405
b7871ca930ad
Massive changes for separate thread state management.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
175 tstate->tracing = 0; |
|
18374
3b295ce2705f
This change adjusts the profiling/tracing support so that the common
Fred Drake <fdrake@acm.org>
parents:
18326
diff
changeset
|
176 tstate->use_tracing = 0; |
|
26109
e61b946474df
Assorted patches from Armin Rigo:
Michael W. Hudson <mwh@python.net>
parents:
25111
diff
changeset
|
177 tstate->tick_counter = 0; |
|
28694
a4154dd5939a
New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents:
28616
diff
changeset
|
178 tstate->gilstate_counter = 0; |
|
29643
fa97293533a9
Add PyThreadState_SetAsyncExc(long, PyObject *).
Guido van Rossum <guido@python.org>
parents:
28914
diff
changeset
|
179 tstate->async_exc = NULL; |
|
29842
014cc362aa91
Initialize thread_id to 0 in unthreaded build. Fixes #770247.
Martin v. Löwis <martin@v.loewis.de>
parents:
29643
diff
changeset
|
180 #ifdef WITH_THREAD |
|
29643
fa97293533a9
Add PyThreadState_SetAsyncExc(long, PyObject *).
Guido van Rossum <guido@python.org>
parents:
28914
diff
changeset
|
181 tstate->thread_id = PyThread_get_thread_ident(); |
|
29842
014cc362aa91
Initialize thread_id to 0 in unthreaded build. Fixes #770247.
Martin v. Löwis <martin@v.loewis.de>
parents:
29643
diff
changeset
|
182 #else |
|
014cc362aa91
Initialize thread_id to 0 in unthreaded build. Fixes #770247.
Martin v. Löwis <martin@v.loewis.de>
parents:
29643
diff
changeset
|
183 tstate->thread_id = 0; |
|
014cc362aa91
Initialize thread_id to 0 in unthreaded build. Fixes #770247.
Martin v. Löwis <martin@v.loewis.de>
parents:
29643
diff
changeset
|
184 #endif |
|
5405
b7871ca930ad
Massive changes for separate thread state management.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
185 |
|
7970
4ceee1ef99b0
/* An extension mechanism to store arbitrary additional per-thread state.
Guido van Rossum <guido@python.org>
parents:
6549
diff
changeset
|
186 tstate->dict = NULL; |
|
4ceee1ef99b0
/* An extension mechanism to store arbitrary additional per-thread state.
Guido van Rossum <guido@python.org>
parents:
6549
diff
changeset
|
187 |
|
5405
b7871ca930ad
Massive changes for separate thread state management.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
188 tstate->curexc_type = NULL; |
|
b7871ca930ad
Massive changes for separate thread state management.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
189 tstate->curexc_value = NULL; |
|
b7871ca930ad
Massive changes for separate thread state management.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
190 tstate->curexc_traceback = NULL; |
|
b7871ca930ad
Massive changes for separate thread state management.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
191 |
|
b7871ca930ad
Massive changes for separate thread state management.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
192 tstate->exc_type = NULL; |
|
b7871ca930ad
Massive changes for separate thread state management.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
193 tstate->exc_value = NULL; |
|
b7871ca930ad
Massive changes for separate thread state management.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
194 tstate->exc_traceback = NULL; |
|
b7871ca930ad
Massive changes for separate thread state management.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
195 |
|
18326
e427afb5637f
Revise the interface to the profiling and tracing support for the
Fred Drake <fdrake@acm.org>
parents:
16139
diff
changeset
|
196 tstate->c_profilefunc = NULL; |
|
e427afb5637f
Revise the interface to the profiling and tracing support for the
Fred Drake <fdrake@acm.org>
parents:
16139
diff
changeset
|
197 tstate->c_tracefunc = NULL; |
|
e427afb5637f
Revise the interface to the profiling and tracing support for the
Fred Drake <fdrake@acm.org>
parents:
16139
diff
changeset
|
198 tstate->c_profileobj = NULL; |
|
e427afb5637f
Revise the interface to the profiling and tracing support for the
Fred Drake <fdrake@acm.org>
parents:
16139
diff
changeset
|
199 tstate->c_traceobj = NULL; |
|
5926
8d2194e22e67
The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents:
5849
diff
changeset
|
200 |
| 35661 | 201 #ifdef WITH_THREAD |
| 35117 | 202 _PyGILState_NoteThreadState(tstate); |
| 35661 | 203 #endif |
| 35117 | 204 |
| 11011 | 205 HEAD_LOCK(); |
|
5926
8d2194e22e67
The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents:
5849
diff
changeset
|
206 tstate->next = interp->tstate_head; |
|
8d2194e22e67
The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents:
5849
diff
changeset
|
207 interp->tstate_head = tstate; |
| 11011 | 208 HEAD_UNLOCK(); |
|
5926
8d2194e22e67
The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents:
5849
diff
changeset
|
209 } |
|
8d2194e22e67
The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents:
5849
diff
changeset
|
210 |
|
8d2194e22e67
The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents:
5849
diff
changeset
|
211 return tstate; |
|
8d2194e22e67
The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents:
5849
diff
changeset
|
212 } |
|
8d2194e22e67
The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents:
5849
diff
changeset
|
213 |
|
47580
94f64f11fdd0
Implement PEP 3121: new module initialization and finalization API.
Martin v. Löwis <martin@v.loewis.de>
parents:
44834
diff
changeset
|
214 PyObject* |
|
94f64f11fdd0
Implement PEP 3121: new module initialization and finalization API.
Martin v. Löwis <martin@v.loewis.de>
parents:
44834
diff
changeset
|
215 PyState_FindModule(struct PyModuleDef* m) |
|
94f64f11fdd0
Implement PEP 3121: new module initialization and finalization API.
Martin v. Löwis <martin@v.loewis.de>
parents:
44834
diff
changeset
|
216 { |
|
94f64f11fdd0
Implement PEP 3121: new module initialization and finalization API.
Martin v. Löwis <martin@v.loewis.de>
parents:
44834
diff
changeset
|
217 Py_ssize_t index = m->m_base.m_index; |
|
94f64f11fdd0
Implement PEP 3121: new module initialization and finalization API.
Martin v. Löwis <martin@v.loewis.de>
parents:
44834
diff
changeset
|
218 PyInterpreterState *state = PyThreadState_GET()->interp; |
|
94f64f11fdd0
Implement PEP 3121: new module initialization and finalization API.
Martin v. Löwis <martin@v.loewis.de>
parents:
44834
diff
changeset
|
219 PyObject *res; |
|
94f64f11fdd0
Implement PEP 3121: new module initialization and finalization API.
Martin v. Löwis <martin@v.loewis.de>
parents:
44834
diff
changeset
|
220 if (index == 0) |
|
94f64f11fdd0
Implement PEP 3121: new module initialization and finalization API.
Martin v. Löwis <martin@v.loewis.de>
parents:
44834
diff
changeset
|
221 return NULL; |
|
94f64f11fdd0
Implement PEP 3121: new module initialization and finalization API.
Martin v. Löwis <martin@v.loewis.de>
parents:
44834
diff
changeset
|
222 if (state->modules_by_index == NULL) |
|
94f64f11fdd0
Implement PEP 3121: new module initialization and finalization API.
Martin v. Löwis <martin@v.loewis.de>
parents:
44834
diff
changeset
|
223 return NULL; |
|
94f64f11fdd0
Implement PEP 3121: new module initialization and finalization API.
Martin v. Löwis <martin@v.loewis.de>
parents:
44834
diff
changeset
|
224 if (index > PyList_GET_SIZE(state->modules_by_index)) |
|
94f64f11fdd0
Implement PEP 3121: new module initialization and finalization API.
Martin v. Löwis <martin@v.loewis.de>
parents:
44834
diff
changeset
|
225 return NULL; |
|
94f64f11fdd0
Implement PEP 3121: new module initialization and finalization API.
Martin v. Löwis <martin@v.loewis.de>
parents:
44834
diff
changeset
|
226 res = PyList_GET_ITEM(state->modules_by_index, index); |
|
94f64f11fdd0
Implement PEP 3121: new module initialization and finalization API.
Martin v. Löwis <martin@v.loewis.de>
parents:
44834
diff
changeset
|
227 return res==Py_None ? NULL : res; |
|
94f64f11fdd0
Implement PEP 3121: new module initialization and finalization API.
Martin v. Löwis <martin@v.loewis.de>
parents:
44834
diff
changeset
|
228 } |
|
94f64f11fdd0
Implement PEP 3121: new module initialization and finalization API.
Martin v. Löwis <martin@v.loewis.de>
parents:
44834
diff
changeset
|
229 |
|
94f64f11fdd0
Implement PEP 3121: new module initialization and finalization API.
Martin v. Löwis <martin@v.loewis.de>
parents:
44834
diff
changeset
|
230 int |
|
94f64f11fdd0
Implement PEP 3121: new module initialization and finalization API.
Martin v. Löwis <martin@v.loewis.de>
parents:
44834
diff
changeset
|
231 _PyState_AddModule(PyObject* module, struct PyModuleDef* def) |
|
94f64f11fdd0
Implement PEP 3121: new module initialization and finalization API.
Martin v. Löwis <martin@v.loewis.de>
parents:
44834
diff
changeset
|
232 { |
|
94f64f11fdd0
Implement PEP 3121: new module initialization and finalization API.
Martin v. Löwis <martin@v.loewis.de>
parents:
44834
diff
changeset
|
233 PyInterpreterState *state = PyThreadState_GET()->interp; |
|
94f64f11fdd0
Implement PEP 3121: new module initialization and finalization API.
Martin v. Löwis <martin@v.loewis.de>
parents:
44834
diff
changeset
|
234 if (!def) |
|
94f64f11fdd0
Implement PEP 3121: new module initialization and finalization API.
Martin v. Löwis <martin@v.loewis.de>
parents:
44834
diff
changeset
|
235 return -1; |
|
94f64f11fdd0
Implement PEP 3121: new module initialization and finalization API.
Martin v. Löwis <martin@v.loewis.de>
parents:
44834
diff
changeset
|
236 if (!state->modules_by_index) { |
|
49736
620a34dc10f9
Issue #3327: Don't overallocate in the modules_by_index list.
Martin v. Löwis <martin@v.loewis.de>
parents:
49613
diff
changeset
|
237 state->modules_by_index = PyList_New(0); |
|
47580
94f64f11fdd0
Implement PEP 3121: new module initialization and finalization API.
Martin v. Löwis <martin@v.loewis.de>
parents:
44834
diff
changeset
|
238 if (!state->modules_by_index) |
|
94f64f11fdd0
Implement PEP 3121: new module initialization and finalization API.
Martin v. Löwis <martin@v.loewis.de>
parents:
44834
diff
changeset
|
239 return -1; |
|
94f64f11fdd0
Implement PEP 3121: new module initialization and finalization API.
Martin v. Löwis <martin@v.loewis.de>
parents:
44834
diff
changeset
|
240 } |
|
94f64f11fdd0
Implement PEP 3121: new module initialization and finalization API.
Martin v. Löwis <martin@v.loewis.de>
parents:
44834
diff
changeset
|
241 while(PyList_GET_SIZE(state->modules_by_index) <= def->m_base.m_index) |
|
94f64f11fdd0
Implement PEP 3121: new module initialization and finalization API.
Martin v. Löwis <martin@v.loewis.de>
parents:
44834
diff
changeset
|
242 if (PyList_Append(state->modules_by_index, Py_None) < 0) |
|
94f64f11fdd0
Implement PEP 3121: new module initialization and finalization API.
Martin v. Löwis <martin@v.loewis.de>
parents:
44834
diff
changeset
|
243 return -1; |
|
94f64f11fdd0
Implement PEP 3121: new module initialization and finalization API.
Martin v. Löwis <martin@v.loewis.de>
parents:
44834
diff
changeset
|
244 Py_INCREF(module); |
|
94f64f11fdd0
Implement PEP 3121: new module initialization and finalization API.
Martin v. Löwis <martin@v.loewis.de>
parents:
44834
diff
changeset
|
245 return PyList_SetItem(state->modules_by_index, |
|
94f64f11fdd0
Implement PEP 3121: new module initialization and finalization API.
Martin v. Löwis <martin@v.loewis.de>
parents:
44834
diff
changeset
|
246 def->m_base.m_index, module); |
|
94f64f11fdd0
Implement PEP 3121: new module initialization and finalization API.
Martin v. Löwis <martin@v.loewis.de>
parents:
44834
diff
changeset
|
247 } |
|
5405
b7871ca930ad
Massive changes for separate thread state management.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
248 |
|
5926
8d2194e22e67
The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents:
5849
diff
changeset
|
249 void |
|
13658
f79434ee41fa
Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents:
13256
diff
changeset
|
250 PyThreadState_Clear(PyThreadState *tstate) |
|
5926
8d2194e22e67
The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents:
5849
diff
changeset
|
251 { |
|
6549
a8e3b2e9f5d2
The warning about thread still having a frame now only happens in
Guido van Rossum <guido@python.org>
parents:
6124
diff
changeset
|
252 if (Py_VerboseFlag && tstate->frame != NULL) |
|
5926
8d2194e22e67
The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents:
5849
diff
changeset
|
253 fprintf(stderr, |
|
6124
cc2c84769636
Added missing newline to warning msg
Guido van Rossum <guido@python.org>
parents:
5926
diff
changeset
|
254 "PyThreadState_Clear: warning: thread still has a frame\n"); |
|
5926
8d2194e22e67
The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents:
5849
diff
changeset
|
255 |
|
37879
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
36683
diff
changeset
|
256 Py_CLEAR(tstate->frame); |
|
5926
8d2194e22e67
The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents:
5849
diff
changeset
|
257 |
|
37879
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
36683
diff
changeset
|
258 Py_CLEAR(tstate->dict); |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
36683
diff
changeset
|
259 Py_CLEAR(tstate->async_exc); |
|
7970
4ceee1ef99b0
/* An extension mechanism to store arbitrary additional per-thread state.
Guido van Rossum <guido@python.org>
parents:
6549
diff
changeset
|
260 |
|
37879
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
36683
diff
changeset
|
261 Py_CLEAR(tstate->curexc_type); |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
36683
diff
changeset
|
262 Py_CLEAR(tstate->curexc_value); |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
36683
diff
changeset
|
263 Py_CLEAR(tstate->curexc_traceback); |
|
5926
8d2194e22e67
The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents:
5849
diff
changeset
|
264 |
|
37879
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
36683
diff
changeset
|
265 Py_CLEAR(tstate->exc_type); |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
36683
diff
changeset
|
266 Py_CLEAR(tstate->exc_value); |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
36683
diff
changeset
|
267 Py_CLEAR(tstate->exc_traceback); |
|
5926
8d2194e22e67
The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents:
5849
diff
changeset
|
268 |
|
18326
e427afb5637f
Revise the interface to the profiling and tracing support for the
Fred Drake <fdrake@acm.org>
parents:
16139
diff
changeset
|
269 tstate->c_profilefunc = NULL; |
|
e427afb5637f
Revise the interface to the profiling and tracing support for the
Fred Drake <fdrake@acm.org>
parents:
16139
diff
changeset
|
270 tstate->c_tracefunc = NULL; |
|
37879
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
36683
diff
changeset
|
271 Py_CLEAR(tstate->c_profileobj); |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
36683
diff
changeset
|
272 Py_CLEAR(tstate->c_traceobj); |
|
5405
b7871ca930ad
Massive changes for separate thread state management.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
273 } |
|
b7871ca930ad
Massive changes for separate thread state management.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
274 |
|
b7871ca930ad
Massive changes for separate thread state management.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
275 |
|
16139
d96ce9708c00
Add a new API, PyThreadState_DeleteCurrent() that combines
Guido van Rossum <guido@python.org>
parents:
14378
diff
changeset
|
276 /* Common code for PyThreadState_Delete() and PyThreadState_DeleteCurrent() */ |
|
d96ce9708c00
Add a new API, PyThreadState_DeleteCurrent() that combines
Guido van Rossum <guido@python.org>
parents:
14378
diff
changeset
|
277 static void |
|
d96ce9708c00
Add a new API, PyThreadState_DeleteCurrent() that combines
Guido van Rossum <guido@python.org>
parents:
14378
diff
changeset
|
278 tstate_delete_common(PyThreadState *tstate) |
|
5405
b7871ca930ad
Massive changes for separate thread state management.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
279 { |
|
5926
8d2194e22e67
The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents:
5849
diff
changeset
|
280 PyInterpreterState *interp; |
|
8d2194e22e67
The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents:
5849
diff
changeset
|
281 PyThreadState **p; |
|
44834
ed33da2e74e7
Merged revisions 60143-60149 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44099
diff
changeset
|
282 PyThreadState *prev_p = NULL; |
|
5926
8d2194e22e67
The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents:
5849
diff
changeset
|
283 if (tstate == NULL) |
|
8d2194e22e67
The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents:
5849
diff
changeset
|
284 Py_FatalError("PyThreadState_Delete: NULL tstate"); |
|
8d2194e22e67
The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents:
5849
diff
changeset
|
285 interp = tstate->interp; |
|
8d2194e22e67
The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents:
5849
diff
changeset
|
286 if (interp == NULL) |
|
8d2194e22e67
The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents:
5849
diff
changeset
|
287 Py_FatalError("PyThreadState_Delete: NULL interp"); |
| 11011 | 288 HEAD_LOCK(); |
|
5926
8d2194e22e67
The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents:
5849
diff
changeset
|
289 for (p = &interp->tstate_head; ; p = &(*p)->next) { |
|
8d2194e22e67
The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents:
5849
diff
changeset
|
290 if (*p == NULL) |
|
8d2194e22e67
The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents:
5849
diff
changeset
|
291 Py_FatalError( |
|
8d2194e22e67
The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents:
5849
diff
changeset
|
292 "PyThreadState_Delete: invalid tstate"); |
|
8d2194e22e67
The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents:
5849
diff
changeset
|
293 if (*p == tstate) |
|
8d2194e22e67
The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents:
5849
diff
changeset
|
294 break; |
|
48680
7779af388aec
Merged revisions 65459,65472,65481,65518,65536,65581,65609,65637,65641,65644-65645 via svnmerge from
Georg Brandl <georg@python.org>
parents:
47580
diff
changeset
|
295 /* Sanity check. These states should never happen but if |
|
7779af388aec
Merged revisions 65459,65472,65481,65518,65536,65581,65609,65637,65641,65644-65645 via svnmerge from
Georg Brandl <georg@python.org>
parents:
47580
diff
changeset
|
296 * they do we must abort. Otherwise we'll end up spinning in |
|
7779af388aec
Merged revisions 65459,65472,65481,65518,65536,65581,65609,65637,65641,65644-65645 via svnmerge from
Georg Brandl <georg@python.org>
parents:
47580
diff
changeset
|
297 * in a tight loop with the lock held. A similar check is done |
|
7779af388aec
Merged revisions 65459,65472,65481,65518,65536,65581,65609,65637,65641,65644-65645 via svnmerge from
Georg Brandl <georg@python.org>
parents:
47580
diff
changeset
|
298 * in thread.c find_key(). */ |
|
44834
ed33da2e74e7
Merged revisions 60143-60149 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44099
diff
changeset
|
299 if (*p == prev_p) |
|
ed33da2e74e7
Merged revisions 60143-60149 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44099
diff
changeset
|
300 Py_FatalError( |
|
ed33da2e74e7
Merged revisions 60143-60149 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44099
diff
changeset
|
301 "PyThreadState_Delete: small circular list(!)" |
|
ed33da2e74e7
Merged revisions 60143-60149 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44099
diff
changeset
|
302 " and tstate not found."); |
|
ed33da2e74e7
Merged revisions 60143-60149 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44099
diff
changeset
|
303 prev_p = *p; |
|
ed33da2e74e7
Merged revisions 60143-60149 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44099
diff
changeset
|
304 if ((*p)->next == interp->tstate_head) |
|
ed33da2e74e7
Merged revisions 60143-60149 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44099
diff
changeset
|
305 Py_FatalError( |
|
ed33da2e74e7
Merged revisions 60143-60149 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44099
diff
changeset
|
306 "PyThreadState_Delete: circular list(!) and" |
|
ed33da2e74e7
Merged revisions 60143-60149 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44099
diff
changeset
|
307 " tstate not found."); |
|
5926
8d2194e22e67
The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents:
5849
diff
changeset
|
308 } |
|
8d2194e22e67
The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents:
5849
diff
changeset
|
309 *p = tstate->next; |
| 11011 | 310 HEAD_UNLOCK(); |
|
33713
517e4ec0df89
PyInterpreterState_New(), PyThreadState_New(): use malloc/free directly.
Tim Peters <tim.peters@gmail.com>
parents:
33711
diff
changeset
|
311 free(tstate); |
|
5405
b7871ca930ad
Massive changes for separate thread state management.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
312 } |
|
b7871ca930ad
Massive changes for separate thread state management.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
313 |
|
b7871ca930ad
Massive changes for separate thread state management.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
314 |
|
16139
d96ce9708c00
Add a new API, PyThreadState_DeleteCurrent() that combines
Guido van Rossum <guido@python.org>
parents:
14378
diff
changeset
|
315 void |
|
d96ce9708c00
Add a new API, PyThreadState_DeleteCurrent() that combines
Guido van Rossum <guido@python.org>
parents:
14378
diff
changeset
|
316 PyThreadState_Delete(PyThreadState *tstate) |
|
d96ce9708c00
Add a new API, PyThreadState_DeleteCurrent() that combines
Guido van Rossum <guido@python.org>
parents:
14378
diff
changeset
|
317 { |
|
d96ce9708c00
Add a new API, PyThreadState_DeleteCurrent() that combines
Guido van Rossum <guido@python.org>
parents:
14378
diff
changeset
|
318 if (tstate == _PyThreadState_Current) |
|
d96ce9708c00
Add a new API, PyThreadState_DeleteCurrent() that combines
Guido van Rossum <guido@python.org>
parents:
14378
diff
changeset
|
319 Py_FatalError("PyThreadState_Delete: tstate is still current"); |
|
d96ce9708c00
Add a new API, PyThreadState_DeleteCurrent() that combines
Guido van Rossum <guido@python.org>
parents:
14378
diff
changeset
|
320 tstate_delete_common(tstate); |
|
36683
da2a1049215d
Patch 1413181, by Gabriel Becedillas.
Tim Peters <tim.peters@gmail.com>
parents:
35661
diff
changeset
|
321 #ifdef WITH_THREAD |
|
da2a1049215d
Patch 1413181, by Gabriel Becedillas.
Tim Peters <tim.peters@gmail.com>
parents:
35661
diff
changeset
|
322 if (autoTLSkey && PyThread_get_key_value(autoTLSkey) == tstate) |
|
da2a1049215d
Patch 1413181, by Gabriel Becedillas.
Tim Peters <tim.peters@gmail.com>
parents:
35661
diff
changeset
|
323 PyThread_delete_key_value(autoTLSkey); |
|
da2a1049215d
Patch 1413181, by Gabriel Becedillas.
Tim Peters <tim.peters@gmail.com>
parents:
35661
diff
changeset
|
324 #endif /* WITH_THREAD */ |
|
16139
d96ce9708c00
Add a new API, PyThreadState_DeleteCurrent() that combines
Guido van Rossum <guido@python.org>
parents:
14378
diff
changeset
|
325 } |
|
d96ce9708c00
Add a new API, PyThreadState_DeleteCurrent() that combines
Guido van Rossum <guido@python.org>
parents:
14378
diff
changeset
|
326 |
|
d96ce9708c00
Add a new API, PyThreadState_DeleteCurrent() that combines
Guido van Rossum <guido@python.org>
parents:
14378
diff
changeset
|
327 |
|
d96ce9708c00
Add a new API, PyThreadState_DeleteCurrent() that combines
Guido van Rossum <guido@python.org>
parents:
14378
diff
changeset
|
328 #ifdef WITH_THREAD |
|
d96ce9708c00
Add a new API, PyThreadState_DeleteCurrent() that combines
Guido van Rossum <guido@python.org>
parents:
14378
diff
changeset
|
329 void |
|
d96ce9708c00
Add a new API, PyThreadState_DeleteCurrent() that combines
Guido van Rossum <guido@python.org>
parents:
14378
diff
changeset
|
330 PyThreadState_DeleteCurrent() |
|
d96ce9708c00
Add a new API, PyThreadState_DeleteCurrent() that combines
Guido van Rossum <guido@python.org>
parents:
14378
diff
changeset
|
331 { |
|
d96ce9708c00
Add a new API, PyThreadState_DeleteCurrent() that combines
Guido van Rossum <guido@python.org>
parents:
14378
diff
changeset
|
332 PyThreadState *tstate = _PyThreadState_Current; |
|
d96ce9708c00
Add a new API, PyThreadState_DeleteCurrent() that combines
Guido van Rossum <guido@python.org>
parents:
14378
diff
changeset
|
333 if (tstate == NULL) |
|
d96ce9708c00
Add a new API, PyThreadState_DeleteCurrent() that combines
Guido van Rossum <guido@python.org>
parents:
14378
diff
changeset
|
334 Py_FatalError( |
|
d96ce9708c00
Add a new API, PyThreadState_DeleteCurrent() that combines
Guido van Rossum <guido@python.org>
parents:
14378
diff
changeset
|
335 "PyThreadState_DeleteCurrent: no current tstate"); |
|
d96ce9708c00
Add a new API, PyThreadState_DeleteCurrent() that combines
Guido van Rossum <guido@python.org>
parents:
14378
diff
changeset
|
336 _PyThreadState_Current = NULL; |
|
d96ce9708c00
Add a new API, PyThreadState_DeleteCurrent() that combines
Guido van Rossum <guido@python.org>
parents:
14378
diff
changeset
|
337 tstate_delete_common(tstate); |
| 35117 | 338 if (autoTLSkey && PyThread_get_key_value(autoTLSkey) == tstate) |
| 339 PyThread_delete_key_value(autoTLSkey); | |
|
16139
d96ce9708c00
Add a new API, PyThreadState_DeleteCurrent() that combines
Guido van Rossum <guido@python.org>
parents:
14378
diff
changeset
|
340 PyEval_ReleaseLock(); |
|
d96ce9708c00
Add a new API, PyThreadState_DeleteCurrent() that combines
Guido van Rossum <guido@python.org>
parents:
14378
diff
changeset
|
341 } |
|
d96ce9708c00
Add a new API, PyThreadState_DeleteCurrent() that combines
Guido van Rossum <guido@python.org>
parents:
14378
diff
changeset
|
342 #endif /* WITH_THREAD */ |
|
d96ce9708c00
Add a new API, PyThreadState_DeleteCurrent() that combines
Guido van Rossum <guido@python.org>
parents:
14378
diff
changeset
|
343 |
|
d96ce9708c00
Add a new API, PyThreadState_DeleteCurrent() that combines
Guido van Rossum <guido@python.org>
parents:
14378
diff
changeset
|
344 |
|
5405
b7871ca930ad
Massive changes for separate thread state management.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
345 PyThreadState * |
|
13658
f79434ee41fa
Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents:
13256
diff
changeset
|
346 PyThreadState_Get(void) |
|
5405
b7871ca930ad
Massive changes for separate thread state management.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
347 { |
|
9667
914f83e7fa0a
Make current_tstate a global, _PyThreadState_Current. This is to
Guido van Rossum <guido@python.org>
parents:
7970
diff
changeset
|
348 if (_PyThreadState_Current == NULL) |
|
5926
8d2194e22e67
The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents:
5849
diff
changeset
|
349 Py_FatalError("PyThreadState_Get: no current thread"); |
|
8d2194e22e67
The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents:
5849
diff
changeset
|
350 |
|
9667
914f83e7fa0a
Make current_tstate a global, _PyThreadState_Current. This is to
Guido van Rossum <guido@python.org>
parents:
7970
diff
changeset
|
351 return _PyThreadState_Current; |
|
5405
b7871ca930ad
Massive changes for separate thread state management.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
352 } |
|
b7871ca930ad
Massive changes for separate thread state management.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
353 |
|
b7871ca930ad
Massive changes for separate thread state management.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
354 |
|
b7871ca930ad
Massive changes for separate thread state management.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
355 PyThreadState * |
|
37879
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
36683
diff
changeset
|
356 PyThreadState_Swap(PyThreadState *newts) |
|
5405
b7871ca930ad
Massive changes for separate thread state management.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
357 { |
|
37879
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
36683
diff
changeset
|
358 PyThreadState *oldts = _PyThreadState_Current; |
|
5926
8d2194e22e67
The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents:
5849
diff
changeset
|
359 |
|
37879
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
36683
diff
changeset
|
360 _PyThreadState_Current = newts; |
|
28694
a4154dd5939a
New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents:
28616
diff
changeset
|
361 /* It should not be possible for more than one thread state |
|
33698
090ffcb83f0a
Trim trailing whitespace.
Tim Peters <tim.peters@gmail.com>
parents:
32301
diff
changeset
|
362 to be used for a thread. Check this the best we can in debug |
|
28694
a4154dd5939a
New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents:
28616
diff
changeset
|
363 builds. |
|
a4154dd5939a
New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents:
28616
diff
changeset
|
364 */ |
|
28914
33475661823d
Patch #729300: Disable error message if Python is not built for threads.
Martin v. Löwis <martin@v.loewis.de>
parents:
28694
diff
changeset
|
365 #if defined(Py_DEBUG) && defined(WITH_THREAD) |
|
37879
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
36683
diff
changeset
|
366 if (newts) { |
|
40450
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
39610
diff
changeset
|
367 /* This can be called from PyEval_RestoreThread(). Similar |
|
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
39610
diff
changeset
|
368 to it, we need to ensure errno doesn't change. |
|
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
39610
diff
changeset
|
369 */ |
|
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
39610
diff
changeset
|
370 int err = errno; |
|
28694
a4154dd5939a
New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents:
28616
diff
changeset
|
371 PyThreadState *check = PyGILState_GetThisThreadState(); |
|
37879
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
36683
diff
changeset
|
372 if (check && check->interp == newts->interp && check != newts) |
|
28694
a4154dd5939a
New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents:
28616
diff
changeset
|
373 Py_FatalError("Invalid thread state for this thread"); |
|
40450
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
39610
diff
changeset
|
374 errno = err; |
|
28694
a4154dd5939a
New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents:
28616
diff
changeset
|
375 } |
|
a4154dd5939a
New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents:
28616
diff
changeset
|
376 #endif |
|
37879
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
36683
diff
changeset
|
377 return oldts; |
|
5405
b7871ca930ad
Massive changes for separate thread state management.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
378 } |
|
7970
4ceee1ef99b0
/* An extension mechanism to store arbitrary additional per-thread state.
Guido van Rossum <guido@python.org>
parents:
6549
diff
changeset
|
379 |
|
4ceee1ef99b0
/* An extension mechanism to store arbitrary additional per-thread state.
Guido van Rossum <guido@python.org>
parents:
6549
diff
changeset
|
380 /* An extension mechanism to store arbitrary additional per-thread state. |
|
4ceee1ef99b0
/* An extension mechanism to store arbitrary additional per-thread state.
Guido van Rossum <guido@python.org>
parents:
6549
diff
changeset
|
381 PyThreadState_GetDict() returns a dictionary that can be used to hold such |
|
4ceee1ef99b0
/* An extension mechanism to store arbitrary additional per-thread state.
Guido van Rossum <guido@python.org>
parents:
6549
diff
changeset
|
382 state; the caller should pick a unique key and store its state there. If |
|
28616
4f0b7acffc7d
- pythunrun.c, Py_Finalize(): move the call to _Py_PrintReferences()
Guido van Rossum <guido@python.org>
parents:
28325
diff
changeset
|
383 PyThreadState_GetDict() returns NULL, an exception has *not* been raised |
|
4f0b7acffc7d
- pythunrun.c, Py_Finalize(): move the call to _Py_PrintReferences()
Guido van Rossum <guido@python.org>
parents:
28325
diff
changeset
|
384 and the caller should assume no per-thread state is available. */ |
|
7970
4ceee1ef99b0
/* An extension mechanism to store arbitrary additional per-thread state.
Guido van Rossum <guido@python.org>
parents:
6549
diff
changeset
|
385 |
|
4ceee1ef99b0
/* An extension mechanism to store arbitrary additional per-thread state.
Guido van Rossum <guido@python.org>
parents:
6549
diff
changeset
|
386 PyObject * |
|
13658
f79434ee41fa
Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents:
13256
diff
changeset
|
387 PyThreadState_GetDict(void) |
|
7970
4ceee1ef99b0
/* An extension mechanism to store arbitrary additional per-thread state.
Guido van Rossum <guido@python.org>
parents:
6549
diff
changeset
|
388 { |
|
9667
914f83e7fa0a
Make current_tstate a global, _PyThreadState_Current. This is to
Guido van Rossum <guido@python.org>
parents:
7970
diff
changeset
|
389 if (_PyThreadState_Current == NULL) |
|
28616
4f0b7acffc7d
- pythunrun.c, Py_Finalize(): move the call to _Py_PrintReferences()
Guido van Rossum <guido@python.org>
parents:
28325
diff
changeset
|
390 return NULL; |
|
7970
4ceee1ef99b0
/* An extension mechanism to store arbitrary additional per-thread state.
Guido van Rossum <guido@python.org>
parents:
6549
diff
changeset
|
391 |
|
28616
4f0b7acffc7d
- pythunrun.c, Py_Finalize(): move the call to _Py_PrintReferences()
Guido van Rossum <guido@python.org>
parents:
28325
diff
changeset
|
392 if (_PyThreadState_Current->dict == NULL) { |
|
4f0b7acffc7d
- pythunrun.c, Py_Finalize(): move the call to _Py_PrintReferences()
Guido van Rossum <guido@python.org>
parents:
28325
diff
changeset
|
393 PyObject *d; |
|
4f0b7acffc7d
- pythunrun.c, Py_Finalize(): move the call to _Py_PrintReferences()
Guido van Rossum <guido@python.org>
parents:
28325
diff
changeset
|
394 _PyThreadState_Current->dict = d = PyDict_New(); |
|
4f0b7acffc7d
- pythunrun.c, Py_Finalize(): move the call to _Py_PrintReferences()
Guido van Rossum <guido@python.org>
parents:
28325
diff
changeset
|
395 if (d == NULL) |
|
4f0b7acffc7d
- pythunrun.c, Py_Finalize(): move the call to _Py_PrintReferences()
Guido van Rossum <guido@python.org>
parents:
28325
diff
changeset
|
396 PyErr_Clear(); |
|
4f0b7acffc7d
- pythunrun.c, Py_Finalize(): move the call to _Py_PrintReferences()
Guido van Rossum <guido@python.org>
parents:
28325
diff
changeset
|
397 } |
|
9667
914f83e7fa0a
Make current_tstate a global, _PyThreadState_Current. This is to
Guido van Rossum <guido@python.org>
parents:
7970
diff
changeset
|
398 return _PyThreadState_Current->dict; |
|
7970
4ceee1ef99b0
/* An extension mechanism to store arbitrary additional per-thread state.
Guido van Rossum <guido@python.org>
parents:
6549
diff
changeset
|
399 } |
|
18733
b0329649b8cf
Add a low-level API to access interpreters, for David Beazley.
Guido van Rossum <guido@python.org>
parents:
18689
diff
changeset
|
400 |
|
b0329649b8cf
Add a low-level API to access interpreters, for David Beazley.
Guido van Rossum <guido@python.org>
parents:
18689
diff
changeset
|
401 |
|
29643
fa97293533a9
Add PyThreadState_SetAsyncExc(long, PyObject *).
Guido van Rossum <guido@python.org>
parents:
28914
diff
changeset
|
402 /* Asynchronously raise an exception in a thread. |
|
fa97293533a9
Add PyThreadState_SetAsyncExc(long, PyObject *).
Guido van Rossum <guido@python.org>
parents:
28914
diff
changeset
|
403 Requested by Just van Rossum and Alex Martelli. |
| 34568 | 404 To prevent naive misuse, you must write your own extension |
|
39610
3674f20ac781
Merge current trunk into p3yk. This includes the PyNumber_Index API change,
Thomas Wouters <thomas@python.org>
parents:
39442
diff
changeset
|
405 to call this, or use ctypes. Must be called with the GIL held. |
|
3674f20ac781
Merge current trunk into p3yk. This includes the PyNumber_Index API change,
Thomas Wouters <thomas@python.org>
parents:
39442
diff
changeset
|
406 Returns the number of tstates modified (normally 1, but 0 if `id` didn't |
|
3674f20ac781
Merge current trunk into p3yk. This includes the PyNumber_Index API change,
Thomas Wouters <thomas@python.org>
parents:
39442
diff
changeset
|
407 match any known thread id). Can be called with exc=NULL to clear an |
|
3674f20ac781
Merge current trunk into p3yk. This includes the PyNumber_Index API change,
Thomas Wouters <thomas@python.org>
parents:
39442
diff
changeset
|
408 existing async exception. This raises no exceptions. */ |
|
29643
fa97293533a9
Add PyThreadState_SetAsyncExc(long, PyObject *).
Guido van Rossum <guido@python.org>
parents:
28914
diff
changeset
|
409 |
|
fa97293533a9
Add PyThreadState_SetAsyncExc(long, PyObject *).
Guido van Rossum <guido@python.org>
parents:
28914
diff
changeset
|
410 int |
|
fa97293533a9
Add PyThreadState_SetAsyncExc(long, PyObject *).
Guido van Rossum <guido@python.org>
parents:
28914
diff
changeset
|
411 PyThreadState_SetAsyncExc(long id, PyObject *exc) { |
|
31797
846b3ee7e106
Changed random calls to PyThreadState_Get() to use the macro
Nicholas Bastin <nick.bastin@gmail.com>
parents:
29842
diff
changeset
|
412 PyThreadState *tstate = PyThreadState_GET(); |
|
29643
fa97293533a9
Add PyThreadState_SetAsyncExc(long, PyObject *).
Guido van Rossum <guido@python.org>
parents:
28914
diff
changeset
|
413 PyInterpreterState *interp = tstate->interp; |
|
fa97293533a9
Add PyThreadState_SetAsyncExc(long, PyObject *).
Guido van Rossum <guido@python.org>
parents:
28914
diff
changeset
|
414 PyThreadState *p; |
|
39610
3674f20ac781
Merge current trunk into p3yk. This includes the PyNumber_Index API change,
Thomas Wouters <thomas@python.org>
parents:
39442
diff
changeset
|
415 |
|
3674f20ac781
Merge current trunk into p3yk. This includes the PyNumber_Index API change,
Thomas Wouters <thomas@python.org>
parents:
39442
diff
changeset
|
416 /* Although the GIL is held, a few C API functions can be called |
|
3674f20ac781
Merge current trunk into p3yk. This includes the PyNumber_Index API change,
Thomas Wouters <thomas@python.org>
parents:
39442
diff
changeset
|
417 * without the GIL held, and in particular some that create and |
|
3674f20ac781
Merge current trunk into p3yk. This includes the PyNumber_Index API change,
Thomas Wouters <thomas@python.org>
parents:
39442
diff
changeset
|
418 * destroy thread and interpreter states. Those can mutate the |
|
3674f20ac781
Merge current trunk into p3yk. This includes the PyNumber_Index API change,
Thomas Wouters <thomas@python.org>
parents:
39442
diff
changeset
|
419 * list of thread states we're traversing, so to prevent that we lock |
|
3674f20ac781
Merge current trunk into p3yk. This includes the PyNumber_Index API change,
Thomas Wouters <thomas@python.org>
parents:
39442
diff
changeset
|
420 * head_mutex for the duration. |
|
3674f20ac781
Merge current trunk into p3yk. This includes the PyNumber_Index API change,
Thomas Wouters <thomas@python.org>
parents:
39442
diff
changeset
|
421 */ |
| 34568 | 422 HEAD_LOCK(); |
|
29643
fa97293533a9
Add PyThreadState_SetAsyncExc(long, PyObject *).
Guido van Rossum <guido@python.org>
parents:
28914
diff
changeset
|
423 for (p = interp->tstate_head; p != NULL; p = p->next) { |
|
39610
3674f20ac781
Merge current trunk into p3yk. This includes the PyNumber_Index API change,
Thomas Wouters <thomas@python.org>
parents:
39442
diff
changeset
|
424 if (p->thread_id == id) { |
|
3674f20ac781
Merge current trunk into p3yk. This includes the PyNumber_Index API change,
Thomas Wouters <thomas@python.org>
parents:
39442
diff
changeset
|
425 /* Tricky: we need to decref the current value |
|
3674f20ac781
Merge current trunk into p3yk. This includes the PyNumber_Index API change,
Thomas Wouters <thomas@python.org>
parents:
39442
diff
changeset
|
426 * (if any) in p->async_exc, but that can in turn |
|
3674f20ac781
Merge current trunk into p3yk. This includes the PyNumber_Index API change,
Thomas Wouters <thomas@python.org>
parents:
39442
diff
changeset
|
427 * allow arbitrary Python code to run, including |
|
3674f20ac781
Merge current trunk into p3yk. This includes the PyNumber_Index API change,
Thomas Wouters <thomas@python.org>
parents:
39442
diff
changeset
|
428 * perhaps calls to this function. To prevent |
|
3674f20ac781
Merge current trunk into p3yk. This includes the PyNumber_Index API change,
Thomas Wouters <thomas@python.org>
parents:
39442
diff
changeset
|
429 * deadlock, we need to release head_mutex before |
|
3674f20ac781
Merge current trunk into p3yk. This includes the PyNumber_Index API change,
Thomas Wouters <thomas@python.org>
parents:
39442
diff
changeset
|
430 * the decref. |
|
3674f20ac781
Merge current trunk into p3yk. This includes the PyNumber_Index API change,
Thomas Wouters <thomas@python.org>
parents:
39442
diff
changeset
|
431 */ |
|
3674f20ac781
Merge current trunk into p3yk. This includes the PyNumber_Index API change,
Thomas Wouters <thomas@python.org>
parents:
39442
diff
changeset
|
432 PyObject *old_exc = p->async_exc; |
|
3674f20ac781
Merge current trunk into p3yk. This includes the PyNumber_Index API change,
Thomas Wouters <thomas@python.org>
parents:
39442
diff
changeset
|
433 Py_XINCREF(exc); |
|
3674f20ac781
Merge current trunk into p3yk. This includes the PyNumber_Index API change,
Thomas Wouters <thomas@python.org>
parents:
39442
diff
changeset
|
434 p->async_exc = exc; |
|
3674f20ac781
Merge current trunk into p3yk. This includes the PyNumber_Index API change,
Thomas Wouters <thomas@python.org>
parents:
39442
diff
changeset
|
435 HEAD_UNLOCK(); |
|
3674f20ac781
Merge current trunk into p3yk. This includes the PyNumber_Index API change,
Thomas Wouters <thomas@python.org>
parents:
39442
diff
changeset
|
436 Py_XDECREF(old_exc); |
|
57175
fdd6484f1210
Merge in the new GIL.
Antoine Pitrou <solipsis@pitrou.net>
parents:
49736
diff
changeset
|
437 _PyEval_SignalAsyncExc(); |
|
39610
3674f20ac781
Merge current trunk into p3yk. This includes the PyNumber_Index API change,
Thomas Wouters <thomas@python.org>
parents:
39442
diff
changeset
|
438 return 1; |
|
3674f20ac781
Merge current trunk into p3yk. This includes the PyNumber_Index API change,
Thomas Wouters <thomas@python.org>
parents:
39442
diff
changeset
|
439 } |
|
29643
fa97293533a9
Add PyThreadState_SetAsyncExc(long, PyObject *).
Guido van Rossum <guido@python.org>
parents:
28914
diff
changeset
|
440 } |
| 34568 | 441 HEAD_UNLOCK(); |
|
39610
3674f20ac781
Merge current trunk into p3yk. This includes the PyNumber_Index API change,
Thomas Wouters <thomas@python.org>
parents:
39442
diff
changeset
|
442 return 0; |
|
29643
fa97293533a9
Add PyThreadState_SetAsyncExc(long, PyObject *).
Guido van Rossum <guido@python.org>
parents:
28914
diff
changeset
|
443 } |
|
fa97293533a9
Add PyThreadState_SetAsyncExc(long, PyObject *).
Guido van Rossum <guido@python.org>
parents:
28914
diff
changeset
|
444 |
|
fa97293533a9
Add PyThreadState_SetAsyncExc(long, PyObject *).
Guido van Rossum <guido@python.org>
parents:
28914
diff
changeset
|
445 |
|
18733
b0329649b8cf
Add a low-level API to access interpreters, for David Beazley.
Guido van Rossum <guido@python.org>
parents:
18689
diff
changeset
|
446 /* Routines for advanced debuggers, requested by David Beazley. |
|
b0329649b8cf
Add a low-level API to access interpreters, for David Beazley.
Guido van Rossum <guido@python.org>
parents:
18689
diff
changeset
|
447 Don't use unless you know what you are doing! */ |
|
b0329649b8cf
Add a low-level API to access interpreters, for David Beazley.
Guido van Rossum <guido@python.org>
parents:
18689
diff
changeset
|
448 |
|
b0329649b8cf
Add a low-level API to access interpreters, for David Beazley.
Guido van Rossum <guido@python.org>
parents:
18689
diff
changeset
|
449 PyInterpreterState * |
|
b0329649b8cf
Add a low-level API to access interpreters, for David Beazley.
Guido van Rossum <guido@python.org>
parents:
18689
diff
changeset
|
450 PyInterpreterState_Head(void) |
|
b0329649b8cf
Add a low-level API to access interpreters, for David Beazley.
Guido van Rossum <guido@python.org>
parents:
18689
diff
changeset
|
451 { |
|
b0329649b8cf
Add a low-level API to access interpreters, for David Beazley.
Guido van Rossum <guido@python.org>
parents:
18689
diff
changeset
|
452 return interp_head; |
|
b0329649b8cf
Add a low-level API to access interpreters, for David Beazley.
Guido van Rossum <guido@python.org>
parents:
18689
diff
changeset
|
453 } |
|
b0329649b8cf
Add a low-level API to access interpreters, for David Beazley.
Guido van Rossum <guido@python.org>
parents:
18689
diff
changeset
|
454 |
|
b0329649b8cf
Add a low-level API to access interpreters, for David Beazley.
Guido van Rossum <guido@python.org>
parents:
18689
diff
changeset
|
455 PyInterpreterState * |
|
b0329649b8cf
Add a low-level API to access interpreters, for David Beazley.
Guido van Rossum <guido@python.org>
parents:
18689
diff
changeset
|
456 PyInterpreterState_Next(PyInterpreterState *interp) { |
|
b0329649b8cf
Add a low-level API to access interpreters, for David Beazley.
Guido van Rossum <guido@python.org>
parents:
18689
diff
changeset
|
457 return interp->next; |
|
b0329649b8cf
Add a low-level API to access interpreters, for David Beazley.
Guido van Rossum <guido@python.org>
parents:
18689
diff
changeset
|
458 } |
|
b0329649b8cf
Add a low-level API to access interpreters, for David Beazley.
Guido van Rossum <guido@python.org>
parents:
18689
diff
changeset
|
459 |
|
b0329649b8cf
Add a low-level API to access interpreters, for David Beazley.
Guido van Rossum <guido@python.org>
parents:
18689
diff
changeset
|
460 PyThreadState * |
|
b0329649b8cf
Add a low-level API to access interpreters, for David Beazley.
Guido van Rossum <guido@python.org>
parents:
18689
diff
changeset
|
461 PyInterpreterState_ThreadHead(PyInterpreterState *interp) { |
|
b0329649b8cf
Add a low-level API to access interpreters, for David Beazley.
Guido van Rossum <guido@python.org>
parents:
18689
diff
changeset
|
462 return interp->tstate_head; |
|
b0329649b8cf
Add a low-level API to access interpreters, for David Beazley.
Guido van Rossum <guido@python.org>
parents:
18689
diff
changeset
|
463 } |
|
b0329649b8cf
Add a low-level API to access interpreters, for David Beazley.
Guido van Rossum <guido@python.org>
parents:
18689
diff
changeset
|
464 |
|
b0329649b8cf
Add a low-level API to access interpreters, for David Beazley.
Guido van Rossum <guido@python.org>
parents:
18689
diff
changeset
|
465 PyThreadState * |
|
b0329649b8cf
Add a low-level API to access interpreters, for David Beazley.
Guido van Rossum <guido@python.org>
parents:
18689
diff
changeset
|
466 PyThreadState_Next(PyThreadState *tstate) { |
|
b0329649b8cf
Add a low-level API to access interpreters, for David Beazley.
Guido van Rossum <guido@python.org>
parents:
18689
diff
changeset
|
467 return tstate->next; |
|
b0329649b8cf
Add a low-level API to access interpreters, for David Beazley.
Guido van Rossum <guido@python.org>
parents:
18689
diff
changeset
|
468 } |
|
28694
a4154dd5939a
New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents:
28616
diff
changeset
|
469 |
|
39442
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
37879
diff
changeset
|
470 /* The implementation of sys._current_frames(). This is intended to be |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
37879
diff
changeset
|
471 called with the GIL held, as it will be when called via |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
37879
diff
changeset
|
472 sys._current_frames(). It's possible it would work fine even without |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
37879
diff
changeset
|
473 the GIL held, but haven't thought enough about that. |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
37879
diff
changeset
|
474 */ |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
37879
diff
changeset
|
475 PyObject * |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
37879
diff
changeset
|
476 _PyThread_CurrentFrames(void) |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
37879
diff
changeset
|
477 { |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
37879
diff
changeset
|
478 PyObject *result; |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
37879
diff
changeset
|
479 PyInterpreterState *i; |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
37879
diff
changeset
|
480 |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
37879
diff
changeset
|
481 result = PyDict_New(); |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
37879
diff
changeset
|
482 if (result == NULL) |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
37879
diff
changeset
|
483 return NULL; |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
37879
diff
changeset
|
484 |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
37879
diff
changeset
|
485 /* for i in all interpreters: |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
37879
diff
changeset
|
486 * for t in all of i's thread states: |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
37879
diff
changeset
|
487 * if t's frame isn't NULL, map t's id to its frame |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
37879
diff
changeset
|
488 * Because these lists can mutute even when the GIL is held, we |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
37879
diff
changeset
|
489 * need to grab head_mutex for the duration. |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
37879
diff
changeset
|
490 */ |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
37879
diff
changeset
|
491 HEAD_LOCK(); |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
37879
diff
changeset
|
492 for (i = interp_head; i != NULL; i = i->next) { |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
37879
diff
changeset
|
493 PyThreadState *t; |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
37879
diff
changeset
|
494 for (t = i->tstate_head; t != NULL; t = t->next) { |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
37879
diff
changeset
|
495 PyObject *id; |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
37879
diff
changeset
|
496 int stat; |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
37879
diff
changeset
|
497 struct _frame *frame = t->frame; |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
37879
diff
changeset
|
498 if (frame == NULL) |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
37879
diff
changeset
|
499 continue; |
|
44099
f324631462a2
Cleanup: Replaced most PyInt_ aliases with PyLong_ and disabled the aliases in intobject.h
Christian Heimes <christian@cheimes.de>
parents:
42013
diff
changeset
|
500 id = PyLong_FromLong(t->thread_id); |
|
39442
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
37879
diff
changeset
|
501 if (id == NULL) |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
37879
diff
changeset
|
502 goto Fail; |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
37879
diff
changeset
|
503 stat = PyDict_SetItem(result, id, (PyObject *)frame); |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
37879
diff
changeset
|
504 Py_DECREF(id); |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
37879
diff
changeset
|
505 if (stat < 0) |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
37879
diff
changeset
|
506 goto Fail; |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
37879
diff
changeset
|
507 } |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
37879
diff
changeset
|
508 } |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
37879
diff
changeset
|
509 HEAD_UNLOCK(); |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
37879
diff
changeset
|
510 return result; |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
37879
diff
changeset
|
511 |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
37879
diff
changeset
|
512 Fail: |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
37879
diff
changeset
|
513 HEAD_UNLOCK(); |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
37879
diff
changeset
|
514 Py_DECREF(result); |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
37879
diff
changeset
|
515 return NULL; |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
37879
diff
changeset
|
516 } |
|
29643
fa97293533a9
Add PyThreadState_SetAsyncExc(long, PyObject *).
Guido van Rossum <guido@python.org>
parents:
28914
diff
changeset
|
517 |
|
28694
a4154dd5939a
New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents:
28616
diff
changeset
|
518 /* Python "auto thread state" API. */ |
|
a4154dd5939a
New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents:
28616
diff
changeset
|
519 #ifdef WITH_THREAD |
|
a4154dd5939a
New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents:
28616
diff
changeset
|
520 |
|
a4154dd5939a
New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents:
28616
diff
changeset
|
521 /* Keep this as a static, as it is not reliable! It can only |
|
a4154dd5939a
New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents:
28616
diff
changeset
|
522 ever be compared to the state for the *current* thread. |
|
a4154dd5939a
New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents:
28616
diff
changeset
|
523 * If not equal, then it doesn't matter that the actual |
|
a4154dd5939a
New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents:
28616
diff
changeset
|
524 value may change immediately after comparison, as it can't |
|
a4154dd5939a
New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents:
28616
diff
changeset
|
525 possibly change to the current thread's state. |
|
a4154dd5939a
New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents:
28616
diff
changeset
|
526 * If equal, then the current thread holds the lock, so the value can't |
|
a4154dd5939a
New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents:
28616
diff
changeset
|
527 change until we yield the lock. |
|
a4154dd5939a
New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents:
28616
diff
changeset
|
528 */ |
|
a4154dd5939a
New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents:
28616
diff
changeset
|
529 static int |
|
a4154dd5939a
New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents:
28616
diff
changeset
|
530 PyThreadState_IsCurrent(PyThreadState *tstate) |
|
a4154dd5939a
New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents:
28616
diff
changeset
|
531 { |
|
a4154dd5939a
New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents:
28616
diff
changeset
|
532 /* Must be the tstate for this thread */ |
|
a4154dd5939a
New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents:
28616
diff
changeset
|
533 assert(PyGILState_GetThisThreadState()==tstate); |
|
a4154dd5939a
New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents:
28616
diff
changeset
|
534 /* On Windows at least, simple reads and writes to 32 bit values |
|
a4154dd5939a
New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents:
28616
diff
changeset
|
535 are atomic. |
|
a4154dd5939a
New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents:
28616
diff
changeset
|
536 */ |
|
a4154dd5939a
New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents:
28616
diff
changeset
|
537 return tstate == _PyThreadState_Current; |
|
a4154dd5939a
New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents:
28616
diff
changeset
|
538 } |
|
a4154dd5939a
New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents:
28616
diff
changeset
|
539 |
|
33698
090ffcb83f0a
Trim trailing whitespace.
Tim Peters <tim.peters@gmail.com>
parents:
32301
diff
changeset
|
540 /* Internal initialization/finalization functions called by |
|
090ffcb83f0a
Trim trailing whitespace.
Tim Peters <tim.peters@gmail.com>
parents:
32301
diff
changeset
|
541 Py_Initialize/Py_Finalize |
|
28694
a4154dd5939a
New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents:
28616
diff
changeset
|
542 */ |
|
33699
0c26db381673
Style guide & consistency changes. No semantic changes.
Tim Peters <tim.peters@gmail.com>
parents:
33698
diff
changeset
|
543 void |
|
0c26db381673
Style guide & consistency changes. No semantic changes.
Tim Peters <tim.peters@gmail.com>
parents:
33698
diff
changeset
|
544 _PyGILState_Init(PyInterpreterState *i, PyThreadState *t) |
|
28694
a4154dd5939a
New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents:
28616
diff
changeset
|
545 { |
|
33699
0c26db381673
Style guide & consistency changes. No semantic changes.
Tim Peters <tim.peters@gmail.com>
parents:
33698
diff
changeset
|
546 assert(i && t); /* must init with valid states */ |
|
28694
a4154dd5939a
New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents:
28616
diff
changeset
|
547 autoTLSkey = PyThread_create_key(); |
|
a4154dd5939a
New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents:
28616
diff
changeset
|
548 autoInterpreterState = i; |
|
33706
4981ba54f43d
_PyGILState_Init(), PyGILState_Ensure(): Since PyThread_set_key_value()
Tim Peters <tim.peters@gmail.com>
parents:
33699
diff
changeset
|
549 assert(PyThread_get_key_value(autoTLSkey) == NULL); |
| 35117 | 550 assert(t->gilstate_counter == 0); |
| 551 | |
| 552 _PyGILState_NoteThreadState(t); | |
|
28694
a4154dd5939a
New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents:
28616
diff
changeset
|
553 } |
|
a4154dd5939a
New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents:
28616
diff
changeset
|
554 |
|
33699
0c26db381673
Style guide & consistency changes. No semantic changes.
Tim Peters <tim.peters@gmail.com>
parents:
33698
diff
changeset
|
555 void |
|
0c26db381673
Style guide & consistency changes. No semantic changes.
Tim Peters <tim.peters@gmail.com>
parents:
33698
diff
changeset
|
556 _PyGILState_Fini(void) |
|
28694
a4154dd5939a
New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents:
28616
diff
changeset
|
557 { |
|
a4154dd5939a
New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents:
28616
diff
changeset
|
558 PyThread_delete_key(autoTLSkey); |
|
a4154dd5939a
New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents:
28616
diff
changeset
|
559 autoTLSkey = 0; |
|
40450
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
39610
diff
changeset
|
560 autoInterpreterState = NULL; |
|
28694
a4154dd5939a
New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents:
28616
diff
changeset
|
561 } |
|
a4154dd5939a
New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents:
28616
diff
changeset
|
562 |
| 35117 | 563 /* When a thread state is created for a thread by some mechanism other than |
| 564 PyGILState_Ensure, it's important that the GILState machinery knows about | |
| 565 it so it doesn't try to create another thread state for the thread (this is | |
| 566 a better fix for SF bug #1010677 than the first one attempted). | |
| 567 */ | |
|
40450
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
39610
diff
changeset
|
568 static void |
| 35117 | 569 _PyGILState_NoteThreadState(PyThreadState* tstate) |
| 570 { | |
| 571 /* If autoTLSkey is 0, this must be the very first threadstate created | |
| 572 in Py_Initialize(). Don't do anything for now (we'll be back here | |
| 573 when _PyGILState_Init is called). */ | |
|
39442
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
37879
diff
changeset
|
574 if (!autoTLSkey) |
| 35117 | 575 return; |
|
39442
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
37879
diff
changeset
|
576 |
| 35117 | 577 /* Stick the thread state for this thread in thread local storage. |
| 578 | |
| 579 The only situation where you can legitimately have more than one | |
| 580 thread state for an OS level thread is when there are multiple | |
| 581 interpreters, when: | |
|
39442
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
37879
diff
changeset
|
582 |
| 35117 | 583 a) You shouldn't really be using the PyGILState_ APIs anyway, |
| 584 and: | |
| 585 | |
| 586 b) The slightly odd way PyThread_set_key_value works (see | |
| 587 comments by its implementation) means that the first thread | |
| 588 state created for that given OS level thread will "win", | |
| 589 which seems reasonable behaviour. | |
| 590 */ | |
| 591 if (PyThread_set_key_value(autoTLSkey, (void *)tstate) < 0) | |
| 592 Py_FatalError("Couldn't create autoTLSkey mapping"); | |
| 593 | |
| 594 /* PyGILState_Release must not try to delete this thread state. */ | |
| 595 tstate->gilstate_counter = 1; | |
| 596 } | |
| 597 | |
|
28694
a4154dd5939a
New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents:
28616
diff
changeset
|
598 /* The public functions */ |
|
33699
0c26db381673
Style guide & consistency changes. No semantic changes.
Tim Peters <tim.peters@gmail.com>
parents:
33698
diff
changeset
|
599 PyThreadState * |
|
0c26db381673
Style guide & consistency changes. No semantic changes.
Tim Peters <tim.peters@gmail.com>
parents:
33698
diff
changeset
|
600 PyGILState_GetThisThreadState(void) |
|
28694
a4154dd5939a
New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents:
28616
diff
changeset
|
601 { |
|
33699
0c26db381673
Style guide & consistency changes. No semantic changes.
Tim Peters <tim.peters@gmail.com>
parents:
33698
diff
changeset
|
602 if (autoInterpreterState == NULL || autoTLSkey == 0) |
|
28694
a4154dd5939a
New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents:
28616
diff
changeset
|
603 return NULL; |
|
33699
0c26db381673
Style guide & consistency changes. No semantic changes.
Tim Peters <tim.peters@gmail.com>
parents:
33698
diff
changeset
|
604 return (PyThreadState *)PyThread_get_key_value(autoTLSkey); |
|
28694
a4154dd5939a
New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents:
28616
diff
changeset
|
605 } |
|
a4154dd5939a
New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents:
28616
diff
changeset
|
606 |
|
33699
0c26db381673
Style guide & consistency changes. No semantic changes.
Tim Peters <tim.peters@gmail.com>
parents:
33698
diff
changeset
|
607 PyGILState_STATE |
|
0c26db381673
Style guide & consistency changes. No semantic changes.
Tim Peters <tim.peters@gmail.com>
parents:
33698
diff
changeset
|
608 PyGILState_Ensure(void) |
|
28694
a4154dd5939a
New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents:
28616
diff
changeset
|
609 { |
|
a4154dd5939a
New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents:
28616
diff
changeset
|
610 int current; |
|
a4154dd5939a
New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents:
28616
diff
changeset
|
611 PyThreadState *tcur; |
|
33698
090ffcb83f0a
Trim trailing whitespace.
Tim Peters <tim.peters@gmail.com>
parents:
32301
diff
changeset
|
612 /* Note that we do not auto-init Python here - apart from |
|
090ffcb83f0a
Trim trailing whitespace.
Tim Peters <tim.peters@gmail.com>
parents:
32301
diff
changeset
|
613 potential races with 2 threads auto-initializing, pep-311 |
|
28694
a4154dd5939a
New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents:
28616
diff
changeset
|
614 spells out other issues. Embedders are expected to have |
|
a4154dd5939a
New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents:
28616
diff
changeset
|
615 called Py_Initialize() and usually PyEval_InitThreads(). |
|
a4154dd5939a
New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents:
28616
diff
changeset
|
616 */ |
|
a4154dd5939a
New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents:
28616
diff
changeset
|
617 assert(autoInterpreterState); /* Py_Initialize() hasn't been called! */ |
|
37879
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
36683
diff
changeset
|
618 tcur = (PyThreadState *)PyThread_get_key_value(autoTLSkey); |
|
33699
0c26db381673
Style guide & consistency changes. No semantic changes.
Tim Peters <tim.peters@gmail.com>
parents:
33698
diff
changeset
|
619 if (tcur == NULL) { |
|
28694
a4154dd5939a
New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents:
28616
diff
changeset
|
620 /* Create a new thread state for this thread */ |
|
a4154dd5939a
New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents:
28616
diff
changeset
|
621 tcur = PyThreadState_New(autoInterpreterState); |
|
33699
0c26db381673
Style guide & consistency changes. No semantic changes.
Tim Peters <tim.peters@gmail.com>
parents:
33698
diff
changeset
|
622 if (tcur == NULL) |
|
28694
a4154dd5939a
New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents:
28616
diff
changeset
|
623 Py_FatalError("Couldn't create thread-state for new thread"); |
| 35117 | 624 /* This is our thread state! We'll need to delete it in the |
| 625 matching call to PyGILState_Release(). */ | |
| 626 tcur->gilstate_counter = 0; | |
|
28694
a4154dd5939a
New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents:
28616
diff
changeset
|
627 current = 0; /* new thread state is never current */ |
|
33699
0c26db381673
Style guide & consistency changes. No semantic changes.
Tim Peters <tim.peters@gmail.com>
parents:
33698
diff
changeset
|
628 } |
|
0c26db381673
Style guide & consistency changes. No semantic changes.
Tim Peters <tim.peters@gmail.com>
parents:
33698
diff
changeset
|
629 else |
|
28694
a4154dd5939a
New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents:
28616
diff
changeset
|
630 current = PyThreadState_IsCurrent(tcur); |
|
33699
0c26db381673
Style guide & consistency changes. No semantic changes.
Tim Peters <tim.peters@gmail.com>
parents:
33698
diff
changeset
|
631 if (current == 0) |
|
28694
a4154dd5939a
New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents:
28616
diff
changeset
|
632 PyEval_RestoreThread(tcur); |
|
a4154dd5939a
New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents:
28616
diff
changeset
|
633 /* Update our counter in the thread-state - no need for locks: |
|
a4154dd5939a
New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents:
28616
diff
changeset
|
634 - tcur will remain valid as we hold the GIL. |
|
33698
090ffcb83f0a
Trim trailing whitespace.
Tim Peters <tim.peters@gmail.com>
parents:
32301
diff
changeset
|
635 - the counter is safe as we are the only thread "allowed" |
|
28694
a4154dd5939a
New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents:
28616
diff
changeset
|
636 to modify this value |
|
a4154dd5939a
New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents:
28616
diff
changeset
|
637 */ |
|
33699
0c26db381673
Style guide & consistency changes. No semantic changes.
Tim Peters <tim.peters@gmail.com>
parents:
33698
diff
changeset
|
638 ++tcur->gilstate_counter; |
|
28694
a4154dd5939a
New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents:
28616
diff
changeset
|
639 return current ? PyGILState_LOCKED : PyGILState_UNLOCKED; |
|
a4154dd5939a
New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents:
28616
diff
changeset
|
640 } |
|
a4154dd5939a
New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents:
28616
diff
changeset
|
641 |
|
33699
0c26db381673
Style guide & consistency changes. No semantic changes.
Tim Peters <tim.peters@gmail.com>
parents:
33698
diff
changeset
|
642 void |
|
0c26db381673
Style guide & consistency changes. No semantic changes.
Tim Peters <tim.peters@gmail.com>
parents:
33698
diff
changeset
|
643 PyGILState_Release(PyGILState_STATE oldstate) |
|
28694
a4154dd5939a
New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents:
28616
diff
changeset
|
644 { |
|
37879
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
36683
diff
changeset
|
645 PyThreadState *tcur = (PyThreadState *)PyThread_get_key_value( |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
36683
diff
changeset
|
646 autoTLSkey); |
|
33699
0c26db381673
Style guide & consistency changes. No semantic changes.
Tim Peters <tim.peters@gmail.com>
parents:
33698
diff
changeset
|
647 if (tcur == NULL) |
|
28694
a4154dd5939a
New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents:
28616
diff
changeset
|
648 Py_FatalError("auto-releasing thread-state, " |
|
a4154dd5939a
New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents:
28616
diff
changeset
|
649 "but no thread-state for this thread"); |
|
a4154dd5939a
New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents:
28616
diff
changeset
|
650 /* We must hold the GIL and have our thread state current */ |
|
a4154dd5939a
New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents:
28616
diff
changeset
|
651 /* XXX - remove the check - the assert should be fine, |
|
33698
090ffcb83f0a
Trim trailing whitespace.
Tim Peters <tim.peters@gmail.com>
parents:
32301
diff
changeset
|
652 but while this is very new (April 2003), the extra check |
|
28694
a4154dd5939a
New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents:
28616
diff
changeset
|
653 by release-only users can't hurt. |
|
a4154dd5939a
New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents:
28616
diff
changeset
|
654 */ |
|
33699
0c26db381673
Style guide & consistency changes. No semantic changes.
Tim Peters <tim.peters@gmail.com>
parents:
33698
diff
changeset
|
655 if (! PyThreadState_IsCurrent(tcur)) |
|
28694
a4154dd5939a
New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents:
28616
diff
changeset
|
656 Py_FatalError("This thread state must be current when releasing"); |
|
33699
0c26db381673
Style guide & consistency changes. No semantic changes.
Tim Peters <tim.peters@gmail.com>
parents:
33698
diff
changeset
|
657 assert(PyThreadState_IsCurrent(tcur)); |
|
0c26db381673
Style guide & consistency changes. No semantic changes.
Tim Peters <tim.peters@gmail.com>
parents:
33698
diff
changeset
|
658 --tcur->gilstate_counter; |
|
0c26db381673
Style guide & consistency changes. No semantic changes.
Tim Peters <tim.peters@gmail.com>
parents:
33698
diff
changeset
|
659 assert(tcur->gilstate_counter >= 0); /* illegal counter value */ |
|
28694
a4154dd5939a
New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents:
28616
diff
changeset
|
660 |
|
33940
dfd07b7be407
SF bug 1061968: threads: segfault or Py_FatalError at exit
Tim Peters <tim.peters@gmail.com>
parents:
33714
diff
changeset
|
661 /* If we're going to destroy this thread-state, we must |
|
dfd07b7be407
SF bug 1061968: threads: segfault or Py_FatalError at exit
Tim Peters <tim.peters@gmail.com>
parents:
33714
diff
changeset
|
662 * clear it while the GIL is held, as destructors may run. |
|
dfd07b7be407
SF bug 1061968: threads: segfault or Py_FatalError at exit
Tim Peters <tim.peters@gmail.com>
parents:
33714
diff
changeset
|
663 */ |
|
33699
0c26db381673
Style guide & consistency changes. No semantic changes.
Tim Peters <tim.peters@gmail.com>
parents:
33698
diff
changeset
|
664 if (tcur->gilstate_counter == 0) { |
|
28694
a4154dd5939a
New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents:
28616
diff
changeset
|
665 /* can't have been locked when we created it */ |
|
33699
0c26db381673
Style guide & consistency changes. No semantic changes.
Tim Peters <tim.peters@gmail.com>
parents:
33698
diff
changeset
|
666 assert(oldstate == PyGILState_UNLOCKED); |
|
28694
a4154dd5939a
New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents:
28616
diff
changeset
|
667 PyThreadState_Clear(tcur); |
|
33940
dfd07b7be407
SF bug 1061968: threads: segfault or Py_FatalError at exit
Tim Peters <tim.peters@gmail.com>
parents:
33714
diff
changeset
|
668 /* Delete the thread-state. Note this releases the GIL too! |
|
dfd07b7be407
SF bug 1061968: threads: segfault or Py_FatalError at exit
Tim Peters <tim.peters@gmail.com>
parents:
33714
diff
changeset
|
669 * It's vital that the GIL be held here, to avoid shutdown |
|
dfd07b7be407
SF bug 1061968: threads: segfault or Py_FatalError at exit
Tim Peters <tim.peters@gmail.com>
parents:
33714
diff
changeset
|
670 * races; see bugs 225673 and 1061968 (that nasty bug has a |
|
dfd07b7be407
SF bug 1061968: threads: segfault or Py_FatalError at exit
Tim Peters <tim.peters@gmail.com>
parents:
33714
diff
changeset
|
671 * habit of coming back). |
|
dfd07b7be407
SF bug 1061968: threads: segfault or Py_FatalError at exit
Tim Peters <tim.peters@gmail.com>
parents:
33714
diff
changeset
|
672 */ |
|
dfd07b7be407
SF bug 1061968: threads: segfault or Py_FatalError at exit
Tim Peters <tim.peters@gmail.com>
parents:
33714
diff
changeset
|
673 PyThreadState_DeleteCurrent(); |
|
28694
a4154dd5939a
New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents:
28616
diff
changeset
|
674 } |
|
a4154dd5939a
New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents:
28616
diff
changeset
|
675 /* Release the lock if necessary */ |
|
33940
dfd07b7be407
SF bug 1061968: threads: segfault or Py_FatalError at exit
Tim Peters <tim.peters@gmail.com>
parents:
33714
diff
changeset
|
676 else if (oldstate == PyGILState_UNLOCKED) |
|
34928
9857daa22807
Backport my recent fix (rev. 2.40 of Python/pystate.c):
Michael W. Hudson <mwh@python.net>
parents:
34568
diff
changeset
|
677 PyEval_SaveThread(); |
|
28694
a4154dd5939a
New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents:
28616
diff
changeset
|
678 } |
|
37879
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
36683
diff
changeset
|
679 |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
36683
diff
changeset
|
680 #ifdef __cplusplus |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
36683
diff
changeset
|
681 } |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
36683
diff
changeset
|
682 #endif |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
36683
diff
changeset
|
683 |
|
28694
a4154dd5939a
New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents:
28616
diff
changeset
|
684 #endif /* WITH_THREAD */ |
|
37879
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
36683
diff
changeset
|
685 |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
36683
diff
changeset
|
686 |
