blob: 48f1f36cdac8a116431f833e1e8cf49d216f075b [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"
Guido van Rossum1984f1e1992-08-04 12:41:02 +00006
Guido van Rossumb6775db1994-08-01 11:34:53 +00007#ifndef WITH_THREAD
Guido van Rossuma027efa1997-05-05 20:56:21 +00008#error "Error! The rest of Python is not compiled with thread support."
9#error "Rerun configure, adding a --with-thread option."
10#error "Then run `make clean' followed by `make'."
Guido van Rossumb6775db1994-08-01 11:34:53 +000011#endif
12
Guido van Rossum49b56061998-10-01 20:42:43 +000013#include "pythread.h"
Guido van Rossum1984f1e1992-08-04 12:41:02 +000014
Barry Warsawd0c10421996-12-17 00:05:22 +000015static PyObject *ThreadError;
Guido van Rossum1984f1e1992-08-04 12:41:02 +000016
17
18/* Lock objects */
19
20typedef struct {
Barry Warsawd0c10421996-12-17 00:05:22 +000021 PyObject_HEAD
Guido van Rossum65d5b571998-12-21 19:32:43 +000022 PyThread_type_lock lock_lock;
Guido van Rossum1984f1e1992-08-04 12:41:02 +000023} lockobject;
24
Barry Warsawd0c10421996-12-17 00:05:22 +000025staticforward PyTypeObject Locktype;
Guido van Rossum1984f1e1992-08-04 12:41:02 +000026
Guido van Rossum1984f1e1992-08-04 12:41:02 +000027static lockobject *
Thomas Woutersf3f33dc2000-07-21 06:00:07 +000028newlockobject(void)
Guido van Rossum1984f1e1992-08-04 12:41:02 +000029{
30 lockobject *self;
Guido van Rossumb18618d2000-05-03 23:44:39 +000031 self = PyObject_New(lockobject, &Locktype);
Guido van Rossum1984f1e1992-08-04 12:41:02 +000032 if (self == NULL)
33 return NULL;
Guido van Rossum65d5b571998-12-21 19:32:43 +000034 self->lock_lock = PyThread_allocate_lock();
Guido van Rossum1984f1e1992-08-04 12:41:02 +000035 if (self->lock_lock == NULL) {
Guido van Rossumb18618d2000-05-03 23:44:39 +000036 PyObject_Del(self);
Guido van Rossum1984f1e1992-08-04 12:41:02 +000037 self = NULL;
Barry Warsawd0c10421996-12-17 00:05:22 +000038 PyErr_SetString(ThreadError, "can't allocate lock");
Guido van Rossum1984f1e1992-08-04 12:41:02 +000039 }
40 return self;
41}
42
43static void
Peter Schneider-Kamp3707efe2000-07-10 10:03:58 +000044lock_dealloc(lockobject *self)
Guido van Rossum1984f1e1992-08-04 12:41:02 +000045{
46 /* Unlock the lock so it's safe to free it */
Guido van Rossum65d5b571998-12-21 19:32:43 +000047 PyThread_acquire_lock(self->lock_lock, 0);
48 PyThread_release_lock(self->lock_lock);
Guido van Rossum1984f1e1992-08-04 12:41:02 +000049
Guido van Rossum65d5b571998-12-21 19:32:43 +000050 PyThread_free_lock(self->lock_lock);
Guido van Rossumb18618d2000-05-03 23:44:39 +000051 PyObject_Del(self);
Guido van Rossum1984f1e1992-08-04 12:41:02 +000052}
53
Barry Warsawd0c10421996-12-17 00:05:22 +000054static PyObject *
Peter Schneider-Kamp3707efe2000-07-10 10:03:58 +000055lock_PyThread_acquire_lock(lockobject *self, PyObject *args)
Guido van Rossum1984f1e1992-08-04 12:41:02 +000056{
Guido van Rossum1984f1e1992-08-04 12:41:02 +000057 int i;
58
59 if (args != NULL) {
Barry Warsawd0c10421996-12-17 00:05:22 +000060 if (!PyArg_Parse(args, "i", &i))
Guido van Rossum1984f1e1992-08-04 12:41:02 +000061 return NULL;
62 }
63 else
64 i = 1;
65
Barry Warsawd0c10421996-12-17 00:05:22 +000066 Py_BEGIN_ALLOW_THREADS
Guido van Rossum65d5b571998-12-21 19:32:43 +000067 i = PyThread_acquire_lock(self->lock_lock, i);
Barry Warsawd0c10421996-12-17 00:05:22 +000068 Py_END_ALLOW_THREADS
Guido van Rossum1984f1e1992-08-04 12:41:02 +000069
70 if (args == NULL) {
Barry Warsawd0c10421996-12-17 00:05:22 +000071 Py_INCREF(Py_None);
72 return Py_None;
Guido van Rossum1984f1e1992-08-04 12:41:02 +000073 }
74 else
Barry Warsawd0c10421996-12-17 00:05:22 +000075 return PyInt_FromLong((long)i);
Guido van Rossum1984f1e1992-08-04 12:41:02 +000076}
77
Guido van Rossum75e9fc31998-06-27 18:21:06 +000078static char acquire_doc[] =
79"acquire([wait]) -> None or Boolean\n\
Guido van Rossum65d5b571998-12-21 19:32:43 +000080(PyThread_acquire_lock() is an obsolete synonym)\n\
Guido van Rossum75e9fc31998-06-27 18:21:06 +000081\n\
82Lock the lock. Without argument, this blocks if the lock is already\n\
83locked (even by the same thread), waiting for another thread to release\n\
84the lock, and return None when the lock is acquired.\n\
85With a Boolean argument, this will only block if the argument is true,\n\
86and the return value reflects whether the lock is acquired.\n\
87The blocking operation is not interruptible.";
88
Barry Warsawd0c10421996-12-17 00:05:22 +000089static PyObject *
Peter Schneider-Kamp3707efe2000-07-10 10:03:58 +000090lock_PyThread_release_lock(lockobject *self, PyObject *args)
Guido van Rossum1984f1e1992-08-04 12:41:02 +000091{
Barry Warsawd0c10421996-12-17 00:05:22 +000092 if (!PyArg_NoArgs(args))
Guido van Rossum1984f1e1992-08-04 12:41:02 +000093 return NULL;
94
95 /* Sanity check: the lock must be locked */
Guido van Rossum65d5b571998-12-21 19:32:43 +000096 if (PyThread_acquire_lock(self->lock_lock, 0)) {
97 PyThread_release_lock(self->lock_lock);
Barry Warsawd0c10421996-12-17 00:05:22 +000098 PyErr_SetString(ThreadError, "release unlocked lock");
Guido van Rossum1984f1e1992-08-04 12:41:02 +000099 return NULL;
100 }
101
Guido van Rossum65d5b571998-12-21 19:32:43 +0000102 PyThread_release_lock(self->lock_lock);
Barry Warsawd0c10421996-12-17 00:05:22 +0000103 Py_INCREF(Py_None);
104 return Py_None;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000105}
106
Guido van Rossum75e9fc31998-06-27 18:21:06 +0000107static char release_doc[] =
108"release()\n\
Guido van Rossum65d5b571998-12-21 19:32:43 +0000109(PyThread_release_lock() is an obsolete synonym)\n\
Guido van Rossum75e9fc31998-06-27 18:21:06 +0000110\n\
111Release the lock, allowing another thread that is blocked waiting for\n\
112the lock to acquire the lock. The lock must be in the locked state,\n\
113but it needn't be locked by the same thread that unlocks it.";
114
Barry Warsawd0c10421996-12-17 00:05:22 +0000115static PyObject *
Peter Schneider-Kamp3707efe2000-07-10 10:03:58 +0000116lock_locked_lock(lockobject *self, PyObject *args)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000117{
Barry Warsawd0c10421996-12-17 00:05:22 +0000118 if (!PyArg_NoArgs(args))
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000119 return NULL;
120
Guido van Rossum65d5b571998-12-21 19:32:43 +0000121 if (PyThread_acquire_lock(self->lock_lock, 0)) {
122 PyThread_release_lock(self->lock_lock);
Barry Warsawd0c10421996-12-17 00:05:22 +0000123 return PyInt_FromLong(0L);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000124 }
Barry Warsawd0c10421996-12-17 00:05:22 +0000125 return PyInt_FromLong(1L);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000126}
127
Guido van Rossum75e9fc31998-06-27 18:21:06 +0000128static char locked_doc[] =
129"locked() -> Boolean\n\
130(locked_lock() is an obsolete synonym)\n\
131\n\
132Return whether the lock is in the locked state.";
133
Barry Warsawd0c10421996-12-17 00:05:22 +0000134static PyMethodDef lock_methods[] = {
Andrew M. Kuchlinga1abb722000-08-03 02:34:44 +0000135 {"acquire_lock", (PyCFunction)lock_PyThread_acquire_lock,
136 METH_OLDARGS, acquire_doc},
137 {"acquire", (PyCFunction)lock_PyThread_acquire_lock,
138 METH_OLDARGS, acquire_doc},
139 {"release_lock", (PyCFunction)lock_PyThread_release_lock,
140 METH_OLDARGS, release_doc},
141 {"release", (PyCFunction)lock_PyThread_release_lock,
142 METH_OLDARGS, release_doc},
143 {"locked_lock", (PyCFunction)lock_locked_lock,
144 METH_OLDARGS, locked_doc},
145 {"locked", (PyCFunction)lock_locked_lock,
146 METH_OLDARGS, locked_doc},
Guido van Rossum75e9fc31998-06-27 18:21:06 +0000147 {NULL, NULL} /* sentinel */
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000148};
149
Barry Warsawd0c10421996-12-17 00:05:22 +0000150static PyObject *
Peter Schneider-Kamp3707efe2000-07-10 10:03:58 +0000151lock_getattr(lockobject *self, char *name)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000152{
Barry Warsawd0c10421996-12-17 00:05:22 +0000153 return Py_FindMethod(lock_methods, (PyObject *)self, name);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000154}
155
Barry Warsawd0c10421996-12-17 00:05:22 +0000156static PyTypeObject Locktype = {
157 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossumb6775db1994-08-01 11:34:53 +0000158 0, /*ob_size*/
159 "lock", /*tp_name*/
160 sizeof(lockobject), /*tp_size*/
161 0, /*tp_itemsize*/
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000162 /* methods */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000163 (destructor)lock_dealloc, /*tp_dealloc*/
164 0, /*tp_print*/
165 (getattrfunc)lock_getattr, /*tp_getattr*/
166 0, /*tp_setattr*/
167 0, /*tp_compare*/
168 0, /*tp_repr*/
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000169};
170
171
172/* Module functions */
173
Guido van Rossuma027efa1997-05-05 20:56:21 +0000174struct bootstate {
175 PyInterpreterState *interp;
176 PyObject *func;
177 PyObject *args;
178 PyObject *keyw;
179};
180
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000181static void
Peter Schneider-Kamp3707efe2000-07-10 10:03:58 +0000182t_bootstrap(void *boot_raw)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000183{
Guido van Rossuma027efa1997-05-05 20:56:21 +0000184 struct bootstate *boot = (struct bootstate *) boot_raw;
Guido van Rossum75aa0d61997-07-18 23:57:50 +0000185 PyThreadState *tstate;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000186 PyObject *res;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000187
Guido van Rossuma027efa1997-05-05 20:56:21 +0000188 tstate = PyThreadState_New(boot->interp);
Guido van Rossum75aa0d61997-07-18 23:57:50 +0000189 PyEval_AcquireThread(tstate);
Guido van Rossuma027efa1997-05-05 20:56:21 +0000190 res = PyEval_CallObjectWithKeywords(
191 boot->func, boot->args, boot->keyw);
192 Py_DECREF(boot->func);
193 Py_DECREF(boot->args);
194 Py_XDECREF(boot->keyw);
195 PyMem_DEL(boot_raw);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000196 if (res == NULL) {
Fred Drakebebc97f1998-05-28 04:35:12 +0000197 if (PyErr_ExceptionMatches(PyExc_SystemExit))
Barry Warsawd0c10421996-12-17 00:05:22 +0000198 PyErr_Clear();
Guido van Rossum385e7c61995-03-17 10:42:27 +0000199 else {
Fred Drake9c801ab2000-10-20 20:02:37 +0000200 PySys_WriteStderr("Unhandled exception in thread:\n");
Guido van Rossum40769dd1998-02-06 22:32:08 +0000201 PyErr_PrintEx(0);
Guido van Rossum385e7c61995-03-17 10:42:27 +0000202 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000203 }
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000204 else
Barry Warsawd0c10421996-12-17 00:05:22 +0000205 Py_DECREF(res);
Guido van Rossumb02158e1997-08-02 03:13:11 +0000206 PyThreadState_Clear(tstate);
Guido van Rossum2528b192001-01-23 01:47:18 +0000207 PyThreadState_DeleteCurrent();
Guido van Rossumbcc20741998-08-04 22:53:56 +0000208 PyThread_exit_thread();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000209}
210
Barry Warsawd0c10421996-12-17 00:05:22 +0000211static PyObject *
Peter Schneider-Kamp3707efe2000-07-10 10:03:58 +0000212thread_PyThread_start_new_thread(PyObject *self, PyObject *fargs)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000213{
Guido van Rossum38d45b72000-09-01 20:47:58 +0000214 PyObject *func, *args, *keyw = NULL;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000215 struct bootstate *boot;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000216
Guido van Rossum43713e52000-02-29 13:59:29 +0000217 if (!PyArg_ParseTuple(fargs, "OO|O:start_new_thread", &func, &args, &keyw))
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000218 return NULL;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000219 if (!PyCallable_Check(func)) {
220 PyErr_SetString(PyExc_TypeError,
221 "first arg must be callable");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000222 return NULL;
223 }
Guido van Rossuma027efa1997-05-05 20:56:21 +0000224 if (!PyTuple_Check(args)) {
225 PyErr_SetString(PyExc_TypeError,
Guido van Rossum38d45b72000-09-01 20:47:58 +0000226 "2nd arg must be a tuple");
Guido van Rossuma027efa1997-05-05 20:56:21 +0000227 return NULL;
228 }
229 if (keyw != NULL && !PyDict_Check(keyw)) {
230 PyErr_SetString(PyExc_TypeError,
231 "optional 3rd arg must be a dictionary");
232 return NULL;
233 }
234 boot = PyMem_NEW(struct bootstate, 1);
235 if (boot == NULL)
236 return PyErr_NoMemory();
Guido van Rossumb02158e1997-08-02 03:13:11 +0000237 boot->interp = PyThreadState_Get()->interp;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000238 boot->func = func;
239 boot->args = args;
240 boot->keyw = keyw;
241 Py_INCREF(func);
242 Py_INCREF(args);
243 Py_XINCREF(keyw);
244 PyEval_InitThreads(); /* Start the interpreter's thread-awareness */
Guido van Rossum65d5b571998-12-21 19:32:43 +0000245 if (!PyThread_start_new_thread(t_bootstrap, (void*) boot)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +0000246 PyErr_SetString(ThreadError, "can't start new thread\n");
247 Py_DECREF(func);
248 Py_DECREF(args);
249 Py_XDECREF(keyw);
250 PyMem_DEL(boot);
251 return NULL;
252 }
Barry Warsawd0c10421996-12-17 00:05:22 +0000253 Py_INCREF(Py_None);
254 return Py_None;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000255}
256
Guido van Rossum75e9fc31998-06-27 18:21:06 +0000257static char start_new_doc[] =
258"start_new_thread(functon, args[, kwargs])\n\
259(start_new() is an obsolete synonym)\n\
260\n\
261Start a new thread. The thread will call the function with positional\n\
262arguments from the tuple args and keyword arguments taken from the optional\n\
263dictionary kwargs. The thread exits when the function returns; the return\n\
264value is ignored. The thread will also exit when the function raises an\n\
265unhandled exception; a stack trace will be printed unless the exception is\n\
266SystemExit.";
267
Barry Warsawd0c10421996-12-17 00:05:22 +0000268static PyObject *
Peter Schneider-Kamp3707efe2000-07-10 10:03:58 +0000269thread_PyThread_exit_thread(PyObject *self, PyObject *args)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000270{
Barry Warsawd0c10421996-12-17 00:05:22 +0000271 if (!PyArg_NoArgs(args))
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000272 return NULL;
Barry Warsawd0c10421996-12-17 00:05:22 +0000273 PyErr_SetNone(PyExc_SystemExit);
Guido van Rossum385e7c61995-03-17 10:42:27 +0000274 return NULL;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000275}
276
Guido van Rossum75e9fc31998-06-27 18:21:06 +0000277static char exit_doc[] =
278"exit()\n\
Guido van Rossum65d5b571998-12-21 19:32:43 +0000279(PyThread_exit_thread() is an obsolete synonym)\n\
Guido van Rossum75e9fc31998-06-27 18:21:06 +0000280\n\
281This is synonymous to ``raise SystemExit''. It will cause the current\n\
282thread to exit silently unless the exception is caught.";
283
Guido van Rossumb6775db1994-08-01 11:34:53 +0000284#ifndef NO_EXIT_PROG
Barry Warsawd0c10421996-12-17 00:05:22 +0000285static PyObject *
Peter Schneider-Kamp3707efe2000-07-10 10:03:58 +0000286thread_PyThread_exit_prog(PyObject *self, PyObject *args)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000287{
288 int sts;
Barry Warsawd0c10421996-12-17 00:05:22 +0000289 if (!PyArg_Parse(args, "i", &sts))
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000290 return NULL;
Guido van Rossum65d5b571998-12-21 19:32:43 +0000291 Py_Exit(sts); /* Calls PyThread_exit_prog(sts) or _PyThread_exit_prog(sts) */
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000292 for (;;) { } /* Should not be reached */
293}
Guido van Rossumb6775db1994-08-01 11:34:53 +0000294#endif
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000295
Barry Warsawd0c10421996-12-17 00:05:22 +0000296static PyObject *
Peter Schneider-Kamp3707efe2000-07-10 10:03:58 +0000297thread_PyThread_allocate_lock(PyObject *self, PyObject *args)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000298{
Barry Warsawd0c10421996-12-17 00:05:22 +0000299 if (!PyArg_NoArgs(args))
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000300 return NULL;
Barry Warsawd0c10421996-12-17 00:05:22 +0000301 return (PyObject *) newlockobject();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000302}
303
Guido van Rossum75e9fc31998-06-27 18:21:06 +0000304static char allocate_doc[] =
305"allocate_lock() -> lock object\n\
306(allocate() is an obsolete synonym)\n\
307\n\
308Create a new lock object. See LockType.__doc__ for information about locks.";
309
Barry Warsawd0c10421996-12-17 00:05:22 +0000310static PyObject *
Peter Schneider-Kamp3707efe2000-07-10 10:03:58 +0000311thread_get_ident(PyObject *self, PyObject *args)
Guido van Rossumb6775db1994-08-01 11:34:53 +0000312{
313 long ident;
Barry Warsawd0c10421996-12-17 00:05:22 +0000314 if (!PyArg_NoArgs(args))
Guido van Rossumb6775db1994-08-01 11:34:53 +0000315 return NULL;
Guido van Rossum65d5b571998-12-21 19:32:43 +0000316 ident = PyThread_get_thread_ident();
Guido van Rossumb6775db1994-08-01 11:34:53 +0000317 if (ident == -1) {
Barry Warsawd0c10421996-12-17 00:05:22 +0000318 PyErr_SetString(ThreadError, "no current thread ident");
Guido van Rossumb6775db1994-08-01 11:34:53 +0000319 return NULL;
320 }
Barry Warsawd0c10421996-12-17 00:05:22 +0000321 return PyInt_FromLong(ident);
Guido van Rossumb6775db1994-08-01 11:34:53 +0000322}
323
Guido van Rossum75e9fc31998-06-27 18:21:06 +0000324static char get_ident_doc[] =
325"get_ident() -> integer\n\
326\n\
327Return a non-zero integer that uniquely identifies the current thread\n\
328amongst other threads that exist simultaneously.\n\
329This may be used to identify per-thread resources.\n\
330Even though on some platforms threads identities may appear to be\n\
331allocated consecutive numbers starting at 1, this behavior should not\n\
332be relied upon, and the number should be seen purely as a magic cookie.\n\
333A thread's identity may be reused for another thread after it exits.";
334
Barry Warsawd0c10421996-12-17 00:05:22 +0000335static PyMethodDef thread_methods[] = {
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +0000336 {"start_new_thread", (PyCFunction)thread_PyThread_start_new_thread,
337 METH_VARARGS,
Guido van Rossum75e9fc31998-06-27 18:21:06 +0000338 start_new_doc},
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +0000339 {"start_new", (PyCFunction)thread_PyThread_start_new_thread,
340 METH_VARARGS,
Guido van Rossum75e9fc31998-06-27 18:21:06 +0000341 start_new_doc},
Andrew M. Kuchlinga1abb722000-08-03 02:34:44 +0000342 {"allocate_lock", (PyCFunction)thread_PyThread_allocate_lock,
343 METH_OLDARGS, allocate_doc},
344 {"allocate", (PyCFunction)thread_PyThread_allocate_lock,
345 METH_OLDARGS, allocate_doc},
346 {"exit_thread", (PyCFunction)thread_PyThread_exit_thread,
347 METH_OLDARGS, exit_doc},
348 {"exit", (PyCFunction)thread_PyThread_exit_thread,
349 METH_OLDARGS, exit_doc},
350 {"get_ident", (PyCFunction)thread_get_ident,
351 METH_OLDARGS, get_ident_doc},
Guido van Rossumb6775db1994-08-01 11:34:53 +0000352#ifndef NO_EXIT_PROG
Guido van Rossum65d5b571998-12-21 19:32:43 +0000353 {"exit_prog", (PyCFunction)thread_PyThread_exit_prog},
Guido van Rossumb6775db1994-08-01 11:34:53 +0000354#endif
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000355 {NULL, NULL} /* sentinel */
356};
357
358
359/* Initialization function */
360
Guido van Rossum75e9fc31998-06-27 18:21:06 +0000361static char thread_doc[] =
362"This module provides primitive operations to write multi-threaded programs.\n\
363The 'threading' module provides a more convenient interface.";
364
365static char lock_doc[] =
366"A lock object is a synchronization primitive. To create a lock,\n\
Guido van Rossum65d5b571998-12-21 19:32:43 +0000367call the PyThread_allocate_lock() function. Methods are:\n\
Guido van Rossum75e9fc31998-06-27 18:21:06 +0000368\n\
Guido van Rossum75e9fc31998-06-27 18:21:06 +0000369acquire() -- lock the lock, possibly blocking until it can be obtained\n\
370release() -- unlock of the lock\n\
371locked() -- test whether the lock is currently locked\n\
372\n\
373A lock is not owned by the thread that locked it; another thread may\n\
374unlock it. A thread attempting to lock a lock that it has already locked\n\
375will block until another thread unlocks it. Deadlocks may ensue.";
376
Guido van Rossum3886bb61998-12-04 18:50:17 +0000377DL_EXPORT(void)
Thomas Woutersf3f33dc2000-07-21 06:00:07 +0000378initthread(void)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000379{
Barry Warsawd0c10421996-12-17 00:05:22 +0000380 PyObject *m, *d;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000381
382 /* Create the module and add the functions */
Guido van Rossum75e9fc31998-06-27 18:21:06 +0000383 m = Py_InitModule3("thread", thread_methods, thread_doc);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000384
385 /* Add a symbolic constant */
Barry Warsawd0c10421996-12-17 00:05:22 +0000386 d = PyModule_GetDict(m);
Guido van Rossum0cb96de1997-10-01 04:29:29 +0000387 ThreadError = PyErr_NewException("thread.error", NULL, NULL);
Barry Warsawd0c10421996-12-17 00:05:22 +0000388 PyDict_SetItemString(d, "error", ThreadError);
Guido van Rossum75e9fc31998-06-27 18:21:06 +0000389 Locktype.tp_doc = lock_doc;
390 Py_INCREF(&Locktype);
391 PyDict_SetItemString(d, "LockType", (PyObject *)&Locktype);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000392
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000393 /* Initialize the C thread library */
Guido van Rossum65d5b571998-12-21 19:32:43 +0000394 PyThread_init_thread();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000395}