blob: 707e43e90d749b5c611cbdf2708d38290bf6441b [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;
Michael W. Hudson019a78e2002-11-08 12:53:11 +000038unaryfunc _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;
Martin v. Löwisf0473d52001-07-18 16:17:16 +000052#ifdef HAVE_DLOPEN
53#ifdef RTLD_NOW
54 interp->dlopenflags = RTLD_NOW;
55#else
56 interp->dlopenflags = RTLD_LAZY;
57#endif
58#endif
Guido van Rossum25ce5661997-08-02 03:10:38 +000059
Tim Peters412f2462000-09-02 09:16:15 +000060 HEAD_LOCK();
Guido van Rossum25ce5661997-08-02 03:10:38 +000061 interp->next = interp_head;
62 interp_head = interp;
Tim Peters412f2462000-09-02 09:16:15 +000063 HEAD_UNLOCK();
Guido van Rossuma027efa1997-05-05 20:56:21 +000064 }
Guido van Rossum25ce5661997-08-02 03:10:38 +000065
Guido van Rossuma027efa1997-05-05 20:56:21 +000066 return interp;
67}
68
69
70void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000071PyInterpreterState_Clear(PyInterpreterState *interp)
Guido van Rossum25ce5661997-08-02 03:10:38 +000072{
73 PyThreadState *p;
Guido van Rossum1d5ad901999-06-18 14:22:24 +000074 HEAD_LOCK();
Guido van Rossum25ce5661997-08-02 03:10:38 +000075 for (p = interp->tstate_head; p != NULL; p = p->next)
76 PyThreadState_Clear(p);
Guido van Rossum1d5ad901999-06-18 14:22:24 +000077 HEAD_UNLOCK();
Guido van Rossum25ce5661997-08-02 03:10:38 +000078 ZAP(interp->modules);
79 ZAP(interp->sysdict);
80 ZAP(interp->builtins);
81}
82
83
84static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000085zapthreads(PyInterpreterState *interp)
Guido van Rossum25ce5661997-08-02 03:10:38 +000086{
Guido van Rossum1d5ad901999-06-18 14:22:24 +000087 PyThreadState *p;
88 /* No need to lock the mutex here because this should only happen
89 when the threads are all really dead (XXX famous last words). */
90 while ((p = interp->tstate_head) != NULL) {
Guido van Rossum25ce5661997-08-02 03:10:38 +000091 PyThreadState_Delete(p);
Guido van Rossum25ce5661997-08-02 03:10:38 +000092 }
93}
94
95
96void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000097PyInterpreterState_Delete(PyInterpreterState *interp)
Guido van Rossuma027efa1997-05-05 20:56:21 +000098{
Guido van Rossum25ce5661997-08-02 03:10:38 +000099 PyInterpreterState **p;
100 zapthreads(interp);
Tim Peters412f2462000-09-02 09:16:15 +0000101 HEAD_LOCK();
Guido van Rossum25ce5661997-08-02 03:10:38 +0000102 for (p = &interp_head; ; p = &(*p)->next) {
103 if (*p == NULL)
104 Py_FatalError(
105 "PyInterpreterState_Delete: invalid interp");
106 if (*p == interp)
107 break;
108 }
109 if (interp->tstate_head != NULL)
110 Py_FatalError("PyInterpreterState_Delete: remaining threads");
111 *p = interp->next;
Tim Peters412f2462000-09-02 09:16:15 +0000112 HEAD_UNLOCK();
Guido van Rossuma027efa1997-05-05 20:56:21 +0000113 PyMem_DEL(interp);
114}
115
116
Michael W. Hudson019a78e2002-11-08 12:53:11 +0000117/* Default implementation for _PyThreadState_GetFrame */
118static struct _frame *
119threadstate_getframe(PyThreadState *self)
120{
121 return self->frame;
122}
123
Guido van Rossuma027efa1997-05-05 20:56:21 +0000124PyThreadState *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000125PyThreadState_New(PyInterpreterState *interp)
Guido van Rossuma027efa1997-05-05 20:56:21 +0000126{
127 PyThreadState *tstate = PyMem_NEW(PyThreadState, 1);
Michael W. Hudson019a78e2002-11-08 12:53:11 +0000128 if (_PyThreadState_GetFrame == NULL)
129 _PyThreadState_GetFrame = (unaryfunc)threadstate_getframe;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000130
Guido van Rossuma027efa1997-05-05 20:56:21 +0000131 if (tstate != NULL) {
Guido van Rossum25ce5661997-08-02 03:10:38 +0000132 tstate->interp = interp;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000133
134 tstate->frame = NULL;
135 tstate->recursion_depth = 0;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000136 tstate->tracing = 0;
Fred Drake9e3ad782001-07-03 23:39:52 +0000137 tstate->use_tracing = 0;
Michael W. Hudson019a78e2002-11-08 12:53:11 +0000138 tstate->tick_counter = 0;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000139
Guido van Rossumede04391998-04-10 20:18:25 +0000140 tstate->dict = NULL;
141
Guido van Rossuma027efa1997-05-05 20:56:21 +0000142 tstate->curexc_type = NULL;
143 tstate->curexc_value = NULL;
144 tstate->curexc_traceback = NULL;
145
146 tstate->exc_type = NULL;
147 tstate->exc_value = NULL;
148 tstate->exc_traceback = NULL;
149
Fred Drake5755ce62001-06-27 19:19:46 +0000150 tstate->c_profilefunc = NULL;
151 tstate->c_tracefunc = NULL;
152 tstate->c_profileobj = NULL;
153 tstate->c_traceobj = NULL;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000154
Guido van Rossum1d5ad901999-06-18 14:22:24 +0000155 HEAD_LOCK();
Guido van Rossum25ce5661997-08-02 03:10:38 +0000156 tstate->next = interp->tstate_head;
157 interp->tstate_head = tstate;
Guido van Rossum1d5ad901999-06-18 14:22:24 +0000158 HEAD_UNLOCK();
Guido van Rossuma027efa1997-05-05 20:56:21 +0000159 }
Guido van Rossum25ce5661997-08-02 03:10:38 +0000160
Guido van Rossuma027efa1997-05-05 20:56:21 +0000161 return tstate;
162}
163
164
165void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000166PyThreadState_Clear(PyThreadState *tstate)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000167{
Guido van Rossum22348dc1997-11-03 22:08:36 +0000168 if (Py_VerboseFlag && tstate->frame != NULL)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000169 fprintf(stderr,
Guido van Rossum5f896a41997-08-21 02:28:19 +0000170 "PyThreadState_Clear: warning: thread still has a frame\n");
Guido van Rossum25ce5661997-08-02 03:10:38 +0000171
172 ZAP(tstate->frame);
173
Guido van Rossumede04391998-04-10 20:18:25 +0000174 ZAP(tstate->dict);
175
Guido van Rossum25ce5661997-08-02 03:10:38 +0000176 ZAP(tstate->curexc_type);
177 ZAP(tstate->curexc_value);
178 ZAP(tstate->curexc_traceback);
179
180 ZAP(tstate->exc_type);
181 ZAP(tstate->exc_value);
182 ZAP(tstate->exc_traceback);
183
Fred Drake5755ce62001-06-27 19:19:46 +0000184 tstate->c_profilefunc = NULL;
185 tstate->c_tracefunc = NULL;
186 ZAP(tstate->c_profileobj);
187 ZAP(tstate->c_traceobj);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000188}
189
190
Guido van Rossum29757862001-01-23 01:46:06 +0000191/* Common code for PyThreadState_Delete() and PyThreadState_DeleteCurrent() */
192static void
193tstate_delete_common(PyThreadState *tstate)
Guido van Rossuma027efa1997-05-05 20:56:21 +0000194{
Guido van Rossum25ce5661997-08-02 03:10:38 +0000195 PyInterpreterState *interp;
196 PyThreadState **p;
197 if (tstate == NULL)
198 Py_FatalError("PyThreadState_Delete: NULL tstate");
Guido van Rossum25ce5661997-08-02 03:10:38 +0000199 interp = tstate->interp;
200 if (interp == NULL)
201 Py_FatalError("PyThreadState_Delete: NULL interp");
Guido van Rossum1d5ad901999-06-18 14:22:24 +0000202 HEAD_LOCK();
Guido van Rossum25ce5661997-08-02 03:10:38 +0000203 for (p = &interp->tstate_head; ; p = &(*p)->next) {
204 if (*p == NULL)
205 Py_FatalError(
206 "PyThreadState_Delete: invalid tstate");
207 if (*p == tstate)
208 break;
209 }
210 *p = tstate->next;
Guido van Rossum1d5ad901999-06-18 14:22:24 +0000211 HEAD_UNLOCK();
Guido van Rossuma027efa1997-05-05 20:56:21 +0000212 PyMem_DEL(tstate);
213}
214
215
Guido van Rossum29757862001-01-23 01:46:06 +0000216void
217PyThreadState_Delete(PyThreadState *tstate)
218{
219 if (tstate == _PyThreadState_Current)
220 Py_FatalError("PyThreadState_Delete: tstate is still current");
221 tstate_delete_common(tstate);
222}
223
224
225#ifdef WITH_THREAD
226void
227PyThreadState_DeleteCurrent()
228{
229 PyThreadState *tstate = _PyThreadState_Current;
230 if (tstate == NULL)
231 Py_FatalError(
232 "PyThreadState_DeleteCurrent: no current tstate");
233 _PyThreadState_Current = NULL;
234 tstate_delete_common(tstate);
235 PyEval_ReleaseLock();
236}
237#endif /* WITH_THREAD */
238
239
Guido van Rossuma027efa1997-05-05 20:56:21 +0000240PyThreadState *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000241PyThreadState_Get(void)
Guido van Rossuma027efa1997-05-05 20:56:21 +0000242{
Guido van Rossum18bc7c21998-12-21 18:27:28 +0000243 if (_PyThreadState_Current == NULL)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000244 Py_FatalError("PyThreadState_Get: no current thread");
245
Guido van Rossum18bc7c21998-12-21 18:27:28 +0000246 return _PyThreadState_Current;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000247}
248
249
250PyThreadState *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000251PyThreadState_Swap(PyThreadState *new)
Guido van Rossuma027efa1997-05-05 20:56:21 +0000252{
Guido van Rossum18bc7c21998-12-21 18:27:28 +0000253 PyThreadState *old = _PyThreadState_Current;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000254
Guido van Rossum18bc7c21998-12-21 18:27:28 +0000255 _PyThreadState_Current = new;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000256
Guido van Rossuma027efa1997-05-05 20:56:21 +0000257 return old;
258}
Guido van Rossumede04391998-04-10 20:18:25 +0000259
260/* An extension mechanism to store arbitrary additional per-thread state.
261 PyThreadState_GetDict() returns a dictionary that can be used to hold such
262 state; the caller should pick a unique key and store its state there. If
263 PyThreadState_GetDict() returns NULL, an exception has been raised (most
264 likely MemoryError) and the caller should pass on the exception. */
265
266PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000267PyThreadState_GetDict(void)
Guido van Rossumede04391998-04-10 20:18:25 +0000268{
Guido van Rossum18bc7c21998-12-21 18:27:28 +0000269 if (_PyThreadState_Current == NULL)
Guido van Rossumede04391998-04-10 20:18:25 +0000270 Py_FatalError("PyThreadState_GetDict: no current thread");
271
Guido van Rossum18bc7c21998-12-21 18:27:28 +0000272 if (_PyThreadState_Current->dict == NULL)
273 _PyThreadState_Current->dict = PyDict_New();
274 return _PyThreadState_Current->dict;
Guido van Rossumede04391998-04-10 20:18:25 +0000275}
Guido van Rossumf5df46d2001-07-19 12:19:27 +0000276
277
278/* Routines for advanced debuggers, requested by David Beazley.
279 Don't use unless you know what you are doing! */
280
281PyInterpreterState *
282PyInterpreterState_Head(void)
283{
284 return interp_head;
285}
286
287PyInterpreterState *
288PyInterpreterState_Next(PyInterpreterState *interp) {
289 return interp->next;
290}
291
292PyThreadState *
293PyInterpreterState_ThreadHead(PyInterpreterState *interp) {
294 return interp->tstate_head;
295}
296
297PyThreadState *
298PyThreadState_Next(PyThreadState *tstate) {
299 return tstate->next;
300}