blob: 34d913bcedf97c8b344740298f7884f12a687002 [file] [log] [blame]
Guido van Rossuma027efa1997-05-05 20:56:21 +00001/***********************************************************
Guido van Rossumfd71b9e2000-06-30 23:50:40 +00002Copyright (c) 2000, BeOpen.com.
3Copyright (c) 1995-2000, Corporation for National Research Initiatives.
4Copyright (c) 1990-1995, Stichting Mathematisch Centrum.
5All rights reserved.
Guido van Rossuma027efa1997-05-05 20:56:21 +00006
Guido van Rossumfd71b9e2000-06-30 23:50:40 +00007See the file "Misc/COPYRIGHT" for information on usage and
8redistribution of this file, and for a DISCLAIMER OF ALL WARRANTIES.
Guido van Rossuma027efa1997-05-05 20:56:21 +00009******************************************************************/
10
11/* Thread and interpreter state structures and their interfaces */
12
13#include "Python.h"
14
Guido van Rossum25ce5661997-08-02 03:10:38 +000015#define ZAP(x) { \
16 PyObject *tmp = (PyObject *)(x); \
17 (x) = NULL; \
18 Py_XDECREF(tmp); \
19}
20
21
Guido van Rossum1d5ad901999-06-18 14:22:24 +000022#ifdef WITH_THREAD
23#include "pythread.h"
24static PyThread_type_lock head_mutex = NULL; /* Protects interp->tstate_head */
25#define HEAD_INIT() (head_mutex || (head_mutex = PyThread_allocate_lock()))
26#define HEAD_LOCK() PyThread_acquire_lock(head_mutex, WAIT_LOCK)
27#define HEAD_UNLOCK() PyThread_release_lock(head_mutex)
28#else
29#define HEAD_INIT() /* Nothing */
30#define HEAD_LOCK() /* Nothing */
31#define HEAD_UNLOCK() /* Nothing */
32#endif
33
Guido van Rossum25ce5661997-08-02 03:10:38 +000034static PyInterpreterState *interp_head = NULL;
Guido van Rossuma027efa1997-05-05 20:56:21 +000035
Guido van Rossum18bc7c21998-12-21 18:27:28 +000036PyThreadState *_PyThreadState_Current = NULL;
Guido van Rossuma027efa1997-05-05 20:56:21 +000037
38
39PyInterpreterState *
40PyInterpreterState_New()
41{
42 PyInterpreterState *interp = PyMem_NEW(PyInterpreterState, 1);
Guido van Rossum25ce5661997-08-02 03:10:38 +000043
Guido van Rossuma027efa1997-05-05 20:56:21 +000044 if (interp != NULL) {
Guido van Rossum1d5ad901999-06-18 14:22:24 +000045 HEAD_INIT();
Guido van Rossum25ce5661997-08-02 03:10:38 +000046 interp->modules = NULL;
Guido van Rossuma027efa1997-05-05 20:56:21 +000047 interp->sysdict = NULL;
Guido van Rossum25ce5661997-08-02 03:10:38 +000048 interp->builtins = NULL;
49 interp->checkinterval = 10;
50 interp->tstate_head = NULL;
51
52 interp->next = interp_head;
53 interp_head = interp;
Guido van Rossuma027efa1997-05-05 20:56:21 +000054 }
Guido van Rossum25ce5661997-08-02 03:10:38 +000055
Guido van Rossuma027efa1997-05-05 20:56:21 +000056 return interp;
57}
58
59
60void
Guido van Rossum25ce5661997-08-02 03:10:38 +000061PyInterpreterState_Clear(interp)
62 PyInterpreterState *interp;
63{
64 PyThreadState *p;
Guido van Rossum1d5ad901999-06-18 14:22:24 +000065 HEAD_LOCK();
Guido van Rossum25ce5661997-08-02 03:10:38 +000066 for (p = interp->tstate_head; p != NULL; p = p->next)
67 PyThreadState_Clear(p);
Guido van Rossum1d5ad901999-06-18 14:22:24 +000068 HEAD_UNLOCK();
Guido van Rossum25ce5661997-08-02 03:10:38 +000069 ZAP(interp->modules);
70 ZAP(interp->sysdict);
71 ZAP(interp->builtins);
72}
73
74
75static void
76zapthreads(interp)
77 PyInterpreterState *interp;
78{
Guido van Rossum1d5ad901999-06-18 14:22:24 +000079 PyThreadState *p;
80 /* No need to lock the mutex here because this should only happen
81 when the threads are all really dead (XXX famous last words). */
82 while ((p = interp->tstate_head) != NULL) {
Guido van Rossum25ce5661997-08-02 03:10:38 +000083 PyThreadState_Delete(p);
Guido van Rossum25ce5661997-08-02 03:10:38 +000084 }
85}
86
87
88void
Guido van Rossumf9cba091997-05-20 22:23:34 +000089PyInterpreterState_Delete(interp)
90 PyInterpreterState *interp;
Guido van Rossuma027efa1997-05-05 20:56:21 +000091{
Guido van Rossum25ce5661997-08-02 03:10:38 +000092 PyInterpreterState **p;
93 zapthreads(interp);
94 for (p = &interp_head; ; p = &(*p)->next) {
95 if (*p == NULL)
96 Py_FatalError(
97 "PyInterpreterState_Delete: invalid interp");
98 if (*p == interp)
99 break;
100 }
101 if (interp->tstate_head != NULL)
102 Py_FatalError("PyInterpreterState_Delete: remaining threads");
103 *p = interp->next;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000104 PyMem_DEL(interp);
105}
106
107
108PyThreadState *
Guido van Rossumf9cba091997-05-20 22:23:34 +0000109PyThreadState_New(interp)
110 PyInterpreterState *interp;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000111{
112 PyThreadState *tstate = PyMem_NEW(PyThreadState, 1);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000113
Guido van Rossuma027efa1997-05-05 20:56:21 +0000114 if (tstate != NULL) {
Guido van Rossum25ce5661997-08-02 03:10:38 +0000115 tstate->interp = interp;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000116
117 tstate->frame = NULL;
118 tstate->recursion_depth = 0;
119 tstate->ticker = 0;
120 tstate->tracing = 0;
121
Guido van Rossumede04391998-04-10 20:18:25 +0000122 tstate->dict = NULL;
123
Guido van Rossuma027efa1997-05-05 20:56:21 +0000124 tstate->curexc_type = NULL;
125 tstate->curexc_value = NULL;
126 tstate->curexc_traceback = NULL;
127
128 tstate->exc_type = NULL;
129 tstate->exc_value = NULL;
130 tstate->exc_traceback = NULL;
131
132 tstate->sys_profilefunc = NULL;
133 tstate->sys_tracefunc = NULL;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000134
Guido van Rossum1d5ad901999-06-18 14:22:24 +0000135 HEAD_LOCK();
Guido van Rossum25ce5661997-08-02 03:10:38 +0000136 tstate->next = interp->tstate_head;
137 interp->tstate_head = tstate;
Guido van Rossum1d5ad901999-06-18 14:22:24 +0000138 HEAD_UNLOCK();
Guido van Rossuma027efa1997-05-05 20:56:21 +0000139 }
Guido van Rossum25ce5661997-08-02 03:10:38 +0000140
Guido van Rossuma027efa1997-05-05 20:56:21 +0000141 return tstate;
142}
143
144
145void
Guido van Rossum25ce5661997-08-02 03:10:38 +0000146PyThreadState_Clear(tstate)
147 PyThreadState *tstate;
148{
Guido van Rossum22348dc1997-11-03 22:08:36 +0000149 if (Py_VerboseFlag && tstate->frame != NULL)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000150 fprintf(stderr,
Guido van Rossum5f896a41997-08-21 02:28:19 +0000151 "PyThreadState_Clear: warning: thread still has a frame\n");
Guido van Rossum25ce5661997-08-02 03:10:38 +0000152
153 ZAP(tstate->frame);
154
Guido van Rossumede04391998-04-10 20:18:25 +0000155 ZAP(tstate->dict);
156
Guido van Rossum25ce5661997-08-02 03:10:38 +0000157 ZAP(tstate->curexc_type);
158 ZAP(tstate->curexc_value);
159 ZAP(tstate->curexc_traceback);
160
161 ZAP(tstate->exc_type);
162 ZAP(tstate->exc_value);
163 ZAP(tstate->exc_traceback);
164
165 ZAP(tstate->sys_profilefunc);
166 ZAP(tstate->sys_tracefunc);
167}
168
169
170void
Guido van Rossumf9cba091997-05-20 22:23:34 +0000171PyThreadState_Delete(tstate)
172 PyThreadState *tstate;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000173{
Guido van Rossum25ce5661997-08-02 03:10:38 +0000174 PyInterpreterState *interp;
175 PyThreadState **p;
176 if (tstate == NULL)
177 Py_FatalError("PyThreadState_Delete: NULL tstate");
Guido van Rossum18bc7c21998-12-21 18:27:28 +0000178 if (tstate == _PyThreadState_Current)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000179 Py_FatalError("PyThreadState_Delete: tstate is still current");
180 interp = tstate->interp;
181 if (interp == NULL)
182 Py_FatalError("PyThreadState_Delete: NULL interp");
Guido van Rossum1d5ad901999-06-18 14:22:24 +0000183 HEAD_LOCK();
Guido van Rossum25ce5661997-08-02 03:10:38 +0000184 for (p = &interp->tstate_head; ; p = &(*p)->next) {
185 if (*p == NULL)
186 Py_FatalError(
187 "PyThreadState_Delete: invalid tstate");
188 if (*p == tstate)
189 break;
190 }
191 *p = tstate->next;
Guido van Rossum1d5ad901999-06-18 14:22:24 +0000192 HEAD_UNLOCK();
Guido van Rossuma027efa1997-05-05 20:56:21 +0000193 PyMem_DEL(tstate);
194}
195
196
197PyThreadState *
198PyThreadState_Get()
199{
Guido van Rossum18bc7c21998-12-21 18:27:28 +0000200 if (_PyThreadState_Current == NULL)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000201 Py_FatalError("PyThreadState_Get: no current thread");
202
Guido van Rossum18bc7c21998-12-21 18:27:28 +0000203 return _PyThreadState_Current;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000204}
205
206
207PyThreadState *
Guido van Rossumf9cba091997-05-20 22:23:34 +0000208PyThreadState_Swap(new)
209 PyThreadState *new;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000210{
Guido van Rossum18bc7c21998-12-21 18:27:28 +0000211 PyThreadState *old = _PyThreadState_Current;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000212
Guido van Rossum18bc7c21998-12-21 18:27:28 +0000213 _PyThreadState_Current = new;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000214
Guido van Rossuma027efa1997-05-05 20:56:21 +0000215 return old;
216}
Guido van Rossumede04391998-04-10 20:18:25 +0000217
218/* An extension mechanism to store arbitrary additional per-thread state.
219 PyThreadState_GetDict() returns a dictionary that can be used to hold such
220 state; the caller should pick a unique key and store its state there. If
221 PyThreadState_GetDict() returns NULL, an exception has been raised (most
222 likely MemoryError) and the caller should pass on the exception. */
223
224PyObject *
225PyThreadState_GetDict()
226{
Guido van Rossum18bc7c21998-12-21 18:27:28 +0000227 if (_PyThreadState_Current == NULL)
Guido van Rossumede04391998-04-10 20:18:25 +0000228 Py_FatalError("PyThreadState_GetDict: no current thread");
229
Guido van Rossum18bc7c21998-12-21 18:27:28 +0000230 if (_PyThreadState_Current->dict == NULL)
231 _PyThreadState_Current->dict = PyDict_New();
232 return _PyThreadState_Current->dict;
Guido van Rossumede04391998-04-10 20:18:25 +0000233}