annotate Python/pystate.c @ 49613:efef5fc45a9a

Issue 3723: Fixed initialization of subinterpreters The patch fixes several issues with Py_NewInterpreter as well as the demo for multiple subinterpreters. Most of the patch was written by MvL with help from Benjamin, Amaury and me. Graham Dumpleton has verified that this patch fixes an issue with mod_wsgi.
author Christian Heimes <christian@cheimes.de>
date Thu, 30 Oct 2008 21:48:26 +0000
parents 7779af388aec
children 620a34dc10f9
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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
3b3c7b8ade7f CRITICAL PATCH!
Guido van Rossum <guido@python.org>
parents: 9667
diff changeset
26 #ifdef WITH_THREAD
3b3c7b8ade7f CRITICAL PATCH!
Guido van Rossum <guido@python.org>
parents: 9667
diff changeset
27 #include "pythread.h"
3b3c7b8ade7f CRITICAL PATCH!
Guido van Rossum <guido@python.org>
parents: 9667
diff changeset
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
3b3c7b8ade7f CRITICAL PATCH!
Guido van Rossum <guido@python.org>
parents: 9667
diff changeset
30 #define HEAD_LOCK() PyThread_acquire_lock(head_mutex, WAIT_LOCK)
3b3c7b8ade7f CRITICAL PATCH!
Guido van Rossum <guido@python.org>
parents: 9667
diff changeset
31 #define HEAD_UNLOCK() PyThread_release_lock(head_mutex)
35117
7ea2be2c0e1d Fix bug:
Michael W. Hudson <mwh@python.net>
parents: 35095
diff changeset
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
7ea2be2c0e1d Fix bug:
Michael W. Hudson <mwh@python.net>
parents: 35095
diff changeset
37 /* The single PyInterpreterState used by this process'
7ea2be2c0e1d Fix bug:
Michael W. Hudson <mwh@python.net>
parents: 35095
diff changeset
38 GILState implementation
7ea2be2c0e1d Fix bug:
Michael W. Hudson <mwh@python.net>
parents: 35095
diff changeset
39 */
7ea2be2c0e1d Fix bug:
Michael W. Hudson <mwh@python.net>
parents: 35095
diff changeset
40 static PyInterpreterState *autoInterpreterState = NULL;
7ea2be2c0e1d Fix bug:
Michael W. Hudson <mwh@python.net>
parents: 35095
diff changeset
41 static int autoTLSkey = 0;
11011
3b3c7b8ade7f CRITICAL PATCH!
Guido van Rossum <guido@python.org>
parents: 9667
diff changeset
42 #else
3b3c7b8ade7f CRITICAL PATCH!
Guido van Rossum <guido@python.org>
parents: 9667
diff changeset
43 #define HEAD_INIT() /* Nothing */
3b3c7b8ade7f CRITICAL PATCH!
Guido van Rossum <guido@python.org>
parents: 9667
diff changeset
44 #define HEAD_LOCK() /* Nothing */
3b3c7b8ade7f CRITICAL PATCH!
Guido van Rossum <guido@python.org>
parents: 9667
diff changeset
45 #define HEAD_UNLOCK() /* Nothing */
3b3c7b8ade7f CRITICAL PATCH!
Guido van Rossum <guido@python.org>
parents: 9667
diff changeset
46 #endif
3b3c7b8ade7f CRITICAL PATCH!
Guido van Rossum <guido@python.org>
parents: 9667
diff changeset
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
85651eb3d9a9 Forward port bugfix:
Michael W. Hudson <mwh@python.net>
parents: 35117
diff changeset
53 #ifdef WITH_THREAD
35117
7ea2be2c0e1d Fix bug:
Michael W. Hudson <mwh@python.net>
parents: 35095
diff changeset
54 static void _PyGILState_NoteThreadState(PyThreadState* tstate);
35661
85651eb3d9a9 Forward port bugfix:
Michael W. Hudson <mwh@python.net>
parents: 35117
diff changeset
55 #endif
35117
7ea2be2c0e1d Fix bug:
Michael W. Hudson <mwh@python.net>
parents: 35095
diff changeset
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
3b3c7b8ade7f CRITICAL PATCH!
Guido van Rossum <guido@python.org>
parents: 9667
diff changeset
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
3b3c7b8ade7f CRITICAL PATCH!
Guido van Rossum <guido@python.org>
parents: 9667
diff changeset
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
3b3c7b8ade7f CRITICAL PATCH!
Guido van Rossum <guido@python.org>
parents: 9667
diff changeset
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
3b3c7b8ade7f CRITICAL PATCH!
Guido van Rossum <guido@python.org>
parents: 9667
diff changeset
123 PyThreadState *p;
3b3c7b8ade7f CRITICAL PATCH!
Guido van Rossum <guido@python.org>
parents: 9667
diff changeset
124 /* No need to lock the mutex here because this should only happen
3b3c7b8ade7f CRITICAL PATCH!
Guido van Rossum <guido@python.org>
parents: 9667
diff changeset
125 when the threads are all really dead (XXX famous last words). */
3b3c7b8ade7f CRITICAL PATCH!
Guido van Rossum <guido@python.org>
parents: 9667
diff changeset
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
85651eb3d9a9 Forward port bugfix:
Michael W. Hudson <mwh@python.net>
parents: 35117
diff changeset
201 #ifdef WITH_THREAD
35117
7ea2be2c0e1d Fix bug:
Michael W. Hudson <mwh@python.net>
parents: 35095
diff changeset
202 _PyGILState_NoteThreadState(tstate);
35661
85651eb3d9a9 Forward port bugfix:
Michael W. Hudson <mwh@python.net>
parents: 35117
diff changeset
203 #endif
35117
7ea2be2c0e1d Fix bug:
Michael W. Hudson <mwh@python.net>
parents: 35095
diff changeset
204
11011
3b3c7b8ade7f CRITICAL PATCH!
Guido van Rossum <guido@python.org>
parents: 9667
diff changeset
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
3b3c7b8ade7f CRITICAL PATCH!
Guido van Rossum <guido@python.org>
parents: 9667
diff changeset
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) {
94f64f11fdd0 Implement PEP 3121: new module initialization and finalization API.
Martin v. Löwis <martin@v.loewis.de>
parents: 44834
diff changeset
237 state->modules_by_index = PyList_New(20);
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
3b3c7b8ade7f CRITICAL PATCH!
Guido van Rossum <guido@python.org>
parents: 9667
diff changeset
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
3b3c7b8ade7f CRITICAL PATCH!
Guido van Rossum <guido@python.org>
parents: 9667
diff changeset
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
7ea2be2c0e1d Fix bug:
Michael W. Hudson <mwh@python.net>
parents: 35095
diff changeset
338 if (autoTLSkey && PyThread_get_key_value(autoTLSkey) == tstate)
7ea2be2c0e1d Fix bug:
Michael W. Hudson <mwh@python.net>
parents: 35095
diff changeset
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
ff3ca656c281 Backport 2.39:
Guido van Rossum <guido@python.org>
parents: 33940
diff changeset
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
ff3ca656c281 Backport 2.39:
Guido van Rossum <guido@python.org>
parents: 33940
diff changeset
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);
3674f20ac781 Merge current trunk into p3yk. This includes the PyNumber_Index API change,
Thomas Wouters <thomas@python.org>
parents: 39442
diff changeset
437 return 1;
3674f20ac781 Merge current trunk into p3yk. This includes the PyNumber_Index API change,
Thomas Wouters <thomas@python.org>
parents: 39442
diff changeset
438 }
29643
fa97293533a9 Add PyThreadState_SetAsyncExc(long, PyObject *).
Guido van Rossum <guido@python.org>
parents: 28914
diff changeset
439 }
34568
ff3ca656c281 Backport 2.39:
Guido van Rossum <guido@python.org>
parents: 33940
diff changeset
440 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
441 return 0;
29643
fa97293533a9 Add PyThreadState_SetAsyncExc(long, PyObject *).
Guido van Rossum <guido@python.org>
parents: 28914
diff changeset
442 }
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
18733
b0329649b8cf Add a low-level API to access interpreters, for David Beazley.
Guido van Rossum <guido@python.org>
parents: 18689
diff changeset
445 /* 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
446 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
447
b0329649b8cf Add a low-level API to access interpreters, for David Beazley.
Guido van Rossum <guido@python.org>
parents: 18689
diff changeset
448 PyInterpreterState *
b0329649b8cf Add a low-level API to access interpreters, for David Beazley.
Guido van Rossum <guido@python.org>
parents: 18689
diff changeset
449 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
450 {
b0329649b8cf Add a low-level API to access interpreters, for David Beazley.
Guido van Rossum <guido@python.org>
parents: 18689
diff changeset
451 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
452 }
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 PyInterpreterState *
b0329649b8cf Add a low-level API to access interpreters, for David Beazley.
Guido van Rossum <guido@python.org>
parents: 18689
diff changeset
455 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
456 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
457 }
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 PyThreadState *
b0329649b8cf Add a low-level API to access interpreters, for David Beazley.
Guido van Rossum <guido@python.org>
parents: 18689
diff changeset
460 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
461 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
462 }
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 PyThreadState *
b0329649b8cf Add a low-level API to access interpreters, for David Beazley.
Guido van Rossum <guido@python.org>
parents: 18689
diff changeset
465 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
466 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
467 }
28694
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 28616
diff changeset
468
39442
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 37879
diff changeset
469 /* 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
470 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
471 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
472 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
473 */
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 37879
diff changeset
474 PyObject *
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 37879
diff changeset
475 _PyThread_CurrentFrames(void)
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 37879
diff changeset
476 {
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 37879
diff changeset
477 PyObject *result;
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 37879
diff changeset
478 PyInterpreterState *i;
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 37879
diff changeset
479
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 37879
diff changeset
480 result = PyDict_New();
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 37879
diff changeset
481 if (result == NULL)
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 37879
diff changeset
482 return NULL;
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 37879
diff changeset
483
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 37879
diff changeset
484 /* for i in all interpreters:
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 37879
diff changeset
485 * 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
486 * 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
487 * 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
488 * 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
489 */
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 37879
diff changeset
490 HEAD_LOCK();
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 37879
diff changeset
491 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
492 PyThreadState *t;
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 37879
diff changeset
493 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
494 PyObject *id;
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 37879
diff changeset
495 int stat;
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 37879
diff changeset
496 struct _frame *frame = t->frame;
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 37879
diff changeset
497 if (frame == NULL)
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 37879
diff changeset
498 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
499 id = PyLong_FromLong(t->thread_id);
39442
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 37879
diff changeset
500 if (id == NULL)
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 37879
diff changeset
501 goto Fail;
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 37879
diff changeset
502 stat = PyDict_SetItem(result, id, (PyObject *)frame);
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 37879
diff changeset
503 Py_DECREF(id);
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 37879
diff changeset
504 if (stat < 0)
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 37879
diff changeset
505 goto Fail;
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 37879
diff changeset
506 }
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 HEAD_UNLOCK();
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 37879
diff changeset
509 return result;
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 37879
diff changeset
510
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 37879
diff changeset
511 Fail:
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 37879
diff changeset
512 HEAD_UNLOCK();
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 37879
diff changeset
513 Py_DECREF(result);
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 37879
diff changeset
514 return NULL;
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 37879
diff changeset
515 }
29643
fa97293533a9 Add PyThreadState_SetAsyncExc(long, PyObject *).
Guido van Rossum <guido@python.org>
parents: 28914
diff changeset
516
28694
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 28616
diff changeset
517 /* 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
518 #ifdef WITH_THREAD
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 28616
diff changeset
519
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 28616
diff changeset
520 /* 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
521 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
522 * 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
523 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
524 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
525 * 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
526 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
527 */
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 28616
diff changeset
528 static int
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 28616
diff changeset
529 PyThreadState_IsCurrent(PyThreadState *tstate)
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 28616
diff changeset
530 {
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 28616
diff changeset
531 /* 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
532 assert(PyGILState_GetThisThreadState()==tstate);
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 28616
diff changeset
533 /* 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
534 are atomic.
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 28616
diff changeset
535 */
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 28616
diff changeset
536 return tstate == _PyThreadState_Current;
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 28616
diff changeset
537 }
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 28616
diff changeset
538
33698
090ffcb83f0a Trim trailing whitespace.
Tim Peters <tim.peters@gmail.com>
parents: 32301
diff changeset
539 /* Internal initialization/finalization functions called by
090ffcb83f0a Trim trailing whitespace.
Tim Peters <tim.peters@gmail.com>
parents: 32301
diff changeset
540 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
541 */
33699
0c26db381673 Style guide & consistency changes. No semantic changes.
Tim Peters <tim.peters@gmail.com>
parents: 33698
diff changeset
542 void
0c26db381673 Style guide & consistency changes. No semantic changes.
Tim Peters <tim.peters@gmail.com>
parents: 33698
diff changeset
543 _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
544 {
33699
0c26db381673 Style guide & consistency changes. No semantic changes.
Tim Peters <tim.peters@gmail.com>
parents: 33698
diff changeset
545 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
546 autoTLSkey = PyThread_create_key();
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 28616
diff changeset
547 autoInterpreterState = i;
33706
4981ba54f43d _PyGILState_Init(), PyGILState_Ensure(): Since PyThread_set_key_value()
Tim Peters <tim.peters@gmail.com>
parents: 33699
diff changeset
548 assert(PyThread_get_key_value(autoTLSkey) == NULL);
35117
7ea2be2c0e1d Fix bug:
Michael W. Hudson <mwh@python.net>
parents: 35095
diff changeset
549 assert(t->gilstate_counter == 0);
7ea2be2c0e1d Fix bug:
Michael W. Hudson <mwh@python.net>
parents: 35095
diff changeset
550
7ea2be2c0e1d Fix bug:
Michael W. Hudson <mwh@python.net>
parents: 35095
diff changeset
551 _PyGILState_NoteThreadState(t);
28694
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 28616
diff changeset
552 }
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 28616
diff changeset
553
33699
0c26db381673 Style guide & consistency changes. No semantic changes.
Tim Peters <tim.peters@gmail.com>
parents: 33698
diff changeset
554 void
0c26db381673 Style guide & consistency changes. No semantic changes.
Tim Peters <tim.peters@gmail.com>
parents: 33698
diff changeset
555 _PyGILState_Fini(void)
28694
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 28616
diff changeset
556 {
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 28616
diff changeset
557 PyThread_delete_key(autoTLSkey);
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 28616
diff changeset
558 autoTLSkey = 0;
40450
cc992d75d5b3 Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents: 39610
diff changeset
559 autoInterpreterState = NULL;
28694
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 28616
diff changeset
560 }
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 28616
diff changeset
561
35117
7ea2be2c0e1d Fix bug:
Michael W. Hudson <mwh@python.net>
parents: 35095
diff changeset
562 /* When a thread state is created for a thread by some mechanism other than
7ea2be2c0e1d Fix bug:
Michael W. Hudson <mwh@python.net>
parents: 35095
diff changeset
563 PyGILState_Ensure, it's important that the GILState machinery knows about
7ea2be2c0e1d Fix bug:
Michael W. Hudson <mwh@python.net>
parents: 35095
diff changeset
564 it so it doesn't try to create another thread state for the thread (this is
7ea2be2c0e1d Fix bug:
Michael W. Hudson <mwh@python.net>
parents: 35095
diff changeset
565 a better fix for SF bug #1010677 than the first one attempted).
7ea2be2c0e1d Fix bug:
Michael W. Hudson <mwh@python.net>
parents: 35095
diff changeset
566 */
40450
cc992d75d5b3 Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents: 39610
diff changeset
567 static void
35117
7ea2be2c0e1d Fix bug:
Michael W. Hudson <mwh@python.net>
parents: 35095
diff changeset
568 _PyGILState_NoteThreadState(PyThreadState* tstate)
7ea2be2c0e1d Fix bug:
Michael W. Hudson <mwh@python.net>
parents: 35095
diff changeset
569 {
7ea2be2c0e1d Fix bug:
Michael W. Hudson <mwh@python.net>
parents: 35095
diff changeset
570 /* If autoTLSkey is 0, this must be the very first threadstate created
7ea2be2c0e1d Fix bug:
Michael W. Hudson <mwh@python.net>
parents: 35095
diff changeset
571 in Py_Initialize(). Don't do anything for now (we'll be back here
7ea2be2c0e1d Fix bug:
Michael W. Hudson <mwh@python.net>
parents: 35095
diff changeset
572 when _PyGILState_Init is called). */
39442
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 37879
diff changeset
573 if (!autoTLSkey)
35117
7ea2be2c0e1d Fix bug:
Michael W. Hudson <mwh@python.net>
parents: 35095
diff changeset
574 return;
39442
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 37879
diff changeset
575
35117
7ea2be2c0e1d Fix bug:
Michael W. Hudson <mwh@python.net>
parents: 35095
diff changeset
576 /* Stick the thread state for this thread in thread local storage.
7ea2be2c0e1d Fix bug:
Michael W. Hudson <mwh@python.net>
parents: 35095
diff changeset
577
7ea2be2c0e1d Fix bug:
Michael W. Hudson <mwh@python.net>
parents: 35095
diff changeset
578 The only situation where you can legitimately have more than one
7ea2be2c0e1d Fix bug:
Michael W. Hudson <mwh@python.net>
parents: 35095
diff changeset
579 thread state for an OS level thread is when there are multiple
7ea2be2c0e1d Fix bug:
Michael W. Hudson <mwh@python.net>
parents: 35095
diff changeset
580 interpreters, when:
39442
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 37879
diff changeset
581
35117
7ea2be2c0e1d Fix bug:
Michael W. Hudson <mwh@python.net>
parents: 35095
diff changeset
582 a) You shouldn't really be using the PyGILState_ APIs anyway,
7ea2be2c0e1d Fix bug:
Michael W. Hudson <mwh@python.net>
parents: 35095
diff changeset
583 and:
7ea2be2c0e1d Fix bug:
Michael W. Hudson <mwh@python.net>
parents: 35095
diff changeset
584
7ea2be2c0e1d Fix bug:
Michael W. Hudson <mwh@python.net>
parents: 35095
diff changeset
585 b) The slightly odd way PyThread_set_key_value works (see
7ea2be2c0e1d Fix bug:
Michael W. Hudson <mwh@python.net>
parents: 35095
diff changeset
586 comments by its implementation) means that the first thread
7ea2be2c0e1d Fix bug:
Michael W. Hudson <mwh@python.net>
parents: 35095
diff changeset
587 state created for that given OS level thread will "win",
7ea2be2c0e1d Fix bug:
Michael W. Hudson <mwh@python.net>
parents: 35095
diff changeset
588 which seems reasonable behaviour.
7ea2be2c0e1d Fix bug:
Michael W. Hudson <mwh@python.net>
parents: 35095
diff changeset
589 */
7ea2be2c0e1d Fix bug:
Michael W. Hudson <mwh@python.net>
parents: 35095
diff changeset
590 if (PyThread_set_key_value(autoTLSkey, (void *)tstate) < 0)
7ea2be2c0e1d Fix bug:
Michael W. Hudson <mwh@python.net>
parents: 35095
diff changeset
591 Py_FatalError("Couldn't create autoTLSkey mapping");
7ea2be2c0e1d Fix bug:
Michael W. Hudson <mwh@python.net>
parents: 35095
diff changeset
592
7ea2be2c0e1d Fix bug:
Michael W. Hudson <mwh@python.net>
parents: 35095
diff changeset
593 /* PyGILState_Release must not try to delete this thread state. */
7ea2be2c0e1d Fix bug:
Michael W. Hudson <mwh@python.net>
parents: 35095
diff changeset
594 tstate->gilstate_counter = 1;
7ea2be2c0e1d Fix bug:
Michael W. Hudson <mwh@python.net>
parents: 35095
diff changeset
595 }
7ea2be2c0e1d Fix bug:
Michael W. Hudson <mwh@python.net>
parents: 35095
diff changeset
596
28694
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 28616
diff changeset
597 /* The public functions */
33699
0c26db381673 Style guide & consistency changes. No semantic changes.
Tim Peters <tim.peters@gmail.com>
parents: 33698
diff changeset
598 PyThreadState *
0c26db381673 Style guide & consistency changes. No semantic changes.
Tim Peters <tim.peters@gmail.com>
parents: 33698
diff changeset
599 PyGILState_GetThisThreadState(void)
28694
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 28616
diff changeset
600 {
33699
0c26db381673 Style guide & consistency changes. No semantic changes.
Tim Peters <tim.peters@gmail.com>
parents: 33698
diff changeset
601 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
602 return NULL;
33699
0c26db381673 Style guide & consistency changes. No semantic changes.
Tim Peters <tim.peters@gmail.com>
parents: 33698
diff changeset
603 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
604 }
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 28616
diff changeset
605
33699
0c26db381673 Style guide & consistency changes. No semantic changes.
Tim Peters <tim.peters@gmail.com>
parents: 33698
diff changeset
606 PyGILState_STATE
0c26db381673 Style guide & consistency changes. No semantic changes.
Tim Peters <tim.peters@gmail.com>
parents: 33698
diff changeset
607 PyGILState_Ensure(void)
28694
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 28616
diff changeset
608 {
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 28616
diff changeset
609 int current;
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 28616
diff changeset
610 PyThreadState *tcur;
33698
090ffcb83f0a Trim trailing whitespace.
Tim Peters <tim.peters@gmail.com>
parents: 32301
diff changeset
611 /* 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
612 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
613 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
614 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
615 */
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 28616
diff changeset
616 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
617 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
618 if (tcur == NULL) {
28694
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 28616
diff changeset
619 /* 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
620 tcur = PyThreadState_New(autoInterpreterState);
33699
0c26db381673 Style guide & consistency changes. No semantic changes.
Tim Peters <tim.peters@gmail.com>
parents: 33698
diff changeset
621 if (tcur == NULL)
28694
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 28616
diff changeset
622 Py_FatalError("Couldn't create thread-state for new thread");
35117
7ea2be2c0e1d Fix bug:
Michael W. Hudson <mwh@python.net>
parents: 35095
diff changeset
623 /* This is our thread state! We'll need to delete it in the
7ea2be2c0e1d Fix bug:
Michael W. Hudson <mwh@python.net>
parents: 35095
diff changeset
624 matching call to PyGILState_Release(). */
7ea2be2c0e1d Fix bug:
Michael W. Hudson <mwh@python.net>
parents: 35095
diff changeset
625 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
626 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
627 }
0c26db381673 Style guide & consistency changes. No semantic changes.
Tim Peters <tim.peters@gmail.com>
parents: 33698
diff changeset
628 else
28694
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 28616
diff changeset
629 current = PyThreadState_IsCurrent(tcur);
33699
0c26db381673 Style guide & consistency changes. No semantic changes.
Tim Peters <tim.peters@gmail.com>
parents: 33698
diff changeset
630 if (current == 0)
28694
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 28616
diff changeset
631 PyEval_RestoreThread(tcur);
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 28616
diff changeset
632 /* 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
633 - tcur will remain valid as we hold the GIL.
33698
090ffcb83f0a Trim trailing whitespace.
Tim Peters <tim.peters@gmail.com>
parents: 32301
diff changeset
634 - 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
635 to modify this value
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 28616
diff changeset
636 */
33699
0c26db381673 Style guide & consistency changes. No semantic changes.
Tim Peters <tim.peters@gmail.com>
parents: 33698
diff changeset
637 ++tcur->gilstate_counter;
28694
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 28616
diff changeset
638 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
639 }
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 28616
diff changeset
640
33699
0c26db381673 Style guide & consistency changes. No semantic changes.
Tim Peters <tim.peters@gmail.com>
parents: 33698
diff changeset
641 void
0c26db381673 Style guide & consistency changes. No semantic changes.
Tim Peters <tim.peters@gmail.com>
parents: 33698
diff changeset
642 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
643 {
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
644 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
645 autoTLSkey);
33699
0c26db381673 Style guide & consistency changes. No semantic changes.
Tim Peters <tim.peters@gmail.com>
parents: 33698
diff changeset
646 if (tcur == NULL)
28694
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 28616
diff changeset
647 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
648 "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
649 /* 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
650 /* XXX - remove the check - the assert should be fine,
33698
090ffcb83f0a Trim trailing whitespace.
Tim Peters <tim.peters@gmail.com>
parents: 32301
diff changeset
651 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
652 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
653 */
33699
0c26db381673 Style guide & consistency changes. No semantic changes.
Tim Peters <tim.peters@gmail.com>
parents: 33698
diff changeset
654 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
655 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
656 assert(PyThreadState_IsCurrent(tcur));
0c26db381673 Style guide & consistency changes. No semantic changes.
Tim Peters <tim.peters@gmail.com>
parents: 33698
diff changeset
657 --tcur->gilstate_counter;
0c26db381673 Style guide & consistency changes. No semantic changes.
Tim Peters <tim.peters@gmail.com>
parents: 33698
diff changeset
658 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
659
33940
dfd07b7be407 SF bug 1061968: threads: segfault or Py_FatalError at exit
Tim Peters <tim.peters@gmail.com>
parents: 33714
diff changeset
660 /* 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
661 * 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
662 */
33699
0c26db381673 Style guide & consistency changes. No semantic changes.
Tim Peters <tim.peters@gmail.com>
parents: 33698
diff changeset
663 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
664 /* 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
665 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
666 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
667 /* 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
668 * 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
669 * 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
670 * 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
671 */
dfd07b7be407 SF bug 1061968: threads: segfault or Py_FatalError at exit
Tim Peters <tim.peters@gmail.com>
parents: 33714
diff changeset
672 PyThreadState_DeleteCurrent();
28694
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 28616
diff changeset
673 }
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 28616
diff changeset
674 /* 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
675 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
676 PyEval_SaveThread();
28694
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 28616
diff changeset
677 }
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
678
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 #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
680 }
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 #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
682
28694
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 28616
diff changeset
683 #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
684
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