blob: 192c4c14f6263698f09cc255758e7830bd52dda2 [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
Guido van Rossum25ce5661997-08-02 03:10:38 +00006#define ZAP(x) { \
7 PyObject *tmp = (PyObject *)(x); \
8 (x) = NULL; \
9 Py_XDECREF(tmp); \
10}
11
12
Guido van Rossum1d5ad901999-06-18 14:22:24 +000013#ifdef WITH_THREAD
14#include "pythread.h"
15static PyThread_type_lock head_mutex = NULL; /* Protects interp->tstate_head */
Moshe Zadka9fb6af92000-08-04 21:27:47 +000016#define HEAD_INIT() (void)(head_mutex || (head_mutex = PyThread_allocate_lock()))
Guido van Rossum1d5ad901999-06-18 14:22:24 +000017#define HEAD_LOCK() PyThread_acquire_lock(head_mutex, WAIT_LOCK)
18#define HEAD_UNLOCK() PyThread_release_lock(head_mutex)
19#else
20#define HEAD_INIT() /* Nothing */
21#define HEAD_LOCK() /* Nothing */
22#define HEAD_UNLOCK() /* Nothing */
23#endif
24
Guido van Rossum25ce5661997-08-02 03:10:38 +000025static PyInterpreterState *interp_head = NULL;
Guido van Rossuma027efa1997-05-05 20:56:21 +000026
Guido van Rossum18bc7c21998-12-21 18:27:28 +000027PyThreadState *_PyThreadState_Current = NULL;
Guido van Rossuma027efa1997-05-05 20:56:21 +000028
29
30PyInterpreterState *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000031PyInterpreterState_New(void)
Guido van Rossuma027efa1997-05-05 20:56:21 +000032{
33 PyInterpreterState *interp = PyMem_NEW(PyInterpreterState, 1);
Guido van Rossum25ce5661997-08-02 03:10:38 +000034
Guido van Rossuma027efa1997-05-05 20:56:21 +000035 if (interp != NULL) {
Guido van Rossum1d5ad901999-06-18 14:22:24 +000036 HEAD_INIT();
Guido van Rossum25ce5661997-08-02 03:10:38 +000037 interp->modules = NULL;
Guido van Rossuma027efa1997-05-05 20:56:21 +000038 interp->sysdict = NULL;
Guido van Rossum25ce5661997-08-02 03:10:38 +000039 interp->builtins = NULL;
40 interp->checkinterval = 10;
41 interp->tstate_head = NULL;
42
Tim Peters412f2462000-09-02 09:16:15 +000043 HEAD_LOCK();
Guido van Rossum25ce5661997-08-02 03:10:38 +000044 interp->next = interp_head;
45 interp_head = interp;
Tim Peters412f2462000-09-02 09:16:15 +000046 HEAD_UNLOCK();
Guido van Rossuma027efa1997-05-05 20:56:21 +000047 }
Guido van Rossum25ce5661997-08-02 03:10:38 +000048
Guido van Rossuma027efa1997-05-05 20:56:21 +000049 return interp;
50}
51
52
53void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000054PyInterpreterState_Clear(PyInterpreterState *interp)
Guido van Rossum25ce5661997-08-02 03:10:38 +000055{
56 PyThreadState *p;
Guido van Rossum1d5ad901999-06-18 14:22:24 +000057 HEAD_LOCK();
Guido van Rossum25ce5661997-08-02 03:10:38 +000058 for (p = interp->tstate_head; p != NULL; p = p->next)
59 PyThreadState_Clear(p);
Guido van Rossum1d5ad901999-06-18 14:22:24 +000060 HEAD_UNLOCK();
Guido van Rossum25ce5661997-08-02 03:10:38 +000061 ZAP(interp->modules);
62 ZAP(interp->sysdict);
63 ZAP(interp->builtins);
64}
65
66
67static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000068zapthreads(PyInterpreterState *interp)
Guido van Rossum25ce5661997-08-02 03:10:38 +000069{
Guido van Rossum1d5ad901999-06-18 14:22:24 +000070 PyThreadState *p;
71 /* No need to lock the mutex here because this should only happen
72 when the threads are all really dead (XXX famous last words). */
73 while ((p = interp->tstate_head) != NULL) {
Guido van Rossum25ce5661997-08-02 03:10:38 +000074 PyThreadState_Delete(p);
Guido van Rossum25ce5661997-08-02 03:10:38 +000075 }
76}
77
78
79void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000080PyInterpreterState_Delete(PyInterpreterState *interp)
Guido van Rossuma027efa1997-05-05 20:56:21 +000081{
Guido van Rossum25ce5661997-08-02 03:10:38 +000082 PyInterpreterState **p;
83 zapthreads(interp);
Tim Peters412f2462000-09-02 09:16:15 +000084 HEAD_LOCK();
Guido van Rossum25ce5661997-08-02 03:10:38 +000085 for (p = &interp_head; ; p = &(*p)->next) {
86 if (*p == NULL)
87 Py_FatalError(
88 "PyInterpreterState_Delete: invalid interp");
89 if (*p == interp)
90 break;
91 }
92 if (interp->tstate_head != NULL)
93 Py_FatalError("PyInterpreterState_Delete: remaining threads");
94 *p = interp->next;
Tim Peters412f2462000-09-02 09:16:15 +000095 HEAD_UNLOCK();
Guido van Rossuma027efa1997-05-05 20:56:21 +000096 PyMem_DEL(interp);
97}
98
99
100PyThreadState *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000101PyThreadState_New(PyInterpreterState *interp)
Guido van Rossuma027efa1997-05-05 20:56:21 +0000102{
103 PyThreadState *tstate = PyMem_NEW(PyThreadState, 1);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000104
Guido van Rossuma027efa1997-05-05 20:56:21 +0000105 if (tstate != NULL) {
Guido van Rossum25ce5661997-08-02 03:10:38 +0000106 tstate->interp = interp;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000107
108 tstate->frame = NULL;
109 tstate->recursion_depth = 0;
110 tstate->ticker = 0;
111 tstate->tracing = 0;
112
Guido van Rossumede04391998-04-10 20:18:25 +0000113 tstate->dict = NULL;
114
Guido van Rossuma027efa1997-05-05 20:56:21 +0000115 tstate->curexc_type = NULL;
116 tstate->curexc_value = NULL;
117 tstate->curexc_traceback = NULL;
118
119 tstate->exc_type = NULL;
120 tstate->exc_value = NULL;
121 tstate->exc_traceback = NULL;
122
Fred Drake5755ce62001-06-27 19:19:46 +0000123 tstate->c_profilefunc = NULL;
124 tstate->c_tracefunc = NULL;
125 tstate->c_profileobj = NULL;
126 tstate->c_traceobj = NULL;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000127
Guido van Rossum1d5ad901999-06-18 14:22:24 +0000128 HEAD_LOCK();
Guido van Rossum25ce5661997-08-02 03:10:38 +0000129 tstate->next = interp->tstate_head;
130 interp->tstate_head = tstate;
Guido van Rossum1d5ad901999-06-18 14:22:24 +0000131 HEAD_UNLOCK();
Guido van Rossuma027efa1997-05-05 20:56:21 +0000132 }
Guido van Rossum25ce5661997-08-02 03:10:38 +0000133
Guido van Rossuma027efa1997-05-05 20:56:21 +0000134 return tstate;
135}
136
137
138void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000139PyThreadState_Clear(PyThreadState *tstate)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000140{
Guido van Rossum22348dc1997-11-03 22:08:36 +0000141 if (Py_VerboseFlag && tstate->frame != NULL)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000142 fprintf(stderr,
Guido van Rossum5f896a41997-08-21 02:28:19 +0000143 "PyThreadState_Clear: warning: thread still has a frame\n");
Guido van Rossum25ce5661997-08-02 03:10:38 +0000144
145 ZAP(tstate->frame);
146
Guido van Rossumede04391998-04-10 20:18:25 +0000147 ZAP(tstate->dict);
148
Guido van Rossum25ce5661997-08-02 03:10:38 +0000149 ZAP(tstate->curexc_type);
150 ZAP(tstate->curexc_value);
151 ZAP(tstate->curexc_traceback);
152
153 ZAP(tstate->exc_type);
154 ZAP(tstate->exc_value);
155 ZAP(tstate->exc_traceback);
156
Fred Drake5755ce62001-06-27 19:19:46 +0000157 tstate->c_profilefunc = NULL;
158 tstate->c_tracefunc = NULL;
159 ZAP(tstate->c_profileobj);
160 ZAP(tstate->c_traceobj);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000161}
162
163
Guido van Rossum29757862001-01-23 01:46:06 +0000164/* Common code for PyThreadState_Delete() and PyThreadState_DeleteCurrent() */
165static void
166tstate_delete_common(PyThreadState *tstate)
Guido van Rossuma027efa1997-05-05 20:56:21 +0000167{
Guido van Rossum25ce5661997-08-02 03:10:38 +0000168 PyInterpreterState *interp;
169 PyThreadState **p;
170 if (tstate == NULL)
171 Py_FatalError("PyThreadState_Delete: NULL tstate");
Guido van Rossum25ce5661997-08-02 03:10:38 +0000172 interp = tstate->interp;
173 if (interp == NULL)
174 Py_FatalError("PyThreadState_Delete: NULL interp");
Guido van Rossum1d5ad901999-06-18 14:22:24 +0000175 HEAD_LOCK();
Guido van Rossum25ce5661997-08-02 03:10:38 +0000176 for (p = &interp->tstate_head; ; p = &(*p)->next) {
177 if (*p == NULL)
178 Py_FatalError(
179 "PyThreadState_Delete: invalid tstate");
180 if (*p == tstate)
181 break;
182 }
183 *p = tstate->next;
Guido van Rossum1d5ad901999-06-18 14:22:24 +0000184 HEAD_UNLOCK();
Guido van Rossuma027efa1997-05-05 20:56:21 +0000185 PyMem_DEL(tstate);
186}
187
188
Guido van Rossum29757862001-01-23 01:46:06 +0000189void
190PyThreadState_Delete(PyThreadState *tstate)
191{
192 if (tstate == _PyThreadState_Current)
193 Py_FatalError("PyThreadState_Delete: tstate is still current");
194 tstate_delete_common(tstate);
195}
196
197
198#ifdef WITH_THREAD
199void
200PyThreadState_DeleteCurrent()
201{
202 PyThreadState *tstate = _PyThreadState_Current;
203 if (tstate == NULL)
204 Py_FatalError(
205 "PyThreadState_DeleteCurrent: no current tstate");
206 _PyThreadState_Current = NULL;
207 tstate_delete_common(tstate);
208 PyEval_ReleaseLock();
209}
210#endif /* WITH_THREAD */
211
212
Guido van Rossuma027efa1997-05-05 20:56:21 +0000213PyThreadState *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000214PyThreadState_Get(void)
Guido van Rossuma027efa1997-05-05 20:56:21 +0000215{
Guido van Rossum18bc7c21998-12-21 18:27:28 +0000216 if (_PyThreadState_Current == NULL)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000217 Py_FatalError("PyThreadState_Get: no current thread");
218
Guido van Rossum18bc7c21998-12-21 18:27:28 +0000219 return _PyThreadState_Current;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000220}
221
222
223PyThreadState *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000224PyThreadState_Swap(PyThreadState *new)
Guido van Rossuma027efa1997-05-05 20:56:21 +0000225{
Guido van Rossum18bc7c21998-12-21 18:27:28 +0000226 PyThreadState *old = _PyThreadState_Current;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000227
Guido van Rossum18bc7c21998-12-21 18:27:28 +0000228 _PyThreadState_Current = new;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000229
Guido van Rossuma027efa1997-05-05 20:56:21 +0000230 return old;
231}
Guido van Rossumede04391998-04-10 20:18:25 +0000232
233/* An extension mechanism to store arbitrary additional per-thread state.
234 PyThreadState_GetDict() returns a dictionary that can be used to hold such
235 state; the caller should pick a unique key and store its state there. If
236 PyThreadState_GetDict() returns NULL, an exception has been raised (most
237 likely MemoryError) and the caller should pass on the exception. */
238
239PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000240PyThreadState_GetDict(void)
Guido van Rossumede04391998-04-10 20:18:25 +0000241{
Guido van Rossum18bc7c21998-12-21 18:27:28 +0000242 if (_PyThreadState_Current == NULL)
Guido van Rossumede04391998-04-10 20:18:25 +0000243 Py_FatalError("PyThreadState_GetDict: no current thread");
244
Guido van Rossum18bc7c21998-12-21 18:27:28 +0000245 if (_PyThreadState_Current->dict == NULL)
246 _PyThreadState_Current->dict = PyDict_New();
247 return _PyThreadState_Current->dict;
Guido van Rossumede04391998-04-10 20:18:25 +0000248}