blob: 8c1fad215c2afdec5e1ed9c2ae896314e9ba24ab [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
Tim Peters84705582004-10-10 02:47:33 +00006/* --------------------------------------------------------------------------
7CAUTION
8
Victor Stinner1a7425f2013-07-07 16:25:15 +02009Always use PyMem_RawMalloc() and PyMem_RawFree() directly in this file. A
10number of these functions are advertised as safe to call when the GIL isn't
11held, and in a debug build Python redirects (e.g.) PyMem_NEW (etc) to Python's
12debugging obmalloc functions. Those aren't thread-safe (they rely on the GIL
13to avoid the expense of doing their own locking).
Tim Peters84705582004-10-10 02:47:33 +000014-------------------------------------------------------------------------- */
15
Martin v. Löwisf0473d52001-07-18 16:17:16 +000016#ifdef HAVE_DLOPEN
17#ifdef HAVE_DLFCN_H
18#include <dlfcn.h>
19#endif
20#ifndef RTLD_LAZY
21#define RTLD_LAZY 1
22#endif
23#endif
24
Benjamin Peterson43162b82012-04-13 11:58:27 -040025#ifdef __cplusplus
26extern "C" {
27#endif
Martin v. Löwisf0473d52001-07-18 16:17:16 +000028
Guido van Rossum1d5ad901999-06-18 14:22:24 +000029#ifdef WITH_THREAD
30#include "pythread.h"
31static PyThread_type_lock head_mutex = NULL; /* Protects interp->tstate_head */
Moshe Zadka9fb6af92000-08-04 21:27:47 +000032#define HEAD_INIT() (void)(head_mutex || (head_mutex = PyThread_allocate_lock()))
Guido van Rossum1d5ad901999-06-18 14:22:24 +000033#define HEAD_LOCK() PyThread_acquire_lock(head_mutex, WAIT_LOCK)
34#define HEAD_UNLOCK() PyThread_release_lock(head_mutex)
Michael W. Hudson188d4362005-06-20 16:52:57 +000035
36/* The single PyInterpreterState used by this process'
37 GILState implementation
38*/
39static PyInterpreterState *autoInterpreterState = NULL;
40static int autoTLSkey = 0;
Guido van Rossum1d5ad901999-06-18 14:22:24 +000041#else
42#define HEAD_INIT() /* Nothing */
43#define HEAD_LOCK() /* Nothing */
44#define HEAD_UNLOCK() /* Nothing */
45#endif
46
Guido van Rossum25ce5661997-08-02 03:10:38 +000047static PyInterpreterState *interp_head = NULL;
Guido van Rossuma027efa1997-05-05 20:56:21 +000048
Jeffrey Yasskin39370832010-05-03 19:29:34 +000049/* Assuming the current thread holds the GIL, this is the
50 PyThreadState for the current thread. */
51_Py_atomic_address _PyThreadState_Current = {NULL};
Guido van Rossum6297a7a2003-02-19 15:53:17 +000052PyThreadFrameGetter _PyThreadState_GetFrame = NULL;
Guido van Rossuma027efa1997-05-05 20:56:21 +000053
Michael W. Hudsonce7da6c2005-09-30 08:20:24 +000054#ifdef WITH_THREAD
Michael W. Hudson188d4362005-06-20 16:52:57 +000055static void _PyGILState_NoteThreadState(PyThreadState* tstate);
Michael W. Hudsonce7da6c2005-09-30 08:20:24 +000056#endif
Michael W. Hudson188d4362005-06-20 16:52:57 +000057
Guido van Rossuma027efa1997-05-05 20:56:21 +000058
59PyInterpreterState *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000060PyInterpreterState_New(void)
Guido van Rossuma027efa1997-05-05 20:56:21 +000061{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000062 PyInterpreterState *interp = (PyInterpreterState *)
Victor Stinner1a7425f2013-07-07 16:25:15 +020063 PyMem_RawMalloc(sizeof(PyInterpreterState));
Guido van Rossum25ce5661997-08-02 03:10:38 +000064
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000065 if (interp != NULL) {
66 HEAD_INIT();
Thomas Wouters0e3f5912006-08-11 14:57:12 +000067#ifdef WITH_THREAD
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000068 if (head_mutex == NULL)
69 Py_FatalError("Can't initialize threads for interpreter");
Thomas Wouters0e3f5912006-08-11 14:57:12 +000070#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000071 interp->modules = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000072 interp->modules_by_index = NULL;
73 interp->sysdict = NULL;
74 interp->builtins = NULL;
Serhiy Storchaka013bb912014-02-10 18:21:34 +020075 interp->builtins_copy = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000076 interp->tstate_head = NULL;
77 interp->codec_search_path = NULL;
78 interp->codec_search_cache = NULL;
79 interp->codec_error_registry = NULL;
80 interp->codecs_initialized = 0;
Victor Stinner3cbf14b2011-04-27 00:24:21 +020081 interp->fscodec_initialized = 0;
Brett Cannonfd074152012-04-14 14:10:13 -040082 interp->importlib = NULL;
Martin v. Löwisf0473d52001-07-18 16:17:16 +000083#ifdef HAVE_DLOPEN
84#ifdef RTLD_NOW
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000085 interp->dlopenflags = RTLD_NOW;
Martin v. Löwisf0473d52001-07-18 16:17:16 +000086#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000087 interp->dlopenflags = RTLD_LAZY;
Martin v. Löwisf0473d52001-07-18 16:17:16 +000088#endif
89#endif
Martin v. Löwisf30d60e2004-06-08 08:17:44 +000090#ifdef WITH_TSC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000091 interp->tscdump = 0;
Martin v. Löwisf30d60e2004-06-08 08:17:44 +000092#endif
Guido van Rossum25ce5661997-08-02 03:10:38 +000093
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000094 HEAD_LOCK();
95 interp->next = interp_head;
96 interp_head = interp;
97 HEAD_UNLOCK();
98 }
Guido van Rossum25ce5661997-08-02 03:10:38 +000099
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000100 return interp;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000101}
102
103
104void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000105PyInterpreterState_Clear(PyInterpreterState *interp)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000106{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000107 PyThreadState *p;
108 HEAD_LOCK();
109 for (p = interp->tstate_head; p != NULL; p = p->next)
110 PyThreadState_Clear(p);
111 HEAD_UNLOCK();
112 Py_CLEAR(interp->codec_search_path);
113 Py_CLEAR(interp->codec_search_cache);
114 Py_CLEAR(interp->codec_error_registry);
115 Py_CLEAR(interp->modules);
116 Py_CLEAR(interp->modules_by_index);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000117 Py_CLEAR(interp->sysdict);
118 Py_CLEAR(interp->builtins);
Serhiy Storchaka013bb912014-02-10 18:21:34 +0200119 Py_CLEAR(interp->builtins_copy);
Brett Cannonfd074152012-04-14 14:10:13 -0400120 Py_CLEAR(interp->importlib);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000121}
122
123
124static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000125zapthreads(PyInterpreterState *interp)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000126{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000127 PyThreadState *p;
128 /* No need to lock the mutex here because this should only happen
129 when the threads are all really dead (XXX famous last words). */
130 while ((p = interp->tstate_head) != NULL) {
131 PyThreadState_Delete(p);
132 }
Guido van Rossum25ce5661997-08-02 03:10:38 +0000133}
134
135
136void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000137PyInterpreterState_Delete(PyInterpreterState *interp)
Guido van Rossuma027efa1997-05-05 20:56:21 +0000138{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000139 PyInterpreterState **p;
140 zapthreads(interp);
141 HEAD_LOCK();
142 for (p = &interp_head; ; p = &(*p)->next) {
143 if (*p == NULL)
144 Py_FatalError(
145 "PyInterpreterState_Delete: invalid interp");
146 if (*p == interp)
147 break;
148 }
149 if (interp->tstate_head != NULL)
150 Py_FatalError("PyInterpreterState_Delete: remaining threads");
151 *p = interp->next;
152 HEAD_UNLOCK();
Victor Stinner1a7425f2013-07-07 16:25:15 +0200153 PyMem_RawFree(interp);
Antoine Pitrou8db076c2011-10-30 19:13:55 +0100154#ifdef WITH_THREAD
155 if (interp_head == NULL && head_mutex != NULL) {
156 PyThread_free_lock(head_mutex);
157 head_mutex = NULL;
158 }
159#endif
Guido van Rossuma027efa1997-05-05 20:56:21 +0000160}
161
162
Michael W. Hudson019a78e2002-11-08 12:53:11 +0000163/* Default implementation for _PyThreadState_GetFrame */
164static struct _frame *
165threadstate_getframe(PyThreadState *self)
166{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000167 return self->frame;
Michael W. Hudson019a78e2002-11-08 12:53:11 +0000168}
169
Victor Stinner45b9be52010-03-03 23:28:07 +0000170static PyThreadState *
171new_threadstate(PyInterpreterState *interp, int init)
Guido van Rossuma027efa1997-05-05 20:56:21 +0000172{
Victor Stinner1a7425f2013-07-07 16:25:15 +0200173 PyThreadState *tstate = (PyThreadState *)PyMem_RawMalloc(sizeof(PyThreadState));
Tim Peters84705582004-10-10 02:47:33 +0000174
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000175 if (_PyThreadState_GetFrame == NULL)
176 _PyThreadState_GetFrame = threadstate_getframe;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000177
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000178 if (tstate != NULL) {
179 tstate->interp = interp;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000180
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000181 tstate->frame = NULL;
182 tstate->recursion_depth = 0;
183 tstate->overflowed = 0;
184 tstate->recursion_critical = 0;
185 tstate->tracing = 0;
186 tstate->use_tracing = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000187 tstate->gilstate_counter = 0;
188 tstate->async_exc = NULL;
Martin v. Löwisf9ce67d2003-07-13 10:41:53 +0000189#ifdef WITH_THREAD
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000190 tstate->thread_id = PyThread_get_thread_ident();
Martin v. Löwisf9ce67d2003-07-13 10:41:53 +0000191#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000192 tstate->thread_id = 0;
Martin v. Löwisf9ce67d2003-07-13 10:41:53 +0000193#endif
Guido van Rossuma027efa1997-05-05 20:56:21 +0000194
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000195 tstate->dict = NULL;
Guido van Rossumede04391998-04-10 20:18:25 +0000196
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000197 tstate->curexc_type = NULL;
198 tstate->curexc_value = NULL;
199 tstate->curexc_traceback = NULL;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000200
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000201 tstate->exc_type = NULL;
202 tstate->exc_value = NULL;
203 tstate->exc_traceback = NULL;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000204
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000205 tstate->c_profilefunc = NULL;
206 tstate->c_tracefunc = NULL;
207 tstate->c_profileobj = NULL;
208 tstate->c_traceobj = NULL;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000209
Antoine Pitrou2b0218a2012-09-06 00:59:49 +0200210 tstate->trash_delete_nesting = 0;
211 tstate->trash_delete_later = NULL;
Antoine Pitrou7b476992013-09-07 23:38:37 +0200212 tstate->on_delete = NULL;
213 tstate->on_delete_data = NULL;
Antoine Pitrou2b0218a2012-09-06 00:59:49 +0200214
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000215 if (init)
216 _PyThreadState_Init(tstate);
Michael W. Hudson188d4362005-06-20 16:52:57 +0000217
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000218 HEAD_LOCK();
Charles-Francois Natalif28dfdd2013-05-08 21:09:52 +0200219 tstate->prev = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000220 tstate->next = interp->tstate_head;
Charles-Francois Natalif28dfdd2013-05-08 21:09:52 +0200221 if (tstate->next)
222 tstate->next->prev = tstate;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000223 interp->tstate_head = tstate;
224 HEAD_UNLOCK();
225 }
Guido van Rossum25ce5661997-08-02 03:10:38 +0000226
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000227 return tstate;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000228}
229
Victor Stinner45b9be52010-03-03 23:28:07 +0000230PyThreadState *
231PyThreadState_New(PyInterpreterState *interp)
232{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000233 return new_threadstate(interp, 1);
Victor Stinner45b9be52010-03-03 23:28:07 +0000234}
235
236PyThreadState *
237_PyThreadState_Prealloc(PyInterpreterState *interp)
238{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000239 return new_threadstate(interp, 0);
Victor Stinner45b9be52010-03-03 23:28:07 +0000240}
241
242void
243_PyThreadState_Init(PyThreadState *tstate)
244{
245#ifdef WITH_THREAD
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000246 _PyGILState_NoteThreadState(tstate);
Victor Stinner45b9be52010-03-03 23:28:07 +0000247#endif
248}
249
Martin v. Löwis1a214512008-06-11 05:26:20 +0000250PyObject*
Martin v. Löwis7800f752012-06-22 12:20:55 +0200251PyState_FindModule(struct PyModuleDef* module)
Martin v. Löwis1a214512008-06-11 05:26:20 +0000252{
Martin v. Löwis7800f752012-06-22 12:20:55 +0200253 Py_ssize_t index = module->m_base.m_index;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000254 PyInterpreterState *state = PyThreadState_GET()->interp;
255 PyObject *res;
256 if (index == 0)
257 return NULL;
258 if (state->modules_by_index == NULL)
259 return NULL;
Antoine Pitrou75506e82012-08-20 19:30:46 +0200260 if (index >= PyList_GET_SIZE(state->modules_by_index))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000261 return NULL;
262 res = PyList_GET_ITEM(state->modules_by_index, index);
263 return res==Py_None ? NULL : res;
Martin v. Löwis1a214512008-06-11 05:26:20 +0000264}
265
266int
267_PyState_AddModule(PyObject* module, struct PyModuleDef* def)
268{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000269 PyInterpreterState *state = PyThreadState_GET()->interp;
270 if (!def)
271 return -1;
272 if (!state->modules_by_index) {
273 state->modules_by_index = PyList_New(0);
274 if (!state->modules_by_index)
275 return -1;
276 }
277 while(PyList_GET_SIZE(state->modules_by_index) <= def->m_base.m_index)
278 if (PyList_Append(state->modules_by_index, Py_None) < 0)
279 return -1;
280 Py_INCREF(module);
281 return PyList_SetItem(state->modules_by_index,
282 def->m_base.m_index, module);
Martin v. Löwis1a214512008-06-11 05:26:20 +0000283}
Guido van Rossuma027efa1997-05-05 20:56:21 +0000284
Martin v. Löwis7800f752012-06-22 12:20:55 +0200285int
286PyState_AddModule(PyObject* module, struct PyModuleDef* def)
287{
288 Py_ssize_t index;
289 PyInterpreterState *state = PyThreadState_GET()->interp;
290 if (!def) {
291 Py_FatalError("PyState_AddModule: Module Definition is NULL");
292 return -1;
293 }
294 index = def->m_base.m_index;
295 if (state->modules_by_index) {
296 if(PyList_GET_SIZE(state->modules_by_index) >= index) {
297 if(module == PyList_GET_ITEM(state->modules_by_index, index)) {
298 Py_FatalError("PyState_AddModule: Module already added!");
299 return -1;
300 }
301 }
302 }
303 return _PyState_AddModule(module, def);
304}
305
306int
307PyState_RemoveModule(struct PyModuleDef* def)
308{
309 Py_ssize_t index = def->m_base.m_index;
310 PyInterpreterState *state = PyThreadState_GET()->interp;
311 if (index == 0) {
312 Py_FatalError("PyState_RemoveModule: Module index invalid.");
313 return -1;
314 }
315 if (state->modules_by_index == NULL) {
316 Py_FatalError("PyState_RemoveModule: Interpreters module-list not acessible.");
317 return -1;
318 }
319 if (index > PyList_GET_SIZE(state->modules_by_index)) {
320 Py_FatalError("PyState_RemoveModule: Module index out of bounds.");
321 return -1;
322 }
323 return PyList_SetItem(state->modules_by_index, index, Py_None);
324}
325
Antoine Pitrou40322e62013-08-11 00:30:09 +0200326/* used by import.c:PyImport_Cleanup */
327void
328_PyState_ClearModules(void)
329{
330 PyInterpreterState *state = PyThreadState_GET()->interp;
331 if (state->modules_by_index) {
332 Py_ssize_t i;
333 for (i = 0; i < PyList_GET_SIZE(state->modules_by_index); i++) {
334 PyObject *m = PyList_GET_ITEM(state->modules_by_index, i);
335 if (PyModule_Check(m)) {
336 /* cleanup the saved copy of module dicts */
337 PyModuleDef *md = PyModule_GetDef(m);
338 if (md)
339 Py_CLEAR(md->m_base.m_copy);
340 }
341 }
342 /* Setting modules_by_index to NULL could be dangerous, so we
343 clear the list instead. */
344 if (PyList_SetSlice(state->modules_by_index,
345 0, PyList_GET_SIZE(state->modules_by_index),
346 NULL))
347 PyErr_WriteUnraisable(state->modules_by_index);
348 }
349}
350
Guido van Rossuma027efa1997-05-05 20:56:21 +0000351void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000352PyThreadState_Clear(PyThreadState *tstate)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000353{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000354 if (Py_VerboseFlag && tstate->frame != NULL)
355 fprintf(stderr,
356 "PyThreadState_Clear: warning: thread still has a frame\n");
Guido van Rossum25ce5661997-08-02 03:10:38 +0000357
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000358 Py_CLEAR(tstate->frame);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000359
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000360 Py_CLEAR(tstate->dict);
361 Py_CLEAR(tstate->async_exc);
Guido van Rossumede04391998-04-10 20:18:25 +0000362
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000363 Py_CLEAR(tstate->curexc_type);
364 Py_CLEAR(tstate->curexc_value);
365 Py_CLEAR(tstate->curexc_traceback);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000366
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000367 Py_CLEAR(tstate->exc_type);
368 Py_CLEAR(tstate->exc_value);
369 Py_CLEAR(tstate->exc_traceback);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000370
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000371 tstate->c_profilefunc = NULL;
372 tstate->c_tracefunc = NULL;
373 Py_CLEAR(tstate->c_profileobj);
374 Py_CLEAR(tstate->c_traceobj);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000375}
376
377
Guido van Rossum29757862001-01-23 01:46:06 +0000378/* Common code for PyThreadState_Delete() and PyThreadState_DeleteCurrent() */
379static void
380tstate_delete_common(PyThreadState *tstate)
Guido van Rossuma027efa1997-05-05 20:56:21 +0000381{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000382 PyInterpreterState *interp;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000383 if (tstate == NULL)
384 Py_FatalError("PyThreadState_Delete: NULL tstate");
385 interp = tstate->interp;
386 if (interp == NULL)
387 Py_FatalError("PyThreadState_Delete: NULL interp");
388 HEAD_LOCK();
Charles-Francois Natalif28dfdd2013-05-08 21:09:52 +0200389 if (tstate->prev)
390 tstate->prev->next = tstate->next;
391 else
392 interp->tstate_head = tstate->next;
393 if (tstate->next)
394 tstate->next->prev = tstate->prev;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000395 HEAD_UNLOCK();
Antoine Pitrou7b476992013-09-07 23:38:37 +0200396 if (tstate->on_delete != NULL) {
397 tstate->on_delete(tstate->on_delete_data);
398 }
Victor Stinner1a7425f2013-07-07 16:25:15 +0200399 PyMem_RawFree(tstate);
Guido van Rossuma027efa1997-05-05 20:56:21 +0000400}
401
402
Guido van Rossum29757862001-01-23 01:46:06 +0000403void
404PyThreadState_Delete(PyThreadState *tstate)
405{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000406 if (tstate == _Py_atomic_load_relaxed(&_PyThreadState_Current))
407 Py_FatalError("PyThreadState_Delete: tstate is still current");
Tim Petersf4e69282006-02-27 17:15:31 +0000408#ifdef WITH_THREAD
Antoine Pitrou079ce542010-09-08 12:37:10 +0000409 if (autoInterpreterState && PyThread_get_key_value(autoTLSkey) == tstate)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000410 PyThread_delete_key_value(autoTLSkey);
Tim Petersf4e69282006-02-27 17:15:31 +0000411#endif /* WITH_THREAD */
Christian Heimesb9dbc7d2013-07-01 23:42:28 +0200412 tstate_delete_common(tstate);
Guido van Rossum29757862001-01-23 01:46:06 +0000413}
414
415
416#ifdef WITH_THREAD
417void
418PyThreadState_DeleteCurrent()
419{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000420 PyThreadState *tstate = (PyThreadState*)_Py_atomic_load_relaxed(
421 &_PyThreadState_Current);
422 if (tstate == NULL)
423 Py_FatalError(
424 "PyThreadState_DeleteCurrent: no current tstate");
425 _Py_atomic_store_relaxed(&_PyThreadState_Current, NULL);
Benjamin Peterson068f81e2014-06-16 23:07:49 -0700426 /*
427 Only call tstate_delete_common to have the tstate if we're not finalizing
428 or we're the main thread. The main thread will do this for us. Not calling
429 tstate_delete_common means we won't lock the interpreter head lock,
430 avoiding a possible deadlock with the GIL.
431 */
432 if (!_Py_Finalizing || _Py_Finalizing == tstate)
433 tstate_delete_common(tstate);
Antoine Pitrou079ce542010-09-08 12:37:10 +0000434 if (autoInterpreterState && PyThread_get_key_value(autoTLSkey) == tstate)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000435 PyThread_delete_key_value(autoTLSkey);
Christian Heimesb9dbc7d2013-07-01 23:42:28 +0200436 tstate_delete_common(tstate);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000437 PyEval_ReleaseLock();
Guido van Rossum29757862001-01-23 01:46:06 +0000438}
439#endif /* WITH_THREAD */
440
441
Antoine Pitrou8408cea2013-05-05 23:47:09 +0200442/*
443 * Delete all thread states except the one passed as argument.
444 * Note that, if there is a current thread state, it *must* be the one
445 * passed as argument. Also, this won't touch any other interpreters
446 * than the current one, since we don't know which thread state should
447 * be kept in those other interpreteres.
448 */
449void
450_PyThreadState_DeleteExcept(PyThreadState *tstate)
451{
452 PyInterpreterState *interp = tstate->interp;
453 PyThreadState *p, *next, *garbage;
454 HEAD_LOCK();
455 /* Remove all thread states, except tstate, from the linked list of
456 thread states. This will allow calling PyThreadState_Clear()
Charles-Francois Natalif28dfdd2013-05-08 21:09:52 +0200457 without holding the lock. */
Antoine Pitrou8408cea2013-05-05 23:47:09 +0200458 garbage = interp->tstate_head;
Charles-Francois Natalif28dfdd2013-05-08 21:09:52 +0200459 if (garbage == tstate)
460 garbage = tstate->next;
461 if (tstate->prev)
462 tstate->prev->next = tstate->next;
463 if (tstate->next)
464 tstate->next->prev = tstate->prev;
465 tstate->prev = tstate->next = NULL;
Antoine Pitrou8408cea2013-05-05 23:47:09 +0200466 interp->tstate_head = tstate;
Antoine Pitrou8408cea2013-05-05 23:47:09 +0200467 HEAD_UNLOCK();
468 /* Clear and deallocate all stale thread states. Even if this
469 executes Python code, we should be safe since it executes
470 in the current thread, not one of the stale threads. */
471 for (p = garbage; p; p = next) {
472 next = p->next;
473 PyThreadState_Clear(p);
Victor Stinner1a7425f2013-07-07 16:25:15 +0200474 PyMem_RawFree(p);
Antoine Pitrou8408cea2013-05-05 23:47:09 +0200475 }
476}
477
478
Guido van Rossuma027efa1997-05-05 20:56:21 +0000479PyThreadState *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000480PyThreadState_Get(void)
Guido van Rossuma027efa1997-05-05 20:56:21 +0000481{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000482 PyThreadState *tstate = (PyThreadState*)_Py_atomic_load_relaxed(
483 &_PyThreadState_Current);
484 if (tstate == NULL)
485 Py_FatalError("PyThreadState_Get: no current thread");
Guido van Rossum25ce5661997-08-02 03:10:38 +0000486
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000487 return tstate;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000488}
489
490
491PyThreadState *
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000492PyThreadState_Swap(PyThreadState *newts)
Guido van Rossuma027efa1997-05-05 20:56:21 +0000493{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000494 PyThreadState *oldts = (PyThreadState*)_Py_atomic_load_relaxed(
495 &_PyThreadState_Current);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000496
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000497 _Py_atomic_store_relaxed(&_PyThreadState_Current, newts);
498 /* It should not be possible for more than one thread state
499 to be used for a thread. Check this the best we can in debug
500 builds.
501 */
Martin v. Löwis9e296252003-05-01 05:25:29 +0000502#if defined(Py_DEBUG) && defined(WITH_THREAD)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000503 if (newts) {
504 /* This can be called from PyEval_RestoreThread(). Similar
505 to it, we need to ensure errno doesn't change.
506 */
507 int err = errno;
508 PyThreadState *check = PyGILState_GetThisThreadState();
509 if (check && check->interp == newts->interp && check != newts)
510 Py_FatalError("Invalid thread state for this thread");
511 errno = err;
512 }
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000513#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000514 return oldts;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000515}
Guido van Rossumede04391998-04-10 20:18:25 +0000516
517/* An extension mechanism to store arbitrary additional per-thread state.
518 PyThreadState_GetDict() returns a dictionary that can be used to hold such
519 state; the caller should pick a unique key and store its state there. If
Guido van Rossum0fc8f002003-04-15 15:12:39 +0000520 PyThreadState_GetDict() returns NULL, an exception has *not* been raised
521 and the caller should assume no per-thread state is available. */
Guido van Rossumede04391998-04-10 20:18:25 +0000522
523PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000524PyThreadState_GetDict(void)
Guido van Rossumede04391998-04-10 20:18:25 +0000525{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000526 PyThreadState *tstate = (PyThreadState*)_Py_atomic_load_relaxed(
527 &_PyThreadState_Current);
528 if (tstate == NULL)
529 return NULL;
Guido van Rossumede04391998-04-10 20:18:25 +0000530
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000531 if (tstate->dict == NULL) {
532 PyObject *d;
533 tstate->dict = d = PyDict_New();
534 if (d == NULL)
535 PyErr_Clear();
536 }
537 return tstate->dict;
Guido van Rossumede04391998-04-10 20:18:25 +0000538}
Guido van Rossumf5df46d2001-07-19 12:19:27 +0000539
540
Guido van Rossumb8b6d0c2003-06-28 21:53:52 +0000541/* Asynchronously raise an exception in a thread.
542 Requested by Just van Rossum and Alex Martelli.
Guido van Rossum0f1f63c2005-02-08 02:07:57 +0000543 To prevent naive misuse, you must write your own extension
Thomas Wouters00ee7ba2006-08-21 19:07:27 +0000544 to call this, or use ctypes. Must be called with the GIL held.
545 Returns the number of tstates modified (normally 1, but 0 if `id` didn't
546 match any known thread id). Can be called with exc=NULL to clear an
547 existing async exception. This raises no exceptions. */
Guido van Rossumb8b6d0c2003-06-28 21:53:52 +0000548
549int
550PyThreadState_SetAsyncExc(long id, PyObject *exc) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000551 PyThreadState *tstate = PyThreadState_GET();
552 PyInterpreterState *interp = tstate->interp;
553 PyThreadState *p;
Thomas Wouters00ee7ba2006-08-21 19:07:27 +0000554
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000555 /* Although the GIL is held, a few C API functions can be called
556 * without the GIL held, and in particular some that create and
557 * destroy thread and interpreter states. Those can mutate the
558 * list of thread states we're traversing, so to prevent that we lock
559 * head_mutex for the duration.
560 */
561 HEAD_LOCK();
562 for (p = interp->tstate_head; p != NULL; p = p->next) {
563 if (p->thread_id == id) {
564 /* Tricky: we need to decref the current value
565 * (if any) in p->async_exc, but that can in turn
566 * allow arbitrary Python code to run, including
567 * perhaps calls to this function. To prevent
568 * deadlock, we need to release head_mutex before
569 * the decref.
570 */
571 PyObject *old_exc = p->async_exc;
572 Py_XINCREF(exc);
573 p->async_exc = exc;
574 HEAD_UNLOCK();
575 Py_XDECREF(old_exc);
576 _PyEval_SignalAsyncExc();
577 return 1;
578 }
579 }
580 HEAD_UNLOCK();
581 return 0;
Guido van Rossumb8b6d0c2003-06-28 21:53:52 +0000582}
583
584
Guido van Rossumf5df46d2001-07-19 12:19:27 +0000585/* Routines for advanced debuggers, requested by David Beazley.
586 Don't use unless you know what you are doing! */
587
588PyInterpreterState *
589PyInterpreterState_Head(void)
590{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000591 return interp_head;
Guido van Rossumf5df46d2001-07-19 12:19:27 +0000592}
593
594PyInterpreterState *
595PyInterpreterState_Next(PyInterpreterState *interp) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000596 return interp->next;
Guido van Rossumf5df46d2001-07-19 12:19:27 +0000597}
598
599PyThreadState *
600PyInterpreterState_ThreadHead(PyInterpreterState *interp) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000601 return interp->tstate_head;
Guido van Rossumf5df46d2001-07-19 12:19:27 +0000602}
603
604PyThreadState *
605PyThreadState_Next(PyThreadState *tstate) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000606 return tstate->next;
Guido van Rossumf5df46d2001-07-19 12:19:27 +0000607}
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000608
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000609/* The implementation of sys._current_frames(). This is intended to be
610 called with the GIL held, as it will be when called via
611 sys._current_frames(). It's possible it would work fine even without
612 the GIL held, but haven't thought enough about that.
613*/
614PyObject *
615_PyThread_CurrentFrames(void)
616{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000617 PyObject *result;
618 PyInterpreterState *i;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000619
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000620 result = PyDict_New();
621 if (result == NULL)
622 return NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000623
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000624 /* for i in all interpreters:
625 * for t in all of i's thread states:
626 * if t's frame isn't NULL, map t's id to its frame
Ezio Melotti13925002011-03-16 11:05:33 +0200627 * Because these lists can mutate even when the GIL is held, we
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000628 * need to grab head_mutex for the duration.
629 */
630 HEAD_LOCK();
631 for (i = interp_head; i != NULL; i = i->next) {
632 PyThreadState *t;
633 for (t = i->tstate_head; t != NULL; t = t->next) {
634 PyObject *id;
635 int stat;
636 struct _frame *frame = t->frame;
637 if (frame == NULL)
638 continue;
639 id = PyLong_FromLong(t->thread_id);
640 if (id == NULL)
641 goto Fail;
642 stat = PyDict_SetItem(result, id, (PyObject *)frame);
643 Py_DECREF(id);
644 if (stat < 0)
645 goto Fail;
646 }
647 }
648 HEAD_UNLOCK();
649 return result;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000650
651 Fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000652 HEAD_UNLOCK();
653 Py_DECREF(result);
654 return NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000655}
Guido van Rossumb8b6d0c2003-06-28 21:53:52 +0000656
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000657/* Python "auto thread state" API. */
658#ifdef WITH_THREAD
659
660/* Keep this as a static, as it is not reliable! It can only
661 ever be compared to the state for the *current* thread.
662 * If not equal, then it doesn't matter that the actual
663 value may change immediately after comparison, as it can't
664 possibly change to the current thread's state.
665 * If equal, then the current thread holds the lock, so the value can't
666 change until we yield the lock.
667*/
668static int
669PyThreadState_IsCurrent(PyThreadState *tstate)
670{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000671 /* Must be the tstate for this thread */
672 assert(PyGILState_GetThisThreadState()==tstate);
673 return tstate == _Py_atomic_load_relaxed(&_PyThreadState_Current);
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000674}
675
Tim Peters4c1f5ec2004-10-09 17:25:05 +0000676/* Internal initialization/finalization functions called by
677 Py_Initialize/Py_Finalize
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000678*/
Tim Peters19717fa2004-10-09 17:38:29 +0000679void
680_PyGILState_Init(PyInterpreterState *i, PyThreadState *t)
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000681{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000682 assert(i && t); /* must init with valid states */
683 autoTLSkey = PyThread_create_key();
Kristján Valur Jónsson2fea9b92010-09-20 02:11:49 +0000684 if (autoTLSkey == -1)
685 Py_FatalError("Could not allocate TLS entry");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000686 autoInterpreterState = i;
687 assert(PyThread_get_key_value(autoTLSkey) == NULL);
688 assert(t->gilstate_counter == 0);
Michael W. Hudson188d4362005-06-20 16:52:57 +0000689
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000690 _PyGILState_NoteThreadState(t);
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000691}
692
Tim Peters19717fa2004-10-09 17:38:29 +0000693void
694_PyGILState_Fini(void)
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000695{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000696 PyThread_delete_key(autoTLSkey);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000697 autoInterpreterState = NULL;
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000698}
699
Charles-François Natalia233df82011-11-22 19:49:51 +0100700/* Reset the TLS key - called by PyOS_AfterFork().
Antoine Pitrou0c759fe2011-04-27 19:28:05 +0200701 * This should not be necessary, but some - buggy - pthread implementations
Charles-François Natalia233df82011-11-22 19:49:51 +0100702 * don't reset TLS upon fork(), see issue #10517.
Antoine Pitrou0c759fe2011-04-27 19:28:05 +0200703 */
704void
705_PyGILState_Reinit(void)
706{
707 PyThreadState *tstate = PyGILState_GetThisThreadState();
708 PyThread_delete_key(autoTLSkey);
709 if ((autoTLSkey = PyThread_create_key()) == -1)
710 Py_FatalError("Could not allocate TLS entry");
711
Charles-François Natalia233df82011-11-22 19:49:51 +0100712 /* If the thread had an associated auto thread state, reassociate it with
713 * the new key. */
714 if (tstate && PyThread_set_key_value(autoTLSkey, (void *)tstate) < 0)
Antoine Pitrou0c759fe2011-04-27 19:28:05 +0200715 Py_FatalError("Couldn't create autoTLSkey mapping");
716}
717
Michael W. Hudson188d4362005-06-20 16:52:57 +0000718/* When a thread state is created for a thread by some mechanism other than
719 PyGILState_Ensure, it's important that the GILState machinery knows about
720 it so it doesn't try to create another thread state for the thread (this is
721 a better fix for SF bug #1010677 than the first one attempted).
722*/
Thomas Wouters89f507f2006-12-13 04:49:30 +0000723static void
Michael W. Hudson188d4362005-06-20 16:52:57 +0000724_PyGILState_NoteThreadState(PyThreadState* tstate)
725{
Antoine Pitrou079ce542010-09-08 12:37:10 +0000726 /* If autoTLSkey isn't initialized, this must be the very first
727 threadstate created in Py_Initialize(). Don't do anything for now
728 (we'll be back here when _PyGILState_Init is called). */
729 if (!autoInterpreterState)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000730 return;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000731
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000732 /* Stick the thread state for this thread in thread local storage.
Michael W. Hudson188d4362005-06-20 16:52:57 +0000733
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000734 The only situation where you can legitimately have more than one
735 thread state for an OS level thread is when there are multiple
Victor Stinner590cebe2013-12-13 11:08:56 +0100736 interpreters.
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000737
Victor Stinner590cebe2013-12-13 11:08:56 +0100738 You shouldn't really be using the PyGILState_ APIs anyway (see issues
739 #10915 and #15751).
Michael W. Hudson188d4362005-06-20 16:52:57 +0000740
Victor Stinner590cebe2013-12-13 11:08:56 +0100741 The first thread state created for that given OS level thread will
742 "win", which seems reasonable behaviour.
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000743 */
Victor Stinner590cebe2013-12-13 11:08:56 +0100744 if (PyThread_get_key_value(autoTLSkey) == NULL) {
745 if (PyThread_set_key_value(autoTLSkey, (void *)tstate) < 0)
746 Py_FatalError("Couldn't create autoTLSkey mapping");
747 }
Michael W. Hudson188d4362005-06-20 16:52:57 +0000748
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000749 /* PyGILState_Release must not try to delete this thread state. */
750 tstate->gilstate_counter = 1;
Michael W. Hudson188d4362005-06-20 16:52:57 +0000751}
752
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000753/* The public functions */
Tim Peters19717fa2004-10-09 17:38:29 +0000754PyThreadState *
755PyGILState_GetThisThreadState(void)
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000756{
Antoine Pitrou079ce542010-09-08 12:37:10 +0000757 if (autoInterpreterState == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000758 return NULL;
759 return (PyThreadState *)PyThread_get_key_value(autoTLSkey);
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000760}
761
Kristján Valur Jónsson684cd0e2013-03-23 03:36:16 -0700762int
763PyGILState_Check(void)
764{
765 /* can't use PyThreadState_Get() since it will assert that it has the GIL */
766 PyThreadState *tstate = (PyThreadState*)_Py_atomic_load_relaxed(
767 &_PyThreadState_Current);
768 return tstate && (tstate == PyGILState_GetThisThreadState());
769}
770
Tim Peters19717fa2004-10-09 17:38:29 +0000771PyGILState_STATE
772PyGILState_Ensure(void)
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000773{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000774 int current;
775 PyThreadState *tcur;
776 /* Note that we do not auto-init Python here - apart from
777 potential races with 2 threads auto-initializing, pep-311
778 spells out other issues. Embedders are expected to have
779 called Py_Initialize() and usually PyEval_InitThreads().
780 */
781 assert(autoInterpreterState); /* Py_Initialize() hasn't been called! */
782 tcur = (PyThreadState *)PyThread_get_key_value(autoTLSkey);
783 if (tcur == NULL) {
Victor Stinner62ca1002013-12-13 01:46:43 +0100784 /* At startup, Python has no concrete GIL. If PyGILState_Ensure() is
785 called from a new thread for the first time, we need the create the
786 GIL. */
787 PyEval_InitThreads();
788
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000789 /* Create a new thread state for this thread */
790 tcur = PyThreadState_New(autoInterpreterState);
791 if (tcur == NULL)
792 Py_FatalError("Couldn't create thread-state for new thread");
793 /* This is our thread state! We'll need to delete it in the
794 matching call to PyGILState_Release(). */
795 tcur->gilstate_counter = 0;
796 current = 0; /* new thread state is never current */
797 }
798 else
799 current = PyThreadState_IsCurrent(tcur);
800 if (current == 0)
801 PyEval_RestoreThread(tcur);
802 /* Update our counter in the thread-state - no need for locks:
803 - tcur will remain valid as we hold the GIL.
804 - the counter is safe as we are the only thread "allowed"
805 to modify this value
806 */
807 ++tcur->gilstate_counter;
808 return current ? PyGILState_LOCKED : PyGILState_UNLOCKED;
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000809}
810
Tim Peters19717fa2004-10-09 17:38:29 +0000811void
812PyGILState_Release(PyGILState_STATE oldstate)
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000813{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000814 PyThreadState *tcur = (PyThreadState *)PyThread_get_key_value(
815 autoTLSkey);
816 if (tcur == NULL)
817 Py_FatalError("auto-releasing thread-state, "
818 "but no thread-state for this thread");
819 /* We must hold the GIL and have our thread state current */
820 /* XXX - remove the check - the assert should be fine,
821 but while this is very new (April 2003), the extra check
822 by release-only users can't hurt.
823 */
824 if (! PyThreadState_IsCurrent(tcur))
825 Py_FatalError("This thread state must be current when releasing");
826 assert(PyThreadState_IsCurrent(tcur));
827 --tcur->gilstate_counter;
828 assert(tcur->gilstate_counter >= 0); /* illegal counter value */
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000829
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000830 /* If we're going to destroy this thread-state, we must
831 * clear it while the GIL is held, as destructors may run.
832 */
833 if (tcur->gilstate_counter == 0) {
834 /* can't have been locked when we created it */
835 assert(oldstate == PyGILState_UNLOCKED);
836 PyThreadState_Clear(tcur);
837 /* Delete the thread-state. Note this releases the GIL too!
838 * It's vital that the GIL be held here, to avoid shutdown
839 * races; see bugs 225673 and 1061968 (that nasty bug has a
840 * habit of coming back).
841 */
842 PyThreadState_DeleteCurrent();
843 }
844 /* Release the lock if necessary */
845 else if (oldstate == PyGILState_UNLOCKED)
846 PyEval_SaveThread();
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000847}
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000848
Benjamin Peterson3bf01752012-04-13 18:06:36 -0400849#endif /* WITH_THREAD */
850
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000851#ifdef __cplusplus
852}
853#endif
854
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000855