blob: 1139851c3c1e445e9a8f99e5a3d44b4f7d1766bb [file] [log] [blame]
Guido van Rossuma027efa1997-05-05 20:56:21 +00001
2/* Thread and interpreter state structures and their interfaces */
3
4#include "Python.h"
5
Martin v. Löwisf0473d52001-07-18 16:17:16 +00006#ifdef HAVE_DLOPEN
7#ifdef HAVE_DLFCN_H
8#include <dlfcn.h>
9#endif
10#ifndef RTLD_LAZY
11#define RTLD_LAZY 1
12#endif
13#endif
14
15
Guido van Rossum25ce5661997-08-02 03:10:38 +000016#define ZAP(x) { \
17 PyObject *tmp = (PyObject *)(x); \
18 (x) = NULL; \
19 Py_XDECREF(tmp); \
20}
21
22
Guido van Rossum1d5ad901999-06-18 14:22:24 +000023#ifdef WITH_THREAD
24#include "pythread.h"
25static PyThread_type_lock head_mutex = NULL; /* Protects interp->tstate_head */
Moshe Zadka9fb6af92000-08-04 21:27:47 +000026#define HEAD_INIT() (void)(head_mutex || (head_mutex = PyThread_allocate_lock()))
Guido van Rossum1d5ad901999-06-18 14:22:24 +000027#define HEAD_LOCK() PyThread_acquire_lock(head_mutex, WAIT_LOCK)
28#define HEAD_UNLOCK() PyThread_release_lock(head_mutex)
29#else
30#define HEAD_INIT() /* Nothing */
31#define HEAD_LOCK() /* Nothing */
32#define HEAD_UNLOCK() /* Nothing */
33#endif
34
Guido van Rossum25ce5661997-08-02 03:10:38 +000035static PyInterpreterState *interp_head = NULL;
Guido van Rossuma027efa1997-05-05 20:56:21 +000036
Guido van Rossum18bc7c21998-12-21 18:27:28 +000037PyThreadState *_PyThreadState_Current = NULL;
Guido van Rossum6297a7a2003-02-19 15:53:17 +000038PyThreadFrameGetter _PyThreadState_GetFrame = NULL;
Guido van Rossuma027efa1997-05-05 20:56:21 +000039
40
41PyInterpreterState *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000042PyInterpreterState_New(void)
Guido van Rossuma027efa1997-05-05 20:56:21 +000043{
44 PyInterpreterState *interp = PyMem_NEW(PyInterpreterState, 1);
Guido van Rossum25ce5661997-08-02 03:10:38 +000045
Guido van Rossuma027efa1997-05-05 20:56:21 +000046 if (interp != NULL) {
Guido van Rossum1d5ad901999-06-18 14:22:24 +000047 HEAD_INIT();
Guido van Rossum25ce5661997-08-02 03:10:38 +000048 interp->modules = NULL;
Guido van Rossuma027efa1997-05-05 20:56:21 +000049 interp->sysdict = NULL;
Guido van Rossum25ce5661997-08-02 03:10:38 +000050 interp->builtins = NULL;
Guido van Rossum25ce5661997-08-02 03:10:38 +000051 interp->tstate_head = NULL;
Gustavo Niemeyer5ddd4c32003-03-19 00:35:36 +000052 interp->codec_search_path = NULL;
53 interp->codec_search_cache = NULL;
54 interp->codec_error_registry = NULL;
Martin v. Löwisf0473d52001-07-18 16:17:16 +000055#ifdef HAVE_DLOPEN
56#ifdef RTLD_NOW
57 interp->dlopenflags = RTLD_NOW;
58#else
59 interp->dlopenflags = RTLD_LAZY;
60#endif
61#endif
Guido van Rossum25ce5661997-08-02 03:10:38 +000062
Tim Peters412f2462000-09-02 09:16:15 +000063 HEAD_LOCK();
Guido van Rossum25ce5661997-08-02 03:10:38 +000064 interp->next = interp_head;
65 interp_head = interp;
Tim Peters412f2462000-09-02 09:16:15 +000066 HEAD_UNLOCK();
Guido van Rossuma027efa1997-05-05 20:56:21 +000067 }
Guido van Rossum25ce5661997-08-02 03:10:38 +000068
Guido van Rossuma027efa1997-05-05 20:56:21 +000069 return interp;
70}
71
72
73void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000074PyInterpreterState_Clear(PyInterpreterState *interp)
Guido van Rossum25ce5661997-08-02 03:10:38 +000075{
76 PyThreadState *p;
Guido van Rossum1d5ad901999-06-18 14:22:24 +000077 HEAD_LOCK();
Guido van Rossum25ce5661997-08-02 03:10:38 +000078 for (p = interp->tstate_head; p != NULL; p = p->next)
79 PyThreadState_Clear(p);
Guido van Rossum1d5ad901999-06-18 14:22:24 +000080 HEAD_UNLOCK();
Gustavo Niemeyer5ddd4c32003-03-19 00:35:36 +000081 ZAP(interp->codec_search_path);
82 ZAP(interp->codec_search_cache);
83 ZAP(interp->codec_error_registry);
Guido van Rossum25ce5661997-08-02 03:10:38 +000084 ZAP(interp->modules);
85 ZAP(interp->sysdict);
86 ZAP(interp->builtins);
87}
88
89
90static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000091zapthreads(PyInterpreterState *interp)
Guido van Rossum25ce5661997-08-02 03:10:38 +000092{
Guido van Rossum1d5ad901999-06-18 14:22:24 +000093 PyThreadState *p;
94 /* No need to lock the mutex here because this should only happen
95 when the threads are all really dead (XXX famous last words). */
96 while ((p = interp->tstate_head) != NULL) {
Guido van Rossum25ce5661997-08-02 03:10:38 +000097 PyThreadState_Delete(p);
Guido van Rossum25ce5661997-08-02 03:10:38 +000098 }
99}
100
101
102void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000103PyInterpreterState_Delete(PyInterpreterState *interp)
Guido van Rossuma027efa1997-05-05 20:56:21 +0000104{
Guido van Rossum25ce5661997-08-02 03:10:38 +0000105 PyInterpreterState **p;
106 zapthreads(interp);
Tim Peters412f2462000-09-02 09:16:15 +0000107 HEAD_LOCK();
Guido van Rossum25ce5661997-08-02 03:10:38 +0000108 for (p = &interp_head; ; p = &(*p)->next) {
109 if (*p == NULL)
110 Py_FatalError(
111 "PyInterpreterState_Delete: invalid interp");
112 if (*p == interp)
113 break;
114 }
115 if (interp->tstate_head != NULL)
116 Py_FatalError("PyInterpreterState_Delete: remaining threads");
117 *p = interp->next;
Tim Peters412f2462000-09-02 09:16:15 +0000118 HEAD_UNLOCK();
Guido van Rossuma027efa1997-05-05 20:56:21 +0000119 PyMem_DEL(interp);
120}
121
122
Michael W. Hudson019a78e2002-11-08 12:53:11 +0000123/* Default implementation for _PyThreadState_GetFrame */
124static struct _frame *
125threadstate_getframe(PyThreadState *self)
126{
127 return self->frame;
128}
129
Guido van Rossuma027efa1997-05-05 20:56:21 +0000130PyThreadState *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000131PyThreadState_New(PyInterpreterState *interp)
Guido van Rossuma027efa1997-05-05 20:56:21 +0000132{
133 PyThreadState *tstate = PyMem_NEW(PyThreadState, 1);
Michael W. Hudson019a78e2002-11-08 12:53:11 +0000134 if (_PyThreadState_GetFrame == NULL)
Guido van Rossum6297a7a2003-02-19 15:53:17 +0000135 _PyThreadState_GetFrame = threadstate_getframe;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000136
Guido van Rossuma027efa1997-05-05 20:56:21 +0000137 if (tstate != NULL) {
Guido van Rossum25ce5661997-08-02 03:10:38 +0000138 tstate->interp = interp;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000139
140 tstate->frame = NULL;
141 tstate->recursion_depth = 0;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000142 tstate->tracing = 0;
Fred Drake9e3ad782001-07-03 23:39:52 +0000143 tstate->use_tracing = 0;
Michael W. Hudson019a78e2002-11-08 12:53:11 +0000144 tstate->tick_counter = 0;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000145
Guido van Rossumede04391998-04-10 20:18:25 +0000146 tstate->dict = NULL;
147
Guido van Rossuma027efa1997-05-05 20:56:21 +0000148 tstate->curexc_type = NULL;
149 tstate->curexc_value = NULL;
150 tstate->curexc_traceback = NULL;
151
152 tstate->exc_type = NULL;
153 tstate->exc_value = NULL;
154 tstate->exc_traceback = NULL;
155
Fred Drake5755ce62001-06-27 19:19:46 +0000156 tstate->c_profilefunc = NULL;
157 tstate->c_tracefunc = NULL;
158 tstate->c_profileobj = NULL;
159 tstate->c_traceobj = NULL;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000160
Guido van Rossum1d5ad901999-06-18 14:22:24 +0000161 HEAD_LOCK();
Guido van Rossum25ce5661997-08-02 03:10:38 +0000162 tstate->next = interp->tstate_head;
163 interp->tstate_head = tstate;
Guido van Rossum1d5ad901999-06-18 14:22:24 +0000164 HEAD_UNLOCK();
Guido van Rossuma027efa1997-05-05 20:56:21 +0000165 }
Guido van Rossum25ce5661997-08-02 03:10:38 +0000166
Guido van Rossuma027efa1997-05-05 20:56:21 +0000167 return tstate;
168}
169
170
171void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000172PyThreadState_Clear(PyThreadState *tstate)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000173{
Guido van Rossum22348dc1997-11-03 22:08:36 +0000174 if (Py_VerboseFlag && tstate->frame != NULL)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000175 fprintf(stderr,
Guido van Rossum5f896a41997-08-21 02:28:19 +0000176 "PyThreadState_Clear: warning: thread still has a frame\n");
Guido van Rossum25ce5661997-08-02 03:10:38 +0000177
178 ZAP(tstate->frame);
179
Guido van Rossumede04391998-04-10 20:18:25 +0000180 ZAP(tstate->dict);
181
Guido van Rossum25ce5661997-08-02 03:10:38 +0000182 ZAP(tstate->curexc_type);
183 ZAP(tstate->curexc_value);
184 ZAP(tstate->curexc_traceback);
185
186 ZAP(tstate->exc_type);
187 ZAP(tstate->exc_value);
188 ZAP(tstate->exc_traceback);
189
Fred Drake5755ce62001-06-27 19:19:46 +0000190 tstate->c_profilefunc = NULL;
191 tstate->c_tracefunc = NULL;
192 ZAP(tstate->c_profileobj);
193 ZAP(tstate->c_traceobj);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000194}
195
196
Guido van Rossum29757862001-01-23 01:46:06 +0000197/* Common code for PyThreadState_Delete() and PyThreadState_DeleteCurrent() */
198static void
199tstate_delete_common(PyThreadState *tstate)
Guido van Rossuma027efa1997-05-05 20:56:21 +0000200{
Guido van Rossum25ce5661997-08-02 03:10:38 +0000201 PyInterpreterState *interp;
202 PyThreadState **p;
203 if (tstate == NULL)
204 Py_FatalError("PyThreadState_Delete: NULL tstate");
Guido van Rossum25ce5661997-08-02 03:10:38 +0000205 interp = tstate->interp;
206 if (interp == NULL)
207 Py_FatalError("PyThreadState_Delete: NULL interp");
Guido van Rossum1d5ad901999-06-18 14:22:24 +0000208 HEAD_LOCK();
Guido van Rossum25ce5661997-08-02 03:10:38 +0000209 for (p = &interp->tstate_head; ; p = &(*p)->next) {
210 if (*p == NULL)
211 Py_FatalError(
212 "PyThreadState_Delete: invalid tstate");
213 if (*p == tstate)
214 break;
215 }
216 *p = tstate->next;
Guido van Rossum1d5ad901999-06-18 14:22:24 +0000217 HEAD_UNLOCK();
Guido van Rossuma027efa1997-05-05 20:56:21 +0000218 PyMem_DEL(tstate);
219}
220
221
Guido van Rossum29757862001-01-23 01:46:06 +0000222void
223PyThreadState_Delete(PyThreadState *tstate)
224{
225 if (tstate == _PyThreadState_Current)
226 Py_FatalError("PyThreadState_Delete: tstate is still current");
227 tstate_delete_common(tstate);
228}
229
230
231#ifdef WITH_THREAD
232void
233PyThreadState_DeleteCurrent()
234{
235 PyThreadState *tstate = _PyThreadState_Current;
236 if (tstate == NULL)
237 Py_FatalError(
238 "PyThreadState_DeleteCurrent: no current tstate");
239 _PyThreadState_Current = NULL;
240 tstate_delete_common(tstate);
241 PyEval_ReleaseLock();
242}
243#endif /* WITH_THREAD */
244
245
Guido van Rossuma027efa1997-05-05 20:56:21 +0000246PyThreadState *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000247PyThreadState_Get(void)
Guido van Rossuma027efa1997-05-05 20:56:21 +0000248{
Guido van Rossum18bc7c21998-12-21 18:27:28 +0000249 if (_PyThreadState_Current == NULL)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000250 Py_FatalError("PyThreadState_Get: no current thread");
251
Guido van Rossum18bc7c21998-12-21 18:27:28 +0000252 return _PyThreadState_Current;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000253}
254
255
256PyThreadState *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000257PyThreadState_Swap(PyThreadState *new)
Guido van Rossuma027efa1997-05-05 20:56:21 +0000258{
Guido van Rossum18bc7c21998-12-21 18:27:28 +0000259 PyThreadState *old = _PyThreadState_Current;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000260
Guido van Rossum18bc7c21998-12-21 18:27:28 +0000261 _PyThreadState_Current = new;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000262
Guido van Rossuma027efa1997-05-05 20:56:21 +0000263 return old;
264}
Guido van Rossumede04391998-04-10 20:18:25 +0000265
266/* An extension mechanism to store arbitrary additional per-thread state.
267 PyThreadState_GetDict() returns a dictionary that can be used to hold such
268 state; the caller should pick a unique key and store its state there. If
269 PyThreadState_GetDict() returns NULL, an exception has been raised (most
270 likely MemoryError) and the caller should pass on the exception. */
271
272PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000273PyThreadState_GetDict(void)
Guido van Rossumede04391998-04-10 20:18:25 +0000274{
Guido van Rossum18bc7c21998-12-21 18:27:28 +0000275 if (_PyThreadState_Current == NULL)
Guido van Rossumede04391998-04-10 20:18:25 +0000276 Py_FatalError("PyThreadState_GetDict: no current thread");
277
Guido van Rossum18bc7c21998-12-21 18:27:28 +0000278 if (_PyThreadState_Current->dict == NULL)
279 _PyThreadState_Current->dict = PyDict_New();
280 return _PyThreadState_Current->dict;
Guido van Rossumede04391998-04-10 20:18:25 +0000281}
Guido van Rossumf5df46d2001-07-19 12:19:27 +0000282
283
284/* Routines for advanced debuggers, requested by David Beazley.
285 Don't use unless you know what you are doing! */
286
287PyInterpreterState *
288PyInterpreterState_Head(void)
289{
290 return interp_head;
291}
292
293PyInterpreterState *
294PyInterpreterState_Next(PyInterpreterState *interp) {
295 return interp->next;
296}
297
298PyThreadState *
299PyInterpreterState_ThreadHead(PyInterpreterState *interp) {
300 return interp->tstate_head;
301}
302
303PyThreadState *
304PyThreadState_Next(PyThreadState *tstate) {
305 return tstate->next;
306}