blob: ad92ddec26973b19a0865e3f0c1e097c57f35099 [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 Rossuma027efa1997-05-05 20:56:21 +000038
39
40PyInterpreterState *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000041PyInterpreterState_New(void)
Guido van Rossuma027efa1997-05-05 20:56:21 +000042{
43 PyInterpreterState *interp = PyMem_NEW(PyInterpreterState, 1);
Guido van Rossum25ce5661997-08-02 03:10:38 +000044
Guido van Rossuma027efa1997-05-05 20:56:21 +000045 if (interp != NULL) {
Guido van Rossum1d5ad901999-06-18 14:22:24 +000046 HEAD_INIT();
Guido van Rossum25ce5661997-08-02 03:10:38 +000047 interp->modules = NULL;
Guido van Rossuma027efa1997-05-05 20:56:21 +000048 interp->sysdict = NULL;
Guido van Rossum25ce5661997-08-02 03:10:38 +000049 interp->builtins = NULL;
Guido van Rossum25ce5661997-08-02 03:10:38 +000050 interp->tstate_head = NULL;
Martin v. Löwisf0473d52001-07-18 16:17:16 +000051#ifdef HAVE_DLOPEN
52#ifdef RTLD_NOW
53 interp->dlopenflags = RTLD_NOW;
54#else
55 interp->dlopenflags = RTLD_LAZY;
56#endif
57#endif
Guido van Rossum25ce5661997-08-02 03:10:38 +000058
Tim Peters412f2462000-09-02 09:16:15 +000059 HEAD_LOCK();
Guido van Rossum25ce5661997-08-02 03:10:38 +000060 interp->next = interp_head;
61 interp_head = interp;
Tim Peters412f2462000-09-02 09:16:15 +000062 HEAD_UNLOCK();
Guido van Rossuma027efa1997-05-05 20:56:21 +000063 }
Guido van Rossum25ce5661997-08-02 03:10:38 +000064
Guido van Rossuma027efa1997-05-05 20:56:21 +000065 return interp;
66}
67
68
69void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000070PyInterpreterState_Clear(PyInterpreterState *interp)
Guido van Rossum25ce5661997-08-02 03:10:38 +000071{
72 PyThreadState *p;
Guido van Rossum1d5ad901999-06-18 14:22:24 +000073 HEAD_LOCK();
Guido van Rossum25ce5661997-08-02 03:10:38 +000074 for (p = interp->tstate_head; p != NULL; p = p->next)
75 PyThreadState_Clear(p);
Guido van Rossum1d5ad901999-06-18 14:22:24 +000076 HEAD_UNLOCK();
Guido van Rossum25ce5661997-08-02 03:10:38 +000077 ZAP(interp->modules);
78 ZAP(interp->sysdict);
79 ZAP(interp->builtins);
80}
81
82
83static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000084zapthreads(PyInterpreterState *interp)
Guido van Rossum25ce5661997-08-02 03:10:38 +000085{
Guido van Rossum1d5ad901999-06-18 14:22:24 +000086 PyThreadState *p;
87 /* No need to lock the mutex here because this should only happen
88 when the threads are all really dead (XXX famous last words). */
89 while ((p = interp->tstate_head) != NULL) {
Guido van Rossum25ce5661997-08-02 03:10:38 +000090 PyThreadState_Delete(p);
Guido van Rossum25ce5661997-08-02 03:10:38 +000091 }
92}
93
94
95void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000096PyInterpreterState_Delete(PyInterpreterState *interp)
Guido van Rossuma027efa1997-05-05 20:56:21 +000097{
Guido van Rossum25ce5661997-08-02 03:10:38 +000098 PyInterpreterState **p;
99 zapthreads(interp);
Tim Peters412f2462000-09-02 09:16:15 +0000100 HEAD_LOCK();
Guido van Rossum25ce5661997-08-02 03:10:38 +0000101 for (p = &interp_head; ; p = &(*p)->next) {
102 if (*p == NULL)
103 Py_FatalError(
104 "PyInterpreterState_Delete: invalid interp");
105 if (*p == interp)
106 break;
107 }
108 if (interp->tstate_head != NULL)
109 Py_FatalError("PyInterpreterState_Delete: remaining threads");
110 *p = interp->next;
Tim Peters412f2462000-09-02 09:16:15 +0000111 HEAD_UNLOCK();
Guido van Rossuma027efa1997-05-05 20:56:21 +0000112 PyMem_DEL(interp);
113}
114
115
116PyThreadState *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000117PyThreadState_New(PyInterpreterState *interp)
Guido van Rossuma027efa1997-05-05 20:56:21 +0000118{
119 PyThreadState *tstate = PyMem_NEW(PyThreadState, 1);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000120
Guido van Rossuma027efa1997-05-05 20:56:21 +0000121 if (tstate != NULL) {
Guido van Rossum25ce5661997-08-02 03:10:38 +0000122 tstate->interp = interp;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000123
124 tstate->frame = NULL;
125 tstate->recursion_depth = 0;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000126 tstate->tracing = 0;
Fred Drake9e3ad782001-07-03 23:39:52 +0000127 tstate->use_tracing = 0;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000128
Guido van Rossumede04391998-04-10 20:18:25 +0000129 tstate->dict = NULL;
130
Guido van Rossuma027efa1997-05-05 20:56:21 +0000131 tstate->curexc_type = NULL;
132 tstate->curexc_value = NULL;
133 tstate->curexc_traceback = NULL;
134
135 tstate->exc_type = NULL;
136 tstate->exc_value = NULL;
137 tstate->exc_traceback = NULL;
138
Fred Drake5755ce62001-06-27 19:19:46 +0000139 tstate->c_profilefunc = NULL;
140 tstate->c_tracefunc = NULL;
141 tstate->c_profileobj = NULL;
142 tstate->c_traceobj = NULL;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000143
Guido van Rossum1d5ad901999-06-18 14:22:24 +0000144 HEAD_LOCK();
Guido van Rossum25ce5661997-08-02 03:10:38 +0000145 tstate->next = interp->tstate_head;
146 interp->tstate_head = tstate;
Guido van Rossum1d5ad901999-06-18 14:22:24 +0000147 HEAD_UNLOCK();
Guido van Rossuma027efa1997-05-05 20:56:21 +0000148 }
Guido van Rossum25ce5661997-08-02 03:10:38 +0000149
Guido van Rossuma027efa1997-05-05 20:56:21 +0000150 return tstate;
151}
152
153
154void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000155PyThreadState_Clear(PyThreadState *tstate)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000156{
Guido van Rossum22348dc1997-11-03 22:08:36 +0000157 if (Py_VerboseFlag && tstate->frame != NULL)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000158 fprintf(stderr,
Guido van Rossum5f896a41997-08-21 02:28:19 +0000159 "PyThreadState_Clear: warning: thread still has a frame\n");
Guido van Rossum25ce5661997-08-02 03:10:38 +0000160
161 ZAP(tstate->frame);
162
Guido van Rossumede04391998-04-10 20:18:25 +0000163 ZAP(tstate->dict);
164
Guido van Rossum25ce5661997-08-02 03:10:38 +0000165 ZAP(tstate->curexc_type);
166 ZAP(tstate->curexc_value);
167 ZAP(tstate->curexc_traceback);
168
169 ZAP(tstate->exc_type);
170 ZAP(tstate->exc_value);
171 ZAP(tstate->exc_traceback);
172
Fred Drake5755ce62001-06-27 19:19:46 +0000173 tstate->c_profilefunc = NULL;
174 tstate->c_tracefunc = NULL;
175 ZAP(tstate->c_profileobj);
176 ZAP(tstate->c_traceobj);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000177}
178
179
Guido van Rossum29757862001-01-23 01:46:06 +0000180/* Common code for PyThreadState_Delete() and PyThreadState_DeleteCurrent() */
181static void
182tstate_delete_common(PyThreadState *tstate)
Guido van Rossuma027efa1997-05-05 20:56:21 +0000183{
Guido van Rossum25ce5661997-08-02 03:10:38 +0000184 PyInterpreterState *interp;
185 PyThreadState **p;
186 if (tstate == NULL)
187 Py_FatalError("PyThreadState_Delete: NULL tstate");
Guido van Rossum25ce5661997-08-02 03:10:38 +0000188 interp = tstate->interp;
189 if (interp == NULL)
190 Py_FatalError("PyThreadState_Delete: NULL interp");
Guido van Rossum1d5ad901999-06-18 14:22:24 +0000191 HEAD_LOCK();
Guido van Rossum25ce5661997-08-02 03:10:38 +0000192 for (p = &interp->tstate_head; ; p = &(*p)->next) {
193 if (*p == NULL)
194 Py_FatalError(
195 "PyThreadState_Delete: invalid tstate");
196 if (*p == tstate)
197 break;
198 }
199 *p = tstate->next;
Guido van Rossum1d5ad901999-06-18 14:22:24 +0000200 HEAD_UNLOCK();
Guido van Rossuma027efa1997-05-05 20:56:21 +0000201 PyMem_DEL(tstate);
202}
203
204
Guido van Rossum29757862001-01-23 01:46:06 +0000205void
206PyThreadState_Delete(PyThreadState *tstate)
207{
208 if (tstate == _PyThreadState_Current)
209 Py_FatalError("PyThreadState_Delete: tstate is still current");
210 tstate_delete_common(tstate);
211}
212
213
214#ifdef WITH_THREAD
215void
216PyThreadState_DeleteCurrent()
217{
218 PyThreadState *tstate = _PyThreadState_Current;
219 if (tstate == NULL)
220 Py_FatalError(
221 "PyThreadState_DeleteCurrent: no current tstate");
222 _PyThreadState_Current = NULL;
223 tstate_delete_common(tstate);
224 PyEval_ReleaseLock();
225}
226#endif /* WITH_THREAD */
227
228
Guido van Rossuma027efa1997-05-05 20:56:21 +0000229PyThreadState *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000230PyThreadState_Get(void)
Guido van Rossuma027efa1997-05-05 20:56:21 +0000231{
Guido van Rossum18bc7c21998-12-21 18:27:28 +0000232 if (_PyThreadState_Current == NULL)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000233 Py_FatalError("PyThreadState_Get: no current thread");
234
Guido van Rossum18bc7c21998-12-21 18:27:28 +0000235 return _PyThreadState_Current;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000236}
237
238
239PyThreadState *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000240PyThreadState_Swap(PyThreadState *new)
Guido van Rossuma027efa1997-05-05 20:56:21 +0000241{
Guido van Rossum18bc7c21998-12-21 18:27:28 +0000242 PyThreadState *old = _PyThreadState_Current;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000243
Guido van Rossum18bc7c21998-12-21 18:27:28 +0000244 _PyThreadState_Current = new;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000245
Guido van Rossuma027efa1997-05-05 20:56:21 +0000246 return old;
247}
Guido van Rossumede04391998-04-10 20:18:25 +0000248
249/* An extension mechanism to store arbitrary additional per-thread state.
250 PyThreadState_GetDict() returns a dictionary that can be used to hold such
251 state; the caller should pick a unique key and store its state there. If
252 PyThreadState_GetDict() returns NULL, an exception has been raised (most
253 likely MemoryError) and the caller should pass on the exception. */
254
255PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000256PyThreadState_GetDict(void)
Guido van Rossumede04391998-04-10 20:18:25 +0000257{
Guido van Rossum18bc7c21998-12-21 18:27:28 +0000258 if (_PyThreadState_Current == NULL)
Guido van Rossumede04391998-04-10 20:18:25 +0000259 Py_FatalError("PyThreadState_GetDict: no current thread");
260
Guido van Rossum18bc7c21998-12-21 18:27:28 +0000261 if (_PyThreadState_Current->dict == NULL)
262 _PyThreadState_Current->dict = PyDict_New();
263 return _PyThreadState_Current->dict;
Guido van Rossumede04391998-04-10 20:18:25 +0000264}
Guido van Rossumf5df46d2001-07-19 12:19:27 +0000265
266
267/* Routines for advanced debuggers, requested by David Beazley.
268 Don't use unless you know what you are doing! */
269
270PyInterpreterState *
271PyInterpreterState_Head(void)
272{
273 return interp_head;
274}
275
276PyInterpreterState *
277PyInterpreterState_Next(PyInterpreterState *interp) {
278 return interp->next;
279}
280
281PyThreadState *
282PyInterpreterState_ThreadHead(PyInterpreterState *interp) {
283 return interp->tstate_head;
284}
285
286PyThreadState *
287PyThreadState_Next(PyThreadState *tstate) {
288 return tstate->next;
289}