blob: a6251461ba767393eebb08453389612bafb6130a [file] [log] [blame]
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001/***********************************************************
Guido van Rossumfd71b9e2000-06-30 23:50:40 +00002Copyright (c) 2000, BeOpen.com.
3Copyright (c) 1995-2000, Corporation for National Research Initiatives.
4Copyright (c) 1990-1995, Stichting Mathematisch Centrum.
5All rights reserved.
Guido van Rossum1984f1e1992-08-04 12:41:02 +00006
Guido van Rossumfd71b9e2000-06-30 23:50:40 +00007See the file "Misc/COPYRIGHT" for information on usage and
8redistribution of this file, and for a DISCLAIMER OF ALL WARRANTIES.
Guido van Rossum1984f1e1992-08-04 12:41:02 +00009******************************************************************/
10
11/* Thread module */
12/* Interface to Sjoerd's portable C thread library */
13
Barry Warsawd0c10421996-12-17 00:05:22 +000014#include "Python.h"
Guido van Rossum1984f1e1992-08-04 12:41:02 +000015
Guido van Rossumb6775db1994-08-01 11:34:53 +000016#ifndef WITH_THREAD
Guido van Rossuma027efa1997-05-05 20:56:21 +000017#error "Error! The rest of Python is not compiled with thread support."
18#error "Rerun configure, adding a --with-thread option."
19#error "Then run `make clean' followed by `make'."
Guido van Rossumb6775db1994-08-01 11:34:53 +000020#endif
21
Guido van Rossum49b56061998-10-01 20:42:43 +000022#include "pythread.h"
Guido van Rossum1984f1e1992-08-04 12:41:02 +000023
Barry Warsawd0c10421996-12-17 00:05:22 +000024static PyObject *ThreadError;
Guido van Rossum1984f1e1992-08-04 12:41:02 +000025
26
27/* Lock objects */
28
29typedef struct {
Barry Warsawd0c10421996-12-17 00:05:22 +000030 PyObject_HEAD
Guido van Rossum65d5b571998-12-21 19:32:43 +000031 PyThread_type_lock lock_lock;
Guido van Rossum1984f1e1992-08-04 12:41:02 +000032} lockobject;
33
Barry Warsawd0c10421996-12-17 00:05:22 +000034staticforward PyTypeObject Locktype;
Guido van Rossum1984f1e1992-08-04 12:41:02 +000035
Guido van Rossum1984f1e1992-08-04 12:41:02 +000036static lockobject *
Thomas Woutersf3f33dc2000-07-21 06:00:07 +000037newlockobject(void)
Guido van Rossum1984f1e1992-08-04 12:41:02 +000038{
39 lockobject *self;
Guido van Rossumb18618d2000-05-03 23:44:39 +000040 self = PyObject_New(lockobject, &Locktype);
Guido van Rossum1984f1e1992-08-04 12:41:02 +000041 if (self == NULL)
42 return NULL;
Guido van Rossum65d5b571998-12-21 19:32:43 +000043 self->lock_lock = PyThread_allocate_lock();
Guido van Rossum1984f1e1992-08-04 12:41:02 +000044 if (self->lock_lock == NULL) {
Guido van Rossumb18618d2000-05-03 23:44:39 +000045 PyObject_Del(self);
Guido van Rossum1984f1e1992-08-04 12:41:02 +000046 self = NULL;
Barry Warsawd0c10421996-12-17 00:05:22 +000047 PyErr_SetString(ThreadError, "can't allocate lock");
Guido van Rossum1984f1e1992-08-04 12:41:02 +000048 }
49 return self;
50}
51
52static void
Peter Schneider-Kamp3707efe2000-07-10 10:03:58 +000053lock_dealloc(lockobject *self)
Guido van Rossum1984f1e1992-08-04 12:41:02 +000054{
55 /* Unlock the lock so it's safe to free it */
Guido van Rossum65d5b571998-12-21 19:32:43 +000056 PyThread_acquire_lock(self->lock_lock, 0);
57 PyThread_release_lock(self->lock_lock);
Guido van Rossum1984f1e1992-08-04 12:41:02 +000058
Guido van Rossum65d5b571998-12-21 19:32:43 +000059 PyThread_free_lock(self->lock_lock);
Guido van Rossumb18618d2000-05-03 23:44:39 +000060 PyObject_Del(self);
Guido van Rossum1984f1e1992-08-04 12:41:02 +000061}
62
Barry Warsawd0c10421996-12-17 00:05:22 +000063static PyObject *
Peter Schneider-Kamp3707efe2000-07-10 10:03:58 +000064lock_PyThread_acquire_lock(lockobject *self, PyObject *args)
Guido van Rossum1984f1e1992-08-04 12:41:02 +000065{
Guido van Rossum1984f1e1992-08-04 12:41:02 +000066 int i;
67
68 if (args != NULL) {
Barry Warsawd0c10421996-12-17 00:05:22 +000069 if (!PyArg_Parse(args, "i", &i))
Guido van Rossum1984f1e1992-08-04 12:41:02 +000070 return NULL;
71 }
72 else
73 i = 1;
74
Barry Warsawd0c10421996-12-17 00:05:22 +000075 Py_BEGIN_ALLOW_THREADS
Guido van Rossum65d5b571998-12-21 19:32:43 +000076 i = PyThread_acquire_lock(self->lock_lock, i);
Barry Warsawd0c10421996-12-17 00:05:22 +000077 Py_END_ALLOW_THREADS
Guido van Rossum1984f1e1992-08-04 12:41:02 +000078
79 if (args == NULL) {
Barry Warsawd0c10421996-12-17 00:05:22 +000080 Py_INCREF(Py_None);
81 return Py_None;
Guido van Rossum1984f1e1992-08-04 12:41:02 +000082 }
83 else
Barry Warsawd0c10421996-12-17 00:05:22 +000084 return PyInt_FromLong((long)i);
Guido van Rossum1984f1e1992-08-04 12:41:02 +000085}
86
Guido van Rossum75e9fc31998-06-27 18:21:06 +000087static char acquire_doc[] =
88"acquire([wait]) -> None or Boolean\n\
Guido van Rossum65d5b571998-12-21 19:32:43 +000089(PyThread_acquire_lock() is an obsolete synonym)\n\
Guido van Rossum75e9fc31998-06-27 18:21:06 +000090\n\
91Lock the lock. Without argument, this blocks if the lock is already\n\
92locked (even by the same thread), waiting for another thread to release\n\
93the lock, and return None when the lock is acquired.\n\
94With a Boolean argument, this will only block if the argument is true,\n\
95and the return value reflects whether the lock is acquired.\n\
96The blocking operation is not interruptible.";
97
Barry Warsawd0c10421996-12-17 00:05:22 +000098static PyObject *
Peter Schneider-Kamp3707efe2000-07-10 10:03:58 +000099lock_PyThread_release_lock(lockobject *self, PyObject *args)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000100{
Barry Warsawd0c10421996-12-17 00:05:22 +0000101 if (!PyArg_NoArgs(args))
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000102 return NULL;
103
104 /* Sanity check: the lock must be locked */
Guido van Rossum65d5b571998-12-21 19:32:43 +0000105 if (PyThread_acquire_lock(self->lock_lock, 0)) {
106 PyThread_release_lock(self->lock_lock);
Barry Warsawd0c10421996-12-17 00:05:22 +0000107 PyErr_SetString(ThreadError, "release unlocked lock");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000108 return NULL;
109 }
110
Guido van Rossum65d5b571998-12-21 19:32:43 +0000111 PyThread_release_lock(self->lock_lock);
Barry Warsawd0c10421996-12-17 00:05:22 +0000112 Py_INCREF(Py_None);
113 return Py_None;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000114}
115
Guido van Rossum75e9fc31998-06-27 18:21:06 +0000116static char release_doc[] =
117"release()\n\
Guido van Rossum65d5b571998-12-21 19:32:43 +0000118(PyThread_release_lock() is an obsolete synonym)\n\
Guido van Rossum75e9fc31998-06-27 18:21:06 +0000119\n\
120Release the lock, allowing another thread that is blocked waiting for\n\
121the lock to acquire the lock. The lock must be in the locked state,\n\
122but it needn't be locked by the same thread that unlocks it.";
123
Barry Warsawd0c10421996-12-17 00:05:22 +0000124static PyObject *
Peter Schneider-Kamp3707efe2000-07-10 10:03:58 +0000125lock_locked_lock(lockobject *self, PyObject *args)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000126{
Barry Warsawd0c10421996-12-17 00:05:22 +0000127 if (!PyArg_NoArgs(args))
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000128 return NULL;
129
Guido van Rossum65d5b571998-12-21 19:32:43 +0000130 if (PyThread_acquire_lock(self->lock_lock, 0)) {
131 PyThread_release_lock(self->lock_lock);
Barry Warsawd0c10421996-12-17 00:05:22 +0000132 return PyInt_FromLong(0L);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000133 }
Barry Warsawd0c10421996-12-17 00:05:22 +0000134 return PyInt_FromLong(1L);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000135}
136
Guido van Rossum75e9fc31998-06-27 18:21:06 +0000137static char locked_doc[] =
138"locked() -> Boolean\n\
139(locked_lock() is an obsolete synonym)\n\
140\n\
141Return whether the lock is in the locked state.";
142
Barry Warsawd0c10421996-12-17 00:05:22 +0000143static PyMethodDef lock_methods[] = {
Andrew M. Kuchlinga1abb722000-08-03 02:34:44 +0000144 {"acquire_lock", (PyCFunction)lock_PyThread_acquire_lock,
145 METH_OLDARGS, acquire_doc},
146 {"acquire", (PyCFunction)lock_PyThread_acquire_lock,
147 METH_OLDARGS, acquire_doc},
148 {"release_lock", (PyCFunction)lock_PyThread_release_lock,
149 METH_OLDARGS, release_doc},
150 {"release", (PyCFunction)lock_PyThread_release_lock,
151 METH_OLDARGS, release_doc},
152 {"locked_lock", (PyCFunction)lock_locked_lock,
153 METH_OLDARGS, locked_doc},
154 {"locked", (PyCFunction)lock_locked_lock,
155 METH_OLDARGS, locked_doc},
Guido van Rossum75e9fc31998-06-27 18:21:06 +0000156 {NULL, NULL} /* sentinel */
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000157};
158
Barry Warsawd0c10421996-12-17 00:05:22 +0000159static PyObject *
Peter Schneider-Kamp3707efe2000-07-10 10:03:58 +0000160lock_getattr(lockobject *self, char *name)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000161{
Barry Warsawd0c10421996-12-17 00:05:22 +0000162 return Py_FindMethod(lock_methods, (PyObject *)self, name);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000163}
164
Barry Warsawd0c10421996-12-17 00:05:22 +0000165static PyTypeObject Locktype = {
166 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossumb6775db1994-08-01 11:34:53 +0000167 0, /*ob_size*/
168 "lock", /*tp_name*/
169 sizeof(lockobject), /*tp_size*/
170 0, /*tp_itemsize*/
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000171 /* methods */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000172 (destructor)lock_dealloc, /*tp_dealloc*/
173 0, /*tp_print*/
174 (getattrfunc)lock_getattr, /*tp_getattr*/
175 0, /*tp_setattr*/
176 0, /*tp_compare*/
177 0, /*tp_repr*/
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000178};
179
180
181/* Module functions */
182
Guido van Rossuma027efa1997-05-05 20:56:21 +0000183struct bootstate {
184 PyInterpreterState *interp;
185 PyObject *func;
186 PyObject *args;
187 PyObject *keyw;
188};
189
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000190static void
Peter Schneider-Kamp3707efe2000-07-10 10:03:58 +0000191t_bootstrap(void *boot_raw)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000192{
Guido van Rossuma027efa1997-05-05 20:56:21 +0000193 struct bootstate *boot = (struct bootstate *) boot_raw;
Guido van Rossum75aa0d61997-07-18 23:57:50 +0000194 PyThreadState *tstate;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000195 PyObject *res;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000196
Guido van Rossuma027efa1997-05-05 20:56:21 +0000197 tstate = PyThreadState_New(boot->interp);
Guido van Rossum75aa0d61997-07-18 23:57:50 +0000198 PyEval_AcquireThread(tstate);
Guido van Rossuma027efa1997-05-05 20:56:21 +0000199 res = PyEval_CallObjectWithKeywords(
200 boot->func, boot->args, boot->keyw);
201 Py_DECREF(boot->func);
202 Py_DECREF(boot->args);
203 Py_XDECREF(boot->keyw);
204 PyMem_DEL(boot_raw);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000205 if (res == NULL) {
Fred Drakebebc97f1998-05-28 04:35:12 +0000206 if (PyErr_ExceptionMatches(PyExc_SystemExit))
Barry Warsawd0c10421996-12-17 00:05:22 +0000207 PyErr_Clear();
Guido van Rossum385e7c61995-03-17 10:42:27 +0000208 else {
209 fprintf(stderr, "Unhandled exception in thread:\n");
Guido van Rossum40769dd1998-02-06 22:32:08 +0000210 PyErr_PrintEx(0);
Guido van Rossum385e7c61995-03-17 10:42:27 +0000211 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000212 }
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000213 else
Barry Warsawd0c10421996-12-17 00:05:22 +0000214 Py_DECREF(res);
Guido van Rossumb02158e1997-08-02 03:13:11 +0000215 PyThreadState_Clear(tstate);
Guido van Rossum75aa0d61997-07-18 23:57:50 +0000216 PyEval_ReleaseThread(tstate);
Guido van Rossuma027efa1997-05-05 20:56:21 +0000217 PyThreadState_Delete(tstate);
Guido van Rossumbcc20741998-08-04 22:53:56 +0000218 PyThread_exit_thread();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000219}
220
Barry Warsawd0c10421996-12-17 00:05:22 +0000221static PyObject *
Peter Schneider-Kamp3707efe2000-07-10 10:03:58 +0000222thread_PyThread_start_new_thread(PyObject *self, PyObject *fargs)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000223{
Guido van Rossuma027efa1997-05-05 20:56:21 +0000224 PyObject *func, *args = NULL, *keyw = NULL;
225 struct bootstate *boot;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000226
Guido van Rossum43713e52000-02-29 13:59:29 +0000227 if (!PyArg_ParseTuple(fargs, "OO|O:start_new_thread", &func, &args, &keyw))
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000228 return NULL;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000229 if (!PyCallable_Check(func)) {
230 PyErr_SetString(PyExc_TypeError,
231 "first arg must be callable");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000232 return NULL;
233 }
Guido van Rossuma027efa1997-05-05 20:56:21 +0000234 if (!PyTuple_Check(args)) {
235 PyErr_SetString(PyExc_TypeError,
236 "optional 2nd arg must be a tuple");
237 return NULL;
238 }
239 if (keyw != NULL && !PyDict_Check(keyw)) {
240 PyErr_SetString(PyExc_TypeError,
241 "optional 3rd arg must be a dictionary");
242 return NULL;
243 }
244 boot = PyMem_NEW(struct bootstate, 1);
245 if (boot == NULL)
246 return PyErr_NoMemory();
Guido van Rossumb02158e1997-08-02 03:13:11 +0000247 boot->interp = PyThreadState_Get()->interp;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000248 boot->func = func;
249 boot->args = args;
250 boot->keyw = keyw;
251 Py_INCREF(func);
252 Py_INCREF(args);
253 Py_XINCREF(keyw);
254 PyEval_InitThreads(); /* Start the interpreter's thread-awareness */
Guido van Rossum65d5b571998-12-21 19:32:43 +0000255 if (!PyThread_start_new_thread(t_bootstrap, (void*) boot)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +0000256 PyErr_SetString(ThreadError, "can't start new thread\n");
257 Py_DECREF(func);
258 Py_DECREF(args);
259 Py_XDECREF(keyw);
260 PyMem_DEL(boot);
261 return NULL;
262 }
Barry Warsawd0c10421996-12-17 00:05:22 +0000263 Py_INCREF(Py_None);
264 return Py_None;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000265}
266
Guido van Rossum75e9fc31998-06-27 18:21:06 +0000267static char start_new_doc[] =
268"start_new_thread(functon, args[, kwargs])\n\
269(start_new() is an obsolete synonym)\n\
270\n\
271Start a new thread. The thread will call the function with positional\n\
272arguments from the tuple args and keyword arguments taken from the optional\n\
273dictionary kwargs. The thread exits when the function returns; the return\n\
274value is ignored. The thread will also exit when the function raises an\n\
275unhandled exception; a stack trace will be printed unless the exception is\n\
276SystemExit.";
277
Barry Warsawd0c10421996-12-17 00:05:22 +0000278static PyObject *
Peter Schneider-Kamp3707efe2000-07-10 10:03:58 +0000279thread_PyThread_exit_thread(PyObject *self, PyObject *args)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000280{
Barry Warsawd0c10421996-12-17 00:05:22 +0000281 if (!PyArg_NoArgs(args))
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000282 return NULL;
Barry Warsawd0c10421996-12-17 00:05:22 +0000283 PyErr_SetNone(PyExc_SystemExit);
Guido van Rossum385e7c61995-03-17 10:42:27 +0000284 return NULL;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000285}
286
Guido van Rossum75e9fc31998-06-27 18:21:06 +0000287static char exit_doc[] =
288"exit()\n\
Guido van Rossum65d5b571998-12-21 19:32:43 +0000289(PyThread_exit_thread() is an obsolete synonym)\n\
Guido van Rossum75e9fc31998-06-27 18:21:06 +0000290\n\
291This is synonymous to ``raise SystemExit''. It will cause the current\n\
292thread to exit silently unless the exception is caught.";
293
Guido van Rossumb6775db1994-08-01 11:34:53 +0000294#ifndef NO_EXIT_PROG
Barry Warsawd0c10421996-12-17 00:05:22 +0000295static PyObject *
Peter Schneider-Kamp3707efe2000-07-10 10:03:58 +0000296thread_PyThread_exit_prog(PyObject *self, PyObject *args)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000297{
298 int sts;
Barry Warsawd0c10421996-12-17 00:05:22 +0000299 if (!PyArg_Parse(args, "i", &sts))
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000300 return NULL;
Guido van Rossum65d5b571998-12-21 19:32:43 +0000301 Py_Exit(sts); /* Calls PyThread_exit_prog(sts) or _PyThread_exit_prog(sts) */
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000302 for (;;) { } /* Should not be reached */
303}
Guido van Rossumb6775db1994-08-01 11:34:53 +0000304#endif
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000305
Barry Warsawd0c10421996-12-17 00:05:22 +0000306static PyObject *
Peter Schneider-Kamp3707efe2000-07-10 10:03:58 +0000307thread_PyThread_allocate_lock(PyObject *self, PyObject *args)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000308{
Barry Warsawd0c10421996-12-17 00:05:22 +0000309 if (!PyArg_NoArgs(args))
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000310 return NULL;
Barry Warsawd0c10421996-12-17 00:05:22 +0000311 return (PyObject *) newlockobject();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000312}
313
Guido van Rossum75e9fc31998-06-27 18:21:06 +0000314static char allocate_doc[] =
315"allocate_lock() -> lock object\n\
316(allocate() is an obsolete synonym)\n\
317\n\
318Create a new lock object. See LockType.__doc__ for information about locks.";
319
Barry Warsawd0c10421996-12-17 00:05:22 +0000320static PyObject *
Peter Schneider-Kamp3707efe2000-07-10 10:03:58 +0000321thread_get_ident(PyObject *self, PyObject *args)
Guido van Rossumb6775db1994-08-01 11:34:53 +0000322{
323 long ident;
Barry Warsawd0c10421996-12-17 00:05:22 +0000324 if (!PyArg_NoArgs(args))
Guido van Rossumb6775db1994-08-01 11:34:53 +0000325 return NULL;
Guido van Rossum65d5b571998-12-21 19:32:43 +0000326 ident = PyThread_get_thread_ident();
Guido van Rossumb6775db1994-08-01 11:34:53 +0000327 if (ident == -1) {
Barry Warsawd0c10421996-12-17 00:05:22 +0000328 PyErr_SetString(ThreadError, "no current thread ident");
Guido van Rossumb6775db1994-08-01 11:34:53 +0000329 return NULL;
330 }
Barry Warsawd0c10421996-12-17 00:05:22 +0000331 return PyInt_FromLong(ident);
Guido van Rossumb6775db1994-08-01 11:34:53 +0000332}
333
Guido van Rossum75e9fc31998-06-27 18:21:06 +0000334static char get_ident_doc[] =
335"get_ident() -> integer\n\
336\n\
337Return a non-zero integer that uniquely identifies the current thread\n\
338amongst other threads that exist simultaneously.\n\
339This may be used to identify per-thread resources.\n\
340Even though on some platforms threads identities may appear to be\n\
341allocated consecutive numbers starting at 1, this behavior should not\n\
342be relied upon, and the number should be seen purely as a magic cookie.\n\
343A thread's identity may be reused for another thread after it exits.";
344
Barry Warsawd0c10421996-12-17 00:05:22 +0000345static PyMethodDef thread_methods[] = {
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +0000346 {"start_new_thread", (PyCFunction)thread_PyThread_start_new_thread,
347 METH_VARARGS,
Guido van Rossum75e9fc31998-06-27 18:21:06 +0000348 start_new_doc},
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +0000349 {"start_new", (PyCFunction)thread_PyThread_start_new_thread,
350 METH_VARARGS,
Guido van Rossum75e9fc31998-06-27 18:21:06 +0000351 start_new_doc},
Andrew M. Kuchlinga1abb722000-08-03 02:34:44 +0000352 {"allocate_lock", (PyCFunction)thread_PyThread_allocate_lock,
353 METH_OLDARGS, allocate_doc},
354 {"allocate", (PyCFunction)thread_PyThread_allocate_lock,
355 METH_OLDARGS, allocate_doc},
356 {"exit_thread", (PyCFunction)thread_PyThread_exit_thread,
357 METH_OLDARGS, exit_doc},
358 {"exit", (PyCFunction)thread_PyThread_exit_thread,
359 METH_OLDARGS, exit_doc},
360 {"get_ident", (PyCFunction)thread_get_ident,
361 METH_OLDARGS, get_ident_doc},
Guido van Rossumb6775db1994-08-01 11:34:53 +0000362#ifndef NO_EXIT_PROG
Guido van Rossum65d5b571998-12-21 19:32:43 +0000363 {"exit_prog", (PyCFunction)thread_PyThread_exit_prog},
Guido van Rossumb6775db1994-08-01 11:34:53 +0000364#endif
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000365 {NULL, NULL} /* sentinel */
366};
367
368
369/* Initialization function */
370
Guido van Rossum75e9fc31998-06-27 18:21:06 +0000371static char thread_doc[] =
372"This module provides primitive operations to write multi-threaded programs.\n\
373The 'threading' module provides a more convenient interface.";
374
375static char lock_doc[] =
376"A lock object is a synchronization primitive. To create a lock,\n\
Guido van Rossum65d5b571998-12-21 19:32:43 +0000377call the PyThread_allocate_lock() function. Methods are:\n\
Guido van Rossum75e9fc31998-06-27 18:21:06 +0000378\n\
Guido van Rossum75e9fc31998-06-27 18:21:06 +0000379acquire() -- lock the lock, possibly blocking until it can be obtained\n\
380release() -- unlock of the lock\n\
381locked() -- test whether the lock is currently locked\n\
382\n\
383A lock is not owned by the thread that locked it; another thread may\n\
384unlock it. A thread attempting to lock a lock that it has already locked\n\
385will block until another thread unlocks it. Deadlocks may ensue.";
386
Guido van Rossum3886bb61998-12-04 18:50:17 +0000387DL_EXPORT(void)
Thomas Woutersf3f33dc2000-07-21 06:00:07 +0000388initthread(void)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000389{
Barry Warsawd0c10421996-12-17 00:05:22 +0000390 PyObject *m, *d;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000391
392 /* Create the module and add the functions */
Guido van Rossum75e9fc31998-06-27 18:21:06 +0000393 m = Py_InitModule3("thread", thread_methods, thread_doc);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000394
395 /* Add a symbolic constant */
Barry Warsawd0c10421996-12-17 00:05:22 +0000396 d = PyModule_GetDict(m);
Guido van Rossum0cb96de1997-10-01 04:29:29 +0000397 ThreadError = PyErr_NewException("thread.error", NULL, NULL);
Barry Warsawd0c10421996-12-17 00:05:22 +0000398 PyDict_SetItemString(d, "error", ThreadError);
Guido van Rossum75e9fc31998-06-27 18:21:06 +0000399 Locktype.tp_doc = lock_doc;
400 Py_INCREF(&Locktype);
401 PyDict_SetItemString(d, "LockType", (PyObject *)&Locktype);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000402
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000403 /* Initialize the C thread library */
Guido van Rossum65d5b571998-12-21 19:32:43 +0000404 PyThread_init_thread();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000405}