2 /* Thread and interpreter state structures and their interfaces */
17 PyObject *tmp = (PyObject *)(x); \
25 static PyThread_type_lock head_mutex
= NULL
; /* Protects interp->tstate_head */
26 #define HEAD_INIT() (void)(head_mutex || (head_mutex = PyThread_allocate_lock()))
27 #define HEAD_LOCK() PyThread_acquire_lock(head_mutex, WAIT_LOCK)
28 #define HEAD_UNLOCK() PyThread_release_lock(head_mutex)
30 #define HEAD_INIT() /* Nothing */
31 #define HEAD_LOCK() /* Nothing */
32 #define HEAD_UNLOCK() /* Nothing */
35 static PyInterpreterState
*interp_head
= NULL
;
37 PyThreadState
*_PyThreadState_Current
= NULL
;
41 PyInterpreterState_New(void)
43 PyInterpreterState
*interp
= PyMem_NEW(PyInterpreterState
, 1);
47 interp
->modules
= NULL
;
48 interp
->sysdict
= NULL
;
49 interp
->builtins
= NULL
;
50 interp
->checkinterval
= 10;
51 interp
->tstate_head
= NULL
;
54 interp
->dlopenflags
= RTLD_NOW
;
56 interp
->dlopenflags
= RTLD_LAZY
;
61 interp
->next
= interp_head
;
71 PyInterpreterState_Clear(PyInterpreterState
*interp
)
75 for (p
= interp
->tstate_head
; p
!= NULL
; p
= p
->next
)
76 PyThreadState_Clear(p
);
80 ZAP(interp
->builtins
);
85 zapthreads(PyInterpreterState
*interp
)
88 /* No need to lock the mutex here because this should only happen
89 when the threads are all really dead (XXX famous last words). */
90 while ((p
= interp
->tstate_head
) != NULL
) {
91 PyThreadState_Delete(p
);
97 PyInterpreterState_Delete(PyInterpreterState
*interp
)
99 PyInterpreterState
**p
;
102 for (p
= &interp_head
; ; p
= &(*p
)->next
) {
105 "PyInterpreterState_Delete: invalid interp");
109 if (interp
->tstate_head
!= NULL
)
110 Py_FatalError("PyInterpreterState_Delete: remaining threads");
118 PyThreadState_New(PyInterpreterState
*interp
)
120 PyThreadState
*tstate
= PyMem_NEW(PyThreadState
, 1);
122 if (tstate
!= NULL
) {
123 tstate
->interp
= interp
;
125 tstate
->frame
= NULL
;
126 tstate
->recursion_depth
= 0;
129 tstate
->use_tracing
= 0;
133 tstate
->curexc_type
= NULL
;
134 tstate
->curexc_value
= NULL
;
135 tstate
->curexc_traceback
= NULL
;
137 tstate
->exc_type
= NULL
;
138 tstate
->exc_value
= NULL
;
139 tstate
->exc_traceback
= NULL
;
141 tstate
->c_profilefunc
= NULL
;
142 tstate
->c_tracefunc
= NULL
;
143 tstate
->c_profileobj
= NULL
;
144 tstate
->c_traceobj
= NULL
;
147 tstate
->next
= interp
->tstate_head
;
148 interp
->tstate_head
= tstate
;
157 PyThreadState_Clear(PyThreadState
*tstate
)
159 if (Py_VerboseFlag
&& tstate
->frame
!= NULL
)
161 "PyThreadState_Clear: warning: thread still has a frame\n");
167 ZAP(tstate
->curexc_type
);
168 ZAP(tstate
->curexc_value
);
169 ZAP(tstate
->curexc_traceback
);
171 ZAP(tstate
->exc_type
);
172 ZAP(tstate
->exc_value
);
173 ZAP(tstate
->exc_traceback
);
175 tstate
->c_profilefunc
= NULL
;
176 tstate
->c_tracefunc
= NULL
;
177 ZAP(tstate
->c_profileobj
);
178 ZAP(tstate
->c_traceobj
);
182 /* Common code for PyThreadState_Delete() and PyThreadState_DeleteCurrent() */
184 tstate_delete_common(PyThreadState
*tstate
)
186 PyInterpreterState
*interp
;
189 Py_FatalError("PyThreadState_Delete: NULL tstate");
190 interp
= tstate
->interp
;
192 Py_FatalError("PyThreadState_Delete: NULL interp");
194 for (p
= &interp
->tstate_head
; ; p
= &(*p
)->next
) {
197 "PyThreadState_Delete: invalid tstate");
208 PyThreadState_Delete(PyThreadState
*tstate
)
210 if (tstate
== _PyThreadState_Current
)
211 Py_FatalError("PyThreadState_Delete: tstate is still current");
212 tstate_delete_common(tstate
);
218 PyThreadState_DeleteCurrent()
220 PyThreadState
*tstate
= _PyThreadState_Current
;
223 "PyThreadState_DeleteCurrent: no current tstate");
224 _PyThreadState_Current
= NULL
;
225 tstate_delete_common(tstate
);
226 PyEval_ReleaseLock();
228 #endif /* WITH_THREAD */
232 PyThreadState_Get(void)
234 if (_PyThreadState_Current
== NULL
)
235 Py_FatalError("PyThreadState_Get: no current thread");
237 return _PyThreadState_Current
;
242 PyThreadState_Swap(PyThreadState
*new)
244 PyThreadState
*old
= _PyThreadState_Current
;
246 _PyThreadState_Current
= new;
251 /* An extension mechanism to store arbitrary additional per-thread state.
252 PyThreadState_GetDict() returns a dictionary that can be used to hold such
253 state; the caller should pick a unique key and store its state there. If
254 PyThreadState_GetDict() returns NULL, an exception has been raised (most
255 likely MemoryError) and the caller should pass on the exception. */
258 PyThreadState_GetDict(void)
260 if (_PyThreadState_Current
== NULL
)
261 Py_FatalError("PyThreadState_GetDict: no current thread");
263 if (_PyThreadState_Current
->dict
== NULL
)
264 _PyThreadState_Current
->dict
= PyDict_New();
265 return _PyThreadState_Current
->dict
;
269 /* Routines for advanced debuggers, requested by David Beazley.
270 Don't use unless you know what you are doing! */
273 PyInterpreterState_Head(void)
279 PyInterpreterState_Next(PyInterpreterState
*interp
) {
284 PyInterpreterState_ThreadHead(PyInterpreterState
*interp
) {
285 return interp
->tstate_head
;
289 PyThreadState_Next(PyThreadState
*tstate
) {