blob: 8e5896a44fd1ea27f207557ae0aa2d508a5e5415 [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
123 tstate->sys_profilefunc = NULL;
124 tstate->sys_tracefunc = NULL;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000125
Guido van Rossum1d5ad901999-06-18 14:22:24 +0000126 HEAD_LOCK();
Guido van Rossum25ce5661997-08-02 03:10:38 +0000127 tstate->next = interp->tstate_head;
128 interp->tstate_head = tstate;
Guido van Rossum1d5ad901999-06-18 14:22:24 +0000129 HEAD_UNLOCK();
Guido van Rossuma027efa1997-05-05 20:56:21 +0000130 }
Guido van Rossum25ce5661997-08-02 03:10:38 +0000131
Guido van Rossuma027efa1997-05-05 20:56:21 +0000132 return tstate;
133}
134
135
136void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000137PyThreadState_Clear(PyThreadState *tstate)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000138{
Guido van Rossum22348dc1997-11-03 22:08:36 +0000139 if (Py_VerboseFlag && tstate->frame != NULL)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000140 fprintf(stderr,
Guido van Rossum5f896a41997-08-21 02:28:19 +0000141 "PyThreadState_Clear: warning: thread still has a frame\n");
Guido van Rossum25ce5661997-08-02 03:10:38 +0000142
143 ZAP(tstate->frame);
144
Guido van Rossumede04391998-04-10 20:18:25 +0000145 ZAP(tstate->dict);
146
Guido van Rossum25ce5661997-08-02 03:10:38 +0000147 ZAP(tstate->curexc_type);
148 ZAP(tstate->curexc_value);
149 ZAP(tstate->curexc_traceback);
150
151 ZAP(tstate->exc_type);
152 ZAP(tstate->exc_value);
153 ZAP(tstate->exc_traceback);
154
155 ZAP(tstate->sys_profilefunc);
156 ZAP(tstate->sys_tracefunc);
157}
158
159
Guido van Rossum29757862001-01-23 01:46:06 +0000160/* Common code for PyThreadState_Delete() and PyThreadState_DeleteCurrent() */
161static void
162tstate_delete_common(PyThreadState *tstate)
Guido van Rossuma027efa1997-05-05 20:56:21 +0000163{
Guido van Rossum25ce5661997-08-02 03:10:38 +0000164 PyInterpreterState *interp;
165 PyThreadState **p;
166 if (tstate == NULL)
167 Py_FatalError("PyThreadState_Delete: NULL tstate");
Guido van Rossum25ce5661997-08-02 03:10:38 +0000168 interp = tstate->interp;
169 if (interp == NULL)
170 Py_FatalError("PyThreadState_Delete: NULL interp");
Guido van Rossum1d5ad901999-06-18 14:22:24 +0000171 HEAD_LOCK();
Guido van Rossum25ce5661997-08-02 03:10:38 +0000172 for (p = &interp->tstate_head; ; p = &(*p)->next) {
173 if (*p == NULL)
174 Py_FatalError(
175 "PyThreadState_Delete: invalid tstate");
176 if (*p == tstate)
177 break;
178 }
179 *p = tstate->next;
Guido van Rossum1d5ad901999-06-18 14:22:24 +0000180 HEAD_UNLOCK();
Guido van Rossuma027efa1997-05-05 20:56:21 +0000181 PyMem_DEL(tstate);
182}
183
184
Guido van Rossum29757862001-01-23 01:46:06 +0000185void
186PyThreadState_Delete(PyThreadState *tstate)
187{
188 if (tstate == _PyThreadState_Current)
189 Py_FatalError("PyThreadState_Delete: tstate is still current");
190 tstate_delete_common(tstate);
191}
192
193
194#ifdef WITH_THREAD
195void
196PyThreadState_DeleteCurrent()
197{
198 PyThreadState *tstate = _PyThreadState_Current;
199 if (tstate == NULL)
200 Py_FatalError(
201 "PyThreadState_DeleteCurrent: no current tstate");
202 _PyThreadState_Current = NULL;
203 tstate_delete_common(tstate);
204 PyEval_ReleaseLock();
205}
206#endif /* WITH_THREAD */
207
208
Guido van Rossuma027efa1997-05-05 20:56:21 +0000209PyThreadState *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000210PyThreadState_Get(void)
Guido van Rossuma027efa1997-05-05 20:56:21 +0000211{
Guido van Rossum18bc7c21998-12-21 18:27:28 +0000212 if (_PyThreadState_Current == NULL)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000213 Py_FatalError("PyThreadState_Get: no current thread");
214
Guido van Rossum18bc7c21998-12-21 18:27:28 +0000215 return _PyThreadState_Current;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000216}
217
218
219PyThreadState *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000220PyThreadState_Swap(PyThreadState *new)
Guido van Rossuma027efa1997-05-05 20:56:21 +0000221{
Guido van Rossum18bc7c21998-12-21 18:27:28 +0000222 PyThreadState *old = _PyThreadState_Current;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000223
Guido van Rossum18bc7c21998-12-21 18:27:28 +0000224 _PyThreadState_Current = new;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000225
Guido van Rossuma027efa1997-05-05 20:56:21 +0000226 return old;
227}
Guido van Rossumede04391998-04-10 20:18:25 +0000228
229/* An extension mechanism to store arbitrary additional per-thread state.
230 PyThreadState_GetDict() returns a dictionary that can be used to hold such
231 state; the caller should pick a unique key and store its state there. If
232 PyThreadState_GetDict() returns NULL, an exception has been raised (most
233 likely MemoryError) and the caller should pass on the exception. */
234
235PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000236PyThreadState_GetDict(void)
Guido van Rossumede04391998-04-10 20:18:25 +0000237{
Guido van Rossum18bc7c21998-12-21 18:27:28 +0000238 if (_PyThreadState_Current == NULL)
Guido van Rossumede04391998-04-10 20:18:25 +0000239 Py_FatalError("PyThreadState_GetDict: no current thread");
240
Guido van Rossum18bc7c21998-12-21 18:27:28 +0000241 if (_PyThreadState_Current->dict == NULL)
242 _PyThreadState_Current->dict = PyDict_New();
243 return _PyThreadState_Current->dict;
Guido van Rossumede04391998-04-10 20:18:25 +0000244}