annotate Python/pystate.c @ 73776:c86fb10eaf68

Issue #7111: Python can now be run without a stdin, stdout or stderr stream. It was already the case with Python 2. However, the corresponding sys module entries are now set to None (instead of an unusable file object).
author Antoine Pitrou <solipsis@pitrou.net>
date Mon, 28 Nov 2011 19:09:45 +0100
parents aa6ce09d2350
children 4d1349013dd4
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
61184
4fd3ab5fa71d Make (most of) Python's tests pass under Thread Sanitizer.
Jeffrey Yasskin <jyasskin@gmail.com>
parents: 59316
diff changeset
50 /* Assuming the current thread holds the GIL, this is the
4fd3ab5fa71d Make (most of) Python's tests pass under Thread Sanitizer.
Jeffrey Yasskin <jyasskin@gmail.com>
parents: 59316
diff changeset
51 PyThreadState for the current thread. */
4fd3ab5fa71d Make (most of) Python's tests pass under Thread Sanitizer.
Jeffrey Yasskin <jyasskin@gmail.com>
parents: 59316
diff changeset
52 _Py_atomic_address _PyThreadState_Current = {NULL};
27978
4b99a701defe - PyEval_GetFrame() is now declared to return a PyFrameObject *
Guido van Rossum <guido@python.org>
parents: 26109
diff changeset
53 PyThreadFrameGetter _PyThreadState_GetFrame = NULL;
5405
b7871ca930ad Massive changes for separate thread state management.
Guido van Rossum <guido@python.org>
parents:
diff changeset
54
35661
85651eb3d9a9 Forward port bugfix:
Michael W. Hudson <mwh@python.net>
parents: 35117
diff changeset
55 #ifdef WITH_THREAD
35117
7ea2be2c0e1d Fix bug:
Michael W. Hudson <mwh@python.net>
parents: 35095
diff changeset
56 static void _PyGILState_NoteThreadState(PyThreadState* tstate);
35661
85651eb3d9a9 Forward port bugfix:
Michael W. Hudson <mwh@python.net>
parents: 35117
diff changeset
57 #endif
35117
7ea2be2c0e1d Fix bug:
Michael W. Hudson <mwh@python.net>
parents: 35095
diff changeset
58
5405
b7871ca930ad Massive changes for separate thread state management.
Guido van Rossum <guido@python.org>
parents:
diff changeset
59
b7871ca930ad Massive changes for separate thread state management.
Guido van Rossum <guido@python.org>
parents:
diff changeset
60 PyInterpreterState *
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13256
diff changeset
61 PyInterpreterState_New(void)
5405
b7871ca930ad Massive changes for separate thread state management.
Guido van Rossum <guido@python.org>
parents:
diff changeset
62 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
63 PyInterpreterState *interp = (PyInterpreterState *)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
64 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
65
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
66 if (interp != NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
67 HEAD_INIT();
39442
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 37879
diff changeset
68 #ifdef WITH_THREAD
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
69 if (head_mutex == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
70 Py_FatalError("Can't initialize threads for interpreter");
39442
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 37879
diff changeset
71 #endif
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
72 interp->modules = NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
73 interp->modules_reloading = NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
74 interp->modules_by_index = NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
75 interp->sysdict = NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
76 interp->builtins = NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
77 interp->tstate_head = NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
78 interp->codec_search_path = NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
79 interp->codec_search_cache = NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
80 interp->codec_error_registry = NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
81 interp->codecs_initialized = 0;
69708
2caf82aee7a4 Issue #10914: Initialize correctly the filesystem codec when creating a new
Victor Stinner <victor.stinner@haypocalc.com>
parents: 69637
diff changeset
82 interp->fscodec_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
83 #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
84 #ifdef RTLD_NOW
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
85 interp->dlopenflags = RTLD_NOW;
18689
064de84385ca Patch #412229: Add functions sys.getdlopenflags and sys.setdlopenflags.
Martin v. Löwis <martin@v.loewis.de>
parents: 18374
diff changeset
86 #else
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
87 interp->dlopenflags = RTLD_LAZY;
18689
064de84385ca Patch #412229: Add functions sys.getdlopenflags and sys.setdlopenflags.
Martin v. Löwis <martin@v.loewis.de>
parents: 18374
diff changeset
88 #endif
064de84385ca Patch #412229: Add functions sys.getdlopenflags and sys.setdlopenflags.
Martin v. Löwis <martin@v.loewis.de>
parents: 18374
diff changeset
89 #endif
32301
41c59d80bbc5 Patch #510695: Add TSC profiling for the VM.
Martin v. Löwis <martin@v.loewis.de>
parents: 31797
diff changeset
90 #ifdef WITH_TSC
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
91 interp->tscdump = 0;
32301
41c59d80bbc5 Patch #510695: Add TSC profiling for the VM.
Martin v. Löwis <martin@v.loewis.de>
parents: 31797
diff changeset
92 #endif
5926
8d2194e22e67 The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents: 5849
diff changeset
93
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
94 HEAD_LOCK();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
95 interp->next = interp_head;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
96 interp_head = interp;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
97 HEAD_UNLOCK();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
98 }
5926
8d2194e22e67 The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents: 5849
diff changeset
99
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
100 return interp;
5405
b7871ca930ad Massive changes for separate thread state management.
Guido van Rossum <guido@python.org>
parents:
diff changeset
101 }
b7871ca930ad Massive changes for separate thread state management.
Guido van Rossum <guido@python.org>
parents:
diff changeset
102
b7871ca930ad Massive changes for separate thread state management.
Guido van Rossum <guido@python.org>
parents:
diff changeset
103
b7871ca930ad Massive changes for separate thread state management.
Guido van Rossum <guido@python.org>
parents:
diff changeset
104 void
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13256
diff changeset
105 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
106 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
107 PyThreadState *p;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
108 HEAD_LOCK();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
109 for (p = interp->tstate_head; p != NULL; p = p->next)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
110 PyThreadState_Clear(p);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
111 HEAD_UNLOCK();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
112 Py_CLEAR(interp->codec_search_path);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
113 Py_CLEAR(interp->codec_search_cache);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
114 Py_CLEAR(interp->codec_error_registry);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
115 Py_CLEAR(interp->modules);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
116 Py_CLEAR(interp->modules_by_index);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
117 Py_CLEAR(interp->modules_reloading);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
118 Py_CLEAR(interp->sysdict);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
119 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
120 }
8d2194e22e67 The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents: 5849
diff changeset
121
8d2194e22e67 The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents: 5849
diff changeset
122
8d2194e22e67 The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents: 5849
diff changeset
123 static void
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13256
diff changeset
124 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
125 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
126 PyThreadState *p;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
127 /* No need to lock the mutex here because this should only happen
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
128 when the threads are all really dead (XXX famous last words). */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
129 while ((p = interp->tstate_head) != NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
130 PyThreadState_Delete(p);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
131 }
5926
8d2194e22e67 The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents: 5849
diff changeset
132 }
8d2194e22e67 The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents: 5849
diff changeset
133
8d2194e22e67 The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents: 5849
diff changeset
134
8d2194e22e67 The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents: 5849
diff changeset
135 void
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13256
diff changeset
136 PyInterpreterState_Delete(PyInterpreterState *interp)
5405
b7871ca930ad Massive changes for separate thread state management.
Guido van Rossum <guido@python.org>
parents:
diff changeset
137 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
138 PyInterpreterState **p;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
139 zapthreads(interp);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
140 HEAD_LOCK();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
141 for (p = &interp_head; ; p = &(*p)->next) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
142 if (*p == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
143 Py_FatalError(
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
144 "PyInterpreterState_Delete: invalid interp");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
145 if (*p == interp)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
146 break;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
147 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
148 if (interp->tstate_head != NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
149 Py_FatalError("PyInterpreterState_Delete: remaining threads");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
150 *p = interp->next;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
151 HEAD_UNLOCK();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
152 free(interp);
73205
608975eafe86 Issue #10363: Deallocate global locks in Py_Finalize().
Antoine Pitrou <solipsis@pitrou.net>
parents: 69708
diff changeset
153 #ifdef WITH_THREAD
608975eafe86 Issue #10363: Deallocate global locks in Py_Finalize().
Antoine Pitrou <solipsis@pitrou.net>
parents: 69708
diff changeset
154 if (interp_head == NULL && head_mutex != NULL) {
608975eafe86 Issue #10363: Deallocate global locks in Py_Finalize().
Antoine Pitrou <solipsis@pitrou.net>
parents: 69708
diff changeset
155 PyThread_free_lock(head_mutex);
608975eafe86 Issue #10363: Deallocate global locks in Py_Finalize().
Antoine Pitrou <solipsis@pitrou.net>
parents: 69708
diff changeset
156 head_mutex = NULL;
608975eafe86 Issue #10363: Deallocate global locks in Py_Finalize().
Antoine Pitrou <solipsis@pitrou.net>
parents: 69708
diff changeset
157 }
608975eafe86 Issue #10363: Deallocate global locks in Py_Finalize().
Antoine Pitrou <solipsis@pitrou.net>
parents: 69708
diff changeset
158 #endif
5405
b7871ca930ad Massive changes for separate thread state management.
Guido van Rossum <guido@python.org>
parents:
diff changeset
159 }
b7871ca930ad Massive changes for separate thread state management.
Guido van Rossum <guido@python.org>
parents:
diff changeset
160
b7871ca930ad Massive changes for separate thread state management.
Guido van Rossum <guido@python.org>
parents:
diff changeset
161
26109
e61b946474df Assorted patches from Armin Rigo:
Michael W. Hudson <mwh@python.net>
parents: 25111
diff changeset
162 /* Default implementation for _PyThreadState_GetFrame */
e61b946474df Assorted patches from Armin Rigo:
Michael W. Hudson <mwh@python.net>
parents: 25111
diff changeset
163 static struct _frame *
e61b946474df Assorted patches from Armin Rigo:
Michael W. Hudson <mwh@python.net>
parents: 25111
diff changeset
164 threadstate_getframe(PyThreadState *self)
e61b946474df Assorted patches from Armin Rigo:
Michael W. Hudson <mwh@python.net>
parents: 25111
diff changeset
165 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
166 return self->frame;
26109
e61b946474df Assorted patches from Armin Rigo:
Michael W. Hudson <mwh@python.net>
parents: 25111
diff changeset
167 }
e61b946474df Assorted patches from Armin Rigo:
Michael W. Hudson <mwh@python.net>
parents: 25111
diff changeset
168
59317
d7a62c16505b Merged revisions 78639 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents: 49736
diff changeset
169 static PyThreadState *
d7a62c16505b Merged revisions 78639 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents: 49736
diff changeset
170 new_threadstate(PyInterpreterState *interp, int init)
5405
b7871ca930ad Massive changes for separate thread state management.
Guido van Rossum <guido@python.org>
parents:
diff changeset
171 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
172 PyThreadState *tstate = (PyThreadState *)malloc(sizeof(PyThreadState));
33713
517e4ec0df89 PyInterpreterState_New(), PyThreadState_New(): use malloc/free directly.
Tim Peters <tim.peters@gmail.com>
parents: 33711
diff changeset
173
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
174 if (_PyThreadState_GetFrame == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
175 _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
176
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
177 if (tstate != NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
178 tstate->interp = interp;
5405
b7871ca930ad Massive changes for separate thread state management.
Guido van Rossum <guido@python.org>
parents:
diff changeset
179
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
180 tstate->frame = NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
181 tstate->recursion_depth = 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
182 tstate->overflowed = 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
183 tstate->recursion_critical = 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
184 tstate->tracing = 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
185 tstate->use_tracing = 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
186 tstate->tick_counter = 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
187 tstate->gilstate_counter = 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
188 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
189 #ifdef WITH_THREAD
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
190 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
191 #else
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
192 tstate->thread_id = 0;
29842
014cc362aa91 Initialize thread_id to 0 in unthreaded build. Fixes #770247.
Martin v. Löwis <martin@v.loewis.de>
parents: 29643
diff changeset
193 #endif
5405
b7871ca930ad Massive changes for separate thread state management.
Guido van Rossum <guido@python.org>
parents:
diff changeset
194
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
195 tstate->dict = NULL;
7970
4ceee1ef99b0 /* An extension mechanism to store arbitrary additional per-thread state.
Guido van Rossum <guido@python.org>
parents: 6549
diff changeset
196
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
197 tstate->curexc_type = NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
198 tstate->curexc_value = NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
199 tstate->curexc_traceback = NULL;
5405
b7871ca930ad Massive changes for separate thread state management.
Guido van Rossum <guido@python.org>
parents:
diff changeset
200
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
201 tstate->exc_type = NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
202 tstate->exc_value = NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
203 tstate->exc_traceback = NULL;
5405
b7871ca930ad Massive changes for separate thread state management.
Guido van Rossum <guido@python.org>
parents:
diff changeset
204
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
205 tstate->c_profilefunc = NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
206 tstate->c_tracefunc = NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
207 tstate->c_profileobj = NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
208 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
209
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
210 if (init)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
211 _PyThreadState_Init(tstate);
35117
7ea2be2c0e1d Fix bug:
Michael W. Hudson <mwh@python.net>
parents: 35095
diff changeset
212
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
213 HEAD_LOCK();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
214 tstate->next = interp->tstate_head;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
215 interp->tstate_head = tstate;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
216 HEAD_UNLOCK();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
217 }
5926
8d2194e22e67 The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents: 5849
diff changeset
218
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
219 return tstate;
5926
8d2194e22e67 The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents: 5849
diff changeset
220 }
8d2194e22e67 The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents: 5849
diff changeset
221
59317
d7a62c16505b Merged revisions 78639 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents: 49736
diff changeset
222 PyThreadState *
d7a62c16505b Merged revisions 78639 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents: 49736
diff changeset
223 PyThreadState_New(PyInterpreterState *interp)
d7a62c16505b Merged revisions 78639 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents: 49736
diff changeset
224 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
225 return new_threadstate(interp, 1);
59317
d7a62c16505b Merged revisions 78639 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents: 49736
diff changeset
226 }
d7a62c16505b Merged revisions 78639 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents: 49736
diff changeset
227
d7a62c16505b Merged revisions 78639 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents: 49736
diff changeset
228 PyThreadState *
d7a62c16505b Merged revisions 78639 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents: 49736
diff changeset
229 _PyThreadState_Prealloc(PyInterpreterState *interp)
d7a62c16505b Merged revisions 78639 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents: 49736
diff changeset
230 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
231 return new_threadstate(interp, 0);
59317
d7a62c16505b Merged revisions 78639 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents: 49736
diff changeset
232 }
d7a62c16505b Merged revisions 78639 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents: 49736
diff changeset
233
d7a62c16505b Merged revisions 78639 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents: 49736
diff changeset
234 void
d7a62c16505b Merged revisions 78639 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents: 49736
diff changeset
235 _PyThreadState_Init(PyThreadState *tstate)
d7a62c16505b Merged revisions 78639 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents: 49736
diff changeset
236 {
d7a62c16505b Merged revisions 78639 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents: 49736
diff changeset
237 #ifdef WITH_THREAD
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
238 _PyGILState_NoteThreadState(tstate);
59317
d7a62c16505b Merged revisions 78639 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents: 49736
diff changeset
239 #endif
d7a62c16505b Merged revisions 78639 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents: 49736
diff changeset
240 }
d7a62c16505b Merged revisions 78639 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents: 49736
diff changeset
241
47580
94f64f11fdd0 Implement PEP 3121: new module initialization and finalization API.
Martin v. Löwis <martin@v.loewis.de>
parents: 44834
diff changeset
242 PyObject*
94f64f11fdd0 Implement PEP 3121: new module initialization and finalization API.
Martin v. Löwis <martin@v.loewis.de>
parents: 44834
diff changeset
243 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
244 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
245 Py_ssize_t index = m->m_base.m_index;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
246 PyInterpreterState *state = PyThreadState_GET()->interp;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
247 PyObject *res;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
248 if (index == 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
249 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
250 if (state->modules_by_index == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
251 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
252 if (index > PyList_GET_SIZE(state->modules_by_index))
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
253 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
254 res = PyList_GET_ITEM(state->modules_by_index, index);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
255 return res==Py_None ? NULL : res;
47580
94f64f11fdd0 Implement PEP 3121: new module initialization and finalization API.
Martin v. Löwis <martin@v.loewis.de>
parents: 44834
diff changeset
256 }
94f64f11fdd0 Implement PEP 3121: new module initialization and finalization API.
Martin v. Löwis <martin@v.loewis.de>
parents: 44834
diff changeset
257
94f64f11fdd0 Implement PEP 3121: new module initialization and finalization API.
Martin v. Löwis <martin@v.loewis.de>
parents: 44834
diff changeset
258 int
94f64f11fdd0 Implement PEP 3121: new module initialization and finalization API.
Martin v. Löwis <martin@v.loewis.de>
parents: 44834
diff changeset
259 _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
260 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
261 PyInterpreterState *state = PyThreadState_GET()->interp;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
262 if (!def)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
263 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
264 if (!state->modules_by_index) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
265 state->modules_by_index = PyList_New(0);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
266 if (!state->modules_by_index)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
267 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
268 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
269 while(PyList_GET_SIZE(state->modules_by_index) <= def->m_base.m_index)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
270 if (PyList_Append(state->modules_by_index, Py_None) < 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
271 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
272 Py_INCREF(module);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
273 return PyList_SetItem(state->modules_by_index,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
274 def->m_base.m_index, module);
47580
94f64f11fdd0 Implement PEP 3121: new module initialization and finalization API.
Martin v. Löwis <martin@v.loewis.de>
parents: 44834
diff changeset
275 }
5405
b7871ca930ad Massive changes for separate thread state management.
Guido van Rossum <guido@python.org>
parents:
diff changeset
276
5926
8d2194e22e67 The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents: 5849
diff changeset
277 void
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13256
diff changeset
278 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
279 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
280 if (Py_VerboseFlag && tstate->frame != NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
281 fprintf(stderr,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
282 "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
283
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
284 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
285
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
286 Py_CLEAR(tstate->dict);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
287 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
288
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
289 Py_CLEAR(tstate->curexc_type);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
290 Py_CLEAR(tstate->curexc_value);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
291 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
292
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
293 Py_CLEAR(tstate->exc_type);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
294 Py_CLEAR(tstate->exc_value);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
295 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
296
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
297 tstate->c_profilefunc = NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
298 tstate->c_tracefunc = NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
299 Py_CLEAR(tstate->c_profileobj);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
300 Py_CLEAR(tstate->c_traceobj);
5405
b7871ca930ad Massive changes for separate thread state management.
Guido van Rossum <guido@python.org>
parents:
diff changeset
301 }
b7871ca930ad Massive changes for separate thread state management.
Guido van Rossum <guido@python.org>
parents:
diff changeset
302
b7871ca930ad Massive changes for separate thread state management.
Guido van Rossum <guido@python.org>
parents:
diff changeset
303
16139
d96ce9708c00 Add a new API, PyThreadState_DeleteCurrent() that combines
Guido van Rossum <guido@python.org>
parents: 14378
diff changeset
304 /* 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
305 static void
d96ce9708c00 Add a new API, PyThreadState_DeleteCurrent() that combines
Guido van Rossum <guido@python.org>
parents: 14378
diff changeset
306 tstate_delete_common(PyThreadState *tstate)
5405
b7871ca930ad Massive changes for separate thread state management.
Guido van Rossum <guido@python.org>
parents:
diff changeset
307 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
308 PyInterpreterState *interp;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
309 PyThreadState **p;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
310 PyThreadState *prev_p = NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
311 if (tstate == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
312 Py_FatalError("PyThreadState_Delete: NULL tstate");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
313 interp = tstate->interp;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
314 if (interp == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
315 Py_FatalError("PyThreadState_Delete: NULL interp");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
316 HEAD_LOCK();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
317 for (p = &interp->tstate_head; ; p = &(*p)->next) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
318 if (*p == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
319 Py_FatalError(
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
320 "PyThreadState_Delete: invalid tstate");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
321 if (*p == tstate)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
322 break;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
323 /* Sanity check. These states should never happen but if
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
324 * they do we must abort. Otherwise we'll end up spinning in
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
325 * in a tight loop with the lock held. A similar check is done
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
326 * in thread.c find_key(). */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
327 if (*p == prev_p)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
328 Py_FatalError(
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
329 "PyThreadState_Delete: small circular list(!)"
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
330 " and tstate not found.");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
331 prev_p = *p;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
332 if ((*p)->next == interp->tstate_head)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
333 Py_FatalError(
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
334 "PyThreadState_Delete: circular list(!) and"
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
335 " tstate not found.");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
336 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
337 *p = tstate->next;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
338 HEAD_UNLOCK();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
339 free(tstate);
5405
b7871ca930ad Massive changes for separate thread state management.
Guido van Rossum <guido@python.org>
parents:
diff changeset
340 }
b7871ca930ad Massive changes for separate thread state management.
Guido van Rossum <guido@python.org>
parents:
diff changeset
341
b7871ca930ad Massive changes for separate thread state management.
Guido van Rossum <guido@python.org>
parents:
diff changeset
342
16139
d96ce9708c00 Add a new API, PyThreadState_DeleteCurrent() that combines
Guido van Rossum <guido@python.org>
parents: 14378
diff changeset
343 void
d96ce9708c00 Add a new API, PyThreadState_DeleteCurrent() that combines
Guido van Rossum <guido@python.org>
parents: 14378
diff changeset
344 PyThreadState_Delete(PyThreadState *tstate)
d96ce9708c00 Add a new API, PyThreadState_DeleteCurrent() that combines
Guido van Rossum <guido@python.org>
parents: 14378
diff changeset
345 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61184
diff changeset
346 if (tstate == _Py_atomic_load_relaxed(&_PyThreadState_Current))
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
347 Py_FatalError("PyThreadState_Delete: tstate is still current");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
348 tstate_delete_common(tstate);
36683
da2a1049215d Patch 1413181, by Gabriel Becedillas.
Tim Peters <tim.peters@gmail.com>
parents: 35661
diff changeset
349 #ifdef WITH_THREAD
64563
dc5986d0e5a4 Merged revisions 84623 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61467
diff changeset
350 if (autoInterpreterState && PyThread_get_key_value(autoTLSkey) == tstate)
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
351 PyThread_delete_key_value(autoTLSkey);
36683
da2a1049215d Patch 1413181, by Gabriel Becedillas.
Tim Peters <tim.peters@gmail.com>
parents: 35661
diff changeset
352 #endif /* WITH_THREAD */
16139
d96ce9708c00 Add a new API, PyThreadState_DeleteCurrent() that combines
Guido van Rossum <guido@python.org>
parents: 14378
diff changeset
353 }
d96ce9708c00 Add a new API, PyThreadState_DeleteCurrent() that combines
Guido van Rossum <guido@python.org>
parents: 14378
diff changeset
354
d96ce9708c00 Add a new API, PyThreadState_DeleteCurrent() that combines
Guido van Rossum <guido@python.org>
parents: 14378
diff changeset
355
d96ce9708c00 Add a new API, PyThreadState_DeleteCurrent() that combines
Guido van Rossum <guido@python.org>
parents: 14378
diff changeset
356 #ifdef WITH_THREAD
d96ce9708c00 Add a new API, PyThreadState_DeleteCurrent() that combines
Guido van Rossum <guido@python.org>
parents: 14378
diff changeset
357 void
d96ce9708c00 Add a new API, PyThreadState_DeleteCurrent() that combines
Guido van Rossum <guido@python.org>
parents: 14378
diff changeset
358 PyThreadState_DeleteCurrent()
d96ce9708c00 Add a new API, PyThreadState_DeleteCurrent() that combines
Guido van Rossum <guido@python.org>
parents: 14378
diff changeset
359 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61184
diff changeset
360 PyThreadState *tstate = (PyThreadState*)_Py_atomic_load_relaxed(
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61184
diff changeset
361 &_PyThreadState_Current);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
362 if (tstate == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
363 Py_FatalError(
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
364 "PyThreadState_DeleteCurrent: no current tstate");
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61184
diff changeset
365 _Py_atomic_store_relaxed(&_PyThreadState_Current, NULL);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
366 tstate_delete_common(tstate);
64563
dc5986d0e5a4 Merged revisions 84623 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61467
diff changeset
367 if (autoInterpreterState && PyThread_get_key_value(autoTLSkey) == tstate)
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
368 PyThread_delete_key_value(autoTLSkey);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
369 PyEval_ReleaseLock();
16139
d96ce9708c00 Add a new API, PyThreadState_DeleteCurrent() that combines
Guido van Rossum <guido@python.org>
parents: 14378
diff changeset
370 }
d96ce9708c00 Add a new API, PyThreadState_DeleteCurrent() that combines
Guido van Rossum <guido@python.org>
parents: 14378
diff changeset
371 #endif /* WITH_THREAD */
d96ce9708c00 Add a new API, PyThreadState_DeleteCurrent() that combines
Guido van Rossum <guido@python.org>
parents: 14378
diff changeset
372
d96ce9708c00 Add a new API, PyThreadState_DeleteCurrent() that combines
Guido van Rossum <guido@python.org>
parents: 14378
diff changeset
373
5405
b7871ca930ad Massive changes for separate thread state management.
Guido van Rossum <guido@python.org>
parents:
diff changeset
374 PyThreadState *
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13256
diff changeset
375 PyThreadState_Get(void)
5405
b7871ca930ad Massive changes for separate thread state management.
Guido van Rossum <guido@python.org>
parents:
diff changeset
376 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61184
diff changeset
377 PyThreadState *tstate = (PyThreadState*)_Py_atomic_load_relaxed(
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61184
diff changeset
378 &_PyThreadState_Current);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61184
diff changeset
379 if (tstate == NULL)
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
380 Py_FatalError("PyThreadState_Get: no current thread");
5926
8d2194e22e67 The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents: 5849
diff changeset
381
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61184
diff changeset
382 return tstate;
5405
b7871ca930ad Massive changes for separate thread state management.
Guido van Rossum <guido@python.org>
parents:
diff changeset
383 }
b7871ca930ad Massive changes for separate thread state management.
Guido van Rossum <guido@python.org>
parents:
diff changeset
384
b7871ca930ad Massive changes for separate thread state management.
Guido van Rossum <guido@python.org>
parents:
diff changeset
385
b7871ca930ad Massive changes for separate thread state management.
Guido van Rossum <guido@python.org>
parents:
diff changeset
386 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
387 PyThreadState_Swap(PyThreadState *newts)
5405
b7871ca930ad Massive changes for separate thread state management.
Guido van Rossum <guido@python.org>
parents:
diff changeset
388 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61184
diff changeset
389 PyThreadState *oldts = (PyThreadState*)_Py_atomic_load_relaxed(
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61184
diff changeset
390 &_PyThreadState_Current);
5926
8d2194e22e67 The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents: 5849
diff changeset
391
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61184
diff changeset
392 _Py_atomic_store_relaxed(&_PyThreadState_Current, newts);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
393 /* It should not be possible for more than one thread state
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
394 to be used for a thread. Check this the best we can in debug
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
395 builds.
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
396 */
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
397 #if defined(Py_DEBUG) && defined(WITH_THREAD)
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
398 if (newts) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
399 /* This can be called from PyEval_RestoreThread(). Similar
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
400 to it, we need to ensure errno doesn't change.
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
401 */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
402 int err = errno;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
403 PyThreadState *check = PyGILState_GetThisThreadState();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
404 if (check && check->interp == newts->interp && check != newts)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
405 Py_FatalError("Invalid thread state for this thread");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
406 errno = err;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
407 }
28694
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 28616
diff changeset
408 #endif
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
409 return oldts;
5405
b7871ca930ad Massive changes for separate thread state management.
Guido van Rossum <guido@python.org>
parents:
diff changeset
410 }
7970
4ceee1ef99b0 /* An extension mechanism to store arbitrary additional per-thread state.
Guido van Rossum <guido@python.org>
parents: 6549
diff changeset
411
4ceee1ef99b0 /* An extension mechanism to store arbitrary additional per-thread state.
Guido van Rossum <guido@python.org>
parents: 6549
diff changeset
412 /* 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
413 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
414 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
415 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
416 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
417
4ceee1ef99b0 /* An extension mechanism to store arbitrary additional per-thread state.
Guido van Rossum <guido@python.org>
parents: 6549
diff changeset
418 PyObject *
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13256
diff changeset
419 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
420 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61184
diff changeset
421 PyThreadState *tstate = (PyThreadState*)_Py_atomic_load_relaxed(
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61184
diff changeset
422 &_PyThreadState_Current);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61184
diff changeset
423 if (tstate == NULL)
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
424 return NULL;
7970
4ceee1ef99b0 /* An extension mechanism to store arbitrary additional per-thread state.
Guido van Rossum <guido@python.org>
parents: 6549
diff changeset
425
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61184
diff changeset
426 if (tstate->dict == NULL) {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
427 PyObject *d;
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61184
diff changeset
428 tstate->dict = d = PyDict_New();
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
429 if (d == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
430 PyErr_Clear();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
431 }
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61184
diff changeset
432 return tstate->dict;
7970
4ceee1ef99b0 /* An extension mechanism to store arbitrary additional per-thread state.
Guido van Rossum <guido@python.org>
parents: 6549
diff changeset
433 }
18733
b0329649b8cf Add a low-level API to access interpreters, for David Beazley.
Guido van Rossum <guido@python.org>
parents: 18689
diff changeset
434
b0329649b8cf Add a low-level API to access interpreters, for David Beazley.
Guido van Rossum <guido@python.org>
parents: 18689
diff changeset
435
29643
fa97293533a9 Add PyThreadState_SetAsyncExc(long, PyObject *).
Guido van Rossum <guido@python.org>
parents: 28914
diff changeset
436 /* Asynchronously raise an exception in a thread.
fa97293533a9 Add PyThreadState_SetAsyncExc(long, PyObject *).
Guido van Rossum <guido@python.org>
parents: 28914
diff changeset
437 Requested by Just van Rossum and Alex Martelli.
34568
ff3ca656c281 Backport 2.39:
Guido van Rossum <guido@python.org>
parents: 33940
diff changeset
438 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
439 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
440 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
441 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
442 existing async exception. This raises no exceptions. */
29643
fa97293533a9 Add PyThreadState_SetAsyncExc(long, PyObject *).
Guido van Rossum <guido@python.org>
parents: 28914
diff changeset
443
fa97293533a9 Add PyThreadState_SetAsyncExc(long, PyObject *).
Guido van Rossum <guido@python.org>
parents: 28914
diff changeset
444 int
fa97293533a9 Add PyThreadState_SetAsyncExc(long, PyObject *).
Guido van Rossum <guido@python.org>
parents: 28914
diff changeset
445 PyThreadState_SetAsyncExc(long id, PyObject *exc) {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
446 PyThreadState *tstate = PyThreadState_GET();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
447 PyInterpreterState *interp = tstate->interp;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
448 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
449
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
450 /* Although the GIL is held, a few C API functions can be called
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
451 * without the GIL held, and in particular some that create and
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
452 * destroy thread and interpreter states. Those can mutate the
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
453 * list of thread states we're traversing, so to prevent that we lock
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
454 * head_mutex for the duration.
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
455 */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
456 HEAD_LOCK();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
457 for (p = interp->tstate_head; p != NULL; p = p->next) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
458 if (p->thread_id == id) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
459 /* Tricky: we need to decref the current value
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
460 * (if any) in p->async_exc, but that can in turn
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
461 * allow arbitrary Python code to run, including
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
462 * perhaps calls to this function. To prevent
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
463 * deadlock, we need to release head_mutex before
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
464 * the decref.
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
465 */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
466 PyObject *old_exc = p->async_exc;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
467 Py_XINCREF(exc);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
468 p->async_exc = exc;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
469 HEAD_UNLOCK();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
470 Py_XDECREF(old_exc);
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61184
diff changeset
471 _PyEval_SignalAsyncExc();
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
472 return 1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
473 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
474 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
475 HEAD_UNLOCK();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
476 return 0;
29643
fa97293533a9 Add PyThreadState_SetAsyncExc(long, PyObject *).
Guido van Rossum <guido@python.org>
parents: 28914
diff changeset
477 }
fa97293533a9 Add PyThreadState_SetAsyncExc(long, PyObject *).
Guido van Rossum <guido@python.org>
parents: 28914
diff changeset
478
fa97293533a9 Add PyThreadState_SetAsyncExc(long, PyObject *).
Guido van Rossum <guido@python.org>
parents: 28914
diff changeset
479
18733
b0329649b8cf Add a low-level API to access interpreters, for David Beazley.
Guido van Rossum <guido@python.org>
parents: 18689
diff changeset
480 /* 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
481 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
482
b0329649b8cf Add a low-level API to access interpreters, for David Beazley.
Guido van Rossum <guido@python.org>
parents: 18689
diff changeset
483 PyInterpreterState *
b0329649b8cf Add a low-level API to access interpreters, for David Beazley.
Guido van Rossum <guido@python.org>
parents: 18689
diff changeset
484 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
485 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
486 return interp_head;
18733
b0329649b8cf Add a low-level API to access interpreters, for David Beazley.
Guido van Rossum <guido@python.org>
parents: 18689
diff changeset
487 }
b0329649b8cf Add a low-level API to access interpreters, for David Beazley.
Guido van Rossum <guido@python.org>
parents: 18689
diff changeset
488
b0329649b8cf Add a low-level API to access interpreters, for David Beazley.
Guido van Rossum <guido@python.org>
parents: 18689
diff changeset
489 PyInterpreterState *
b0329649b8cf Add a low-level API to access interpreters, for David Beazley.
Guido van Rossum <guido@python.org>
parents: 18689
diff changeset
490 PyInterpreterState_Next(PyInterpreterState *interp) {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
491 return interp->next;
18733
b0329649b8cf Add a low-level API to access interpreters, for David Beazley.
Guido van Rossum <guido@python.org>
parents: 18689
diff changeset
492 }
b0329649b8cf Add a low-level API to access interpreters, for David Beazley.
Guido van Rossum <guido@python.org>
parents: 18689
diff changeset
493
b0329649b8cf Add a low-level API to access interpreters, for David Beazley.
Guido van Rossum <guido@python.org>
parents: 18689
diff changeset
494 PyThreadState *
b0329649b8cf Add a low-level API to access interpreters, for David Beazley.
Guido van Rossum <guido@python.org>
parents: 18689
diff changeset
495 PyInterpreterState_ThreadHead(PyInterpreterState *interp) {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
496 return interp->tstate_head;
18733
b0329649b8cf Add a low-level API to access interpreters, for David Beazley.
Guido van Rossum <guido@python.org>
parents: 18689
diff changeset
497 }
b0329649b8cf Add a low-level API to access interpreters, for David Beazley.
Guido van Rossum <guido@python.org>
parents: 18689
diff changeset
498
b0329649b8cf Add a low-level API to access interpreters, for David Beazley.
Guido van Rossum <guido@python.org>
parents: 18689
diff changeset
499 PyThreadState *
b0329649b8cf Add a low-level API to access interpreters, for David Beazley.
Guido van Rossum <guido@python.org>
parents: 18689
diff changeset
500 PyThreadState_Next(PyThreadState *tstate) {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
501 return tstate->next;
18733
b0329649b8cf Add a low-level API to access interpreters, for David Beazley.
Guido van Rossum <guido@python.org>
parents: 18689
diff changeset
502 }
28694
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 28616
diff changeset
503
39442
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 37879
diff changeset
504 /* 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
505 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
506 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
507 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
508 */
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 37879
diff changeset
509 PyObject *
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 37879
diff changeset
510 _PyThread_CurrentFrames(void)
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 37879
diff changeset
511 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
512 PyObject *result;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
513 PyInterpreterState *i;
39442
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 37879
diff changeset
514
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
515 result = PyDict_New();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
516 if (result == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
517 return NULL;
39442
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 37879
diff changeset
518
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
519 /* for i in all interpreters:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
520 * for t in all of i's thread states:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
521 * if t's frame isn't NULL, map t's id to its frame
68585
bf94b6a73fc8 #11565: Fix several typos. Patch by Piotr Kasprzyk.
Ezio Melotti <ezio.melotti@gmail.com>
parents: 64563
diff changeset
522 * Because these lists can mutate even when the GIL is held, we
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
523 * need to grab head_mutex for the duration.
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
524 */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
525 HEAD_LOCK();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
526 for (i = interp_head; i != NULL; i = i->next) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
527 PyThreadState *t;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
528 for (t = i->tstate_head; t != NULL; t = t->next) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
529 PyObject *id;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
530 int stat;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
531 struct _frame *frame = t->frame;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
532 if (frame == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
533 continue;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
534 id = PyLong_FromLong(t->thread_id);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
535 if (id == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
536 goto Fail;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
537 stat = PyDict_SetItem(result, id, (PyObject *)frame);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
538 Py_DECREF(id);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
539 if (stat < 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
540 goto Fail;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
541 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
542 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
543 HEAD_UNLOCK();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
544 return result;
39442
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 37879
diff changeset
545
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 37879
diff changeset
546 Fail:
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
547 HEAD_UNLOCK();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
548 Py_DECREF(result);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
549 return NULL;
39442
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 37879
diff changeset
550 }
29643
fa97293533a9 Add PyThreadState_SetAsyncExc(long, PyObject *).
Guido van Rossum <guido@python.org>
parents: 28914
diff changeset
551
28694
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 28616
diff changeset
552 /* 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
553 #ifdef WITH_THREAD
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 28616
diff changeset
554
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 28616
diff changeset
555 /* 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
556 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
557 * 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
558 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
559 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
560 * 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
561 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
562 */
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 28616
diff changeset
563 static int
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 28616
diff changeset
564 PyThreadState_IsCurrent(PyThreadState *tstate)
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 28616
diff changeset
565 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
566 /* Must be the tstate for this thread */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
567 assert(PyGILState_GetThisThreadState()==tstate);
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61184
diff changeset
568 return tstate == _Py_atomic_load_relaxed(&_PyThreadState_Current);
28694
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 28616
diff changeset
569 }
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 28616
diff changeset
570
33698
090ffcb83f0a Trim trailing whitespace.
Tim Peters <tim.peters@gmail.com>
parents: 32301
diff changeset
571 /* Internal initialization/finalization functions called by
090ffcb83f0a Trim trailing whitespace.
Tim Peters <tim.peters@gmail.com>
parents: 32301
diff changeset
572 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
573 */
33699
0c26db381673 Style guide & consistency changes. No semantic changes.
Tim Peters <tim.peters@gmail.com>
parents: 33698
diff changeset
574 void
0c26db381673 Style guide & consistency changes. No semantic changes.
Tim Peters <tim.peters@gmail.com>
parents: 33698
diff changeset
575 _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
576 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
577 assert(i && t); /* must init with valid states */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
578 autoTLSkey = PyThread_create_key();
64844
8e428b8e7d81 issue 9786 Native TLS support for pthreads
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 64558
diff changeset
579 if (autoTLSkey == -1)
8e428b8e7d81 issue 9786 Native TLS support for pthreads
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 64558
diff changeset
580 Py_FatalError("Could not allocate TLS entry");
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
581 autoInterpreterState = i;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
582 assert(PyThread_get_key_value(autoTLSkey) == NULL);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
583 assert(t->gilstate_counter == 0);
35117
7ea2be2c0e1d Fix bug:
Michael W. Hudson <mwh@python.net>
parents: 35095
diff changeset
584
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
585 _PyGILState_NoteThreadState(t);
28694
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 28616
diff changeset
586 }
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 28616
diff changeset
587
33699
0c26db381673 Style guide & consistency changes. No semantic changes.
Tim Peters <tim.peters@gmail.com>
parents: 33698
diff changeset
588 void
0c26db381673 Style guide & consistency changes. No semantic changes.
Tim Peters <tim.peters@gmail.com>
parents: 33698
diff changeset
589 _PyGILState_Fini(void)
28694
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 28616
diff changeset
590 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
591 PyThread_delete_key(autoTLSkey);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
592 autoInterpreterState = NULL;
28694
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 28616
diff changeset
593 }
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 28616
diff changeset
594
73694
ba90839c4993 Issue #13156: _PyGILState_Reinit(): Re-associate the auto thread state with the
Charles-François Natali <neologix@free.fr>
parents: 73205
diff changeset
595 /* Reset the TLS key - called by PyOS_AfterFork().
69637
7b7ad9a88451 Issue #10517: After fork(), reinitialize the TLS used by the PyGILState_*
Antoine Pitrou <solipsis@pitrou.net>
parents: 68586
diff changeset
596 * This should not be necessary, but some - buggy - pthread implementations
73694
ba90839c4993 Issue #13156: _PyGILState_Reinit(): Re-associate the auto thread state with the
Charles-François Natali <neologix@free.fr>
parents: 73205
diff changeset
597 * don't reset TLS upon fork(), see issue #10517.
69637
7b7ad9a88451 Issue #10517: After fork(), reinitialize the TLS used by the PyGILState_*
Antoine Pitrou <solipsis@pitrou.net>
parents: 68586
diff changeset
598 */
7b7ad9a88451 Issue #10517: After fork(), reinitialize the TLS used by the PyGILState_*
Antoine Pitrou <solipsis@pitrou.net>
parents: 68586
diff changeset
599 void
7b7ad9a88451 Issue #10517: After fork(), reinitialize the TLS used by the PyGILState_*
Antoine Pitrou <solipsis@pitrou.net>
parents: 68586
diff changeset
600 _PyGILState_Reinit(void)
7b7ad9a88451 Issue #10517: After fork(), reinitialize the TLS used by the PyGILState_*
Antoine Pitrou <solipsis@pitrou.net>
parents: 68586
diff changeset
601 {
7b7ad9a88451 Issue #10517: After fork(), reinitialize the TLS used by the PyGILState_*
Antoine Pitrou <solipsis@pitrou.net>
parents: 68586
diff changeset
602 PyThreadState *tstate = PyGILState_GetThisThreadState();
7b7ad9a88451 Issue #10517: After fork(), reinitialize the TLS used by the PyGILState_*
Antoine Pitrou <solipsis@pitrou.net>
parents: 68586
diff changeset
603 PyThread_delete_key(autoTLSkey);
7b7ad9a88451 Issue #10517: After fork(), reinitialize the TLS used by the PyGILState_*
Antoine Pitrou <solipsis@pitrou.net>
parents: 68586
diff changeset
604 if ((autoTLSkey = PyThread_create_key()) == -1)
7b7ad9a88451 Issue #10517: After fork(), reinitialize the TLS used by the PyGILState_*
Antoine Pitrou <solipsis@pitrou.net>
parents: 68586
diff changeset
605 Py_FatalError("Could not allocate TLS entry");
7b7ad9a88451 Issue #10517: After fork(), reinitialize the TLS used by the PyGILState_*
Antoine Pitrou <solipsis@pitrou.net>
parents: 68586
diff changeset
606
73694
ba90839c4993 Issue #13156: _PyGILState_Reinit(): Re-associate the auto thread state with the
Charles-François Natali <neologix@free.fr>
parents: 73205
diff changeset
607 /* If the thread had an associated auto thread state, reassociate it with
ba90839c4993 Issue #13156: _PyGILState_Reinit(): Re-associate the auto thread state with the
Charles-François Natali <neologix@free.fr>
parents: 73205
diff changeset
608 * the new key. */
ba90839c4993 Issue #13156: _PyGILState_Reinit(): Re-associate the auto thread state with the
Charles-François Natali <neologix@free.fr>
parents: 73205
diff changeset
609 if (tstate && PyThread_set_key_value(autoTLSkey, (void *)tstate) < 0)
69637
7b7ad9a88451 Issue #10517: After fork(), reinitialize the TLS used by the PyGILState_*
Antoine Pitrou <solipsis@pitrou.net>
parents: 68586
diff changeset
610 Py_FatalError("Couldn't create autoTLSkey mapping");
7b7ad9a88451 Issue #10517: After fork(), reinitialize the TLS used by the PyGILState_*
Antoine Pitrou <solipsis@pitrou.net>
parents: 68586
diff changeset
611 }
7b7ad9a88451 Issue #10517: After fork(), reinitialize the TLS used by the PyGILState_*
Antoine Pitrou <solipsis@pitrou.net>
parents: 68586
diff changeset
612
35117
7ea2be2c0e1d Fix bug:
Michael W. Hudson <mwh@python.net>
parents: 35095
diff changeset
613 /* 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
614 PyGILState_Ensure, it's important that the GILState machinery knows about
7ea2be2c0e1d Fix bug:
Michael W. Hudson <mwh@python.net>
parents: 35095
diff changeset
615 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
616 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
617 */
40450
cc992d75d5b3 Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents: 39610
diff changeset
618 static void
35117
7ea2be2c0e1d Fix bug:
Michael W. Hudson <mwh@python.net>
parents: 35095
diff changeset
619 _PyGILState_NoteThreadState(PyThreadState* tstate)
7ea2be2c0e1d Fix bug:
Michael W. Hudson <mwh@python.net>
parents: 35095
diff changeset
620 {
64563
dc5986d0e5a4 Merged revisions 84623 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61467
diff changeset
621 /* If autoTLSkey isn't initialized, this must be the very first
dc5986d0e5a4 Merged revisions 84623 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61467
diff changeset
622 threadstate created in Py_Initialize(). Don't do anything for now
dc5986d0e5a4 Merged revisions 84623 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61467
diff changeset
623 (we'll be back here when _PyGILState_Init is called). */
dc5986d0e5a4 Merged revisions 84623 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61467
diff changeset
624 if (!autoInterpreterState)
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
625 return;
39442
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 37879
diff changeset
626
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
627 /* Stick the thread state for this thread in thread local storage.
35117
7ea2be2c0e1d Fix bug:
Michael W. Hudson <mwh@python.net>
parents: 35095
diff changeset
628
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
629 The only situation where you can legitimately have more than one
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
630 thread state for an OS level thread is when there are multiple
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
631 interpreters, when:
39442
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 37879
diff changeset
632
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
633 a) You shouldn't really be using the PyGILState_ APIs anyway,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
634 and:
35117
7ea2be2c0e1d Fix bug:
Michael W. Hudson <mwh@python.net>
parents: 35095
diff changeset
635
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
636 b) The slightly odd way PyThread_set_key_value works (see
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
637 comments by its implementation) means that the first thread
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
638 state created for that given OS level thread will "win",
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
639 which seems reasonable behaviour.
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
640 */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
641 if (PyThread_set_key_value(autoTLSkey, (void *)tstate) < 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
642 Py_FatalError("Couldn't create autoTLSkey mapping");
35117
7ea2be2c0e1d Fix bug:
Michael W. Hudson <mwh@python.net>
parents: 35095
diff changeset
643
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
644 /* PyGILState_Release must not try to delete this thread state. */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
645 tstate->gilstate_counter = 1;
35117
7ea2be2c0e1d Fix bug:
Michael W. Hudson <mwh@python.net>
parents: 35095
diff changeset
646 }
7ea2be2c0e1d Fix bug:
Michael W. Hudson <mwh@python.net>
parents: 35095
diff changeset
647
28694
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 28616
diff changeset
648 /* The public functions */
33699
0c26db381673 Style guide & consistency changes. No semantic changes.
Tim Peters <tim.peters@gmail.com>
parents: 33698
diff changeset
649 PyThreadState *
0c26db381673 Style guide & consistency changes. No semantic changes.
Tim Peters <tim.peters@gmail.com>
parents: 33698
diff changeset
650 PyGILState_GetThisThreadState(void)
28694
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 28616
diff changeset
651 {
64563
dc5986d0e5a4 Merged revisions 84623 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61467
diff changeset
652 if (autoInterpreterState == NULL)
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
653 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
654 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
655 }
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 28616
diff changeset
656
33699
0c26db381673 Style guide & consistency changes. No semantic changes.
Tim Peters <tim.peters@gmail.com>
parents: 33698
diff changeset
657 PyGILState_STATE
0c26db381673 Style guide & consistency changes. No semantic changes.
Tim Peters <tim.peters@gmail.com>
parents: 33698
diff changeset
658 PyGILState_Ensure(void)
28694
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 28616
diff changeset
659 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
660 int current;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
661 PyThreadState *tcur;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
662 /* Note that we do not auto-init Python here - apart from
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
663 potential races with 2 threads auto-initializing, pep-311
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
664 spells out other issues. Embedders are expected to have
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
665 called Py_Initialize() and usually PyEval_InitThreads().
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
666 */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
667 assert(autoInterpreterState); /* Py_Initialize() hasn't been called! */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
668 tcur = (PyThreadState *)PyThread_get_key_value(autoTLSkey);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
669 if (tcur == NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
670 /* Create a new thread state for this thread */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
671 tcur = PyThreadState_New(autoInterpreterState);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
672 if (tcur == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
673 Py_FatalError("Couldn't create thread-state for new thread");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
674 /* This is our thread state! We'll need to delete it in the
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
675 matching call to PyGILState_Release(). */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
676 tcur->gilstate_counter = 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
677 current = 0; /* new thread state is never current */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
678 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
679 else
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
680 current = PyThreadState_IsCurrent(tcur);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
681 if (current == 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
682 PyEval_RestoreThread(tcur);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
683 /* Update our counter in the thread-state - no need for locks:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
684 - tcur will remain valid as we hold the GIL.
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
685 - the counter is safe as we are the only thread "allowed"
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
686 to modify this value
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
687 */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
688 ++tcur->gilstate_counter;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
689 return current ? PyGILState_LOCKED : PyGILState_UNLOCKED;
28694
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 28616
diff changeset
690 }
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 28616
diff changeset
691
33699
0c26db381673 Style guide & consistency changes. No semantic changes.
Tim Peters <tim.peters@gmail.com>
parents: 33698
diff changeset
692 void
0c26db381673 Style guide & consistency changes. No semantic changes.
Tim Peters <tim.peters@gmail.com>
parents: 33698
diff changeset
693 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
694 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
695 PyThreadState *tcur = (PyThreadState *)PyThread_get_key_value(
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
696 autoTLSkey);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
697 if (tcur == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
698 Py_FatalError("auto-releasing thread-state, "
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
699 "but no thread-state for this thread");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
700 /* We must hold the GIL and have our thread state current */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
701 /* XXX - remove the check - the assert should be fine,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
702 but while this is very new (April 2003), the extra check
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
703 by release-only users can't hurt.
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
704 */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
705 if (! PyThreadState_IsCurrent(tcur))
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
706 Py_FatalError("This thread state must be current when releasing");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
707 assert(PyThreadState_IsCurrent(tcur));
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
708 --tcur->gilstate_counter;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
709 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
710
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
711 /* If we're going to destroy this thread-state, we must
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
712 * clear it while the GIL is held, as destructors may run.
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
713 */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
714 if (tcur->gilstate_counter == 0) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
715 /* can't have been locked when we created it */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
716 assert(oldstate == PyGILState_UNLOCKED);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
717 PyThreadState_Clear(tcur);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
718 /* Delete the thread-state. Note this releases the GIL too!
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
719 * It's vital that the GIL be held here, to avoid shutdown
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
720 * races; see bugs 225673 and 1061968 (that nasty bug has a
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
721 * habit of coming back).
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
722 */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
723 PyThreadState_DeleteCurrent();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
724 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
725 /* Release the lock if necessary */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
726 else if (oldstate == PyGILState_UNLOCKED)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59317
diff changeset
727 PyEval_SaveThread();
28694
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 28616
diff changeset
728 }
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
729
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36683
diff changeset
730 #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
731 }
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36683
diff changeset
732 #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
733
28694
a4154dd5939a New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents: 28616
diff changeset
734 #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
735
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36683
diff changeset
736