blob: bdc7932c6e06041eab640896fbc6ae99adc40a41 [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 Rossum3c288632001-10-16 21:13:49 +0000216 long ident;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000217
Guido van Rossum43713e52000-02-29 13:59:29 +0000218 if (!PyArg_ParseTuple(fargs, "OO|O:start_new_thread", &func, &args, &keyw))
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000219 return NULL;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000220 if (!PyCallable_Check(func)) {
221 PyErr_SetString(PyExc_TypeError,
222 "first arg must be callable");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000223 return NULL;
224 }
Guido van Rossuma027efa1997-05-05 20:56:21 +0000225 if (!PyTuple_Check(args)) {
226 PyErr_SetString(PyExc_TypeError,
Guido van Rossum38d45b72000-09-01 20:47:58 +0000227 "2nd arg must be a tuple");
Guido van Rossuma027efa1997-05-05 20:56:21 +0000228 return NULL;
229 }
230 if (keyw != NULL && !PyDict_Check(keyw)) {
231 PyErr_SetString(PyExc_TypeError,
232 "optional 3rd arg must be a dictionary");
233 return NULL;
234 }
235 boot = PyMem_NEW(struct bootstate, 1);
236 if (boot == NULL)
237 return PyErr_NoMemory();
Guido van Rossumb02158e1997-08-02 03:13:11 +0000238 boot->interp = PyThreadState_Get()->interp;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000239 boot->func = func;
240 boot->args = args;
241 boot->keyw = keyw;
242 Py_INCREF(func);
243 Py_INCREF(args);
244 Py_XINCREF(keyw);
245 PyEval_InitThreads(); /* Start the interpreter's thread-awareness */
Guido van Rossum3c288632001-10-16 21:13:49 +0000246 ident = PyThread_start_new_thread(t_bootstrap, (void*) boot);
247 if (ident == -1) {
Guido van Rossuma027efa1997-05-05 20:56:21 +0000248 PyErr_SetString(ThreadError, "can't start new thread\n");
249 Py_DECREF(func);
250 Py_DECREF(args);
251 Py_XDECREF(keyw);
252 PyMem_DEL(boot);
253 return NULL;
254 }
Guido van Rossum3c288632001-10-16 21:13:49 +0000255 return PyInt_FromLong(ident);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000256}
257
Guido van Rossum75e9fc31998-06-27 18:21:06 +0000258static char start_new_doc[] =
Andrew M. Kuchling38300c62001-10-05 12:24:15 +0000259"start_new_thread(function, args[, kwargs])\n\
Guido van Rossum75e9fc31998-06-27 18:21:06 +0000260(start_new() is an obsolete synonym)\n\
261\n\
Guido van Rossum3c288632001-10-16 21:13:49 +0000262Start a new thread and return its identifier. The thread will call the\n\
263function with positional arguments from the tuple args and keyword arguments\n\
264taken from the optional dictionary kwargs. The thread exits when the\n\
265function returns; the return value is ignored. The thread will also exit\n\
266when the function raises an unhandled exception; a stack trace will be\n\
267printed unless the exception is SystemExit.\n";
Guido van Rossum75e9fc31998-06-27 18:21:06 +0000268
Barry Warsawd0c10421996-12-17 00:05:22 +0000269static PyObject *
Peter Schneider-Kamp3707efe2000-07-10 10:03:58 +0000270thread_PyThread_exit_thread(PyObject *self, PyObject *args)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000271{
Barry Warsawd0c10421996-12-17 00:05:22 +0000272 if (!PyArg_NoArgs(args))
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000273 return NULL;
Barry Warsawd0c10421996-12-17 00:05:22 +0000274 PyErr_SetNone(PyExc_SystemExit);
Guido van Rossum385e7c61995-03-17 10:42:27 +0000275 return NULL;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000276}
277
Guido van Rossum75e9fc31998-06-27 18:21:06 +0000278static char exit_doc[] =
279"exit()\n\
Guido van Rossum65d5b571998-12-21 19:32:43 +0000280(PyThread_exit_thread() is an obsolete synonym)\n\
Guido van Rossum75e9fc31998-06-27 18:21:06 +0000281\n\
282This is synonymous to ``raise SystemExit''. It will cause the current\n\
283thread to exit silently unless the exception is caught.";
284
Guido van Rossumb6775db1994-08-01 11:34:53 +0000285#ifndef NO_EXIT_PROG
Barry Warsawd0c10421996-12-17 00:05:22 +0000286static PyObject *
Peter Schneider-Kamp3707efe2000-07-10 10:03:58 +0000287thread_PyThread_exit_prog(PyObject *self, PyObject *args)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000288{
289 int sts;
Barry Warsawd0c10421996-12-17 00:05:22 +0000290 if (!PyArg_Parse(args, "i", &sts))
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000291 return NULL;
Guido van Rossum65d5b571998-12-21 19:32:43 +0000292 Py_Exit(sts); /* Calls PyThread_exit_prog(sts) or _PyThread_exit_prog(sts) */
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000293 for (;;) { } /* Should not be reached */
294}
Guido van Rossumb6775db1994-08-01 11:34:53 +0000295#endif
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000296
Barry Warsawd0c10421996-12-17 00:05:22 +0000297static PyObject *
Peter Schneider-Kamp3707efe2000-07-10 10:03:58 +0000298thread_PyThread_allocate_lock(PyObject *self, PyObject *args)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000299{
Barry Warsawd0c10421996-12-17 00:05:22 +0000300 if (!PyArg_NoArgs(args))
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000301 return NULL;
Barry Warsawd0c10421996-12-17 00:05:22 +0000302 return (PyObject *) newlockobject();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000303}
304
Guido van Rossum75e9fc31998-06-27 18:21:06 +0000305static char allocate_doc[] =
306"allocate_lock() -> lock object\n\
307(allocate() is an obsolete synonym)\n\
308\n\
309Create a new lock object. See LockType.__doc__ for information about locks.";
310
Barry Warsawd0c10421996-12-17 00:05:22 +0000311static PyObject *
Peter Schneider-Kamp3707efe2000-07-10 10:03:58 +0000312thread_get_ident(PyObject *self, PyObject *args)
Guido van Rossumb6775db1994-08-01 11:34:53 +0000313{
314 long ident;
Barry Warsawd0c10421996-12-17 00:05:22 +0000315 if (!PyArg_NoArgs(args))
Guido van Rossumb6775db1994-08-01 11:34:53 +0000316 return NULL;
Guido van Rossum65d5b571998-12-21 19:32:43 +0000317 ident = PyThread_get_thread_ident();
Guido van Rossumb6775db1994-08-01 11:34:53 +0000318 if (ident == -1) {
Barry Warsawd0c10421996-12-17 00:05:22 +0000319 PyErr_SetString(ThreadError, "no current thread ident");
Guido van Rossumb6775db1994-08-01 11:34:53 +0000320 return NULL;
321 }
Barry Warsawd0c10421996-12-17 00:05:22 +0000322 return PyInt_FromLong(ident);
Guido van Rossumb6775db1994-08-01 11:34:53 +0000323}
324
Guido van Rossum75e9fc31998-06-27 18:21:06 +0000325static char get_ident_doc[] =
326"get_ident() -> integer\n\
327\n\
328Return a non-zero integer that uniquely identifies the current thread\n\
329amongst other threads that exist simultaneously.\n\
330This may be used to identify per-thread resources.\n\
331Even though on some platforms threads identities may appear to be\n\
332allocated consecutive numbers starting at 1, this behavior should not\n\
333be relied upon, and the number should be seen purely as a magic cookie.\n\
334A thread's identity may be reused for another thread after it exits.";
335
Barry Warsawd0c10421996-12-17 00:05:22 +0000336static PyMethodDef thread_methods[] = {
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +0000337 {"start_new_thread", (PyCFunction)thread_PyThread_start_new_thread,
338 METH_VARARGS,
Guido van Rossum75e9fc31998-06-27 18:21:06 +0000339 start_new_doc},
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +0000340 {"start_new", (PyCFunction)thread_PyThread_start_new_thread,
341 METH_VARARGS,
Guido van Rossum75e9fc31998-06-27 18:21:06 +0000342 start_new_doc},
Andrew M. Kuchlinga1abb722000-08-03 02:34:44 +0000343 {"allocate_lock", (PyCFunction)thread_PyThread_allocate_lock,
344 METH_OLDARGS, allocate_doc},
345 {"allocate", (PyCFunction)thread_PyThread_allocate_lock,
346 METH_OLDARGS, allocate_doc},
347 {"exit_thread", (PyCFunction)thread_PyThread_exit_thread,
348 METH_OLDARGS, exit_doc},
349 {"exit", (PyCFunction)thread_PyThread_exit_thread,
350 METH_OLDARGS, exit_doc},
351 {"get_ident", (PyCFunction)thread_get_ident,
352 METH_OLDARGS, get_ident_doc},
Guido van Rossumb6775db1994-08-01 11:34:53 +0000353#ifndef NO_EXIT_PROG
Guido van Rossum65d5b571998-12-21 19:32:43 +0000354 {"exit_prog", (PyCFunction)thread_PyThread_exit_prog},
Guido van Rossumb6775db1994-08-01 11:34:53 +0000355#endif
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000356 {NULL, NULL} /* sentinel */
357};
358
359
360/* Initialization function */
361
Guido van Rossum75e9fc31998-06-27 18:21:06 +0000362static char thread_doc[] =
363"This module provides primitive operations to write multi-threaded programs.\n\
364The 'threading' module provides a more convenient interface.";
365
366static char lock_doc[] =
367"A lock object is a synchronization primitive. To create a lock,\n\
Guido van Rossum65d5b571998-12-21 19:32:43 +0000368call the PyThread_allocate_lock() function. Methods are:\n\
Guido van Rossum75e9fc31998-06-27 18:21:06 +0000369\n\
Guido van Rossum75e9fc31998-06-27 18:21:06 +0000370acquire() -- lock the lock, possibly blocking until it can be obtained\n\
371release() -- unlock of the lock\n\
372locked() -- test whether the lock is currently locked\n\
373\n\
374A lock is not owned by the thread that locked it; another thread may\n\
375unlock it. A thread attempting to lock a lock that it has already locked\n\
376will block until another thread unlocks it. Deadlocks may ensue.";
377
Guido van Rossum3886bb61998-12-04 18:50:17 +0000378DL_EXPORT(void)
Thomas Woutersf3f33dc2000-07-21 06:00:07 +0000379initthread(void)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000380{
Barry Warsawd0c10421996-12-17 00:05:22 +0000381 PyObject *m, *d;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000382
383 /* Create the module and add the functions */
Guido van Rossum75e9fc31998-06-27 18:21:06 +0000384 m = Py_InitModule3("thread", thread_methods, thread_doc);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000385
386 /* Add a symbolic constant */
Barry Warsawd0c10421996-12-17 00:05:22 +0000387 d = PyModule_GetDict(m);
Guido van Rossum0cb96de1997-10-01 04:29:29 +0000388 ThreadError = PyErr_NewException("thread.error", NULL, NULL);
Barry Warsawd0c10421996-12-17 00:05:22 +0000389 PyDict_SetItemString(d, "error", ThreadError);
Guido van Rossum75e9fc31998-06-27 18:21:06 +0000390 Locktype.tp_doc = lock_doc;
391 Py_INCREF(&Locktype);
392 PyDict_SetItemString(d, "LockType", (PyObject *)&Locktype);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000393
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000394 /* Initialize the C thread library */
Guido van Rossum65d5b571998-12-21 19:32:43 +0000395 PyThread_init_thread();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000396}