blob: e214f50497268dcc6cb9d18cb36961c88111b365 [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 Storchaka87a5c512014-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 Storchaka87a5c512014-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
Yury Selivanov75445082015-05-11 22:57:16 -0400215 tstate->coroutine_wrapper = NULL;
216
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000217 if (init)
218 _PyThreadState_Init(tstate);
Michael W. Hudson188d4362005-06-20 16:52:57 +0000219
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000220 HEAD_LOCK();
Charles-Francois Natalif28dfdd2013-05-08 21:09:52 +0200221 tstate->prev = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000222 tstate->next = interp->tstate_head;
Charles-Francois Natalif28dfdd2013-05-08 21:09:52 +0200223 if (tstate->next)
224 tstate->next->prev = tstate;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000225 interp->tstate_head = tstate;
226 HEAD_UNLOCK();
227 }
Guido van Rossum25ce5661997-08-02 03:10:38 +0000228
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000229 return tstate;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000230}
231
Victor Stinner45b9be52010-03-03 23:28:07 +0000232PyThreadState *
233PyThreadState_New(PyInterpreterState *interp)
234{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000235 return new_threadstate(interp, 1);
Victor Stinner45b9be52010-03-03 23:28:07 +0000236}
237
238PyThreadState *
239_PyThreadState_Prealloc(PyInterpreterState *interp)
240{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000241 return new_threadstate(interp, 0);
Victor Stinner45b9be52010-03-03 23:28:07 +0000242}
243
244void
245_PyThreadState_Init(PyThreadState *tstate)
246{
247#ifdef WITH_THREAD
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000248 _PyGILState_NoteThreadState(tstate);
Victor Stinner45b9be52010-03-03 23:28:07 +0000249#endif
250}
251
Martin v. Löwis1a214512008-06-11 05:26:20 +0000252PyObject*
Martin v. Löwis7800f752012-06-22 12:20:55 +0200253PyState_FindModule(struct PyModuleDef* module)
Martin v. Löwis1a214512008-06-11 05:26:20 +0000254{
Martin v. Löwis7800f752012-06-22 12:20:55 +0200255 Py_ssize_t index = module->m_base.m_index;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000256 PyInterpreterState *state = PyThreadState_GET()->interp;
257 PyObject *res;
258 if (index == 0)
259 return NULL;
260 if (state->modules_by_index == NULL)
261 return NULL;
Antoine Pitrou75506e82012-08-20 19:30:46 +0200262 if (index >= PyList_GET_SIZE(state->modules_by_index))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000263 return NULL;
264 res = PyList_GET_ITEM(state->modules_by_index, index);
265 return res==Py_None ? NULL : res;
Martin v. Löwis1a214512008-06-11 05:26:20 +0000266}
267
268int
269_PyState_AddModule(PyObject* module, struct PyModuleDef* def)
270{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000271 PyInterpreterState *state = PyThreadState_GET()->interp;
272 if (!def)
273 return -1;
274 if (!state->modules_by_index) {
275 state->modules_by_index = PyList_New(0);
276 if (!state->modules_by_index)
277 return -1;
278 }
279 while(PyList_GET_SIZE(state->modules_by_index) <= def->m_base.m_index)
280 if (PyList_Append(state->modules_by_index, Py_None) < 0)
281 return -1;
282 Py_INCREF(module);
283 return PyList_SetItem(state->modules_by_index,
284 def->m_base.m_index, module);
Martin v. Löwis1a214512008-06-11 05:26:20 +0000285}
Guido van Rossuma027efa1997-05-05 20:56:21 +0000286
Martin v. Löwis7800f752012-06-22 12:20:55 +0200287int
288PyState_AddModule(PyObject* module, struct PyModuleDef* def)
289{
290 Py_ssize_t index;
291 PyInterpreterState *state = PyThreadState_GET()->interp;
292 if (!def) {
293 Py_FatalError("PyState_AddModule: Module Definition is NULL");
294 return -1;
295 }
296 index = def->m_base.m_index;
297 if (state->modules_by_index) {
298 if(PyList_GET_SIZE(state->modules_by_index) >= index) {
299 if(module == PyList_GET_ITEM(state->modules_by_index, index)) {
300 Py_FatalError("PyState_AddModule: Module already added!");
301 return -1;
302 }
303 }
304 }
305 return _PyState_AddModule(module, def);
306}
307
308int
309PyState_RemoveModule(struct PyModuleDef* def)
310{
311 Py_ssize_t index = def->m_base.m_index;
312 PyInterpreterState *state = PyThreadState_GET()->interp;
313 if (index == 0) {
314 Py_FatalError("PyState_RemoveModule: Module index invalid.");
315 return -1;
316 }
317 if (state->modules_by_index == NULL) {
318 Py_FatalError("PyState_RemoveModule: Interpreters module-list not acessible.");
319 return -1;
320 }
321 if (index > PyList_GET_SIZE(state->modules_by_index)) {
322 Py_FatalError("PyState_RemoveModule: Module index out of bounds.");
323 return -1;
324 }
325 return PyList_SetItem(state->modules_by_index, index, Py_None);
326}
327
Antoine Pitrou40322e62013-08-11 00:30:09 +0200328/* used by import.c:PyImport_Cleanup */
329void
330_PyState_ClearModules(void)
331{
332 PyInterpreterState *state = PyThreadState_GET()->interp;
333 if (state->modules_by_index) {
334 Py_ssize_t i;
335 for (i = 0; i < PyList_GET_SIZE(state->modules_by_index); i++) {
336 PyObject *m = PyList_GET_ITEM(state->modules_by_index, i);
337 if (PyModule_Check(m)) {
338 /* cleanup the saved copy of module dicts */
339 PyModuleDef *md = PyModule_GetDef(m);
340 if (md)
341 Py_CLEAR(md->m_base.m_copy);
342 }
343 }
344 /* Setting modules_by_index to NULL could be dangerous, so we
345 clear the list instead. */
346 if (PyList_SetSlice(state->modules_by_index,
347 0, PyList_GET_SIZE(state->modules_by_index),
348 NULL))
349 PyErr_WriteUnraisable(state->modules_by_index);
350 }
351}
352
Guido van Rossuma027efa1997-05-05 20:56:21 +0000353void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000354PyThreadState_Clear(PyThreadState *tstate)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000355{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000356 if (Py_VerboseFlag && tstate->frame != NULL)
357 fprintf(stderr,
358 "PyThreadState_Clear: warning: thread still has a frame\n");
Guido van Rossum25ce5661997-08-02 03:10:38 +0000359
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000360 Py_CLEAR(tstate->frame);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000361
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000362 Py_CLEAR(tstate->dict);
363 Py_CLEAR(tstate->async_exc);
Guido van Rossumede04391998-04-10 20:18:25 +0000364
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000365 Py_CLEAR(tstate->curexc_type);
366 Py_CLEAR(tstate->curexc_value);
367 Py_CLEAR(tstate->curexc_traceback);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000368
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000369 Py_CLEAR(tstate->exc_type);
370 Py_CLEAR(tstate->exc_value);
371 Py_CLEAR(tstate->exc_traceback);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000372
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000373 tstate->c_profilefunc = NULL;
374 tstate->c_tracefunc = NULL;
375 Py_CLEAR(tstate->c_profileobj);
376 Py_CLEAR(tstate->c_traceobj);
Yury Selivanov75445082015-05-11 22:57:16 -0400377
378 Py_CLEAR(tstate->coroutine_wrapper);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000379}
380
381
Guido van Rossum29757862001-01-23 01:46:06 +0000382/* Common code for PyThreadState_Delete() and PyThreadState_DeleteCurrent() */
383static void
384tstate_delete_common(PyThreadState *tstate)
Guido van Rossuma027efa1997-05-05 20:56:21 +0000385{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000386 PyInterpreterState *interp;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000387 if (tstate == NULL)
388 Py_FatalError("PyThreadState_Delete: NULL tstate");
389 interp = tstate->interp;
390 if (interp == NULL)
391 Py_FatalError("PyThreadState_Delete: NULL interp");
392 HEAD_LOCK();
Charles-Francois Natalif28dfdd2013-05-08 21:09:52 +0200393 if (tstate->prev)
394 tstate->prev->next = tstate->next;
395 else
396 interp->tstate_head = tstate->next;
397 if (tstate->next)
398 tstate->next->prev = tstate->prev;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000399 HEAD_UNLOCK();
Antoine Pitrou7b476992013-09-07 23:38:37 +0200400 if (tstate->on_delete != NULL) {
401 tstate->on_delete(tstate->on_delete_data);
402 }
Victor Stinner1a7425f2013-07-07 16:25:15 +0200403 PyMem_RawFree(tstate);
Guido van Rossuma027efa1997-05-05 20:56:21 +0000404}
405
406
Guido van Rossum29757862001-01-23 01:46:06 +0000407void
408PyThreadState_Delete(PyThreadState *tstate)
409{
Serhiy Storchaka53fa8b22015-02-16 09:40:12 +0200410 if (tstate == (PyThreadState*)_Py_atomic_load_relaxed(&_PyThreadState_Current))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000411 Py_FatalError("PyThreadState_Delete: tstate is still current");
Tim Petersf4e69282006-02-27 17:15:31 +0000412#ifdef WITH_THREAD
Antoine Pitrou079ce542010-09-08 12:37:10 +0000413 if (autoInterpreterState && PyThread_get_key_value(autoTLSkey) == tstate)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000414 PyThread_delete_key_value(autoTLSkey);
Tim Petersf4e69282006-02-27 17:15:31 +0000415#endif /* WITH_THREAD */
Christian Heimesb9dbc7d2013-07-01 23:42:28 +0200416 tstate_delete_common(tstate);
Guido van Rossum29757862001-01-23 01:46:06 +0000417}
418
419
420#ifdef WITH_THREAD
421void
422PyThreadState_DeleteCurrent()
423{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000424 PyThreadState *tstate = (PyThreadState*)_Py_atomic_load_relaxed(
425 &_PyThreadState_Current);
426 if (tstate == NULL)
427 Py_FatalError(
428 "PyThreadState_DeleteCurrent: no current tstate");
429 _Py_atomic_store_relaxed(&_PyThreadState_Current, NULL);
Antoine Pitrou079ce542010-09-08 12:37:10 +0000430 if (autoInterpreterState && PyThread_get_key_value(autoTLSkey) == tstate)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000431 PyThread_delete_key_value(autoTLSkey);
Christian Heimesb9dbc7d2013-07-01 23:42:28 +0200432 tstate_delete_common(tstate);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000433 PyEval_ReleaseLock();
Guido van Rossum29757862001-01-23 01:46:06 +0000434}
435#endif /* WITH_THREAD */
436
437
Antoine Pitrou8408cea2013-05-05 23:47:09 +0200438/*
439 * Delete all thread states except the one passed as argument.
440 * Note that, if there is a current thread state, it *must* be the one
441 * passed as argument. Also, this won't touch any other interpreters
442 * than the current one, since we don't know which thread state should
443 * be kept in those other interpreteres.
444 */
445void
446_PyThreadState_DeleteExcept(PyThreadState *tstate)
447{
448 PyInterpreterState *interp = tstate->interp;
449 PyThreadState *p, *next, *garbage;
450 HEAD_LOCK();
451 /* Remove all thread states, except tstate, from the linked list of
452 thread states. This will allow calling PyThreadState_Clear()
Charles-Francois Natalif28dfdd2013-05-08 21:09:52 +0200453 without holding the lock. */
Antoine Pitrou8408cea2013-05-05 23:47:09 +0200454 garbage = interp->tstate_head;
Charles-Francois Natalif28dfdd2013-05-08 21:09:52 +0200455 if (garbage == tstate)
456 garbage = tstate->next;
457 if (tstate->prev)
458 tstate->prev->next = tstate->next;
459 if (tstate->next)
460 tstate->next->prev = tstate->prev;
461 tstate->prev = tstate->next = NULL;
Antoine Pitrou8408cea2013-05-05 23:47:09 +0200462 interp->tstate_head = tstate;
Antoine Pitrou8408cea2013-05-05 23:47:09 +0200463 HEAD_UNLOCK();
464 /* Clear and deallocate all stale thread states. Even if this
465 executes Python code, we should be safe since it executes
466 in the current thread, not one of the stale threads. */
467 for (p = garbage; p; p = next) {
468 next = p->next;
469 PyThreadState_Clear(p);
Victor Stinner1a7425f2013-07-07 16:25:15 +0200470 PyMem_RawFree(p);
Antoine Pitrou8408cea2013-05-05 23:47:09 +0200471 }
472}
473
474
Guido van Rossuma027efa1997-05-05 20:56:21 +0000475PyThreadState *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000476PyThreadState_Get(void)
Guido van Rossuma027efa1997-05-05 20:56:21 +0000477{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000478 PyThreadState *tstate = (PyThreadState*)_Py_atomic_load_relaxed(
479 &_PyThreadState_Current);
480 if (tstate == NULL)
481 Py_FatalError("PyThreadState_Get: no current thread");
Guido van Rossum25ce5661997-08-02 03:10:38 +0000482
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000483 return tstate;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000484}
485
486
487PyThreadState *
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000488PyThreadState_Swap(PyThreadState *newts)
Guido van Rossuma027efa1997-05-05 20:56:21 +0000489{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000490 PyThreadState *oldts = (PyThreadState*)_Py_atomic_load_relaxed(
491 &_PyThreadState_Current);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000492
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000493 _Py_atomic_store_relaxed(&_PyThreadState_Current, newts);
494 /* It should not be possible for more than one thread state
495 to be used for a thread. Check this the best we can in debug
496 builds.
497 */
Martin v. Löwis9e296252003-05-01 05:25:29 +0000498#if defined(Py_DEBUG) && defined(WITH_THREAD)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000499 if (newts) {
500 /* This can be called from PyEval_RestoreThread(). Similar
501 to it, we need to ensure errno doesn't change.
502 */
503 int err = errno;
504 PyThreadState *check = PyGILState_GetThisThreadState();
505 if (check && check->interp == newts->interp && check != newts)
506 Py_FatalError("Invalid thread state for this thread");
507 errno = err;
508 }
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000509#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000510 return oldts;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000511}
Guido van Rossumede04391998-04-10 20:18:25 +0000512
513/* An extension mechanism to store arbitrary additional per-thread state.
514 PyThreadState_GetDict() returns a dictionary that can be used to hold such
515 state; the caller should pick a unique key and store its state there. If
Guido van Rossum0fc8f002003-04-15 15:12:39 +0000516 PyThreadState_GetDict() returns NULL, an exception has *not* been raised
517 and the caller should assume no per-thread state is available. */
Guido van Rossumede04391998-04-10 20:18:25 +0000518
519PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000520PyThreadState_GetDict(void)
Guido van Rossumede04391998-04-10 20:18:25 +0000521{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000522 PyThreadState *tstate = (PyThreadState*)_Py_atomic_load_relaxed(
523 &_PyThreadState_Current);
524 if (tstate == NULL)
525 return NULL;
Guido van Rossumede04391998-04-10 20:18:25 +0000526
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000527 if (tstate->dict == NULL) {
528 PyObject *d;
529 tstate->dict = d = PyDict_New();
530 if (d == NULL)
531 PyErr_Clear();
532 }
533 return tstate->dict;
Guido van Rossumede04391998-04-10 20:18:25 +0000534}
Guido van Rossumf5df46d2001-07-19 12:19:27 +0000535
536
Guido van Rossumb8b6d0c2003-06-28 21:53:52 +0000537/* Asynchronously raise an exception in a thread.
538 Requested by Just van Rossum and Alex Martelli.
Guido van Rossum0f1f63c2005-02-08 02:07:57 +0000539 To prevent naive misuse, you must write your own extension
Thomas Wouters00ee7ba2006-08-21 19:07:27 +0000540 to call this, or use ctypes. Must be called with the GIL held.
541 Returns the number of tstates modified (normally 1, but 0 if `id` didn't
542 match any known thread id). Can be called with exc=NULL to clear an
543 existing async exception. This raises no exceptions. */
Guido van Rossumb8b6d0c2003-06-28 21:53:52 +0000544
545int
546PyThreadState_SetAsyncExc(long id, PyObject *exc) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000547 PyThreadState *tstate = PyThreadState_GET();
548 PyInterpreterState *interp = tstate->interp;
549 PyThreadState *p;
Thomas Wouters00ee7ba2006-08-21 19:07:27 +0000550
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000551 /* Although the GIL is held, a few C API functions can be called
552 * without the GIL held, and in particular some that create and
553 * destroy thread and interpreter states. Those can mutate the
554 * list of thread states we're traversing, so to prevent that we lock
555 * head_mutex for the duration.
556 */
557 HEAD_LOCK();
558 for (p = interp->tstate_head; p != NULL; p = p->next) {
559 if (p->thread_id == id) {
560 /* Tricky: we need to decref the current value
561 * (if any) in p->async_exc, but that can in turn
562 * allow arbitrary Python code to run, including
563 * perhaps calls to this function. To prevent
564 * deadlock, we need to release head_mutex before
565 * the decref.
566 */
567 PyObject *old_exc = p->async_exc;
568 Py_XINCREF(exc);
569 p->async_exc = exc;
570 HEAD_UNLOCK();
571 Py_XDECREF(old_exc);
572 _PyEval_SignalAsyncExc();
573 return 1;
574 }
575 }
576 HEAD_UNLOCK();
577 return 0;
Guido van Rossumb8b6d0c2003-06-28 21:53:52 +0000578}
579
580
Guido van Rossumf5df46d2001-07-19 12:19:27 +0000581/* Routines for advanced debuggers, requested by David Beazley.
582 Don't use unless you know what you are doing! */
583
584PyInterpreterState *
585PyInterpreterState_Head(void)
586{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000587 return interp_head;
Guido van Rossumf5df46d2001-07-19 12:19:27 +0000588}
589
590PyInterpreterState *
591PyInterpreterState_Next(PyInterpreterState *interp) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000592 return interp->next;
Guido van Rossumf5df46d2001-07-19 12:19:27 +0000593}
594
595PyThreadState *
596PyInterpreterState_ThreadHead(PyInterpreterState *interp) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000597 return interp->tstate_head;
Guido van Rossumf5df46d2001-07-19 12:19:27 +0000598}
599
600PyThreadState *
601PyThreadState_Next(PyThreadState *tstate) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000602 return tstate->next;
Guido van Rossumf5df46d2001-07-19 12:19:27 +0000603}
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000604
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000605/* The implementation of sys._current_frames(). This is intended to be
606 called with the GIL held, as it will be when called via
607 sys._current_frames(). It's possible it would work fine even without
608 the GIL held, but haven't thought enough about that.
609*/
610PyObject *
611_PyThread_CurrentFrames(void)
612{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000613 PyObject *result;
614 PyInterpreterState *i;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000615
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000616 result = PyDict_New();
617 if (result == NULL)
618 return NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000619
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000620 /* for i in all interpreters:
621 * for t in all of i's thread states:
622 * if t's frame isn't NULL, map t's id to its frame
Ezio Melotti13925002011-03-16 11:05:33 +0200623 * Because these lists can mutate even when the GIL is held, we
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000624 * need to grab head_mutex for the duration.
625 */
626 HEAD_LOCK();
627 for (i = interp_head; i != NULL; i = i->next) {
628 PyThreadState *t;
629 for (t = i->tstate_head; t != NULL; t = t->next) {
630 PyObject *id;
631 int stat;
632 struct _frame *frame = t->frame;
633 if (frame == NULL)
634 continue;
635 id = PyLong_FromLong(t->thread_id);
636 if (id == NULL)
637 goto Fail;
638 stat = PyDict_SetItem(result, id, (PyObject *)frame);
639 Py_DECREF(id);
640 if (stat < 0)
641 goto Fail;
642 }
643 }
644 HEAD_UNLOCK();
645 return result;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000646
647 Fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000648 HEAD_UNLOCK();
649 Py_DECREF(result);
650 return NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000651}
Guido van Rossumb8b6d0c2003-06-28 21:53:52 +0000652
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000653/* Python "auto thread state" API. */
654#ifdef WITH_THREAD
655
656/* Keep this as a static, as it is not reliable! It can only
657 ever be compared to the state for the *current* thread.
658 * If not equal, then it doesn't matter that the actual
659 value may change immediately after comparison, as it can't
660 possibly change to the current thread's state.
661 * If equal, then the current thread holds the lock, so the value can't
662 change until we yield the lock.
663*/
664static int
665PyThreadState_IsCurrent(PyThreadState *tstate)
666{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000667 /* Must be the tstate for this thread */
668 assert(PyGILState_GetThisThreadState()==tstate);
Serhiy Storchaka53fa8b22015-02-16 09:40:12 +0200669 return tstate == (PyThreadState*)_Py_atomic_load_relaxed(&_PyThreadState_Current);
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000670}
671
Tim Peters4c1f5ec2004-10-09 17:25:05 +0000672/* Internal initialization/finalization functions called by
673 Py_Initialize/Py_Finalize
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000674*/
Tim Peters19717fa2004-10-09 17:38:29 +0000675void
676_PyGILState_Init(PyInterpreterState *i, PyThreadState *t)
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000677{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000678 assert(i && t); /* must init with valid states */
679 autoTLSkey = PyThread_create_key();
Kristján Valur Jónsson2fea9b92010-09-20 02:11:49 +0000680 if (autoTLSkey == -1)
681 Py_FatalError("Could not allocate TLS entry");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000682 autoInterpreterState = i;
683 assert(PyThread_get_key_value(autoTLSkey) == NULL);
684 assert(t->gilstate_counter == 0);
Michael W. Hudson188d4362005-06-20 16:52:57 +0000685
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000686 _PyGILState_NoteThreadState(t);
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000687}
688
Tim Peters19717fa2004-10-09 17:38:29 +0000689void
690_PyGILState_Fini(void)
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000691{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000692 PyThread_delete_key(autoTLSkey);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000693 autoInterpreterState = NULL;
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000694}
695
Charles-François Natalia233df82011-11-22 19:49:51 +0100696/* Reset the TLS key - called by PyOS_AfterFork().
Antoine Pitrou0c759fe2011-04-27 19:28:05 +0200697 * This should not be necessary, but some - buggy - pthread implementations
Charles-François Natalia233df82011-11-22 19:49:51 +0100698 * don't reset TLS upon fork(), see issue #10517.
Antoine Pitrou0c759fe2011-04-27 19:28:05 +0200699 */
700void
701_PyGILState_Reinit(void)
702{
703 PyThreadState *tstate = PyGILState_GetThisThreadState();
704 PyThread_delete_key(autoTLSkey);
705 if ((autoTLSkey = PyThread_create_key()) == -1)
706 Py_FatalError("Could not allocate TLS entry");
707
Charles-François Natalia233df82011-11-22 19:49:51 +0100708 /* If the thread had an associated auto thread state, reassociate it with
709 * the new key. */
710 if (tstate && PyThread_set_key_value(autoTLSkey, (void *)tstate) < 0)
Antoine Pitrou0c759fe2011-04-27 19:28:05 +0200711 Py_FatalError("Couldn't create autoTLSkey mapping");
712}
713
Michael W. Hudson188d4362005-06-20 16:52:57 +0000714/* When a thread state is created for a thread by some mechanism other than
715 PyGILState_Ensure, it's important that the GILState machinery knows about
716 it so it doesn't try to create another thread state for the thread (this is
717 a better fix for SF bug #1010677 than the first one attempted).
718*/
Thomas Wouters89f507f2006-12-13 04:49:30 +0000719static void
Michael W. Hudson188d4362005-06-20 16:52:57 +0000720_PyGILState_NoteThreadState(PyThreadState* tstate)
721{
Antoine Pitrou079ce542010-09-08 12:37:10 +0000722 /* If autoTLSkey isn't initialized, this must be the very first
723 threadstate created in Py_Initialize(). Don't do anything for now
724 (we'll be back here when _PyGILState_Init is called). */
725 if (!autoInterpreterState)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000726 return;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000727
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000728 /* Stick the thread state for this thread in thread local storage.
Michael W. Hudson188d4362005-06-20 16:52:57 +0000729
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000730 The only situation where you can legitimately have more than one
731 thread state for an OS level thread is when there are multiple
Victor Stinner590cebe2013-12-13 11:08:56 +0100732 interpreters.
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000733
Victor Stinner590cebe2013-12-13 11:08:56 +0100734 You shouldn't really be using the PyGILState_ APIs anyway (see issues
735 #10915 and #15751).
Michael W. Hudson188d4362005-06-20 16:52:57 +0000736
Victor Stinner590cebe2013-12-13 11:08:56 +0100737 The first thread state created for that given OS level thread will
738 "win", which seems reasonable behaviour.
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000739 */
Victor Stinner590cebe2013-12-13 11:08:56 +0100740 if (PyThread_get_key_value(autoTLSkey) == NULL) {
741 if (PyThread_set_key_value(autoTLSkey, (void *)tstate) < 0)
742 Py_FatalError("Couldn't create autoTLSkey mapping");
743 }
Michael W. Hudson188d4362005-06-20 16:52:57 +0000744
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000745 /* PyGILState_Release must not try to delete this thread state. */
746 tstate->gilstate_counter = 1;
Michael W. Hudson188d4362005-06-20 16:52:57 +0000747}
748
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000749/* The public functions */
Tim Peters19717fa2004-10-09 17:38:29 +0000750PyThreadState *
751PyGILState_GetThisThreadState(void)
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000752{
Antoine Pitrou079ce542010-09-08 12:37:10 +0000753 if (autoInterpreterState == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000754 return NULL;
755 return (PyThreadState *)PyThread_get_key_value(autoTLSkey);
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000756}
757
Kristján Valur Jónsson684cd0e2013-03-23 03:36:16 -0700758int
759PyGILState_Check(void)
760{
761 /* can't use PyThreadState_Get() since it will assert that it has the GIL */
762 PyThreadState *tstate = (PyThreadState*)_Py_atomic_load_relaxed(
763 &_PyThreadState_Current);
764 return tstate && (tstate == PyGILState_GetThisThreadState());
765}
766
Tim Peters19717fa2004-10-09 17:38:29 +0000767PyGILState_STATE
768PyGILState_Ensure(void)
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000769{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000770 int current;
771 PyThreadState *tcur;
772 /* Note that we do not auto-init Python here - apart from
773 potential races with 2 threads auto-initializing, pep-311
774 spells out other issues. Embedders are expected to have
775 called Py_Initialize() and usually PyEval_InitThreads().
776 */
777 assert(autoInterpreterState); /* Py_Initialize() hasn't been called! */
778 tcur = (PyThreadState *)PyThread_get_key_value(autoTLSkey);
779 if (tcur == NULL) {
Victor Stinner62ca1002013-12-13 01:46:43 +0100780 /* At startup, Python has no concrete GIL. If PyGILState_Ensure() is
781 called from a new thread for the first time, we need the create the
782 GIL. */
783 PyEval_InitThreads();
784
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000785 /* Create a new thread state for this thread */
786 tcur = PyThreadState_New(autoInterpreterState);
787 if (tcur == NULL)
788 Py_FatalError("Couldn't create thread-state for new thread");
789 /* This is our thread state! We'll need to delete it in the
790 matching call to PyGILState_Release(). */
791 tcur->gilstate_counter = 0;
792 current = 0; /* new thread state is never current */
793 }
794 else
795 current = PyThreadState_IsCurrent(tcur);
796 if (current == 0)
797 PyEval_RestoreThread(tcur);
798 /* Update our counter in the thread-state - no need for locks:
799 - tcur will remain valid as we hold the GIL.
800 - the counter is safe as we are the only thread "allowed"
801 to modify this value
802 */
803 ++tcur->gilstate_counter;
804 return current ? PyGILState_LOCKED : PyGILState_UNLOCKED;
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000805}
806
Tim Peters19717fa2004-10-09 17:38:29 +0000807void
808PyGILState_Release(PyGILState_STATE oldstate)
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000809{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000810 PyThreadState *tcur = (PyThreadState *)PyThread_get_key_value(
811 autoTLSkey);
812 if (tcur == NULL)
813 Py_FatalError("auto-releasing thread-state, "
814 "but no thread-state for this thread");
815 /* We must hold the GIL and have our thread state current */
816 /* XXX - remove the check - the assert should be fine,
817 but while this is very new (April 2003), the extra check
818 by release-only users can't hurt.
819 */
820 if (! PyThreadState_IsCurrent(tcur))
821 Py_FatalError("This thread state must be current when releasing");
822 assert(PyThreadState_IsCurrent(tcur));
823 --tcur->gilstate_counter;
824 assert(tcur->gilstate_counter >= 0); /* illegal counter value */
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000825
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000826 /* If we're going to destroy this thread-state, we must
827 * clear it while the GIL is held, as destructors may run.
828 */
829 if (tcur->gilstate_counter == 0) {
830 /* can't have been locked when we created it */
831 assert(oldstate == PyGILState_UNLOCKED);
832 PyThreadState_Clear(tcur);
833 /* Delete the thread-state. Note this releases the GIL too!
834 * It's vital that the GIL be held here, to avoid shutdown
835 * races; see bugs 225673 and 1061968 (that nasty bug has a
836 * habit of coming back).
837 */
838 PyThreadState_DeleteCurrent();
839 }
840 /* Release the lock if necessary */
841 else if (oldstate == PyGILState_UNLOCKED)
842 PyEval_SaveThread();
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000843}
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000844
Benjamin Peterson3bf01752012-04-13 18:06:36 -0400845#endif /* WITH_THREAD */
846
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000847#ifdef __cplusplus
848}
849#endif
850
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000851