blob: b9dee6e763a99ed868fbd9a9e028b8b5ccc5c979 [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 *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000040PyInterpreterState_New(void)
Guido van Rossuma027efa1997-05-05 20:56:21 +000041{
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
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000061PyInterpreterState_Clear(PyInterpreterState *interp)
Guido van Rossum25ce5661997-08-02 03:10:38 +000062{
63 PyThreadState *p;
Guido van Rossum1d5ad901999-06-18 14:22:24 +000064 HEAD_LOCK();
Guido van Rossum25ce5661997-08-02 03:10:38 +000065 for (p = interp->tstate_head; p != NULL; p = p->next)
66 PyThreadState_Clear(p);
Guido van Rossum1d5ad901999-06-18 14:22:24 +000067 HEAD_UNLOCK();
Guido van Rossum25ce5661997-08-02 03:10:38 +000068 ZAP(interp->modules);
69 ZAP(interp->sysdict);
70 ZAP(interp->builtins);
71}
72
73
74static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000075zapthreads(PyInterpreterState *interp)
Guido van Rossum25ce5661997-08-02 03:10:38 +000076{
Guido van Rossum1d5ad901999-06-18 14:22:24 +000077 PyThreadState *p;
78 /* No need to lock the mutex here because this should only happen
79 when the threads are all really dead (XXX famous last words). */
80 while ((p = interp->tstate_head) != NULL) {
Guido van Rossum25ce5661997-08-02 03:10:38 +000081 PyThreadState_Delete(p);
Guido van Rossum25ce5661997-08-02 03:10:38 +000082 }
83}
84
85
86void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000087PyInterpreterState_Delete(PyInterpreterState *interp)
Guido van Rossuma027efa1997-05-05 20:56:21 +000088{
Guido van Rossum25ce5661997-08-02 03:10:38 +000089 PyInterpreterState **p;
90 zapthreads(interp);
91 for (p = &interp_head; ; p = &(*p)->next) {
92 if (*p == NULL)
93 Py_FatalError(
94 "PyInterpreterState_Delete: invalid interp");
95 if (*p == interp)
96 break;
97 }
98 if (interp->tstate_head != NULL)
99 Py_FatalError("PyInterpreterState_Delete: remaining threads");
100 *p = interp->next;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000101 PyMem_DEL(interp);
102}
103
104
105PyThreadState *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000106PyThreadState_New(PyInterpreterState *interp)
Guido van Rossuma027efa1997-05-05 20:56:21 +0000107{
108 PyThreadState *tstate = PyMem_NEW(PyThreadState, 1);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000109
Guido van Rossuma027efa1997-05-05 20:56:21 +0000110 if (tstate != NULL) {
Guido van Rossum25ce5661997-08-02 03:10:38 +0000111 tstate->interp = interp;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000112
113 tstate->frame = NULL;
114 tstate->recursion_depth = 0;
115 tstate->ticker = 0;
116 tstate->tracing = 0;
117
Guido van Rossumede04391998-04-10 20:18:25 +0000118 tstate->dict = NULL;
119
Guido van Rossuma027efa1997-05-05 20:56:21 +0000120 tstate->curexc_type = NULL;
121 tstate->curexc_value = NULL;
122 tstate->curexc_traceback = NULL;
123
124 tstate->exc_type = NULL;
125 tstate->exc_value = NULL;
126 tstate->exc_traceback = NULL;
127
128 tstate->sys_profilefunc = NULL;
129 tstate->sys_tracefunc = NULL;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000130
Guido van Rossum1d5ad901999-06-18 14:22:24 +0000131 HEAD_LOCK();
Guido van Rossum25ce5661997-08-02 03:10:38 +0000132 tstate->next = interp->tstate_head;
133 interp->tstate_head = tstate;
Guido van Rossum1d5ad901999-06-18 14:22:24 +0000134 HEAD_UNLOCK();
Guido van Rossuma027efa1997-05-05 20:56:21 +0000135 }
Guido van Rossum25ce5661997-08-02 03:10:38 +0000136
Guido van Rossuma027efa1997-05-05 20:56:21 +0000137 return tstate;
138}
139
140
141void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000142PyThreadState_Clear(PyThreadState *tstate)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000143{
Guido van Rossum22348dc1997-11-03 22:08:36 +0000144 if (Py_VerboseFlag && tstate->frame != NULL)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000145 fprintf(stderr,
Guido van Rossum5f896a41997-08-21 02:28:19 +0000146 "PyThreadState_Clear: warning: thread still has a frame\n");
Guido van Rossum25ce5661997-08-02 03:10:38 +0000147
148 ZAP(tstate->frame);
149
Guido van Rossumede04391998-04-10 20:18:25 +0000150 ZAP(tstate->dict);
151
Guido van Rossum25ce5661997-08-02 03:10:38 +0000152 ZAP(tstate->curexc_type);
153 ZAP(tstate->curexc_value);
154 ZAP(tstate->curexc_traceback);
155
156 ZAP(tstate->exc_type);
157 ZAP(tstate->exc_value);
158 ZAP(tstate->exc_traceback);
159
160 ZAP(tstate->sys_profilefunc);
161 ZAP(tstate->sys_tracefunc);
162}
163
164
165void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000166PyThreadState_Delete(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 Rossum18bc7c21998-12-21 18:27:28 +0000172 if (tstate == _PyThreadState_Current)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000173 Py_FatalError("PyThreadState_Delete: tstate is still current");
174 interp = tstate->interp;
175 if (interp == NULL)
176 Py_FatalError("PyThreadState_Delete: NULL interp");
Guido van Rossum1d5ad901999-06-18 14:22:24 +0000177 HEAD_LOCK();
Guido van Rossum25ce5661997-08-02 03:10:38 +0000178 for (p = &interp->tstate_head; ; p = &(*p)->next) {
179 if (*p == NULL)
180 Py_FatalError(
181 "PyThreadState_Delete: invalid tstate");
182 if (*p == tstate)
183 break;
184 }
185 *p = tstate->next;
Guido van Rossum1d5ad901999-06-18 14:22:24 +0000186 HEAD_UNLOCK();
Guido van Rossuma027efa1997-05-05 20:56:21 +0000187 PyMem_DEL(tstate);
188}
189
190
191PyThreadState *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000192PyThreadState_Get(void)
Guido van Rossuma027efa1997-05-05 20:56:21 +0000193{
Guido van Rossum18bc7c21998-12-21 18:27:28 +0000194 if (_PyThreadState_Current == NULL)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000195 Py_FatalError("PyThreadState_Get: no current thread");
196
Guido van Rossum18bc7c21998-12-21 18:27:28 +0000197 return _PyThreadState_Current;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000198}
199
200
201PyThreadState *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000202PyThreadState_Swap(PyThreadState *new)
Guido van Rossuma027efa1997-05-05 20:56:21 +0000203{
Guido van Rossum18bc7c21998-12-21 18:27:28 +0000204 PyThreadState *old = _PyThreadState_Current;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000205
Guido van Rossum18bc7c21998-12-21 18:27:28 +0000206 _PyThreadState_Current = new;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000207
Guido van Rossuma027efa1997-05-05 20:56:21 +0000208 return old;
209}
Guido van Rossumede04391998-04-10 20:18:25 +0000210
211/* An extension mechanism to store arbitrary additional per-thread state.
212 PyThreadState_GetDict() returns a dictionary that can be used to hold such
213 state; the caller should pick a unique key and store its state there. If
214 PyThreadState_GetDict() returns NULL, an exception has been raised (most
215 likely MemoryError) and the caller should pass on the exception. */
216
217PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000218PyThreadState_GetDict(void)
Guido van Rossumede04391998-04-10 20:18:25 +0000219{
Guido van Rossum18bc7c21998-12-21 18:27:28 +0000220 if (_PyThreadState_Current == NULL)
Guido van Rossumede04391998-04-10 20:18:25 +0000221 Py_FatalError("PyThreadState_GetDict: no current thread");
222
Guido van Rossum18bc7c21998-12-21 18:27:28 +0000223 if (_PyThreadState_Current->dict == NULL)
224 _PyThreadState_Current->dict = PyDict_New();
225 return _PyThreadState_Current->dict;
Guido van Rossumede04391998-04-10 20:18:25 +0000226}