blob: 3db6e61252f646bc092e3da3a195fe46e58edcdb [file] [log] [blame]
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001
2/* Thread module */
3/* Interface to Sjoerd's portable C thread library */
4
Barry Warsawd0c10421996-12-17 00:05:22 +00005#include "Python.h"
Gregory P. Smith4e63d542009-08-20 09:39:38 +00006#include "structmember.h" /* offsetof */
Guido van Rossum1984f1e1992-08-04 12:41:02 +00007
Guido van Rossumb6775db1994-08-01 11:34:53 +00008#ifndef WITH_THREAD
Guido van Rossuma027efa1997-05-05 20:56:21 +00009#error "Error! The rest of Python is not compiled with thread support."
Neal Norwitz884baa12002-09-05 21:31:04 +000010#error "Rerun configure, adding a --with-threads option."
Guido van Rossuma027efa1997-05-05 20:56:21 +000011#error "Then run `make clean' followed by `make'."
Guido van Rossumb6775db1994-08-01 11:34:53 +000012#endif
13
Guido van Rossum49b56061998-10-01 20:42:43 +000014#include "pythread.h"
Guido van Rossum1984f1e1992-08-04 12:41:02 +000015
Barry Warsawd0c10421996-12-17 00:05:22 +000016static PyObject *ThreadError;
Antoine Pitrou59c44f32009-10-30 17:07:08 +000017static long nb_threads = 0;
Guido van Rossum1984f1e1992-08-04 12:41:02 +000018
19/* Lock objects */
20
21typedef struct {
Antoine Pitrouc83ea132010-05-09 14:46:46 +000022 PyObject_HEAD
23 PyThread_type_lock lock_lock;
24 PyObject *in_weakreflist;
Guido van Rossum1984f1e1992-08-04 12:41:02 +000025} lockobject;
26
Guido van Rossum1984f1e1992-08-04 12:41:02 +000027static void
Peter Schneider-Kamp3707efe2000-07-10 10:03:58 +000028lock_dealloc(lockobject *self)
Guido van Rossum1984f1e1992-08-04 12:41:02 +000029{
Antoine Pitrouc83ea132010-05-09 14:46:46 +000030 if (self->in_weakreflist != NULL)
31 PyObject_ClearWeakRefs((PyObject *) self);
32 if (self->lock_lock != NULL) {
33 /* Unlock the lock so it's safe to free it */
34 PyThread_acquire_lock(self->lock_lock, 0);
35 PyThread_release_lock(self->lock_lock);
36
37 PyThread_free_lock(self->lock_lock);
38 }
39 PyObject_Del(self);
Guido van Rossum1984f1e1992-08-04 12:41:02 +000040}
41
Barry Warsawd0c10421996-12-17 00:05:22 +000042static PyObject *
Peter Schneider-Kamp3707efe2000-07-10 10:03:58 +000043lock_PyThread_acquire_lock(lockobject *self, PyObject *args)
Guido van Rossum1984f1e1992-08-04 12:41:02 +000044{
Antoine Pitrouc83ea132010-05-09 14:46:46 +000045 int i = 1;
Guido van Rossum1984f1e1992-08-04 12:41:02 +000046
Antoine Pitrouc83ea132010-05-09 14:46:46 +000047 if (!PyArg_ParseTuple(args, "|i:acquire", &i))
48 return NULL;
Guido van Rossum1984f1e1992-08-04 12:41:02 +000049
Antoine Pitrouc83ea132010-05-09 14:46:46 +000050 Py_BEGIN_ALLOW_THREADS
51 i = PyThread_acquire_lock(self->lock_lock, i);
52 Py_END_ALLOW_THREADS
Guido van Rossum1984f1e1992-08-04 12:41:02 +000053
Antoine Pitrouc83ea132010-05-09 14:46:46 +000054 return PyBool_FromLong((long)i);
Guido van Rossum1984f1e1992-08-04 12:41:02 +000055}
56
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +000057PyDoc_STRVAR(acquire_doc,
Guido van Rossum8fdc75b2002-04-07 06:32:21 +000058"acquire([wait]) -> None or bool\n\
Guido van Rossumf6694362006-03-10 02:28:35 +000059(acquire_lock() is an obsolete synonym)\n\
Guido van Rossum75e9fc31998-06-27 18:21:06 +000060\n\
61Lock the lock. Without argument, this blocks if the lock is already\n\
62locked (even by the same thread), waiting for another thread to release\n\
Guido van Rossum8fdc75b2002-04-07 06:32:21 +000063the lock, and return None once the lock is acquired.\n\
64With an argument, this will only block if the argument is true,\n\
Guido van Rossum75e9fc31998-06-27 18:21:06 +000065and the return value reflects whether the lock is acquired.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +000066The blocking operation is not interruptible.");
Guido van Rossum75e9fc31998-06-27 18:21:06 +000067
Barry Warsawd0c10421996-12-17 00:05:22 +000068static PyObject *
Neal Norwitz3a6f9782002-03-25 20:46:46 +000069lock_PyThread_release_lock(lockobject *self)
Guido van Rossum1984f1e1992-08-04 12:41:02 +000070{
Antoine Pitrouc83ea132010-05-09 14:46:46 +000071 /* Sanity check: the lock must be locked */
72 if (PyThread_acquire_lock(self->lock_lock, 0)) {
73 PyThread_release_lock(self->lock_lock);
74 PyErr_SetString(ThreadError, "release unlocked lock");
75 return NULL;
76 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +000077
Antoine Pitrouc83ea132010-05-09 14:46:46 +000078 PyThread_release_lock(self->lock_lock);
79 Py_INCREF(Py_None);
80 return Py_None;
Guido van Rossum1984f1e1992-08-04 12:41:02 +000081}
82
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +000083PyDoc_STRVAR(release_doc,
Guido van Rossum75e9fc31998-06-27 18:21:06 +000084"release()\n\
Guido van Rossumf6694362006-03-10 02:28:35 +000085(release_lock() is an obsolete synonym)\n\
Guido van Rossum75e9fc31998-06-27 18:21:06 +000086\n\
87Release the lock, allowing another thread that is blocked waiting for\n\
88the lock to acquire the lock. The lock must be in the locked state,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +000089but it needn't be locked by the same thread that unlocks it.");
Guido van Rossum75e9fc31998-06-27 18:21:06 +000090
Barry Warsawd0c10421996-12-17 00:05:22 +000091static PyObject *
Neal Norwitz3a6f9782002-03-25 20:46:46 +000092lock_locked_lock(lockobject *self)
Guido van Rossum1984f1e1992-08-04 12:41:02 +000093{
Antoine Pitrouc83ea132010-05-09 14:46:46 +000094 if (PyThread_acquire_lock(self->lock_lock, 0)) {
95 PyThread_release_lock(self->lock_lock);
96 return PyBool_FromLong(0L);
97 }
98 return PyBool_FromLong(1L);
Guido van Rossum1984f1e1992-08-04 12:41:02 +000099}
100
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000101PyDoc_STRVAR(locked_doc,
Guido van Rossum8fdc75b2002-04-07 06:32:21 +0000102"locked() -> bool\n\
Guido van Rossum75e9fc31998-06-27 18:21:06 +0000103(locked_lock() is an obsolete synonym)\n\
104\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000105Return whether the lock is in the locked state.");
Guido van Rossum75e9fc31998-06-27 18:21:06 +0000106
Barry Warsawd0c10421996-12-17 00:05:22 +0000107static PyMethodDef lock_methods[] = {
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000108 {"acquire_lock", (PyCFunction)lock_PyThread_acquire_lock,
109 METH_VARARGS, acquire_doc},
110 {"acquire", (PyCFunction)lock_PyThread_acquire_lock,
111 METH_VARARGS, acquire_doc},
112 {"release_lock", (PyCFunction)lock_PyThread_release_lock,
113 METH_NOARGS, release_doc},
114 {"release", (PyCFunction)lock_PyThread_release_lock,
115 METH_NOARGS, release_doc},
116 {"locked_lock", (PyCFunction)lock_locked_lock,
117 METH_NOARGS, locked_doc},
118 {"locked", (PyCFunction)lock_locked_lock,
119 METH_NOARGS, locked_doc},
120 {"__enter__", (PyCFunction)lock_PyThread_acquire_lock,
121 METH_VARARGS, acquire_doc},
122 {"__exit__", (PyCFunction)lock_PyThread_release_lock,
123 METH_VARARGS, release_doc},
124 {NULL} /* sentinel */
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000125};
126
Barry Warsawd0c10421996-12-17 00:05:22 +0000127static PyTypeObject Locktype = {
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000128 PyVarObject_HEAD_INIT(&PyType_Type, 0)
129 "thread.lock", /*tp_name*/
130 sizeof(lockobject), /*tp_size*/
131 0, /*tp_itemsize*/
132 /* methods */
133 (destructor)lock_dealloc, /*tp_dealloc*/
134 0, /*tp_print*/
135 0, /*tp_getattr*/
136 0, /*tp_setattr*/
137 0, /*tp_compare*/
138 0, /*tp_repr*/
139 0, /* tp_as_number */
140 0, /* tp_as_sequence */
141 0, /* tp_as_mapping */
142 0, /* tp_hash */
143 0, /* tp_call */
144 0, /* tp_str */
145 0, /* tp_getattro */
146 0, /* tp_setattro */
147 0, /* tp_as_buffer */
148 Py_TPFLAGS_HAVE_WEAKREFS, /* tp_flags */
149 0, /* tp_doc */
150 0, /* tp_traverse */
151 0, /* tp_clear */
152 0, /* tp_richcompare */
153 offsetof(lockobject, in_weakreflist), /* tp_weaklistoffset */
154 0, /* tp_iter */
155 0, /* tp_iternext */
156 lock_methods, /* tp_methods */
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000157};
158
Anthony Baxter5576b542006-04-12 04:08:46 +0000159static lockobject *
160newlockobject(void)
161{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000162 lockobject *self;
163 self = PyObject_New(lockobject, &Locktype);
164 if (self == NULL)
165 return NULL;
166 self->lock_lock = PyThread_allocate_lock();
167 self->in_weakreflist = NULL;
168 if (self->lock_lock == NULL) {
169 Py_DECREF(self);
170 PyErr_SetString(ThreadError, "can't allocate lock");
171 return NULL;
172 }
173 return self;
Anthony Baxter5576b542006-04-12 04:08:46 +0000174}
175
Jim Fultond15dc062004-07-14 19:11:50 +0000176/* Thread-local objects */
177
178#include "structmember.h"
179
Antoine Pitrou99009162010-08-09 22:51:24 +0000180/* Quick overview:
181
182 We need to be able to reclaim reference cycles as soon as possible
183 (both when a thread is being terminated, or a thread-local object
184 becomes unreachable from user data). Constraints:
185 - it must not be possible for thread-state dicts to be involved in
186 reference cycles (otherwise the cyclic GC will refuse to consider
187 objects referenced from a reachable thread-state dict, even though
188 local_dealloc would clear them)
189 - the death of a thread-state dict must still imply destruction of the
190 corresponding local dicts in all thread-local objects.
191
192 Our implementation uses small "localdummy" objects in order to break
193 the reference chain. These trivial objects are hashable (using the
194 default scheme of identity hashing) and weakrefable.
195 Each thread-state holds a separate localdummy for each local object
196 (as a /strong reference/),
197 and each thread-local object holds a dict mapping /weak references/
198 of localdummies to local dicts.
199
200 Therefore:
201 - only the thread-state dict holds a strong reference to the dummies
202 - only the thread-local object holds a strong reference to the local dicts
203 - only outside objects (application- or library-level) hold strong
204 references to the thread-local objects
205 - as soon as a thread-state dict is destroyed, the weakref callbacks of all
206 dummies attached to that thread are called, and destroy the corresponding
207 local dicts from thread-local objects
208 - as soon as a thread-local object is destroyed, its local dicts are
209 destroyed and its dummies are manually removed from all thread states
210 - the GC can do its work correctly when a thread-local object is dangling,
211 without any interference from the thread-state dicts
212
213 As an additional optimization, each localdummy holds a borrowed reference
214 to the corresponding localdict. This borrowed reference is only used
215 by the thread-local object which has created the localdummy, which should
216 guarantee that the localdict still exists when accessed.
217*/
218
219typedef struct {
220 PyObject_HEAD
221 PyObject *localdict; /* Borrowed reference! */
222 PyObject *weakreflist; /* List of weak references to self */
223} localdummyobject;
224
225static void
226localdummy_dealloc(localdummyobject *self)
227{
228 if (self->weakreflist != NULL)
229 PyObject_ClearWeakRefs((PyObject *) self);
230 Py_TYPE(self)->tp_free((PyObject*)self);
231}
232
233static PyTypeObject localdummytype = {
234 PyVarObject_HEAD_INIT(NULL, 0)
235 /* tp_name */ "_thread._localdummy",
236 /* tp_basicsize */ sizeof(localdummyobject),
237 /* tp_itemsize */ 0,
238 /* tp_dealloc */ (destructor)localdummy_dealloc,
239 /* tp_print */ 0,
240 /* tp_getattr */ 0,
241 /* tp_setattr */ 0,
242 /* tp_reserved */ 0,
243 /* tp_repr */ 0,
244 /* tp_as_number */ 0,
245 /* tp_as_sequence */ 0,
246 /* tp_as_mapping */ 0,
247 /* tp_hash */ 0,
248 /* tp_call */ 0,
249 /* tp_str */ 0,
250 /* tp_getattro */ 0,
251 /* tp_setattro */ 0,
252 /* tp_as_buffer */ 0,
253 /* tp_flags */ Py_TPFLAGS_DEFAULT,
254 /* tp_doc */ "Thread-local dummy",
255 /* tp_traverse */ 0,
256 /* tp_clear */ 0,
257 /* tp_richcompare */ 0,
258 /* tp_weaklistoffset */ offsetof(localdummyobject, weakreflist)
259};
260
261
Jim Fultond15dc062004-07-14 19:11:50 +0000262typedef struct {
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000263 PyObject_HEAD
264 PyObject *key;
265 PyObject *args;
266 PyObject *kw;
Antoine Pitrou99009162010-08-09 22:51:24 +0000267 /* The current thread's local dict (necessary for tp_dictoffset) */
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000268 PyObject *dict;
Antoine Pitrou99009162010-08-09 22:51:24 +0000269 PyObject *weakreflist; /* List of weak references to self */
270 /* A {localdummy weakref -> localdict} dict */
271 PyObject *dummies;
272 /* The callback for weakrefs to localdummies */
273 PyObject *wr_callback;
Jim Fultond15dc062004-07-14 19:11:50 +0000274} localobject;
275
Antoine Pitrou99009162010-08-09 22:51:24 +0000276/* Forward declaration */
277static PyObject *_ldict(localobject *self);
278static PyObject *_localdummy_destroyed(PyObject *meth_self, PyObject *dummyweakref);
279
280/* Create and register the dummy for the current thread, as well as the
281 corresponding local dict */
282static int
283_local_create_dummy(localobject *self)
284{
285 PyObject *tdict, *ldict = NULL, *wr = NULL;
286 localdummyobject *dummy = NULL;
287 int r;
288
289 tdict = PyThreadState_GetDict();
290 if (tdict == NULL) {
291 PyErr_SetString(PyExc_SystemError,
292 "Couldn't get thread-state dictionary");
293 goto err;
294 }
295
296 ldict = PyDict_New();
297 if (ldict == NULL)
298 goto err;
299 dummy = (localdummyobject *) localdummytype.tp_alloc(&localdummytype, 0);
300 if (dummy == NULL)
301 goto err;
302 dummy->localdict = ldict;
303 wr = PyWeakref_NewRef((PyObject *) dummy, self->wr_callback);
304 if (wr == NULL)
305 goto err;
306
307 /* As a side-effect, this will cache the weakref's hash before the
308 dummy gets deleted */
309 r = PyDict_SetItem(self->dummies, wr, ldict);
310 if (r < 0)
311 goto err;
312 Py_CLEAR(wr);
313 r = PyDict_SetItem(tdict, self->key, (PyObject *) dummy);
314 if (r < 0)
315 goto err;
316 Py_CLEAR(dummy);
317
318 Py_CLEAR(self->dict);
319 self->dict = ldict;
320 return 0;
321
322err:
323 Py_XDECREF(ldict);
324 Py_XDECREF(wr);
325 Py_XDECREF(dummy);
326 return -1;
327}
328
Jim Fultond15dc062004-07-14 19:11:50 +0000329static PyObject *
330local_new(PyTypeObject *type, PyObject *args, PyObject *kw)
331{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000332 localobject *self;
Antoine Pitrou99009162010-08-09 22:51:24 +0000333 PyObject *wr;
334 static PyMethodDef wr_callback_def = {
335 "_localdummy_destroyed", (PyCFunction) _localdummy_destroyed, METH_O
336 };
Jim Fultond15dc062004-07-14 19:11:50 +0000337
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000338 if (type->tp_init == PyBaseObject_Type.tp_init
339 && ((args && PyObject_IsTrue(args))
340 || (kw && PyObject_IsTrue(kw)))) {
341 PyErr_SetString(PyExc_TypeError,
342 "Initialization arguments are not supported");
343 return NULL;
344 }
Jim Fultond15dc062004-07-14 19:11:50 +0000345
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000346 self = (localobject *)type->tp_alloc(type, 0);
347 if (self == NULL)
348 return NULL;
Jim Fultond15dc062004-07-14 19:11:50 +0000349
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000350 Py_XINCREF(args);
351 self->args = args;
352 Py_XINCREF(kw);
353 self->kw = kw;
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000354 self->key = PyString_FromFormat("thread.local.%p", self);
355 if (self->key == NULL)
356 goto err;
Jim Fultond15dc062004-07-14 19:11:50 +0000357
Antoine Pitrou99009162010-08-09 22:51:24 +0000358 self->dummies = PyDict_New();
359 if (self->dummies == NULL)
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000360 goto err;
Jim Fultond15dc062004-07-14 19:11:50 +0000361
Antoine Pitrou99009162010-08-09 22:51:24 +0000362 /* We use a weak reference to self in the callback closure
363 in order to avoid spurious reference cycles */
364 wr = PyWeakref_NewRef((PyObject *) self, NULL);
365 if (wr == NULL)
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000366 goto err;
Antoine Pitrou99009162010-08-09 22:51:24 +0000367 self->wr_callback = PyCFunction_New(&wr_callback_def, wr);
368 Py_DECREF(wr);
369 if (self->wr_callback == NULL)
370 goto err;
Jim Fultond15dc062004-07-14 19:11:50 +0000371
Antoine Pitrou99009162010-08-09 22:51:24 +0000372 if (_local_create_dummy(self) < 0)
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000373 goto err;
Jim Fultond15dc062004-07-14 19:11:50 +0000374
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000375 return (PyObject *)self;
Michael W. Hudson2368b3c2005-06-15 12:48:40 +0000376
377 err:
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000378 Py_DECREF(self);
379 return NULL;
Jim Fultond15dc062004-07-14 19:11:50 +0000380}
381
382static int
383local_traverse(localobject *self, visitproc visit, void *arg)
384{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000385 Py_VISIT(self->args);
386 Py_VISIT(self->kw);
Antoine Pitrou99009162010-08-09 22:51:24 +0000387 Py_VISIT(self->dummies);
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000388 Py_VISIT(self->dict);
389 return 0;
Jim Fultond15dc062004-07-14 19:11:50 +0000390}
391
392static int
393local_clear(localobject *self)
394{
Antoine Pitrou99009162010-08-09 22:51:24 +0000395 PyThreadState *tstate;
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000396 Py_CLEAR(self->args);
397 Py_CLEAR(self->kw);
Antoine Pitrou99009162010-08-09 22:51:24 +0000398 Py_CLEAR(self->dummies);
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000399 Py_CLEAR(self->dict);
Antoine Pitrou99009162010-08-09 22:51:24 +0000400 Py_CLEAR(self->wr_callback);
401 /* Remove all strong references to dummies from the thread states */
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000402 if (self->key
403 && (tstate = PyThreadState_Get())
404 && tstate->interp) {
405 for(tstate = PyInterpreterState_ThreadHead(tstate->interp);
406 tstate;
407 tstate = PyThreadState_Next(tstate))
408 if (tstate->dict &&
409 PyDict_GetItem(tstate->dict, self->key))
410 PyDict_DelItem(tstate->dict, self->key);
411 }
Antoine Pitrou99009162010-08-09 22:51:24 +0000412 return 0;
413}
Jim Fultond15dc062004-07-14 19:11:50 +0000414
Antoine Pitrou99009162010-08-09 22:51:24 +0000415static void
416local_dealloc(localobject *self)
417{
418 /* Weakrefs must be invalidated right now, otherwise they can be used
419 from code called below, which is very dangerous since Py_REFCNT(self) == 0 */
420 if (self->weakreflist != NULL)
421 PyObject_ClearWeakRefs((PyObject *) self);
422
423 PyObject_GC_UnTrack(self);
424
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000425 local_clear(self);
Antoine Pitrou99009162010-08-09 22:51:24 +0000426 Py_XDECREF(self->key);
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000427 Py_TYPE(self)->tp_free((PyObject*)self);
Jim Fultond15dc062004-07-14 19:11:50 +0000428}
429
Antoine Pitrou99009162010-08-09 22:51:24 +0000430/* Returns a borrowed reference to the local dict, creating it if necessary */
Jim Fultond15dc062004-07-14 19:11:50 +0000431static PyObject *
432_ldict(localobject *self)
433{
Antoine Pitrou99009162010-08-09 22:51:24 +0000434 PyObject *tdict, *ldict, *dummy;
Jim Fultond15dc062004-07-14 19:11:50 +0000435
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000436 tdict = PyThreadState_GetDict();
437 if (tdict == NULL) {
438 PyErr_SetString(PyExc_SystemError,
439 "Couldn't get thread-state dictionary");
440 return NULL;
441 }
Jim Fultond15dc062004-07-14 19:11:50 +0000442
Antoine Pitrou99009162010-08-09 22:51:24 +0000443 dummy = PyDict_GetItem(tdict, self->key);
444 if (dummy == NULL) {
445 if (_local_create_dummy(self) < 0)
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000446 return NULL;
Antoine Pitrou99009162010-08-09 22:51:24 +0000447 ldict = self->dict;
Jim Fultond15dc062004-07-14 19:11:50 +0000448
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000449 if (Py_TYPE(self)->tp_init != PyBaseObject_Type.tp_init &&
450 Py_TYPE(self)->tp_init((PyObject*)self,
451 self->args, self->kw) < 0) {
452 /* we need to get rid of ldict from thread so
453 we create a new one the next time we do an attr
454 acces */
455 PyDict_DelItem(tdict, self->key);
456 return NULL;
457 }
Antoine Pitrou99009162010-08-09 22:51:24 +0000458 }
459 else {
460 assert(Py_TYPE(dummy) == &localdummytype);
461 ldict = ((localdummyobject *) dummy)->localdict;
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000462 }
Jim Fultond15dc062004-07-14 19:11:50 +0000463
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000464 /* The call to tp_init above may have caused another thread to run.
465 Install our ldict again. */
466 if (self->dict != ldict) {
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000467 Py_INCREF(ldict);
Antoine Pitrou99009162010-08-09 22:51:24 +0000468 Py_CLEAR(self->dict);
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000469 self->dict = ldict;
470 }
471
472 return ldict;
Jim Fultond15dc062004-07-14 19:11:50 +0000473}
474
Jim Fultond15dc062004-07-14 19:11:50 +0000475static int
476local_setattro(localobject *self, PyObject *name, PyObject *v)
477{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000478 PyObject *ldict;
Jim Fultond15dc062004-07-14 19:11:50 +0000479
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000480 ldict = _ldict(self);
481 if (ldict == NULL)
482 return -1;
483
484 return PyObject_GenericSetAttr((PyObject *)self, name, v);
Jim Fultond15dc062004-07-14 19:11:50 +0000485}
486
487static PyObject *
488local_getdict(localobject *self, void *closure)
489{
Antoine Pitrou99009162010-08-09 22:51:24 +0000490 PyObject *ldict;
491 ldict = _ldict(self);
492 Py_XINCREF(ldict);
493 return ldict;
Jim Fultond15dc062004-07-14 19:11:50 +0000494}
495
496static PyGetSetDef local_getset[] = {
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000497 {"__dict__", (getter)local_getdict, (setter)NULL,
498 "Local-data dictionary", NULL},
499 {NULL} /* Sentinel */
Jim Fultond15dc062004-07-14 19:11:50 +0000500};
501
Anthony Baxter5576b542006-04-12 04:08:46 +0000502static PyObject *local_getattro(localobject *, PyObject *);
503
Jim Fultond15dc062004-07-14 19:11:50 +0000504static PyTypeObject localtype = {
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000505 PyVarObject_HEAD_INIT(NULL, 0)
506 /* tp_name */ "thread._local",
507 /* tp_basicsize */ sizeof(localobject),
508 /* tp_itemsize */ 0,
509 /* tp_dealloc */ (destructor)local_dealloc,
510 /* tp_print */ 0,
511 /* tp_getattr */ 0,
512 /* tp_setattr */ 0,
513 /* tp_compare */ 0,
514 /* tp_repr */ 0,
515 /* tp_as_number */ 0,
516 /* tp_as_sequence */ 0,
517 /* tp_as_mapping */ 0,
518 /* tp_hash */ 0,
519 /* tp_call */ 0,
520 /* tp_str */ 0,
521 /* tp_getattro */ (getattrofunc)local_getattro,
522 /* tp_setattro */ (setattrofunc)local_setattro,
523 /* tp_as_buffer */ 0,
Antoine Pitrou99009162010-08-09 22:51:24 +0000524 /* tp_flags */ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE
525 | Py_TPFLAGS_HAVE_GC,
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000526 /* tp_doc */ "Thread-local data",
527 /* tp_traverse */ (traverseproc)local_traverse,
528 /* tp_clear */ (inquiry)local_clear,
529 /* tp_richcompare */ 0,
Antoine Pitrou99009162010-08-09 22:51:24 +0000530 /* tp_weaklistoffset */ offsetof(localobject, weakreflist),
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000531 /* tp_iter */ 0,
532 /* tp_iternext */ 0,
533 /* tp_methods */ 0,
534 /* tp_members */ 0,
535 /* tp_getset */ local_getset,
536 /* tp_base */ 0,
537 /* tp_dict */ 0, /* internal use */
538 /* tp_descr_get */ 0,
539 /* tp_descr_set */ 0,
540 /* tp_dictoffset */ offsetof(localobject, dict),
541 /* tp_init */ 0,
542 /* tp_alloc */ 0,
543 /* tp_new */ local_new,
544 /* tp_free */ 0, /* Low-level free-mem routine */
545 /* tp_is_gc */ 0, /* For PyObject_IS_GC */
Jim Fultond15dc062004-07-14 19:11:50 +0000546};
547
Anthony Baxter5576b542006-04-12 04:08:46 +0000548static PyObject *
549local_getattro(localobject *self, PyObject *name)
550{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000551 PyObject *ldict, *value;
Anthony Baxter5576b542006-04-12 04:08:46 +0000552
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000553 ldict = _ldict(self);
554 if (ldict == NULL)
555 return NULL;
Anthony Baxter5576b542006-04-12 04:08:46 +0000556
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000557 if (Py_TYPE(self) != &localtype)
558 /* use generic lookup for subtypes */
559 return PyObject_GenericGetAttr((PyObject *)self, name);
Anthony Baxter5576b542006-04-12 04:08:46 +0000560
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000561 /* Optimization: just look in dict ourselves */
562 value = PyDict_GetItem(ldict, name);
563 if (value == NULL)
564 /* Fall back on generic to get __class__ and __dict__ */
565 return PyObject_GenericGetAttr((PyObject *)self, name);
Anthony Baxter5576b542006-04-12 04:08:46 +0000566
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000567 Py_INCREF(value);
568 return value;
Anthony Baxter5576b542006-04-12 04:08:46 +0000569}
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000570
Antoine Pitrou99009162010-08-09 22:51:24 +0000571/* Called when a dummy is destroyed. */
572static PyObject *
573_localdummy_destroyed(PyObject *localweakref, PyObject *dummyweakref)
574{
575 PyObject *obj;
576 localobject *self;
577 assert(PyWeakref_CheckRef(localweakref));
578 obj = PyWeakref_GET_OBJECT(localweakref);
579 if (obj == Py_None)
580 Py_RETURN_NONE;
581 Py_INCREF(obj);
582 assert(PyObject_TypeCheck(obj, &localtype));
583 /* If the thread-local object is still alive and not being cleared,
584 remove the corresponding local dict */
585 self = (localobject *) obj;
586 if (self->dummies != NULL) {
587 PyObject *ldict;
588 ldict = PyDict_GetItem(self->dummies, dummyweakref);
589 if (ldict != NULL) {
590 if (ldict == self->dict)
591 Py_CLEAR(self->dict);
592 PyDict_DelItem(self->dummies, dummyweakref);
593 }
594 if (PyErr_Occurred())
595 PyErr_WriteUnraisable(obj);
596 }
597 Py_DECREF(obj);
598 Py_RETURN_NONE;
599}
600
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000601/* Module functions */
602
Guido van Rossuma027efa1997-05-05 20:56:21 +0000603struct bootstate {
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000604 PyInterpreterState *interp;
605 PyObject *func;
606 PyObject *args;
607 PyObject *keyw;
608 PyThreadState *tstate;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000609};
610
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000611static void
Peter Schneider-Kamp3707efe2000-07-10 10:03:58 +0000612t_bootstrap(void *boot_raw)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000613{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000614 struct bootstate *boot = (struct bootstate *) boot_raw;
615 PyThreadState *tstate;
616 PyObject *res;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000617
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000618 tstate = boot->tstate;
619 tstate->thread_id = PyThread_get_thread_ident();
620 _PyThreadState_Init(tstate);
621 PyEval_AcquireThread(tstate);
622 nb_threads++;
623 res = PyEval_CallObjectWithKeywords(
624 boot->func, boot->args, boot->keyw);
625 if (res == NULL) {
626 if (PyErr_ExceptionMatches(PyExc_SystemExit))
627 PyErr_Clear();
628 else {
629 PyObject *file;
630 PySys_WriteStderr(
631 "Unhandled exception in thread started by ");
632 file = PySys_GetObject("stderr");
633 if (file)
634 PyFile_WriteObject(boot->func, file, 0);
635 else
636 PyObject_Print(boot->func, stderr, 0);
637 PySys_WriteStderr("\n");
638 PyErr_PrintEx(0);
639 }
640 }
641 else
642 Py_DECREF(res);
643 Py_DECREF(boot->func);
644 Py_DECREF(boot->args);
645 Py_XDECREF(boot->keyw);
646 PyMem_DEL(boot_raw);
647 nb_threads--;
648 PyThreadState_Clear(tstate);
649 PyThreadState_DeleteCurrent();
650 PyThread_exit_thread();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000651}
652
Barry Warsawd0c10421996-12-17 00:05:22 +0000653static PyObject *
Peter Schneider-Kamp3707efe2000-07-10 10:03:58 +0000654thread_PyThread_start_new_thread(PyObject *self, PyObject *fargs)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000655{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000656 PyObject *func, *args, *keyw = NULL;
657 struct bootstate *boot;
658 long ident;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000659
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000660 if (!PyArg_UnpackTuple(fargs, "start_new_thread", 2, 3,
661 &func, &args, &keyw))
662 return NULL;
663 if (!PyCallable_Check(func)) {
664 PyErr_SetString(PyExc_TypeError,
665 "first arg must be callable");
666 return NULL;
667 }
668 if (!PyTuple_Check(args)) {
669 PyErr_SetString(PyExc_TypeError,
670 "2nd arg must be a tuple");
671 return NULL;
672 }
673 if (keyw != NULL && !PyDict_Check(keyw)) {
674 PyErr_SetString(PyExc_TypeError,
675 "optional 3rd arg must be a dictionary");
676 return NULL;
677 }
678 boot = PyMem_NEW(struct bootstate, 1);
679 if (boot == NULL)
680 return PyErr_NoMemory();
681 boot->interp = PyThreadState_GET()->interp;
682 boot->func = func;
683 boot->args = args;
684 boot->keyw = keyw;
685 boot->tstate = _PyThreadState_Prealloc(boot->interp);
686 if (boot->tstate == NULL) {
687 PyMem_DEL(boot);
688 return PyErr_NoMemory();
689 }
690 Py_INCREF(func);
691 Py_INCREF(args);
692 Py_XINCREF(keyw);
693 PyEval_InitThreads(); /* Start the interpreter's thread-awareness */
694 ident = PyThread_start_new_thread(t_bootstrap, (void*) boot);
695 if (ident == -1) {
696 PyErr_SetString(ThreadError, "can't start new thread");
697 Py_DECREF(func);
698 Py_DECREF(args);
699 Py_XDECREF(keyw);
700 PyThreadState_Clear(boot->tstate);
701 PyMem_DEL(boot);
702 return NULL;
703 }
704 return PyInt_FromLong(ident);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000705}
706
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000707PyDoc_STRVAR(start_new_doc,
Andrew M. Kuchling38300c62001-10-05 12:24:15 +0000708"start_new_thread(function, args[, kwargs])\n\
Guido van Rossum75e9fc31998-06-27 18:21:06 +0000709(start_new() is an obsolete synonym)\n\
710\n\
Guido van Rossum3c288632001-10-16 21:13:49 +0000711Start a new thread and return its identifier. The thread will call the\n\
712function with positional arguments from the tuple args and keyword arguments\n\
713taken from the optional dictionary kwargs. The thread exits when the\n\
714function returns; the return value is ignored. The thread will also exit\n\
715when the function raises an unhandled exception; a stack trace will be\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000716printed unless the exception is SystemExit.\n");
Guido van Rossum75e9fc31998-06-27 18:21:06 +0000717
Barry Warsawd0c10421996-12-17 00:05:22 +0000718static PyObject *
Neal Norwitz3a6f9782002-03-25 20:46:46 +0000719thread_PyThread_exit_thread(PyObject *self)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000720{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000721 PyErr_SetNone(PyExc_SystemExit);
722 return NULL;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000723}
724
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000725PyDoc_STRVAR(exit_doc,
Guido van Rossum75e9fc31998-06-27 18:21:06 +0000726"exit()\n\
Guido van Rossum65d5b571998-12-21 19:32:43 +0000727(PyThread_exit_thread() is an obsolete synonym)\n\
Guido van Rossum75e9fc31998-06-27 18:21:06 +0000728\n\
729This is synonymous to ``raise SystemExit''. It will cause the current\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000730thread to exit silently unless the exception is caught.");
Guido van Rossum75e9fc31998-06-27 18:21:06 +0000731
Kurt B. Kaisera11e8462003-06-13 21:59:45 +0000732static PyObject *
Kurt B. Kaisera1ad5f62003-06-16 18:51:28 +0000733thread_PyThread_interrupt_main(PyObject * self)
Kurt B. Kaisera11e8462003-06-13 21:59:45 +0000734{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000735 PyErr_SetInterrupt();
736 Py_INCREF(Py_None);
737 return Py_None;
Kurt B. Kaisera11e8462003-06-13 21:59:45 +0000738}
739
740PyDoc_STRVAR(interrupt_doc,
741"interrupt_main()\n\
742\n\
743Raise a KeyboardInterrupt in the main thread.\n\
Kurt B. Kaisera1ad5f62003-06-16 18:51:28 +0000744A subthread can use this function to interrupt the main thread."
Kurt B. Kaisera11e8462003-06-13 21:59:45 +0000745);
746
Anthony Baxter5576b542006-04-12 04:08:46 +0000747static lockobject *newlockobject(void);
748
Barry Warsawd0c10421996-12-17 00:05:22 +0000749static PyObject *
Neal Norwitz3a6f9782002-03-25 20:46:46 +0000750thread_PyThread_allocate_lock(PyObject *self)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000751{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000752 return (PyObject *) newlockobject();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000753}
754
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000755PyDoc_STRVAR(allocate_doc,
Guido van Rossum75e9fc31998-06-27 18:21:06 +0000756"allocate_lock() -> lock object\n\
757(allocate() is an obsolete synonym)\n\
758\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000759Create a new lock object. See LockType.__doc__ for information about locks.");
Guido van Rossum75e9fc31998-06-27 18:21:06 +0000760
Barry Warsawd0c10421996-12-17 00:05:22 +0000761static PyObject *
Neal Norwitz3a6f9782002-03-25 20:46:46 +0000762thread_get_ident(PyObject *self)
Guido van Rossumb6775db1994-08-01 11:34:53 +0000763{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000764 long ident;
765 ident = PyThread_get_thread_ident();
766 if (ident == -1) {
767 PyErr_SetString(ThreadError, "no current thread ident");
768 return NULL;
769 }
770 return PyInt_FromLong(ident);
Guido van Rossumb6775db1994-08-01 11:34:53 +0000771}
772
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000773PyDoc_STRVAR(get_ident_doc,
Guido van Rossum75e9fc31998-06-27 18:21:06 +0000774"get_ident() -> integer\n\
775\n\
776Return a non-zero integer that uniquely identifies the current thread\n\
777amongst other threads that exist simultaneously.\n\
778This may be used to identify per-thread resources.\n\
779Even though on some platforms threads identities may appear to be\n\
780allocated consecutive numbers starting at 1, this behavior should not\n\
781be relied upon, and the number should be seen purely as a magic cookie.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000782A thread's identity may be reused for another thread after it exits.");
Guido van Rossum75e9fc31998-06-27 18:21:06 +0000783
Andrew MacIntyre92913322006-06-13 15:04:24 +0000784static PyObject *
Antoine Pitrou59c44f32009-10-30 17:07:08 +0000785thread__count(PyObject *self)
786{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000787 return PyInt_FromLong(nb_threads);
Antoine Pitrou59c44f32009-10-30 17:07:08 +0000788}
789
790PyDoc_STRVAR(_count_doc,
791"_count() -> integer\n\
792\n\
Antoine Pitrou2c970a22009-10-30 22:19:09 +0000793\
794Return the number of currently running Python threads, excluding \n\
795the main thread. The returned number comprises all threads created\n\
796through `start_new_thread()` as well as `threading.Thread`, and not\n\
797yet finished.\n\
798\n\
799This function is meant for internal and specialized purposes only.\n\
800In most applications `threading.enumerate()` should be used instead.");
Antoine Pitrou59c44f32009-10-30 17:07:08 +0000801
802static PyObject *
Andrew MacIntyre92913322006-06-13 15:04:24 +0000803thread_stack_size(PyObject *self, PyObject *args)
804{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000805 size_t old_size;
806 Py_ssize_t new_size = 0;
807 int rc;
Andrew MacIntyre92913322006-06-13 15:04:24 +0000808
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000809 if (!PyArg_ParseTuple(args, "|n:stack_size", &new_size))
810 return NULL;
Andrew MacIntyre92913322006-06-13 15:04:24 +0000811
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000812 if (new_size < 0) {
813 PyErr_SetString(PyExc_ValueError,
814 "size must be 0 or a positive value");
815 return NULL;
816 }
Andrew MacIntyre92913322006-06-13 15:04:24 +0000817
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000818 old_size = PyThread_get_stacksize();
Andrew MacIntyre92913322006-06-13 15:04:24 +0000819
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000820 rc = PyThread_set_stacksize((size_t) new_size);
821 if (rc == -1) {
822 PyErr_Format(PyExc_ValueError,
823 "size not valid: %zd bytes",
824 new_size);
825 return NULL;
826 }
827 if (rc == -2) {
828 PyErr_SetString(ThreadError,
829 "setting stack size not supported");
830 return NULL;
831 }
Andrew MacIntyre92913322006-06-13 15:04:24 +0000832
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000833 return PyInt_FromSsize_t((Py_ssize_t) old_size);
Andrew MacIntyre92913322006-06-13 15:04:24 +0000834}
835
836PyDoc_STRVAR(stack_size_doc,
837"stack_size([size]) -> size\n\
838\n\
839Return the thread stack size used when creating new threads. The\n\
840optional size argument specifies the stack size (in bytes) to be used\n\
841for subsequently created threads, and must be 0 (use platform or\n\
842configured default) or a positive integer value of at least 32,768 (32k).\n\
843If changing the thread stack size is unsupported, a ThreadError\n\
844exception is raised. If the specified size is invalid, a ValueError\n\
845exception is raised, and the stack size is unmodified. 32k bytes\n\
846 currently the minimum supported stack size value to guarantee\n\
847sufficient stack space for the interpreter itself.\n\
848\n\
849Note that some platforms may have particular restrictions on values for\n\
850the stack size, such as requiring a minimum stack size larger than 32kB or\n\
851requiring allocation in multiples of the system memory page size\n\
852- platform documentation should be referred to for more information\n\
853(4kB pages are common; using multiples of 4096 for the stack size is\n\
854the suggested approach in the absence of more specific information).");
855
Barry Warsawd0c10421996-12-17 00:05:22 +0000856static PyMethodDef thread_methods[] = {
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000857 {"start_new_thread", (PyCFunction)thread_PyThread_start_new_thread,
858 METH_VARARGS,
859 start_new_doc},
860 {"start_new", (PyCFunction)thread_PyThread_start_new_thread,
861 METH_VARARGS,
862 start_new_doc},
863 {"allocate_lock", (PyCFunction)thread_PyThread_allocate_lock,
864 METH_NOARGS, allocate_doc},
865 {"allocate", (PyCFunction)thread_PyThread_allocate_lock,
866 METH_NOARGS, allocate_doc},
867 {"exit_thread", (PyCFunction)thread_PyThread_exit_thread,
868 METH_NOARGS, exit_doc},
869 {"exit", (PyCFunction)thread_PyThread_exit_thread,
870 METH_NOARGS, exit_doc},
871 {"interrupt_main", (PyCFunction)thread_PyThread_interrupt_main,
872 METH_NOARGS, interrupt_doc},
873 {"get_ident", (PyCFunction)thread_get_ident,
874 METH_NOARGS, get_ident_doc},
875 {"_count", (PyCFunction)thread__count,
876 METH_NOARGS, _count_doc},
877 {"stack_size", (PyCFunction)thread_stack_size,
878 METH_VARARGS,
879 stack_size_doc},
880 {NULL, NULL} /* sentinel */
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000881};
882
883
884/* Initialization function */
885
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000886PyDoc_STRVAR(thread_doc,
Guido van Rossum75e9fc31998-06-27 18:21:06 +0000887"This module provides primitive operations to write multi-threaded programs.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000888The 'threading' module provides a more convenient interface.");
Guido van Rossum75e9fc31998-06-27 18:21:06 +0000889
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000890PyDoc_STRVAR(lock_doc,
Guido van Rossum75e9fc31998-06-27 18:21:06 +0000891"A lock object is a synchronization primitive. To create a lock,\n\
Guido van Rossum65d5b571998-12-21 19:32:43 +0000892call the PyThread_allocate_lock() function. Methods are:\n\
Guido van Rossum75e9fc31998-06-27 18:21:06 +0000893\n\
Guido van Rossum75e9fc31998-06-27 18:21:06 +0000894acquire() -- lock the lock, possibly blocking until it can be obtained\n\
895release() -- unlock of the lock\n\
896locked() -- test whether the lock is currently locked\n\
897\n\
898A lock is not owned by the thread that locked it; another thread may\n\
899unlock it. A thread attempting to lock a lock that it has already locked\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000900will block until another thread unlocks it. Deadlocks may ensue.");
Guido van Rossum75e9fc31998-06-27 18:21:06 +0000901
Mark Hammondfe51c6d2002-08-02 02:27:13 +0000902PyMODINIT_FUNC
Thomas Woutersf3f33dc2000-07-21 06:00:07 +0000903initthread(void)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000904{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000905 PyObject *m, *d;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000906
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000907 /* Initialize types: */
Antoine Pitrou99009162010-08-09 22:51:24 +0000908 if (PyType_Ready(&localdummytype) < 0)
909 return;
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000910 if (PyType_Ready(&localtype) < 0)
911 return;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000912
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000913 /* Create the module and add the functions */
914 m = Py_InitModule3("thread", thread_methods, thread_doc);
915 if (m == NULL)
916 return;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000917
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000918 /* Add a symbolic constant */
919 d = PyModule_GetDict(m);
920 ThreadError = PyErr_NewException("thread.error", NULL, NULL);
921 PyDict_SetItemString(d, "error", ThreadError);
922 Locktype.tp_doc = lock_doc;
923 if (PyType_Ready(&Locktype) < 0)
924 return;
925 Py_INCREF(&Locktype);
926 PyDict_SetItemString(d, "LockType", (PyObject *)&Locktype);
Jim Fultond15dc062004-07-14 19:11:50 +0000927
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000928 Py_INCREF(&localtype);
929 if (PyModule_AddObject(m, "_local", (PyObject *)&localtype) < 0)
930 return;
Antoine Pitrou59c44f32009-10-30 17:07:08 +0000931
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000932 nb_threads = 0;
933
934 /* Initialize the C thread library */
935 PyThread_init_thread();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000936}