annotate Modules/_threadmodule.c @ 68191:2ddca55e098d

Issue #11140: Lock.release() now raises a RuntimeError when attempting to release an unacquired lock, as claimed in the threading documentation. The _thread.error exception is now an alias of RuntimeError.
author Antoine Pitrou <solipsis@pitrou.net>
date Mon, 28 Feb 2011 22:03:34 +0000
parents e2f96bd29252
children b39270c6b8d1
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
923
72aceed365d4 * Makefile adapted to changes below.
Guido van Rossum <guido@python.org>
parents:
diff changeset
1
72aceed365d4 * Makefile adapted to changes below.
Guido van Rossum <guido@python.org>
parents:
diff changeset
2 /* Thread module */
72aceed365d4 * Makefile adapted to changes below.
Guido van Rossum <guido@python.org>
parents:
diff changeset
3 /* Interface to Sjoerd's portable C thread library */
72aceed365d4 * Makefile adapted to changes below.
Guido van Rossum <guido@python.org>
parents:
diff changeset
4
4751
7ab835f87f86 Renamed.
Barry Warsaw <barry@python.org>
parents: 4600
diff changeset
5 #include "Python.h"
56440
29908f2bc93f Merged revisions 74524 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 56428
diff changeset
6 #include "structmember.h" /* offsetof */
923
72aceed365d4 * Makefile adapted to changes below.
Guido van Rossum <guido@python.org>
parents:
diff changeset
7
1746
1940892d2fe3 Merge alpha100 branch back to main trunk
Guido van Rossum <guido@python.org>
parents: 1418
diff changeset
8 #ifndef WITH_THREAD
5405
b7871ca930ad Massive changes for separate thread state management.
Guido van Rossum <guido@python.org>
parents: 4944
diff changeset
9 #error "Error! The rest of Python is not compiled with thread support."
25127
5165a0ee84c6 --with(out)-thread is deprecated according to configure --help
Neal Norwitz <nnorwitz@gmail.com>
parents: 24471
diff changeset
10 #error "Rerun configure, adding a --with-threads option."
5405
b7871ca930ad Massive changes for separate thread state management.
Guido van Rossum <guido@python.org>
parents: 4944
diff changeset
11 #error "Then run `make clean' followed by `make'."
1746
1940892d2fe3 Merge alpha100 branch back to main trunk
Guido van Rossum <guido@python.org>
parents: 1418
diff changeset
12 #endif
1940892d2fe3 Merge alpha100 branch back to main trunk
Guido van Rossum <guido@python.org>
parents: 1418
diff changeset
13
9203
07dae6fdae79 Renamed thread.h to pythread.h.
Guido van Rossum <guido@python.org>
parents: 8823
diff changeset
14 #include "pythread.h"
923
72aceed365d4 * Makefile adapted to changes below.
Guido van Rossum <guido@python.org>
parents:
diff changeset
15
4751
7ab835f87f86 Renamed.
Barry Warsaw <barry@python.org>
parents: 4600
diff changeset
16 static PyObject *ThreadError;
56981
6cf84e5a6dd7 Merged revisions 75958 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56440
diff changeset
17 static long nb_threads = 0;
64298
0265d5f7bd07 Issue #1868: Eliminate subtle timing issues in thread-local objects by
Antoine Pitrou <solipsis@pitrou.net>
parents: 64076
diff changeset
18 static PyObject *str_dict;
923
72aceed365d4 * Makefile adapted to changes below.
Guido van Rossum <guido@python.org>
parents:
diff changeset
19
72aceed365d4 * Makefile adapted to changes below.
Guido van Rossum <guido@python.org>
parents:
diff changeset
20 /* Lock objects */
72aceed365d4 * Makefile adapted to changes below.
Guido van Rossum <guido@python.org>
parents:
diff changeset
21
72aceed365d4 * Makefile adapted to changes below.
Guido van Rossum <guido@python.org>
parents:
diff changeset
22 typedef struct {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
23 PyObject_HEAD
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
24 PyThread_type_lock lock_lock;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
25 PyObject *in_weakreflist;
923
72aceed365d4 * Makefile adapted to changes below.
Guido van Rossum <guido@python.org>
parents:
diff changeset
26 } lockobject;
72aceed365d4 * Makefile adapted to changes below.
Guido van Rossum <guido@python.org>
parents:
diff changeset
27
72aceed365d4 * Makefile adapted to changes below.
Guido van Rossum <guido@python.org>
parents:
diff changeset
28 static void
13497
95454b73ea91 ANSI-fication
Peter Schneider-Kamp <nowonder@nowonder.de>
parents: 13256
diff changeset
29 lock_dealloc(lockobject *self)
923
72aceed365d4 * Makefile adapted to changes below.
Guido van Rossum <guido@python.org>
parents:
diff changeset
30 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
31 if (self->in_weakreflist != NULL)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
32 PyObject_ClearWeakRefs((PyObject *) self);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
33 if (self->lock_lock != NULL) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
34 /* Unlock the lock so it's safe to free it */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
35 PyThread_acquire_lock(self->lock_lock, 0);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
36 PyThread_release_lock(self->lock_lock);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
37
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
38 PyThread_free_lock(self->lock_lock);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
39 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
40 PyObject_Del(self);
923
72aceed365d4 * Makefile adapted to changes below.
Guido van Rossum <guido@python.org>
parents:
diff changeset
41 }
72aceed365d4 * Makefile adapted to changes below.
Guido van Rossum <guido@python.org>
parents:
diff changeset
42
66946
b750c45a772c Issue #8844: Regular and recursive lock acquisitions can now be interrupted
Antoine Pitrou <solipsis@pitrou.net>
parents: 64298
diff changeset
43 /* Helper to acquire an interruptible lock with a timeout. If the lock acquire
b750c45a772c Issue #8844: Regular and recursive lock acquisitions can now be interrupted
Antoine Pitrou <solipsis@pitrou.net>
parents: 64298
diff changeset
44 * is interrupted, signal handlers are run, and if they raise an exception,
b750c45a772c Issue #8844: Regular and recursive lock acquisitions can now be interrupted
Antoine Pitrou <solipsis@pitrou.net>
parents: 64298
diff changeset
45 * PY_LOCK_INTR is returned. Otherwise, PY_LOCK_ACQUIRED or PY_LOCK_FAILURE
b750c45a772c Issue #8844: Regular and recursive lock acquisitions can now be interrupted
Antoine Pitrou <solipsis@pitrou.net>
parents: 64298
diff changeset
46 * are returned, depending on whether the lock can be acquired withing the
b750c45a772c Issue #8844: Regular and recursive lock acquisitions can now be interrupted
Antoine Pitrou <solipsis@pitrou.net>
parents: 64298
diff changeset
47 * timeout.
b750c45a772c Issue #8844: Regular and recursive lock acquisitions can now be interrupted
Antoine Pitrou <solipsis@pitrou.net>
parents: 64298
diff changeset
48 */
b750c45a772c Issue #8844: Regular and recursive lock acquisitions can now be interrupted
Antoine Pitrou <solipsis@pitrou.net>
parents: 64298
diff changeset
49 static PyLockStatus
b750c45a772c Issue #8844: Regular and recursive lock acquisitions can now be interrupted
Antoine Pitrou <solipsis@pitrou.net>
parents: 64298
diff changeset
50 acquire_timed(PyThread_type_lock lock, PY_TIMEOUT_T microseconds)
b750c45a772c Issue #8844: Regular and recursive lock acquisitions can now be interrupted
Antoine Pitrou <solipsis@pitrou.net>
parents: 64298
diff changeset
51 {
b750c45a772c Issue #8844: Regular and recursive lock acquisitions can now be interrupted
Antoine Pitrou <solipsis@pitrou.net>
parents: 64298
diff changeset
52 PyLockStatus r;
b750c45a772c Issue #8844: Regular and recursive lock acquisitions can now be interrupted
Antoine Pitrou <solipsis@pitrou.net>
parents: 64298
diff changeset
53 _PyTime_timeval curtime;
b750c45a772c Issue #8844: Regular and recursive lock acquisitions can now be interrupted
Antoine Pitrou <solipsis@pitrou.net>
parents: 64298
diff changeset
54 _PyTime_timeval endtime;
b750c45a772c Issue #8844: Regular and recursive lock acquisitions can now be interrupted
Antoine Pitrou <solipsis@pitrou.net>
parents: 64298
diff changeset
55
68102
e2f96bd29252 Issue #8914: fix various warnings from the Clang static analyzer v254.
Brett Cannon <bcannon@gmail.com>
parents: 66946
diff changeset
56
e2f96bd29252 Issue #8914: fix various warnings from the Clang static analyzer v254.
Brett Cannon <bcannon@gmail.com>
parents: 66946
diff changeset
57 _PyTime_gettimeofday(&endtime);
66946
b750c45a772c Issue #8844: Regular and recursive lock acquisitions can now be interrupted
Antoine Pitrou <solipsis@pitrou.net>
parents: 64298
diff changeset
58 if (microseconds > 0) {
b750c45a772c Issue #8844: Regular and recursive lock acquisitions can now be interrupted
Antoine Pitrou <solipsis@pitrou.net>
parents: 64298
diff changeset
59 endtime.tv_sec += microseconds / (1000 * 1000);
b750c45a772c Issue #8844: Regular and recursive lock acquisitions can now be interrupted
Antoine Pitrou <solipsis@pitrou.net>
parents: 64298
diff changeset
60 endtime.tv_usec += microseconds % (1000 * 1000);
b750c45a772c Issue #8844: Regular and recursive lock acquisitions can now be interrupted
Antoine Pitrou <solipsis@pitrou.net>
parents: 64298
diff changeset
61 }
b750c45a772c Issue #8844: Regular and recursive lock acquisitions can now be interrupted
Antoine Pitrou <solipsis@pitrou.net>
parents: 64298
diff changeset
62
b750c45a772c Issue #8844: Regular and recursive lock acquisitions can now be interrupted
Antoine Pitrou <solipsis@pitrou.net>
parents: 64298
diff changeset
63
b750c45a772c Issue #8844: Regular and recursive lock acquisitions can now be interrupted
Antoine Pitrou <solipsis@pitrou.net>
parents: 64298
diff changeset
64 do {
b750c45a772c Issue #8844: Regular and recursive lock acquisitions can now be interrupted
Antoine Pitrou <solipsis@pitrou.net>
parents: 64298
diff changeset
65 Py_BEGIN_ALLOW_THREADS
b750c45a772c Issue #8844: Regular and recursive lock acquisitions can now be interrupted
Antoine Pitrou <solipsis@pitrou.net>
parents: 64298
diff changeset
66 r = PyThread_acquire_lock_timed(lock, microseconds, 1);
b750c45a772c Issue #8844: Regular and recursive lock acquisitions can now be interrupted
Antoine Pitrou <solipsis@pitrou.net>
parents: 64298
diff changeset
67 Py_END_ALLOW_THREADS
b750c45a772c Issue #8844: Regular and recursive lock acquisitions can now be interrupted
Antoine Pitrou <solipsis@pitrou.net>
parents: 64298
diff changeset
68
b750c45a772c Issue #8844: Regular and recursive lock acquisitions can now be interrupted
Antoine Pitrou <solipsis@pitrou.net>
parents: 64298
diff changeset
69 if (r == PY_LOCK_INTR) {
b750c45a772c Issue #8844: Regular and recursive lock acquisitions can now be interrupted
Antoine Pitrou <solipsis@pitrou.net>
parents: 64298
diff changeset
70 /* Run signal handlers if we were interrupted. Propagate
b750c45a772c Issue #8844: Regular and recursive lock acquisitions can now be interrupted
Antoine Pitrou <solipsis@pitrou.net>
parents: 64298
diff changeset
71 * exceptions from signal handlers, such as KeyboardInterrupt, by
b750c45a772c Issue #8844: Regular and recursive lock acquisitions can now be interrupted
Antoine Pitrou <solipsis@pitrou.net>
parents: 64298
diff changeset
72 * passing up PY_LOCK_INTR. */
b750c45a772c Issue #8844: Regular and recursive lock acquisitions can now be interrupted
Antoine Pitrou <solipsis@pitrou.net>
parents: 64298
diff changeset
73 if (Py_MakePendingCalls() < 0) {
b750c45a772c Issue #8844: Regular and recursive lock acquisitions can now be interrupted
Antoine Pitrou <solipsis@pitrou.net>
parents: 64298
diff changeset
74 return PY_LOCK_INTR;
b750c45a772c Issue #8844: Regular and recursive lock acquisitions can now be interrupted
Antoine Pitrou <solipsis@pitrou.net>
parents: 64298
diff changeset
75 }
b750c45a772c Issue #8844: Regular and recursive lock acquisitions can now be interrupted
Antoine Pitrou <solipsis@pitrou.net>
parents: 64298
diff changeset
76
b750c45a772c Issue #8844: Regular and recursive lock acquisitions can now be interrupted
Antoine Pitrou <solipsis@pitrou.net>
parents: 64298
diff changeset
77 /* If we're using a timeout, recompute the timeout after processing
b750c45a772c Issue #8844: Regular and recursive lock acquisitions can now be interrupted
Antoine Pitrou <solipsis@pitrou.net>
parents: 64298
diff changeset
78 * signals, since those can take time. */
b750c45a772c Issue #8844: Regular and recursive lock acquisitions can now be interrupted
Antoine Pitrou <solipsis@pitrou.net>
parents: 64298
diff changeset
79 if (microseconds >= 0) {
b750c45a772c Issue #8844: Regular and recursive lock acquisitions can now be interrupted
Antoine Pitrou <solipsis@pitrou.net>
parents: 64298
diff changeset
80 _PyTime_gettimeofday(&curtime);
b750c45a772c Issue #8844: Regular and recursive lock acquisitions can now be interrupted
Antoine Pitrou <solipsis@pitrou.net>
parents: 64298
diff changeset
81 microseconds = ((endtime.tv_sec - curtime.tv_sec) * 1000000 +
b750c45a772c Issue #8844: Regular and recursive lock acquisitions can now be interrupted
Antoine Pitrou <solipsis@pitrou.net>
parents: 64298
diff changeset
82 (endtime.tv_usec - curtime.tv_usec));
b750c45a772c Issue #8844: Regular and recursive lock acquisitions can now be interrupted
Antoine Pitrou <solipsis@pitrou.net>
parents: 64298
diff changeset
83
b750c45a772c Issue #8844: Regular and recursive lock acquisitions can now be interrupted
Antoine Pitrou <solipsis@pitrou.net>
parents: 64298
diff changeset
84 /* Check for negative values, since those mean block forever.
b750c45a772c Issue #8844: Regular and recursive lock acquisitions can now be interrupted
Antoine Pitrou <solipsis@pitrou.net>
parents: 64298
diff changeset
85 */
b750c45a772c Issue #8844: Regular and recursive lock acquisitions can now be interrupted
Antoine Pitrou <solipsis@pitrou.net>
parents: 64298
diff changeset
86 if (microseconds <= 0) {
b750c45a772c Issue #8844: Regular and recursive lock acquisitions can now be interrupted
Antoine Pitrou <solipsis@pitrou.net>
parents: 64298
diff changeset
87 r = PY_LOCK_FAILURE;
b750c45a772c Issue #8844: Regular and recursive lock acquisitions can now be interrupted
Antoine Pitrou <solipsis@pitrou.net>
parents: 64298
diff changeset
88 }
b750c45a772c Issue #8844: Regular and recursive lock acquisitions can now be interrupted
Antoine Pitrou <solipsis@pitrou.net>
parents: 64298
diff changeset
89 }
b750c45a772c Issue #8844: Regular and recursive lock acquisitions can now be interrupted
Antoine Pitrou <solipsis@pitrou.net>
parents: 64298
diff changeset
90 }
b750c45a772c Issue #8844: Regular and recursive lock acquisitions can now be interrupted
Antoine Pitrou <solipsis@pitrou.net>
parents: 64298
diff changeset
91 } while (r == PY_LOCK_INTR); /* Retry if we were interrupted. */
b750c45a772c Issue #8844: Regular and recursive lock acquisitions can now be interrupted
Antoine Pitrou <solipsis@pitrou.net>
parents: 64298
diff changeset
92
b750c45a772c Issue #8844: Regular and recursive lock acquisitions can now be interrupted
Antoine Pitrou <solipsis@pitrou.net>
parents: 64298
diff changeset
93 return r;
b750c45a772c Issue #8844: Regular and recursive lock acquisitions can now be interrupted
Antoine Pitrou <solipsis@pitrou.net>
parents: 64298
diff changeset
94 }
b750c45a772c Issue #8844: Regular and recursive lock acquisitions can now be interrupted
Antoine Pitrou <solipsis@pitrou.net>
parents: 64298
diff changeset
95
4751
7ab835f87f86 Renamed.
Barry Warsaw <barry@python.org>
parents: 4600
diff changeset
96 static PyObject *
60598
01d1fd775d16 Issue #7316: the acquire() method of lock objects in the :mod:`threading`
Antoine Pitrou <solipsis@pitrou.net>
parents: 59316
diff changeset
97 lock_PyThread_acquire_lock(lockobject *self, PyObject *args, PyObject *kwds)
923
72aceed365d4 * Makefile adapted to changes below.
Guido van Rossum <guido@python.org>
parents:
diff changeset
98 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
99 char *kwlist[] = {"blocking", "timeout", NULL};
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
100 int blocking = 1;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
101 double timeout = -1;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
102 PY_TIMEOUT_T microseconds;
66946
b750c45a772c Issue #8844: Regular and recursive lock acquisitions can now be interrupted
Antoine Pitrou <solipsis@pitrou.net>
parents: 64298
diff changeset
103 PyLockStatus r;
923
72aceed365d4 * Makefile adapted to changes below.
Guido van Rossum <guido@python.org>
parents:
diff changeset
104
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
105 if (!PyArg_ParseTupleAndKeywords(args, kwds, "|id:acquire", kwlist,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
106 &blocking, &timeout))
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
107 return NULL;
923
72aceed365d4 * Makefile adapted to changes below.
Guido van Rossum <guido@python.org>
parents:
diff changeset
108
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
109 if (!blocking && timeout != -1) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
110 PyErr_SetString(PyExc_ValueError, "can't specify a timeout "
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
111 "for a non-blocking call");
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
112 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
113 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
114 if (timeout < 0 && timeout != -1) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
115 PyErr_SetString(PyExc_ValueError, "timeout value must be "
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
116 "strictly positive");
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
117 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
118 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
119 if (!blocking)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
120 microseconds = 0;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
121 else if (timeout == -1)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
122 microseconds = -1;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
123 else {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
124 timeout *= 1e6;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
125 if (timeout >= (double) PY_TIMEOUT_MAX) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
126 PyErr_SetString(PyExc_OverflowError,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
127 "timeout value is too large");
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
128 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
129 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
130 microseconds = (PY_TIMEOUT_T) timeout;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
131 }
923
72aceed365d4 * Makefile adapted to changes below.
Guido van Rossum <guido@python.org>
parents:
diff changeset
132
66946
b750c45a772c Issue #8844: Regular and recursive lock acquisitions can now be interrupted
Antoine Pitrou <solipsis@pitrou.net>
parents: 64298
diff changeset
133 r = acquire_timed(self->lock_lock, microseconds);
b750c45a772c Issue #8844: Regular and recursive lock acquisitions can now be interrupted
Antoine Pitrou <solipsis@pitrou.net>
parents: 64298
diff changeset
134 if (r == PY_LOCK_INTR) {
b750c45a772c Issue #8844: Regular and recursive lock acquisitions can now be interrupted
Antoine Pitrou <solipsis@pitrou.net>
parents: 64298
diff changeset
135 return NULL;
b750c45a772c Issue #8844: Regular and recursive lock acquisitions can now be interrupted
Antoine Pitrou <solipsis@pitrou.net>
parents: 64298
diff changeset
136 }
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
137
66946
b750c45a772c Issue #8844: Regular and recursive lock acquisitions can now be interrupted
Antoine Pitrou <solipsis@pitrou.net>
parents: 64298
diff changeset
138 return PyBool_FromLong(r == PY_LOCK_ACQUIRED);
923
72aceed365d4 * Makefile adapted to changes below.
Guido van Rossum <guido@python.org>
parents:
diff changeset
139 }
72aceed365d4 * Makefile adapted to changes below.
Guido van Rossum <guido@python.org>
parents:
diff changeset
140
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 22865
diff changeset
141 PyDoc_STRVAR(acquire_doc,
22865
7014921820a5 Lock methods acquire() and locked() now return bools.
Guido van Rossum <guido@python.org>
parents: 22709
diff changeset
142 "acquire([wait]) -> None or bool\n\
36926
fc10ff322df1 Um, I thought I'd already checked this in.
Guido van Rossum <guido@python.org>
parents: 36895
diff changeset
143 (acquire_lock() is an obsolete synonym)\n\
8562
ff9adb57b8b5 Added doc strings. Also export LockType from the modoule, and give it
Guido van Rossum <guido@python.org>
parents: 8433
diff changeset
144 \n\
ff9adb57b8b5 Added doc strings. Also export LockType from the modoule, and give it
Guido van Rossum <guido@python.org>
parents: 8433
diff changeset
145 Lock the lock. Without argument, this blocks if the lock is already\n\
ff9adb57b8b5 Added doc strings. Also export LockType from the modoule, and give it
Guido van Rossum <guido@python.org>
parents: 8433
diff changeset
146 locked (even by the same thread), waiting for another thread to release\n\
22865
7014921820a5 Lock methods acquire() and locked() now return bools.
Guido van Rossum <guido@python.org>
parents: 22709
diff changeset
147 the lock, and return None once the lock is acquired.\n\
7014921820a5 Lock methods acquire() and locked() now return bools.
Guido van Rossum <guido@python.org>
parents: 22709
diff changeset
148 With an argument, this will only block if the argument is true,\n\
8562
ff9adb57b8b5 Added doc strings. Also export LockType from the modoule, and give it
Guido van Rossum <guido@python.org>
parents: 8433
diff changeset
149 and the return value reflects whether the lock is acquired.\n\
66946
b750c45a772c Issue #8844: Regular and recursive lock acquisitions can now be interrupted
Antoine Pitrou <solipsis@pitrou.net>
parents: 64298
diff changeset
150 The blocking operation is interruptible.");
8562
ff9adb57b8b5 Added doc strings. Also export LockType from the modoule, and give it
Guido van Rossum <guido@python.org>
parents: 8433
diff changeset
151
4751
7ab835f87f86 Renamed.
Barry Warsaw <barry@python.org>
parents: 4600
diff changeset
152 static PyObject *
22561
043ad7adc896 Remove many uses of PyArg_NoArgs macro, change METH_OLDARGS to METH_NOARGS.
Neal Norwitz <nnorwitz@gmail.com>
parents: 21313
diff changeset
153 lock_PyThread_release_lock(lockobject *self)
923
72aceed365d4 * Makefile adapted to changes below.
Guido van Rossum <guido@python.org>
parents:
diff changeset
154 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
155 /* Sanity check: the lock must be locked */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
156 if (PyThread_acquire_lock(self->lock_lock, 0)) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
157 PyThread_release_lock(self->lock_lock);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
158 PyErr_SetString(ThreadError, "release unlocked lock");
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
159 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
160 }
923
72aceed365d4 * Makefile adapted to changes below.
Guido van Rossum <guido@python.org>
parents:
diff changeset
161
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
162 PyThread_release_lock(self->lock_lock);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
163 Py_INCREF(Py_None);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
164 return Py_None;
923
72aceed365d4 * Makefile adapted to changes below.
Guido van Rossum <guido@python.org>
parents:
diff changeset
165 }
72aceed365d4 * Makefile adapted to changes below.
Guido van Rossum <guido@python.org>
parents:
diff changeset
166
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 22865
diff changeset
167 PyDoc_STRVAR(release_doc,
8562
ff9adb57b8b5 Added doc strings. Also export LockType from the modoule, and give it
Guido van Rossum <guido@python.org>
parents: 8433
diff changeset
168 "release()\n\
36926
fc10ff322df1 Um, I thought I'd already checked this in.
Guido van Rossum <guido@python.org>
parents: 36895
diff changeset
169 (release_lock() is an obsolete synonym)\n\
8562
ff9adb57b8b5 Added doc strings. Also export LockType from the modoule, and give it
Guido van Rossum <guido@python.org>
parents: 8433
diff changeset
170 \n\
ff9adb57b8b5 Added doc strings. Also export LockType from the modoule, and give it
Guido van Rossum <guido@python.org>
parents: 8433
diff changeset
171 Release the lock, allowing another thread that is blocked waiting for\n\
ff9adb57b8b5 Added doc strings. Also export LockType from the modoule, and give it
Guido van Rossum <guido@python.org>
parents: 8433
diff changeset
172 the lock to acquire the lock. The lock must be in the locked state,\n\
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 22865
diff changeset
173 but it needn't be locked by the same thread that unlocks it.");
8562
ff9adb57b8b5 Added doc strings. Also export LockType from the modoule, and give it
Guido van Rossum <guido@python.org>
parents: 8433
diff changeset
174
4751
7ab835f87f86 Renamed.
Barry Warsaw <barry@python.org>
parents: 4600
diff changeset
175 static PyObject *
22561
043ad7adc896 Remove many uses of PyArg_NoArgs macro, change METH_OLDARGS to METH_NOARGS.
Neal Norwitz <nnorwitz@gmail.com>
parents: 21313
diff changeset
176 lock_locked_lock(lockobject *self)
923
72aceed365d4 * Makefile adapted to changes below.
Guido van Rossum <guido@python.org>
parents:
diff changeset
177 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
178 if (PyThread_acquire_lock(self->lock_lock, 0)) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
179 PyThread_release_lock(self->lock_lock);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
180 return PyBool_FromLong(0L);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
181 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
182 return PyBool_FromLong(1L);
923
72aceed365d4 * Makefile adapted to changes below.
Guido van Rossum <guido@python.org>
parents:
diff changeset
183 }
72aceed365d4 * Makefile adapted to changes below.
Guido van Rossum <guido@python.org>
parents:
diff changeset
184
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 22865
diff changeset
185 PyDoc_STRVAR(locked_doc,
22865
7014921820a5 Lock methods acquire() and locked() now return bools.
Guido van Rossum <guido@python.org>
parents: 22709
diff changeset
186 "locked() -> bool\n\
8562
ff9adb57b8b5 Added doc strings. Also export LockType from the modoule, and give it
Guido van Rossum <guido@python.org>
parents: 8433
diff changeset
187 (locked_lock() is an obsolete synonym)\n\
ff9adb57b8b5 Added doc strings. Also export LockType from the modoule, and give it
Guido van Rossum <guido@python.org>
parents: 8433
diff changeset
188 \n\
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 22865
diff changeset
189 Return whether the lock is in the locked state.");
8562
ff9adb57b8b5 Added doc strings. Also export LockType from the modoule, and give it
Guido van Rossum <guido@python.org>
parents: 8433
diff changeset
190
4751
7ab835f87f86 Renamed.
Barry Warsaw <barry@python.org>
parents: 4600
diff changeset
191 static PyMethodDef lock_methods[] = {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
192 {"acquire_lock", (PyCFunction)lock_PyThread_acquire_lock,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
193 METH_VARARGS | METH_KEYWORDS, acquire_doc},
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
194 {"acquire", (PyCFunction)lock_PyThread_acquire_lock,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
195 METH_VARARGS | METH_KEYWORDS, acquire_doc},
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
196 {"release_lock", (PyCFunction)lock_PyThread_release_lock,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
197 METH_NOARGS, release_doc},
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
198 {"release", (PyCFunction)lock_PyThread_release_lock,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
199 METH_NOARGS, release_doc},
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
200 {"locked_lock", (PyCFunction)lock_locked_lock,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
201 METH_NOARGS, locked_doc},
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
202 {"locked", (PyCFunction)lock_locked_lock,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
203 METH_NOARGS, locked_doc},
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
204 {"__enter__", (PyCFunction)lock_PyThread_acquire_lock,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
205 METH_VARARGS | METH_KEYWORDS, acquire_doc},
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
206 {"__exit__", (PyCFunction)lock_PyThread_release_lock,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
207 METH_VARARGS, release_doc},
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
208 {NULL, NULL} /* sentinel */
923
72aceed365d4 * Makefile adapted to changes below.
Guido van Rossum <guido@python.org>
parents:
diff changeset
209 };
72aceed365d4 * Makefile adapted to changes below.
Guido van Rossum <guido@python.org>
parents:
diff changeset
210
4751
7ab835f87f86 Renamed.
Barry Warsaw <barry@python.org>
parents: 4600
diff changeset
211 static PyTypeObject Locktype = {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
212 PyVarObject_HEAD_INIT(&PyType_Type, 0)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
213 "_thread.lock", /*tp_name*/
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
214 sizeof(lockobject), /*tp_size*/
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
215 0, /*tp_itemsize*/
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
216 /* methods */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
217 (destructor)lock_dealloc, /*tp_dealloc*/
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
218 0, /*tp_print*/
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
219 0, /*tp_getattr*/
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
220 0, /*tp_setattr*/
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
221 0, /*tp_reserved*/
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
222 0, /*tp_repr*/
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
223 0, /*tp_as_number*/
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
224 0, /*tp_as_sequence*/
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
225 0, /*tp_as_mapping*/
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
226 0, /*tp_hash*/
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
227 0, /*tp_call*/
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
228 0, /*tp_str*/
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
229 0, /*tp_getattro*/
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
230 0, /*tp_setattro*/
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
231 0, /*tp_as_buffer*/
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
232 Py_TPFLAGS_DEFAULT, /*tp_flags*/
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
233 0, /*tp_doc*/
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
234 0, /*tp_traverse*/
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
235 0, /*tp_clear*/
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
236 0, /*tp_richcompare*/
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
237 offsetof(lockobject, in_weakreflist), /*tp_weaklistoffset*/
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
238 0, /*tp_iter*/
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
239 0, /*tp_iternext*/
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
240 lock_methods, /*tp_methods*/
923
72aceed365d4 * Makefile adapted to changes below.
Guido van Rossum <guido@python.org>
parents:
diff changeset
241 };
72aceed365d4 * Makefile adapted to changes below.
Guido van Rossum <guido@python.org>
parents:
diff changeset
242
57172
6d91aaadddd0 Issue #3001: Add a C implementation of recursive locks which is used by
Antoine Pitrou <solipsis@pitrou.net>
parents: 56992
diff changeset
243 /* Recursive lock objects */
6d91aaadddd0 Issue #3001: Add a C implementation of recursive locks which is used by
Antoine Pitrou <solipsis@pitrou.net>
parents: 56992
diff changeset
244
6d91aaadddd0 Issue #3001: Add a C implementation of recursive locks which is used by
Antoine Pitrou <solipsis@pitrou.net>
parents: 56992
diff changeset
245 typedef struct {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
246 PyObject_HEAD
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
247 PyThread_type_lock rlock_lock;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
248 long rlock_owner;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
249 unsigned long rlock_count;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
250 PyObject *in_weakreflist;
57172
6d91aaadddd0 Issue #3001: Add a C implementation of recursive locks which is used by
Antoine Pitrou <solipsis@pitrou.net>
parents: 56992
diff changeset
251 } rlockobject;
6d91aaadddd0 Issue #3001: Add a C implementation of recursive locks which is used by
Antoine Pitrou <solipsis@pitrou.net>
parents: 56992
diff changeset
252
6d91aaadddd0 Issue #3001: Add a C implementation of recursive locks which is used by
Antoine Pitrou <solipsis@pitrou.net>
parents: 56992
diff changeset
253 static void
6d91aaadddd0 Issue #3001: Add a C implementation of recursive locks which is used by
Antoine Pitrou <solipsis@pitrou.net>
parents: 56992
diff changeset
254 rlock_dealloc(rlockobject *self)
6d91aaadddd0 Issue #3001: Add a C implementation of recursive locks which is used by
Antoine Pitrou <solipsis@pitrou.net>
parents: 56992
diff changeset
255 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
256 assert(self->rlock_lock);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
257 if (self->in_weakreflist != NULL)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
258 PyObject_ClearWeakRefs((PyObject *) self);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
259 /* Unlock the lock so it's safe to free it */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
260 if (self->rlock_count > 0)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
261 PyThread_release_lock(self->rlock_lock);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
262
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
263 PyThread_free_lock(self->rlock_lock);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
264 Py_TYPE(self)->tp_free(self);
57172
6d91aaadddd0 Issue #3001: Add a C implementation of recursive locks which is used by
Antoine Pitrou <solipsis@pitrou.net>
parents: 56992
diff changeset
265 }
6d91aaadddd0 Issue #3001: Add a C implementation of recursive locks which is used by
Antoine Pitrou <solipsis@pitrou.net>
parents: 56992
diff changeset
266
6d91aaadddd0 Issue #3001: Add a C implementation of recursive locks which is used by
Antoine Pitrou <solipsis@pitrou.net>
parents: 56992
diff changeset
267 static PyObject *
6d91aaadddd0 Issue #3001: Add a C implementation of recursive locks which is used by
Antoine Pitrou <solipsis@pitrou.net>
parents: 56992
diff changeset
268 rlock_acquire(rlockobject *self, PyObject *args, PyObject *kwds)
6d91aaadddd0 Issue #3001: Add a C implementation of recursive locks which is used by
Antoine Pitrou <solipsis@pitrou.net>
parents: 56992
diff changeset
269 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
270 char *kwlist[] = {"blocking", "timeout", NULL};
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
271 int blocking = 1;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
272 double timeout = -1;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
273 PY_TIMEOUT_T microseconds;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
274 long tid;
66946
b750c45a772c Issue #8844: Regular and recursive lock acquisitions can now be interrupted
Antoine Pitrou <solipsis@pitrou.net>
parents: 64298
diff changeset
275 PyLockStatus r = PY_LOCK_ACQUIRED;
57172
6d91aaadddd0 Issue #3001: Add a C implementation of recursive locks which is used by
Antoine Pitrou <solipsis@pitrou.net>
parents: 56992
diff changeset
276
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
277 if (!PyArg_ParseTupleAndKeywords(args, kwds, "|id:acquire", kwlist,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
278 &blocking, &timeout))
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
279 return NULL;
57172
6d91aaadddd0 Issue #3001: Add a C implementation of recursive locks which is used by
Antoine Pitrou <solipsis@pitrou.net>
parents: 56992
diff changeset
280
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
281 if (!blocking && timeout != -1) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
282 PyErr_SetString(PyExc_ValueError, "can't specify a timeout "
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
283 "for a non-blocking call");
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
284 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
285 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
286 if (timeout < 0 && timeout != -1) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
287 PyErr_SetString(PyExc_ValueError, "timeout value must be "
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
288 "strictly positive");
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
289 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
290 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
291 if (!blocking)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
292 microseconds = 0;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
293 else if (timeout == -1)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
294 microseconds = -1;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
295 else {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
296 timeout *= 1e6;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
297 if (timeout >= (double) PY_TIMEOUT_MAX) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
298 PyErr_SetString(PyExc_OverflowError,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
299 "timeout value is too large");
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
300 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
301 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
302 microseconds = (PY_TIMEOUT_T) timeout;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
303 }
57172
6d91aaadddd0 Issue #3001: Add a C implementation of recursive locks which is used by
Antoine Pitrou <solipsis@pitrou.net>
parents: 56992
diff changeset
304
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
305 tid = PyThread_get_thread_ident();
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
306 if (self->rlock_count > 0 && tid == self->rlock_owner) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
307 unsigned long count = self->rlock_count + 1;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
308 if (count <= self->rlock_count) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
309 PyErr_SetString(PyExc_OverflowError,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
310 "Internal lock count overflowed");
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
311 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
312 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
313 self->rlock_count = count;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
314 Py_RETURN_TRUE;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
315 }
57172
6d91aaadddd0 Issue #3001: Add a C implementation of recursive locks which is used by
Antoine Pitrou <solipsis@pitrou.net>
parents: 56992
diff changeset
316
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
317 if (self->rlock_count > 0 ||
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
318 !PyThread_acquire_lock(self->rlock_lock, 0)) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
319 if (microseconds == 0) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
320 Py_RETURN_FALSE;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
321 }
66946
b750c45a772c Issue #8844: Regular and recursive lock acquisitions can now be interrupted
Antoine Pitrou <solipsis@pitrou.net>
parents: 64298
diff changeset
322 r = acquire_timed(self->rlock_lock, microseconds);
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
323 }
66946
b750c45a772c Issue #8844: Regular and recursive lock acquisitions can now be interrupted
Antoine Pitrou <solipsis@pitrou.net>
parents: 64298
diff changeset
324 if (r == PY_LOCK_ACQUIRED) {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
325 assert(self->rlock_count == 0);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
326 self->rlock_owner = tid;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
327 self->rlock_count = 1;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
328 }
66946
b750c45a772c Issue #8844: Regular and recursive lock acquisitions can now be interrupted
Antoine Pitrou <solipsis@pitrou.net>
parents: 64298
diff changeset
329 else if (r == PY_LOCK_INTR) {
b750c45a772c Issue #8844: Regular and recursive lock acquisitions can now be interrupted
Antoine Pitrou <solipsis@pitrou.net>
parents: 64298
diff changeset
330 return NULL;
b750c45a772c Issue #8844: Regular and recursive lock acquisitions can now be interrupted
Antoine Pitrou <solipsis@pitrou.net>
parents: 64298
diff changeset
331 }
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
332
66946
b750c45a772c Issue #8844: Regular and recursive lock acquisitions can now be interrupted
Antoine Pitrou <solipsis@pitrou.net>
parents: 64298
diff changeset
333 return PyBool_FromLong(r == PY_LOCK_ACQUIRED);
57172
6d91aaadddd0 Issue #3001: Add a C implementation of recursive locks which is used by
Antoine Pitrou <solipsis@pitrou.net>
parents: 56992
diff changeset
334 }
6d91aaadddd0 Issue #3001: Add a C implementation of recursive locks which is used by
Antoine Pitrou <solipsis@pitrou.net>
parents: 56992
diff changeset
335
6d91aaadddd0 Issue #3001: Add a C implementation of recursive locks which is used by
Antoine Pitrou <solipsis@pitrou.net>
parents: 56992
diff changeset
336 PyDoc_STRVAR(rlock_acquire_doc,
6d91aaadddd0 Issue #3001: Add a C implementation of recursive locks which is used by
Antoine Pitrou <solipsis@pitrou.net>
parents: 56992
diff changeset
337 "acquire(blocking=True) -> bool\n\
6d91aaadddd0 Issue #3001: Add a C implementation of recursive locks which is used by
Antoine Pitrou <solipsis@pitrou.net>
parents: 56992
diff changeset
338 \n\
6d91aaadddd0 Issue #3001: Add a C implementation of recursive locks which is used by
Antoine Pitrou <solipsis@pitrou.net>
parents: 56992
diff changeset
339 Lock the lock. `blocking` indicates whether we should wait\n\
6d91aaadddd0 Issue #3001: Add a C implementation of recursive locks which is used by
Antoine Pitrou <solipsis@pitrou.net>
parents: 56992
diff changeset
340 for the lock to be available or not. If `blocking` is False\n\
6d91aaadddd0 Issue #3001: Add a C implementation of recursive locks which is used by
Antoine Pitrou <solipsis@pitrou.net>
parents: 56992
diff changeset
341 and another thread holds the lock, the method will return False\n\
6d91aaadddd0 Issue #3001: Add a C implementation of recursive locks which is used by
Antoine Pitrou <solipsis@pitrou.net>
parents: 56992
diff changeset
342 immediately. If `blocking` is True and another thread holds\n\
6d91aaadddd0 Issue #3001: Add a C implementation of recursive locks which is used by
Antoine Pitrou <solipsis@pitrou.net>
parents: 56992
diff changeset
343 the lock, the method will wait for the lock to be released,\n\
6d91aaadddd0 Issue #3001: Add a C implementation of recursive locks which is used by
Antoine Pitrou <solipsis@pitrou.net>
parents: 56992
diff changeset
344 take it and then return True.\n\
66946
b750c45a772c Issue #8844: Regular and recursive lock acquisitions can now be interrupted
Antoine Pitrou <solipsis@pitrou.net>
parents: 64298
diff changeset
345 (note: the blocking operation is interruptible.)\n\
57172
6d91aaadddd0 Issue #3001: Add a C implementation of recursive locks which is used by
Antoine Pitrou <solipsis@pitrou.net>
parents: 56992
diff changeset
346 \n\
6d91aaadddd0 Issue #3001: Add a C implementation of recursive locks which is used by
Antoine Pitrou <solipsis@pitrou.net>
parents: 56992
diff changeset
347 In all other cases, the method will return True immediately.\n\
6d91aaadddd0 Issue #3001: Add a C implementation of recursive locks which is used by
Antoine Pitrou <solipsis@pitrou.net>
parents: 56992
diff changeset
348 Precisely, if the current thread already holds the lock, its\n\
6d91aaadddd0 Issue #3001: Add a C implementation of recursive locks which is used by
Antoine Pitrou <solipsis@pitrou.net>
parents: 56992
diff changeset
349 internal counter is simply incremented. If nobody holds the lock,\n\
6d91aaadddd0 Issue #3001: Add a C implementation of recursive locks which is used by
Antoine Pitrou <solipsis@pitrou.net>
parents: 56992
diff changeset
350 the lock is taken and its internal counter initialized to 1.");
6d91aaadddd0 Issue #3001: Add a C implementation of recursive locks which is used by
Antoine Pitrou <solipsis@pitrou.net>
parents: 56992
diff changeset
351
6d91aaadddd0 Issue #3001: Add a C implementation of recursive locks which is used by
Antoine Pitrou <solipsis@pitrou.net>
parents: 56992
diff changeset
352 static PyObject *
6d91aaadddd0 Issue #3001: Add a C implementation of recursive locks which is used by
Antoine Pitrou <solipsis@pitrou.net>
parents: 56992
diff changeset
353 rlock_release(rlockobject *self)
6d91aaadddd0 Issue #3001: Add a C implementation of recursive locks which is used by
Antoine Pitrou <solipsis@pitrou.net>
parents: 56992
diff changeset
354 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
355 long tid = PyThread_get_thread_ident();
57172
6d91aaadddd0 Issue #3001: Add a C implementation of recursive locks which is used by
Antoine Pitrou <solipsis@pitrou.net>
parents: 56992
diff changeset
356
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
357 if (self->rlock_count == 0 || self->rlock_owner != tid) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
358 PyErr_SetString(PyExc_RuntimeError,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
359 "cannot release un-acquired lock");
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
360 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
361 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
362 if (--self->rlock_count == 0) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
363 self->rlock_owner = 0;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
364 PyThread_release_lock(self->rlock_lock);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
365 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
366 Py_RETURN_NONE;
57172
6d91aaadddd0 Issue #3001: Add a C implementation of recursive locks which is used by
Antoine Pitrou <solipsis@pitrou.net>
parents: 56992
diff changeset
367 }
6d91aaadddd0 Issue #3001: Add a C implementation of recursive locks which is used by
Antoine Pitrou <solipsis@pitrou.net>
parents: 56992
diff changeset
368
6d91aaadddd0 Issue #3001: Add a C implementation of recursive locks which is used by
Antoine Pitrou <solipsis@pitrou.net>
parents: 56992
diff changeset
369 PyDoc_STRVAR(rlock_release_doc,
6d91aaadddd0 Issue #3001: Add a C implementation of recursive locks which is used by
Antoine Pitrou <solipsis@pitrou.net>
parents: 56992
diff changeset
370 "release()\n\
6d91aaadddd0 Issue #3001: Add a C implementation of recursive locks which is used by
Antoine Pitrou <solipsis@pitrou.net>
parents: 56992
diff changeset
371 \n\
6d91aaadddd0 Issue #3001: Add a C implementation of recursive locks which is used by
Antoine Pitrou <solipsis@pitrou.net>
parents: 56992
diff changeset
372 Release the lock, allowing another thread that is blocked waiting for\n\
6d91aaadddd0 Issue #3001: Add a C implementation of recursive locks which is used by
Antoine Pitrou <solipsis@pitrou.net>
parents: 56992
diff changeset
373 the lock to acquire the lock. The lock must be in the locked state,\n\
6d91aaadddd0 Issue #3001: Add a C implementation of recursive locks which is used by
Antoine Pitrou <solipsis@pitrou.net>
parents: 56992
diff changeset
374 and must be locked by the same thread that unlocks it; otherwise a\n\
6d91aaadddd0 Issue #3001: Add a C implementation of recursive locks which is used by
Antoine Pitrou <solipsis@pitrou.net>
parents: 56992
diff changeset
375 `RuntimeError` is raised.\n\
6d91aaadddd0 Issue #3001: Add a C implementation of recursive locks which is used by
Antoine Pitrou <solipsis@pitrou.net>
parents: 56992
diff changeset
376 \n\
6d91aaadddd0 Issue #3001: Add a C implementation of recursive locks which is used by
Antoine Pitrou <solipsis@pitrou.net>
parents: 56992
diff changeset
377 Do note that if the lock was acquire()d several times in a row by the\n\
6d91aaadddd0 Issue #3001: Add a C implementation of recursive locks which is used by
Antoine Pitrou <solipsis@pitrou.net>
parents: 56992
diff changeset
378 current thread, release() needs to be called as many times for the lock\n\
6d91aaadddd0 Issue #3001: Add a C implementation of recursive locks which is used by
Antoine Pitrou <solipsis@pitrou.net>
parents: 56992
diff changeset
379 to be available for other threads.");
6d91aaadddd0 Issue #3001: Add a C implementation of recursive locks which is used by
Antoine Pitrou <solipsis@pitrou.net>
parents: 56992
diff changeset
380
6d91aaadddd0 Issue #3001: Add a C implementation of recursive locks which is used by
Antoine Pitrou <solipsis@pitrou.net>
parents: 56992
diff changeset
381 static PyObject *
6d91aaadddd0 Issue #3001: Add a C implementation of recursive locks which is used by
Antoine Pitrou <solipsis@pitrou.net>
parents: 56992
diff changeset
382 rlock_acquire_restore(rlockobject *self, PyObject *arg)
6d91aaadddd0 Issue #3001: Add a C implementation of recursive locks which is used by
Antoine Pitrou <solipsis@pitrou.net>
parents: 56992
diff changeset
383 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
384 long owner;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
385 unsigned long count;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
386 int r = 1;
57172
6d91aaadddd0 Issue #3001: Add a C implementation of recursive locks which is used by
Antoine Pitrou <solipsis@pitrou.net>
parents: 56992
diff changeset
387
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
388 if (!PyArg_ParseTuple(arg, "kl:_acquire_restore", &count, &owner))
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
389 return NULL;
57172
6d91aaadddd0 Issue #3001: Add a C implementation of recursive locks which is used by
Antoine Pitrou <solipsis@pitrou.net>
parents: 56992
diff changeset
390
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
391 if (!PyThread_acquire_lock(self->rlock_lock, 0)) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
392 Py_BEGIN_ALLOW_THREADS
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
393 r = PyThread_acquire_lock(self->rlock_lock, 1);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
394 Py_END_ALLOW_THREADS
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
395 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
396 if (!r) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
397 PyErr_SetString(ThreadError, "couldn't acquire lock");
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
398 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
399 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
400 assert(self->rlock_count == 0);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
401 self->rlock_owner = owner;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
402 self->rlock_count = count;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
403 Py_RETURN_NONE;
57172
6d91aaadddd0 Issue #3001: Add a C implementation of recursive locks which is used by
Antoine Pitrou <solipsis@pitrou.net>
parents: 56992
diff changeset
404 }
6d91aaadddd0 Issue #3001: Add a C implementation of recursive locks which is used by
Antoine Pitrou <solipsis@pitrou.net>
parents: 56992
diff changeset
405
6d91aaadddd0 Issue #3001: Add a C implementation of recursive locks which is used by
Antoine Pitrou <solipsis@pitrou.net>
parents: 56992
diff changeset
406 PyDoc_STRVAR(rlock_acquire_restore_doc,
6d91aaadddd0 Issue #3001: Add a C implementation of recursive locks which is used by
Antoine Pitrou <solipsis@pitrou.net>
parents: 56992
diff changeset
407 "_acquire_restore(state) -> None\n\
6d91aaadddd0 Issue #3001: Add a C implementation of recursive locks which is used by
Antoine Pitrou <solipsis@pitrou.net>
parents: 56992
diff changeset
408 \n\
6d91aaadddd0 Issue #3001: Add a C implementation of recursive locks which is used by
Antoine Pitrou <solipsis@pitrou.net>
parents: 56992
diff changeset
409 For internal use by `threading.Condition`.");
6d91aaadddd0 Issue #3001: Add a C implementation of recursive locks which is used by
Antoine Pitrou <solipsis@pitrou.net>
parents: 56992
diff changeset
410
6d91aaadddd0 Issue #3001: Add a C implementation of recursive locks which is used by
Antoine Pitrou <solipsis@pitrou.net>
parents: 56992
diff changeset
411 static PyObject *
6d91aaadddd0 Issue #3001: Add a C implementation of recursive locks which is used by
Antoine Pitrou <solipsis@pitrou.net>
parents: 56992
diff changeset
412 rlock_release_save(rlockobject *self)
6d91aaadddd0 Issue #3001: Add a C implementation of recursive locks which is used by
Antoine Pitrou <solipsis@pitrou.net>
parents: 56992
diff changeset
413 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
414 long owner;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
415 unsigned long count;
57172
6d91aaadddd0 Issue #3001: Add a C implementation of recursive locks which is used by
Antoine Pitrou <solipsis@pitrou.net>
parents: 56992
diff changeset
416
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
417 owner = self->rlock_owner;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
418 count = self->rlock_count;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
419 self->rlock_count = 0;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
420 self->rlock_owner = 0;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
421 PyThread_release_lock(self->rlock_lock);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
422 return Py_BuildValue("kl", count, owner);
57172
6d91aaadddd0 Issue #3001: Add a C implementation of recursive locks which is used by
Antoine Pitrou <solipsis@pitrou.net>
parents: 56992
diff changeset
423 }
6d91aaadddd0 Issue #3001: Add a C implementation of recursive locks which is used by
Antoine Pitrou <solipsis@pitrou.net>
parents: 56992
diff changeset
424
6d91aaadddd0 Issue #3001: Add a C implementation of recursive locks which is used by
Antoine Pitrou <solipsis@pitrou.net>
parents: 56992
diff changeset
425 PyDoc_STRVAR(rlock_release_save_doc,
6d91aaadddd0 Issue #3001: Add a C implementation of recursive locks which is used by
Antoine Pitrou <solipsis@pitrou.net>
parents: 56992
diff changeset
426 "_release_save() -> tuple\n\
6d91aaadddd0 Issue #3001: Add a C implementation of recursive locks which is used by
Antoine Pitrou <solipsis@pitrou.net>
parents: 56992
diff changeset
427 \n\
6d91aaadddd0 Issue #3001: Add a C implementation of recursive locks which is used by
Antoine Pitrou <solipsis@pitrou.net>
parents: 56992
diff changeset
428 For internal use by `threading.Condition`.");
6d91aaadddd0 Issue #3001: Add a C implementation of recursive locks which is used by
Antoine Pitrou <solipsis@pitrou.net>
parents: 56992
diff changeset
429
6d91aaadddd0 Issue #3001: Add a C implementation of recursive locks which is used by
Antoine Pitrou <solipsis@pitrou.net>
parents: 56992
diff changeset
430
6d91aaadddd0 Issue #3001: Add a C implementation of recursive locks which is used by
Antoine Pitrou <solipsis@pitrou.net>
parents: 56992
diff changeset
431 static PyObject *
6d91aaadddd0 Issue #3001: Add a C implementation of recursive locks which is used by
Antoine Pitrou <solipsis@pitrou.net>
parents: 56992
diff changeset
432 rlock_is_owned(rlockobject *self)
6d91aaadddd0 Issue #3001: Add a C implementation of recursive locks which is used by
Antoine Pitrou <solipsis@pitrou.net>
parents: 56992
diff changeset
433 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
434 long tid = PyThread_get_thread_ident();
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
435
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
436 if (self->rlock_count > 0 && self->rlock_owner == tid) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
437 Py_RETURN_TRUE;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
438 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
439 Py_RETURN_FALSE;
57172
6d91aaadddd0 Issue #3001: Add a C implementation of recursive locks which is used by
Antoine Pitrou <solipsis@pitrou.net>
parents: 56992
diff changeset
440 }
6d91aaadddd0 Issue #3001: Add a C implementation of recursive locks which is used by
Antoine Pitrou <solipsis@pitrou.net>
parents: 56992
diff changeset
441
6d91aaadddd0 Issue #3001: Add a C implementation of recursive locks which is used by
Antoine Pitrou <solipsis@pitrou.net>
parents: 56992
diff changeset
442 PyDoc_STRVAR(rlock_is_owned_doc,
6d91aaadddd0 Issue #3001: Add a C implementation of recursive locks which is used by
Antoine Pitrou <solipsis@pitrou.net>
parents: 56992
diff changeset
443 "_is_owned() -> bool\n\
6d91aaadddd0 Issue #3001: Add a C implementation of recursive locks which is used by
Antoine Pitrou <solipsis@pitrou.net>
parents: 56992
diff changeset
444 \n\
6d91aaadddd0 Issue #3001: Add a C implementation of recursive locks which is used by
Antoine Pitrou <solipsis@pitrou.net>
parents: 56992
diff changeset
445 For internal use by `threading.Condition`.");
6d91aaadddd0 Issue #3001: Add a C implementation of recursive locks which is used by
Antoine Pitrou <solipsis@pitrou.net>
parents: 56992
diff changeset
446
6d91aaadddd0 Issue #3001: Add a C implementation of recursive locks which is used by
Antoine Pitrou <solipsis@pitrou.net>
parents: 56992
diff changeset
447 static PyObject *
6d91aaadddd0 Issue #3001: Add a C implementation of recursive locks which is used by
Antoine Pitrou <solipsis@pitrou.net>
parents: 56992
diff changeset
448 rlock_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
6d91aaadddd0 Issue #3001: Add a C implementation of recursive locks which is used by
Antoine Pitrou <solipsis@pitrou.net>
parents: 56992
diff changeset
449 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
450 rlockobject *self;
57172
6d91aaadddd0 Issue #3001: Add a C implementation of recursive locks which is used by
Antoine Pitrou <solipsis@pitrou.net>
parents: 56992
diff changeset
451
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
452 self = (rlockobject *) type->tp_alloc(type, 0);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
453 if (self != NULL) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
454 self->rlock_lock = PyThread_allocate_lock();
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
455 if (self->rlock_lock == NULL) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
456 type->tp_free(self);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
457 PyErr_SetString(ThreadError, "can't allocate lock");
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
458 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
459 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
460 self->in_weakreflist = NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
461 self->rlock_owner = 0;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
462 self->rlock_count = 0;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
463 }
57172
6d91aaadddd0 Issue #3001: Add a C implementation of recursive locks which is used by
Antoine Pitrou <solipsis@pitrou.net>
parents: 56992
diff changeset
464
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
465 return (PyObject *) self;
57172
6d91aaadddd0 Issue #3001: Add a C implementation of recursive locks which is used by
Antoine Pitrou <solipsis@pitrou.net>
parents: 56992
diff changeset
466 }
6d91aaadddd0 Issue #3001: Add a C implementation of recursive locks which is used by
Antoine Pitrou <solipsis@pitrou.net>
parents: 56992
diff changeset
467
6d91aaadddd0 Issue #3001: Add a C implementation of recursive locks which is used by
Antoine Pitrou <solipsis@pitrou.net>
parents: 56992
diff changeset
468 static PyObject *
6d91aaadddd0 Issue #3001: Add a C implementation of recursive locks which is used by
Antoine Pitrou <solipsis@pitrou.net>
parents: 56992
diff changeset
469 rlock_repr(rlockobject *self)
6d91aaadddd0 Issue #3001: Add a C implementation of recursive locks which is used by
Antoine Pitrou <solipsis@pitrou.net>
parents: 56992
diff changeset
470 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
471 return PyUnicode_FromFormat("<%s owner=%ld count=%lu>",
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
472 Py_TYPE(self)->tp_name, self->rlock_owner, self->rlock_count);
57172
6d91aaadddd0 Issue #3001: Add a C implementation of recursive locks which is used by
Antoine Pitrou <solipsis@pitrou.net>
parents: 56992
diff changeset
473 }
6d91aaadddd0 Issue #3001: Add a C implementation of recursive locks which is used by
Antoine Pitrou <solipsis@pitrou.net>
parents: 56992
diff changeset
474
6d91aaadddd0 Issue #3001: Add a C implementation of recursive locks which is used by
Antoine Pitrou <solipsis@pitrou.net>
parents: 56992
diff changeset
475
6d91aaadddd0 Issue #3001: Add a C implementation of recursive locks which is used by
Antoine Pitrou <solipsis@pitrou.net>
parents: 56992
diff changeset
476 static PyMethodDef rlock_methods[] = {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
477 {"acquire", (PyCFunction)rlock_acquire,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
478 METH_VARARGS | METH_KEYWORDS, rlock_acquire_doc},
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
479 {"release", (PyCFunction)rlock_release,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
480 METH_NOARGS, rlock_release_doc},
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
481 {"_is_owned", (PyCFunction)rlock_is_owned,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
482 METH_NOARGS, rlock_is_owned_doc},
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
483 {"_acquire_restore", (PyCFunction)rlock_acquire_restore,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
484 METH_O, rlock_acquire_restore_doc},
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
485 {"_release_save", (PyCFunction)rlock_release_save,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
486 METH_NOARGS, rlock_release_save_doc},
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
487 {"__enter__", (PyCFunction)rlock_acquire,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
488 METH_VARARGS | METH_KEYWORDS, rlock_acquire_doc},
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
489 {"__exit__", (PyCFunction)rlock_release,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
490 METH_VARARGS, rlock_release_doc},
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
491 {NULL, NULL} /* sentinel */
57172
6d91aaadddd0 Issue #3001: Add a C implementation of recursive locks which is used by
Antoine Pitrou <solipsis@pitrou.net>
parents: 56992
diff changeset
492 };
6d91aaadddd0 Issue #3001: Add a C implementation of recursive locks which is used by
Antoine Pitrou <solipsis@pitrou.net>
parents: 56992
diff changeset
493
6d91aaadddd0 Issue #3001: Add a C implementation of recursive locks which is used by
Antoine Pitrou <solipsis@pitrou.net>
parents: 56992
diff changeset
494
6d91aaadddd0 Issue #3001: Add a C implementation of recursive locks which is used by
Antoine Pitrou <solipsis@pitrou.net>
parents: 56992
diff changeset
495 static PyTypeObject RLocktype = {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
496 PyVarObject_HEAD_INIT(&PyType_Type, 0)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
497 "_thread.RLock", /*tp_name*/
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
498 sizeof(rlockobject), /*tp_size*/
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
499 0, /*tp_itemsize*/
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
500 /* methods */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
501 (destructor)rlock_dealloc, /*tp_dealloc*/
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
502 0, /*tp_print*/
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
503 0, /*tp_getattr*/
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
504 0, /*tp_setattr*/
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
505 0, /*tp_reserved*/
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
506 (reprfunc)rlock_repr, /*tp_repr*/
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
507 0, /*tp_as_number*/
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
508 0, /*tp_as_sequence*/
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
509 0, /*tp_as_mapping*/
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
510 0, /*tp_hash*/
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
511 0, /*tp_call*/
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
512 0, /*tp_str*/
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
513 0, /*tp_getattro*/
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
514 0, /*tp_setattro*/
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
515 0, /*tp_as_buffer*/
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
516 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
517 0, /*tp_doc*/
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
518 0, /*tp_traverse*/
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
519 0, /*tp_clear*/
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
520 0, /*tp_richcompare*/
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
521 offsetof(rlockobject, in_weakreflist), /*tp_weaklistoffset*/
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
522 0, /*tp_iter*/
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
523 0, /*tp_iternext*/
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
524 rlock_methods, /*tp_methods*/
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
525 0, /* tp_members */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
526 0, /* tp_getset */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
527 0, /* tp_base */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
528 0, /* tp_dict */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
529 0, /* tp_descr_get */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
530 0, /* tp_descr_set */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
531 0, /* tp_dictoffset */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
532 0, /* tp_init */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
533 PyType_GenericAlloc, /* tp_alloc */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
534 rlock_new /* tp_new */
57172
6d91aaadddd0 Issue #3001: Add a C implementation of recursive locks which is used by
Antoine Pitrou <solipsis@pitrou.net>
parents: 56992
diff changeset
535 };
6d91aaadddd0 Issue #3001: Add a C implementation of recursive locks which is used by
Antoine Pitrou <solipsis@pitrou.net>
parents: 56992
diff changeset
536
37879
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36926
diff changeset
537 static lockobject *
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36926
diff changeset
538 newlockobject(void)
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36926
diff changeset
539 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
540 lockobject *self;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
541 self = PyObject_New(lockobject, &Locktype);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
542 if (self == NULL)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
543 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
544 self->lock_lock = PyThread_allocate_lock();
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
545 self->in_weakreflist = NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
546 if (self->lock_lock == NULL) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
547 Py_DECREF(self);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
548 PyErr_SetString(ThreadError, "can't allocate lock");
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
549 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
550 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
551 return self;
37879
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36926
diff changeset
552 }
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36926
diff changeset
553
32673
97768d87394a Implemented thread-local data as proposed on python-dev:
Jim Fulton <jim@zope.com>
parents: 31797
diff changeset
554 /* Thread-local objects */
97768d87394a Implemented thread-local data as proposed on python-dev:
Jim Fulton <jim@zope.com>
parents: 31797
diff changeset
555
97768d87394a Implemented thread-local data as proposed on python-dev:
Jim Fulton <jim@zope.com>
parents: 31797
diff changeset
556 #include "structmember.h"
97768d87394a Implemented thread-local data as proposed on python-dev:
Jim Fulton <jim@zope.com>
parents: 31797
diff changeset
557
63897
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
558 /* Quick overview:
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
559
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
560 We need to be able to reclaim reference cycles as soon as possible
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
561 (both when a thread is being terminated, or a thread-local object
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
562 becomes unreachable from user data). Constraints:
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
563 - it must not be possible for thread-state dicts to be involved in
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
564 reference cycles (otherwise the cyclic GC will refuse to consider
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
565 objects referenced from a reachable thread-state dict, even though
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
566 local_dealloc would clear them)
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
567 - the death of a thread-state dict must still imply destruction of the
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
568 corresponding local dicts in all thread-local objects.
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
569
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
570 Our implementation uses small "localdummy" objects in order to break
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
571 the reference chain. These trivial objects are hashable (using the
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
572 default scheme of identity hashing) and weakrefable.
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
573 Each thread-state holds a separate localdummy for each local object
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
574 (as a /strong reference/),
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
575 and each thread-local object holds a dict mapping /weak references/
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
576 of localdummies to local dicts.
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
577
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
578 Therefore:
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
579 - only the thread-state dict holds a strong reference to the dummies
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
580 - only the thread-local object holds a strong reference to the local dicts
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
581 - only outside objects (application- or library-level) hold strong
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
582 references to the thread-local objects
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
583 - as soon as a thread-state dict is destroyed, the weakref callbacks of all
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
584 dummies attached to that thread are called, and destroy the corresponding
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
585 local dicts from thread-local objects
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
586 - as soon as a thread-local object is destroyed, its local dicts are
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
587 destroyed and its dummies are manually removed from all thread states
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
588 - the GC can do its work correctly when a thread-local object is dangling,
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
589 without any interference from the thread-state dicts
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
590
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
591 As an additional optimization, each localdummy holds a borrowed reference
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
592 to the corresponding localdict. This borrowed reference is only used
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
593 by the thread-local object which has created the localdummy, which should
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
594 guarantee that the localdict still exists when accessed.
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
595 */
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
596
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
597 typedef struct {
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
598 PyObject_HEAD
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
599 PyObject *localdict; /* Borrowed reference! */
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
600 PyObject *weakreflist; /* List of weak references to self */
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
601 } localdummyobject;
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
602
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
603 static void
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
604 localdummy_dealloc(localdummyobject *self)
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
605 {
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
606 if (self->weakreflist != NULL)
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
607 PyObject_ClearWeakRefs((PyObject *) self);
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
608 Py_TYPE(self)->tp_free((PyObject*)self);
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
609 }
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
610
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
611 static PyTypeObject localdummytype = {
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
612 PyVarObject_HEAD_INIT(NULL, 0)
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
613 /* tp_name */ "_thread._localdummy",
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
614 /* tp_basicsize */ sizeof(localdummyobject),
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
615 /* tp_itemsize */ 0,
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
616 /* tp_dealloc */ (destructor)localdummy_dealloc,
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
617 /* tp_print */ 0,
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
618 /* tp_getattr */ 0,
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
619 /* tp_setattr */ 0,
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
620 /* tp_reserved */ 0,
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
621 /* tp_repr */ 0,
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
622 /* tp_as_number */ 0,
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
623 /* tp_as_sequence */ 0,
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
624 /* tp_as_mapping */ 0,
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
625 /* tp_hash */ 0,
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
626 /* tp_call */ 0,
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
627 /* tp_str */ 0,
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
628 /* tp_getattro */ 0,
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
629 /* tp_setattro */ 0,
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
630 /* tp_as_buffer */ 0,
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
631 /* tp_flags */ Py_TPFLAGS_DEFAULT,
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
632 /* tp_doc */ "Thread-local dummy",
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
633 /* tp_traverse */ 0,
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
634 /* tp_clear */ 0,
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
635 /* tp_richcompare */ 0,
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
636 /* tp_weaklistoffset */ offsetof(localdummyobject, weakreflist)
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
637 };
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
638
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
639
32673
97768d87394a Implemented thread-local data as proposed on python-dev:
Jim Fulton <jim@zope.com>
parents: 31797
diff changeset
640 typedef struct {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
641 PyObject_HEAD
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
642 PyObject *key;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
643 PyObject *args;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
644 PyObject *kw;
63897
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
645 PyObject *weakreflist; /* List of weak references to self */
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
646 /* A {localdummy weakref -> localdict} dict */
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
647 PyObject *dummies;
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
648 /* The callback for weakrefs to localdummies */
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
649 PyObject *wr_callback;
32673
97768d87394a Implemented thread-local data as proposed on python-dev:
Jim Fulton <jim@zope.com>
parents: 31797
diff changeset
650 } localobject;
97768d87394a Implemented thread-local data as proposed on python-dev:
Jim Fulton <jim@zope.com>
parents: 31797
diff changeset
651
63897
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
652 /* Forward declaration */
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
653 static PyObject *_ldict(localobject *self);
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
654 static PyObject *_localdummy_destroyed(PyObject *meth_self, PyObject *dummyweakref);
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
655
64298
0265d5f7bd07 Issue #1868: Eliminate subtle timing issues in thread-local objects by
Antoine Pitrou <solipsis@pitrou.net>
parents: 64076
diff changeset
656 /* Create and register the dummy for the current thread.
0265d5f7bd07 Issue #1868: Eliminate subtle timing issues in thread-local objects by
Antoine Pitrou <solipsis@pitrou.net>
parents: 64076
diff changeset
657 Returns a borrowed reference of the corresponding local dict */
0265d5f7bd07 Issue #1868: Eliminate subtle timing issues in thread-local objects by
Antoine Pitrou <solipsis@pitrou.net>
parents: 64076
diff changeset
658 static PyObject *
63897
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
659 _local_create_dummy(localobject *self)
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
660 {
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
661 PyObject *tdict, *ldict = NULL, *wr = NULL;
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
662 localdummyobject *dummy = NULL;
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
663 int r;
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
664
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
665 tdict = PyThreadState_GetDict();
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
666 if (tdict == NULL) {
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
667 PyErr_SetString(PyExc_SystemError,
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
668 "Couldn't get thread-state dictionary");
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
669 goto err;
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
670 }
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
671
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
672 ldict = PyDict_New();
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
673 if (ldict == NULL)
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
674 goto err;
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
675 dummy = (localdummyobject *) localdummytype.tp_alloc(&localdummytype, 0);
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
676 if (dummy == NULL)
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
677 goto err;
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
678 dummy->localdict = ldict;
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
679 wr = PyWeakref_NewRef((PyObject *) dummy, self->wr_callback);
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
680 if (wr == NULL)
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
681 goto err;
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
682
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
683 /* As a side-effect, this will cache the weakref's hash before the
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
684 dummy gets deleted */
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
685 r = PyDict_SetItem(self->dummies, wr, ldict);
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
686 if (r < 0)
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
687 goto err;
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
688 Py_CLEAR(wr);
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
689 r = PyDict_SetItem(tdict, self->key, (PyObject *) dummy);
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
690 if (r < 0)
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
691 goto err;
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
692 Py_CLEAR(dummy);
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
693
64298
0265d5f7bd07 Issue #1868: Eliminate subtle timing issues in thread-local objects by
Antoine Pitrou <solipsis@pitrou.net>
parents: 64076
diff changeset
694 Py_DECREF(ldict);
0265d5f7bd07 Issue #1868: Eliminate subtle timing issues in thread-local objects by
Antoine Pitrou <solipsis@pitrou.net>
parents: 64076
diff changeset
695 return ldict;
63897
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
696
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
697 err:
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
698 Py_XDECREF(ldict);
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
699 Py_XDECREF(wr);
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
700 Py_XDECREF(dummy);
64298
0265d5f7bd07 Issue #1868: Eliminate subtle timing issues in thread-local objects by
Antoine Pitrou <solipsis@pitrou.net>
parents: 64076
diff changeset
701 return NULL;
63897
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
702 }
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
703
32673
97768d87394a Implemented thread-local data as proposed on python-dev:
Jim Fulton <jim@zope.com>
parents: 31797
diff changeset
704 static PyObject *
97768d87394a Implemented thread-local data as proposed on python-dev:
Jim Fulton <jim@zope.com>
parents: 31797
diff changeset
705 local_new(PyTypeObject *type, PyObject *args, PyObject *kw)
97768d87394a Implemented thread-local data as proposed on python-dev:
Jim Fulton <jim@zope.com>
parents: 31797
diff changeset
706 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
707 localobject *self;
63897
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
708 PyObject *wr;
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
709 static PyMethodDef wr_callback_def = {
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
710 "_localdummy_destroyed", (PyCFunction) _localdummy_destroyed, METH_O
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
711 };
32673
97768d87394a Implemented thread-local data as proposed on python-dev:
Jim Fulton <jim@zope.com>
parents: 31797
diff changeset
712
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
713 if (type->tp_init == PyBaseObject_Type.tp_init
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
714 && ((args && PyObject_IsTrue(args))
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
715 || (kw && PyObject_IsTrue(kw)))) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
716 PyErr_SetString(PyExc_TypeError,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
717 "Initialization arguments are not supported");
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
718 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
719 }
32673
97768d87394a Implemented thread-local data as proposed on python-dev:
Jim Fulton <jim@zope.com>
parents: 31797
diff changeset
720
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
721 self = (localobject *)type->tp_alloc(type, 0);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
722 if (self == NULL)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
723 return NULL;
32673
97768d87394a Implemented thread-local data as proposed on python-dev:
Jim Fulton <jim@zope.com>
parents: 31797
diff changeset
724
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
725 Py_XINCREF(args);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
726 self->args = args;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
727 Py_XINCREF(kw);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
728 self->kw = kw;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
729 self->key = PyUnicode_FromFormat("thread.local.%p", self);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
730 if (self->key == NULL)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
731 goto err;
32673
97768d87394a Implemented thread-local data as proposed on python-dev:
Jim Fulton <jim@zope.com>
parents: 31797
diff changeset
732
63897
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
733 self->dummies = PyDict_New();
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
734 if (self->dummies == NULL)
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
735 goto err;
32673
97768d87394a Implemented thread-local data as proposed on python-dev:
Jim Fulton <jim@zope.com>
parents: 31797
diff changeset
736
63897
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
737 /* We use a weak reference to self in the callback closure
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
738 in order to avoid spurious reference cycles */
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
739 wr = PyWeakref_NewRef((PyObject *) self, NULL);
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
740 if (wr == NULL)
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
741 goto err;
63897
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
742 self->wr_callback = PyCFunction_New(&wr_callback_def, wr);
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
743 Py_DECREF(wr);
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
744 if (self->wr_callback == NULL)
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
745 goto err;
32673
97768d87394a Implemented thread-local data as proposed on python-dev:
Jim Fulton <jim@zope.com>
parents: 31797
diff changeset
746
64298
0265d5f7bd07 Issue #1868: Eliminate subtle timing issues in thread-local objects by
Antoine Pitrou <solipsis@pitrou.net>
parents: 64076
diff changeset
747 if (_local_create_dummy(self) == NULL)
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
748 goto err;
32673
97768d87394a Implemented thread-local data as proposed on python-dev:
Jim Fulton <jim@zope.com>
parents: 31797
diff changeset
749
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
750 return (PyObject *)self;
35086
c6b7fadf0ada Consistently use hard tabs for indentation.
Michael W. Hudson <mwh@python.net>
parents: 35085
diff changeset
751
c6b7fadf0ada Consistently use hard tabs for indentation.
Michael W. Hudson <mwh@python.net>
parents: 35085
diff changeset
752 err:
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
753 Py_DECREF(self);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
754 return NULL;
32673
97768d87394a Implemented thread-local data as proposed on python-dev:
Jim Fulton <jim@zope.com>
parents: 31797
diff changeset
755 }
97768d87394a Implemented thread-local data as proposed on python-dev:
Jim Fulton <jim@zope.com>
parents: 31797
diff changeset
756
97768d87394a Implemented thread-local data as proposed on python-dev:
Jim Fulton <jim@zope.com>
parents: 31797
diff changeset
757 static int
97768d87394a Implemented thread-local data as proposed on python-dev:
Jim Fulton <jim@zope.com>
parents: 31797
diff changeset
758 local_traverse(localobject *self, visitproc visit, void *arg)
97768d87394a Implemented thread-local data as proposed on python-dev:
Jim Fulton <jim@zope.com>
parents: 31797
diff changeset
759 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
760 Py_VISIT(self->args);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
761 Py_VISIT(self->kw);
63897
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
762 Py_VISIT(self->dummies);
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
763 return 0;
32673
97768d87394a Implemented thread-local data as proposed on python-dev:
Jim Fulton <jim@zope.com>
parents: 31797
diff changeset
764 }
97768d87394a Implemented thread-local data as proposed on python-dev:
Jim Fulton <jim@zope.com>
parents: 31797
diff changeset
765
97768d87394a Implemented thread-local data as proposed on python-dev:
Jim Fulton <jim@zope.com>
parents: 31797
diff changeset
766 static int
97768d87394a Implemented thread-local data as proposed on python-dev:
Jim Fulton <jim@zope.com>
parents: 31797
diff changeset
767 local_clear(localobject *self)
97768d87394a Implemented thread-local data as proposed on python-dev:
Jim Fulton <jim@zope.com>
parents: 31797
diff changeset
768 {
63897
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
769 PyThreadState *tstate;
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
770 Py_CLEAR(self->args);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
771 Py_CLEAR(self->kw);
63897
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
772 Py_CLEAR(self->dummies);
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
773 Py_CLEAR(self->wr_callback);
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
774 /* Remove all strong references to dummies from the thread states */
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
775 if (self->key
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
776 && (tstate = PyThreadState_Get())
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
777 && tstate->interp) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
778 for(tstate = PyInterpreterState_ThreadHead(tstate->interp);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
779 tstate;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
780 tstate = PyThreadState_Next(tstate))
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
781 if (tstate->dict &&
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
782 PyDict_GetItem(tstate->dict, self->key))
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
783 PyDict_DelItem(tstate->dict, self->key);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
784 }
63897
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
785 return 0;
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
786 }
32673
97768d87394a Implemented thread-local data as proposed on python-dev:
Jim Fulton <jim@zope.com>
parents: 31797
diff changeset
787
63897
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
788 static void
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
789 local_dealloc(localobject *self)
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
790 {
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
791 /* Weakrefs must be invalidated right now, otherwise they can be used
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
792 from code called below, which is very dangerous since Py_REFCNT(self) == 0 */
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
793 if (self->weakreflist != NULL)
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
794 PyObject_ClearWeakRefs((PyObject *) self);
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
795
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
796 PyObject_GC_UnTrack(self);
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
797
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
798 local_clear(self);
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
799 Py_XDECREF(self->key);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
800 Py_TYPE(self)->tp_free((PyObject*)self);
32673
97768d87394a Implemented thread-local data as proposed on python-dev:
Jim Fulton <jim@zope.com>
parents: 31797
diff changeset
801 }
97768d87394a Implemented thread-local data as proposed on python-dev:
Jim Fulton <jim@zope.com>
parents: 31797
diff changeset
802
63897
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
803 /* Returns a borrowed reference to the local dict, creating it if necessary */
32673
97768d87394a Implemented thread-local data as proposed on python-dev:
Jim Fulton <jim@zope.com>
parents: 31797
diff changeset
804 static PyObject *
97768d87394a Implemented thread-local data as proposed on python-dev:
Jim Fulton <jim@zope.com>
parents: 31797
diff changeset
805 _ldict(localobject *self)
97768d87394a Implemented thread-local data as proposed on python-dev:
Jim Fulton <jim@zope.com>
parents: 31797
diff changeset
806 {
63897
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
807 PyObject *tdict, *ldict, *dummy;
32673
97768d87394a Implemented thread-local data as proposed on python-dev:
Jim Fulton <jim@zope.com>
parents: 31797
diff changeset
808
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
809 tdict = PyThreadState_GetDict();
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
810 if (tdict == NULL) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
811 PyErr_SetString(PyExc_SystemError,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
812 "Couldn't get thread-state dictionary");
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
813 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
814 }
32673
97768d87394a Implemented thread-local data as proposed on python-dev:
Jim Fulton <jim@zope.com>
parents: 31797
diff changeset
815
63897
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
816 dummy = PyDict_GetItem(tdict, self->key);
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
817 if (dummy == NULL) {
64298
0265d5f7bd07 Issue #1868: Eliminate subtle timing issues in thread-local objects by
Antoine Pitrou <solipsis@pitrou.net>
parents: 64076
diff changeset
818 ldict = _local_create_dummy(self);
0265d5f7bd07 Issue #1868: Eliminate subtle timing issues in thread-local objects by
Antoine Pitrou <solipsis@pitrou.net>
parents: 64076
diff changeset
819 if (ldict == NULL)
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
820 return NULL;
32673
97768d87394a Implemented thread-local data as proposed on python-dev:
Jim Fulton <jim@zope.com>
parents: 31797
diff changeset
821
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
822 if (Py_TYPE(self)->tp_init != PyBaseObject_Type.tp_init &&
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
823 Py_TYPE(self)->tp_init((PyObject*)self,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
824 self->args, self->kw) < 0) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
825 /* we need to get rid of ldict from thread so
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
826 we create a new one the next time we do an attr
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
827 acces */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
828 PyDict_DelItem(tdict, self->key);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
829 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
830 }
63897
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
831 }
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
832 else {
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
833 assert(Py_TYPE(dummy) == &localdummytype);
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
834 ldict = ((localdummyobject *) dummy)->localdict;
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
835 }
32673
97768d87394a Implemented thread-local data as proposed on python-dev:
Jim Fulton <jim@zope.com>
parents: 31797
diff changeset
836
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
837 return ldict;
32673
97768d87394a Implemented thread-local data as proposed on python-dev:
Jim Fulton <jim@zope.com>
parents: 31797
diff changeset
838 }
97768d87394a Implemented thread-local data as proposed on python-dev:
Jim Fulton <jim@zope.com>
parents: 31797
diff changeset
839
97768d87394a Implemented thread-local data as proposed on python-dev:
Jim Fulton <jim@zope.com>
parents: 31797
diff changeset
840 static int
97768d87394a Implemented thread-local data as proposed on python-dev:
Jim Fulton <jim@zope.com>
parents: 31797
diff changeset
841 local_setattro(localobject *self, PyObject *name, PyObject *v)
97768d87394a Implemented thread-local data as proposed on python-dev:
Jim Fulton <jim@zope.com>
parents: 31797
diff changeset
842 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
843 PyObject *ldict;
64298
0265d5f7bd07 Issue #1868: Eliminate subtle timing issues in thread-local objects by
Antoine Pitrou <solipsis@pitrou.net>
parents: 64076
diff changeset
844 int r;
32673
97768d87394a Implemented thread-local data as proposed on python-dev:
Jim Fulton <jim@zope.com>
parents: 31797
diff changeset
845
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
846 ldict = _ldict(self);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
847 if (ldict == NULL)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
848 return -1;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
849
64298
0265d5f7bd07 Issue #1868: Eliminate subtle timing issues in thread-local objects by
Antoine Pitrou <solipsis@pitrou.net>
parents: 64076
diff changeset
850 r = PyObject_RichCompareBool(name, str_dict, Py_EQ);
0265d5f7bd07 Issue #1868: Eliminate subtle timing issues in thread-local objects by
Antoine Pitrou <solipsis@pitrou.net>
parents: 64076
diff changeset
851 if (r == 1) {
0265d5f7bd07 Issue #1868: Eliminate subtle timing issues in thread-local objects by
Antoine Pitrou <solipsis@pitrou.net>
parents: 64076
diff changeset
852 PyErr_Format(PyExc_AttributeError,
0265d5f7bd07 Issue #1868: Eliminate subtle timing issues in thread-local objects by
Antoine Pitrou <solipsis@pitrou.net>
parents: 64076
diff changeset
853 "'%.50s' object attribute '%U' is read-only",
0265d5f7bd07 Issue #1868: Eliminate subtle timing issues in thread-local objects by
Antoine Pitrou <solipsis@pitrou.net>
parents: 64076
diff changeset
854 Py_TYPE(self)->tp_name, name);
0265d5f7bd07 Issue #1868: Eliminate subtle timing issues in thread-local objects by
Antoine Pitrou <solipsis@pitrou.net>
parents: 64076
diff changeset
855 return -1;
0265d5f7bd07 Issue #1868: Eliminate subtle timing issues in thread-local objects by
Antoine Pitrou <solipsis@pitrou.net>
parents: 64076
diff changeset
856 }
0265d5f7bd07 Issue #1868: Eliminate subtle timing issues in thread-local objects by
Antoine Pitrou <solipsis@pitrou.net>
parents: 64076
diff changeset
857 if (r == -1)
0265d5f7bd07 Issue #1868: Eliminate subtle timing issues in thread-local objects by
Antoine Pitrou <solipsis@pitrou.net>
parents: 64076
diff changeset
858 return -1;
32673
97768d87394a Implemented thread-local data as proposed on python-dev:
Jim Fulton <jim@zope.com>
parents: 31797
diff changeset
859
64298
0265d5f7bd07 Issue #1868: Eliminate subtle timing issues in thread-local objects by
Antoine Pitrou <solipsis@pitrou.net>
parents: 64076
diff changeset
860 return _PyObject_GenericSetAttrWithDict((PyObject *)self, name, v, ldict);
32673
97768d87394a Implemented thread-local data as proposed on python-dev:
Jim Fulton <jim@zope.com>
parents: 31797
diff changeset
861 }
97768d87394a Implemented thread-local data as proposed on python-dev:
Jim Fulton <jim@zope.com>
parents: 31797
diff changeset
862
37879
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36926
diff changeset
863 static PyObject *local_getattro(localobject *, PyObject *);
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36926
diff changeset
864
32673
97768d87394a Implemented thread-local data as proposed on python-dev:
Jim Fulton <jim@zope.com>
parents: 31797
diff changeset
865 static PyTypeObject localtype = {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
866 PyVarObject_HEAD_INIT(NULL, 0)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
867 /* tp_name */ "_thread._local",
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
868 /* tp_basicsize */ sizeof(localobject),
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
869 /* tp_itemsize */ 0,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
870 /* tp_dealloc */ (destructor)local_dealloc,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
871 /* tp_print */ 0,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
872 /* tp_getattr */ 0,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
873 /* tp_setattr */ 0,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
874 /* tp_reserved */ 0,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
875 /* tp_repr */ 0,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
876 /* tp_as_number */ 0,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
877 /* tp_as_sequence */ 0,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
878 /* tp_as_mapping */ 0,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
879 /* tp_hash */ 0,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
880 /* tp_call */ 0,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
881 /* tp_str */ 0,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
882 /* tp_getattro */ (getattrofunc)local_getattro,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
883 /* tp_setattro */ (setattrofunc)local_setattro,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
884 /* tp_as_buffer */ 0,
63897
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
885 /* tp_flags */ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
886 | Py_TPFLAGS_HAVE_GC,
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
887 /* tp_doc */ "Thread-local data",
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
888 /* tp_traverse */ (traverseproc)local_traverse,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
889 /* tp_clear */ (inquiry)local_clear,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
890 /* tp_richcompare */ 0,
63897
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
891 /* tp_weaklistoffset */ offsetof(localobject, weakreflist),
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
892 /* tp_iter */ 0,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
893 /* tp_iternext */ 0,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
894 /* tp_methods */ 0,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
895 /* tp_members */ 0,
64298
0265d5f7bd07 Issue #1868: Eliminate subtle timing issues in thread-local objects by
Antoine Pitrou <solipsis@pitrou.net>
parents: 64076
diff changeset
896 /* tp_getset */ 0,
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
897 /* tp_base */ 0,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
898 /* tp_dict */ 0, /* internal use */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
899 /* tp_descr_get */ 0,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
900 /* tp_descr_set */ 0,
64298
0265d5f7bd07 Issue #1868: Eliminate subtle timing issues in thread-local objects by
Antoine Pitrou <solipsis@pitrou.net>
parents: 64076
diff changeset
901 /* tp_dictoffset */ 0,
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
902 /* tp_init */ 0,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
903 /* tp_alloc */ 0,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
904 /* tp_new */ local_new,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
905 /* tp_free */ 0, /* Low-level free-mem routine */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
906 /* tp_is_gc */ 0, /* For PyObject_IS_GC */
32673
97768d87394a Implemented thread-local data as proposed on python-dev:
Jim Fulton <jim@zope.com>
parents: 31797
diff changeset
907 };
97768d87394a Implemented thread-local data as proposed on python-dev:
Jim Fulton <jim@zope.com>
parents: 31797
diff changeset
908
37879
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36926
diff changeset
909 static PyObject *
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36926
diff changeset
910 local_getattro(localobject *self, PyObject *name)
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36926
diff changeset
911 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
912 PyObject *ldict, *value;
64298
0265d5f7bd07 Issue #1868: Eliminate subtle timing issues in thread-local objects by
Antoine Pitrou <solipsis@pitrou.net>
parents: 64076
diff changeset
913 int r;
37879
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36926
diff changeset
914
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
915 ldict = _ldict(self);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
916 if (ldict == NULL)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
917 return NULL;
37879
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36926
diff changeset
918
64298
0265d5f7bd07 Issue #1868: Eliminate subtle timing issues in thread-local objects by
Antoine Pitrou <solipsis@pitrou.net>
parents: 64076
diff changeset
919 r = PyObject_RichCompareBool(name, str_dict, Py_EQ);
0265d5f7bd07 Issue #1868: Eliminate subtle timing issues in thread-local objects by
Antoine Pitrou <solipsis@pitrou.net>
parents: 64076
diff changeset
920 if (r == 1) {
0265d5f7bd07 Issue #1868: Eliminate subtle timing issues in thread-local objects by
Antoine Pitrou <solipsis@pitrou.net>
parents: 64076
diff changeset
921 Py_INCREF(ldict);
0265d5f7bd07 Issue #1868: Eliminate subtle timing issues in thread-local objects by
Antoine Pitrou <solipsis@pitrou.net>
parents: 64076
diff changeset
922 return ldict;
0265d5f7bd07 Issue #1868: Eliminate subtle timing issues in thread-local objects by
Antoine Pitrou <solipsis@pitrou.net>
parents: 64076
diff changeset
923 }
0265d5f7bd07 Issue #1868: Eliminate subtle timing issues in thread-local objects by
Antoine Pitrou <solipsis@pitrou.net>
parents: 64076
diff changeset
924 if (r == -1)
0265d5f7bd07 Issue #1868: Eliminate subtle timing issues in thread-local objects by
Antoine Pitrou <solipsis@pitrou.net>
parents: 64076
diff changeset
925 return NULL;
0265d5f7bd07 Issue #1868: Eliminate subtle timing issues in thread-local objects by
Antoine Pitrou <solipsis@pitrou.net>
parents: 64076
diff changeset
926
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
927 if (Py_TYPE(self) != &localtype)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
928 /* use generic lookup for subtypes */
64298
0265d5f7bd07 Issue #1868: Eliminate subtle timing issues in thread-local objects by
Antoine Pitrou <solipsis@pitrou.net>
parents: 64076
diff changeset
929 return _PyObject_GenericGetAttrWithDict((PyObject *)self, name, ldict);
37879
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36926
diff changeset
930
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
931 /* Optimization: just look in dict ourselves */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
932 value = PyDict_GetItem(ldict, name);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
933 if (value == NULL)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
934 /* Fall back on generic to get __class__ and __dict__ */
64298
0265d5f7bd07 Issue #1868: Eliminate subtle timing issues in thread-local objects by
Antoine Pitrou <solipsis@pitrou.net>
parents: 64076
diff changeset
935 return _PyObject_GenericGetAttrWithDict((PyObject *)self, name, ldict);
37879
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36926
diff changeset
936
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
937 Py_INCREF(value);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
938 return value;
37879
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36926
diff changeset
939 }
923
72aceed365d4 * Makefile adapted to changes below.
Guido van Rossum <guido@python.org>
parents:
diff changeset
940
63897
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
941 /* Called when a dummy is destroyed. */
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
942 static PyObject *
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
943 _localdummy_destroyed(PyObject *localweakref, PyObject *dummyweakref)
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
944 {
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
945 PyObject *obj;
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
946 localobject *self;
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
947 assert(PyWeakref_CheckRef(localweakref));
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
948 obj = PyWeakref_GET_OBJECT(localweakref);
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
949 if (obj == Py_None)
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
950 Py_RETURN_NONE;
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
951 Py_INCREF(obj);
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
952 assert(PyObject_TypeCheck(obj, &localtype));
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
953 /* If the thread-local object is still alive and not being cleared,
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
954 remove the corresponding local dict */
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
955 self = (localobject *) obj;
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
956 if (self->dummies != NULL) {
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
957 PyObject *ldict;
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
958 ldict = PyDict_GetItem(self->dummies, dummyweakref);
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
959 if (ldict != NULL) {
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
960 PyDict_DelItem(self->dummies, dummyweakref);
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
961 }
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
962 if (PyErr_Occurred())
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
963 PyErr_WriteUnraisable(obj);
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
964 }
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
965 Py_DECREF(obj);
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
966 Py_RETURN_NONE;
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
967 }
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
968
923
72aceed365d4 * Makefile adapted to changes below.
Guido van Rossum <guido@python.org>
parents:
diff changeset
969 /* Module functions */
72aceed365d4 * Makefile adapted to changes below.
Guido van Rossum <guido@python.org>
parents:
diff changeset
970
5405
b7871ca930ad Massive changes for separate thread state management.
Guido van Rossum <guido@python.org>
parents: 4944
diff changeset
971 struct bootstate {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
972 PyInterpreterState *interp;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
973 PyObject *func;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
974 PyObject *args;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
975 PyObject *keyw;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
976 PyThreadState *tstate;
5405
b7871ca930ad Massive changes for separate thread state management.
Guido van Rossum <guido@python.org>
parents: 4944
diff changeset
977 };
923
72aceed365d4 * Makefile adapted to changes below.
Guido van Rossum <guido@python.org>
parents:
diff changeset
978
5405
b7871ca930ad Massive changes for separate thread state management.
Guido van Rossum <guido@python.org>
parents: 4944
diff changeset
979 static void
13497
95454b73ea91 ANSI-fication
Peter Schneider-Kamp <nowonder@nowonder.de>
parents: 13256
diff changeset
980 t_bootstrap(void *boot_raw)
5405
b7871ca930ad Massive changes for separate thread state management.
Guido van Rossum <guido@python.org>
parents: 4944
diff changeset
981 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
982 struct bootstate *boot = (struct bootstate *) boot_raw;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
983 PyThreadState *tstate;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
984 PyObject *res;
961
a31e07847063 New thread.c from Sjoerd, supports _exit_prog(). Use this in goaway()
Guido van Rossum <guido@python.org>
parents: 926
diff changeset
985
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
986 tstate = boot->tstate;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
987 tstate->thread_id = PyThread_get_thread_ident();
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
988 _PyThreadState_Init(tstate);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
989 PyEval_AcquireThread(tstate);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
990 nb_threads++;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
991 res = PyEval_CallObjectWithKeywords(
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
992 boot->func, boot->args, boot->keyw);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
993 if (res == NULL) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
994 if (PyErr_ExceptionMatches(PyExc_SystemExit))
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
995 PyErr_Clear();
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
996 else {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
997 PyObject *file;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
998 PySys_WriteStderr(
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
999 "Unhandled exception in thread started by ");
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1000 file = PySys_GetObject("stderr");
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1001 if (file != NULL && file != Py_None)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1002 PyFile_WriteObject(boot->func, file, 0);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1003 else
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1004 PyObject_Print(boot->func, stderr, 0);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1005 PySys_WriteStderr("\n");
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1006 PyErr_PrintEx(0);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1007 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1008 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1009 else
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1010 Py_DECREF(res);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1011 Py_DECREF(boot->func);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1012 Py_DECREF(boot->args);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1013 Py_XDECREF(boot->keyw);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1014 PyMem_DEL(boot_raw);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1015 nb_threads--;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1016 PyThreadState_Clear(tstate);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1017 PyThreadState_DeleteCurrent();
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1018 PyThread_exit_thread();
923
72aceed365d4 * Makefile adapted to changes below.
Guido van Rossum <guido@python.org>
parents:
diff changeset
1019 }
72aceed365d4 * Makefile adapted to changes below.
Guido van Rossum <guido@python.org>
parents:
diff changeset
1020
4751
7ab835f87f86 Renamed.
Barry Warsaw <barry@python.org>
parents: 4600
diff changeset
1021 static PyObject *
13497
95454b73ea91 ANSI-fication
Peter Schneider-Kamp <nowonder@nowonder.de>
parents: 13256
diff changeset
1022 thread_PyThread_start_new_thread(PyObject *self, PyObject *fargs)
923
72aceed365d4 * Makefile adapted to changes below.
Guido van Rossum <guido@python.org>
parents:
diff changeset
1023 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1024 PyObject *func, *args, *keyw = NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1025 struct bootstate *boot;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1026 long ident;
923
72aceed365d4 * Makefile adapted to changes below.
Guido van Rossum <guido@python.org>
parents:
diff changeset
1027
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1028 if (!PyArg_UnpackTuple(fargs, "start_new_thread", 2, 3,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1029 &func, &args, &keyw))
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1030 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1031 if (!PyCallable_Check(func)) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1032 PyErr_SetString(PyExc_TypeError,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1033 "first arg must be callable");
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1034 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1035 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1036 if (!PyTuple_Check(args)) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1037 PyErr_SetString(PyExc_TypeError,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1038 "2nd arg must be a tuple");
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1039 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1040 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1041 if (keyw != NULL && !PyDict_Check(keyw)) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1042 PyErr_SetString(PyExc_TypeError,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1043 "optional 3rd arg must be a dictionary");
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1044 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1045 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1046 boot = PyMem_NEW(struct bootstate, 1);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1047 if (boot == NULL)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1048 return PyErr_NoMemory();
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1049 boot->interp = PyThreadState_GET()->interp;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1050 boot->func = func;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1051 boot->args = args;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1052 boot->keyw = keyw;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1053 boot->tstate = _PyThreadState_Prealloc(boot->interp);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1054 if (boot->tstate == NULL) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1055 PyMem_DEL(boot);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1056 return PyErr_NoMemory();
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1057 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1058 Py_INCREF(func);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1059 Py_INCREF(args);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1060 Py_XINCREF(keyw);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1061 PyEval_InitThreads(); /* Start the interpreter's thread-awareness */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1062 ident = PyThread_start_new_thread(t_bootstrap, (void*) boot);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1063 if (ident == -1) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1064 PyErr_SetString(ThreadError, "can't start new thread");
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1065 Py_DECREF(func);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1066 Py_DECREF(args);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1067 Py_XDECREF(keyw);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1068 PyThreadState_Clear(boot->tstate);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1069 PyMem_DEL(boot);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1070 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1071 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1072 return PyLong_FromLong(ident);
923
72aceed365d4 * Makefile adapted to changes below.
Guido van Rossum <guido@python.org>
parents:
diff changeset
1073 }
72aceed365d4 * Makefile adapted to changes below.
Guido van Rossum <guido@python.org>
parents:
diff changeset
1074
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 22865
diff changeset
1075 PyDoc_STRVAR(start_new_doc,
20266
241ef8a923c7 Fix typo in docstring
Andrew M. Kuchling <amk@amk.ca>
parents: 16140
diff changeset
1076 "start_new_thread(function, args[, kwargs])\n\
8562
ff9adb57b8b5 Added doc strings. Also export LockType from the modoule, and give it
Guido van Rossum <guido@python.org>
parents: 8433
diff changeset
1077 (start_new() is an obsolete synonym)\n\
ff9adb57b8b5 Added doc strings. Also export LockType from the modoule, and give it
Guido van Rossum <guido@python.org>
parents: 8433
diff changeset
1078 \n\
20468
ebfd87e87884 Partial patch from SF #452266, by Jason Petrone.
Guido van Rossum <guido@python.org>
parents: 20266
diff changeset
1079 Start a new thread and return its identifier. The thread will call the\n\
ebfd87e87884 Partial patch from SF #452266, by Jason Petrone.
Guido van Rossum <guido@python.org>
parents: 20266
diff changeset
1080 function with positional arguments from the tuple args and keyword arguments\n\
ebfd87e87884 Partial patch from SF #452266, by Jason Petrone.
Guido van Rossum <guido@python.org>
parents: 20266
diff changeset
1081 taken from the optional dictionary kwargs. The thread exits when the\n\
ebfd87e87884 Partial patch from SF #452266, by Jason Petrone.
Guido van Rossum <guido@python.org>
parents: 20266
diff changeset
1082 function returns; the return value is ignored. The thread will also exit\n\
ebfd87e87884 Partial patch from SF #452266, by Jason Petrone.
Guido van Rossum <guido@python.org>
parents: 20266
diff changeset
1083 when the function raises an unhandled exception; a stack trace will be\n\
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 22865
diff changeset
1084 printed unless the exception is SystemExit.\n");
8562
ff9adb57b8b5 Added doc strings. Also export LockType from the modoule, and give it
Guido van Rossum <guido@python.org>
parents: 8433
diff changeset
1085
4751
7ab835f87f86 Renamed.
Barry Warsaw <barry@python.org>
parents: 4600
diff changeset
1086 static PyObject *
22561
043ad7adc896 Remove many uses of PyArg_NoArgs macro, change METH_OLDARGS to METH_NOARGS.
Neal Norwitz <nnorwitz@gmail.com>
parents: 21313
diff changeset
1087 thread_PyThread_exit_thread(PyObject *self)
923
72aceed365d4 * Makefile adapted to changes below.
Guido van Rossum <guido@python.org>
parents:
diff changeset
1088 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1089 PyErr_SetNone(PyExc_SystemExit);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1090 return NULL;
923
72aceed365d4 * Makefile adapted to changes below.
Guido van Rossum <guido@python.org>
parents:
diff changeset
1091 }
72aceed365d4 * Makefile adapted to changes below.
Guido van Rossum <guido@python.org>
parents:
diff changeset
1092
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 22865
diff changeset
1093 PyDoc_STRVAR(exit_doc,
8562
ff9adb57b8b5 Added doc strings. Also export LockType from the modoule, and give it
Guido van Rossum <guido@python.org>
parents: 8433
diff changeset
1094 "exit()\n\
9679
877d23bd5bdc Thanks to Chris Herborth, the thread primitives now have proper Py*
Guido van Rossum <guido@python.org>
parents: 9588
diff changeset
1095 (PyThread_exit_thread() is an obsolete synonym)\n\
8562
ff9adb57b8b5 Added doc strings. Also export LockType from the modoule, and give it
Guido van Rossum <guido@python.org>
parents: 8433
diff changeset
1096 \n\
ff9adb57b8b5 Added doc strings. Also export LockType from the modoule, and give it
Guido van Rossum <guido@python.org>
parents: 8433
diff changeset
1097 This is synonymous to ``raise SystemExit''. It will cause the current\n\
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 22865
diff changeset
1098 thread to exit silently unless the exception is caught.");
8562
ff9adb57b8b5 Added doc strings. Also export LockType from the modoule, and give it
Guido van Rossum <guido@python.org>
parents: 8433
diff changeset
1099
29444
8d160095eb66 Add interrupt_main() to thread module.
Kurt B. Kaiser <kbk@shore.net>
parents: 28889
diff changeset
1100 static PyObject *
29498
1402f265e48f Correct function name.
Kurt B. Kaiser <kbk@shore.net>
parents: 29444
diff changeset
1101 thread_PyThread_interrupt_main(PyObject * self)
29444
8d160095eb66 Add interrupt_main() to thread module.
Kurt B. Kaiser <kbk@shore.net>
parents: 28889
diff changeset
1102 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1103 PyErr_SetInterrupt();
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1104 Py_INCREF(Py_None);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1105 return Py_None;
29444
8d160095eb66 Add interrupt_main() to thread module.
Kurt B. Kaiser <kbk@shore.net>
parents: 28889
diff changeset
1106 }
8d160095eb66 Add interrupt_main() to thread module.
Kurt B. Kaiser <kbk@shore.net>
parents: 28889
diff changeset
1107
8d160095eb66 Add interrupt_main() to thread module.
Kurt B. Kaiser <kbk@shore.net>
parents: 28889
diff changeset
1108 PyDoc_STRVAR(interrupt_doc,
8d160095eb66 Add interrupt_main() to thread module.
Kurt B. Kaiser <kbk@shore.net>
parents: 28889
diff changeset
1109 "interrupt_main()\n\
8d160095eb66 Add interrupt_main() to thread module.
Kurt B. Kaiser <kbk@shore.net>
parents: 28889
diff changeset
1110 \n\
8d160095eb66 Add interrupt_main() to thread module.
Kurt B. Kaiser <kbk@shore.net>
parents: 28889
diff changeset
1111 Raise a KeyboardInterrupt in the main thread.\n\
29498
1402f265e48f Correct function name.
Kurt B. Kaiser <kbk@shore.net>
parents: 29444
diff changeset
1112 A subthread can use this function to interrupt the main thread."
29444
8d160095eb66 Add interrupt_main() to thread module.
Kurt B. Kaiser <kbk@shore.net>
parents: 28889
diff changeset
1113 );
8d160095eb66 Add interrupt_main() to thread module.
Kurt B. Kaiser <kbk@shore.net>
parents: 28889
diff changeset
1114
37879
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36926
diff changeset
1115 static lockobject *newlockobject(void);
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36926
diff changeset
1116
4751
7ab835f87f86 Renamed.
Barry Warsaw <barry@python.org>
parents: 4600
diff changeset
1117 static PyObject *
22561
043ad7adc896 Remove many uses of PyArg_NoArgs macro, change METH_OLDARGS to METH_NOARGS.
Neal Norwitz <nnorwitz@gmail.com>
parents: 21313
diff changeset
1118 thread_PyThread_allocate_lock(PyObject *self)
923
72aceed365d4 * Makefile adapted to changes below.
Guido van Rossum <guido@python.org>
parents:
diff changeset
1119 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1120 return (PyObject *) newlockobject();
923
72aceed365d4 * Makefile adapted to changes below.
Guido van Rossum <guido@python.org>
parents:
diff changeset
1121 }
72aceed365d4 * Makefile adapted to changes below.
Guido van Rossum <guido@python.org>
parents:
diff changeset
1122
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 22865
diff changeset
1123 PyDoc_STRVAR(allocate_doc,
8562
ff9adb57b8b5 Added doc strings. Also export LockType from the modoule, and give it
Guido van Rossum <guido@python.org>
parents: 8433
diff changeset
1124 "allocate_lock() -> lock object\n\
ff9adb57b8b5 Added doc strings. Also export LockType from the modoule, and give it
Guido van Rossum <guido@python.org>
parents: 8433
diff changeset
1125 (allocate() is an obsolete synonym)\n\
ff9adb57b8b5 Added doc strings. Also export LockType from the modoule, and give it
Guido van Rossum <guido@python.org>
parents: 8433
diff changeset
1126 \n\
64076
e3df34544db9 Issue #8983: Corrected docstrings.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 63897
diff changeset
1127 Create a new lock object. See help(LockType) for information about locks.");
8562
ff9adb57b8b5 Added doc strings. Also export LockType from the modoule, and give it
Guido van Rossum <guido@python.org>
parents: 8433
diff changeset
1128
4751
7ab835f87f86 Renamed.
Barry Warsaw <barry@python.org>
parents: 4600
diff changeset
1129 static PyObject *
22561
043ad7adc896 Remove many uses of PyArg_NoArgs macro, change METH_OLDARGS to METH_NOARGS.
Neal Norwitz <nnorwitz@gmail.com>
parents: 21313
diff changeset
1130 thread_get_ident(PyObject *self)
1746
1940892d2fe3 Merge alpha100 branch back to main trunk
Guido van Rossum <guido@python.org>
parents: 1418
diff changeset
1131 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1132 long ident;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1133 ident = PyThread_get_thread_ident();
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1134 if (ident == -1) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1135 PyErr_SetString(ThreadError, "no current thread ident");
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1136 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1137 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1138 return PyLong_FromLong(ident);
1746
1940892d2fe3 Merge alpha100 branch back to main trunk
Guido van Rossum <guido@python.org>
parents: 1418
diff changeset
1139 }
1940892d2fe3 Merge alpha100 branch back to main trunk
Guido van Rossum <guido@python.org>
parents: 1418
diff changeset
1140
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 22865
diff changeset
1141 PyDoc_STRVAR(get_ident_doc,
8562
ff9adb57b8b5 Added doc strings. Also export LockType from the modoule, and give it
Guido van Rossum <guido@python.org>
parents: 8433
diff changeset
1142 "get_ident() -> integer\n\
ff9adb57b8b5 Added doc strings. Also export LockType from the modoule, and give it
Guido van Rossum <guido@python.org>
parents: 8433
diff changeset
1143 \n\
ff9adb57b8b5 Added doc strings. Also export LockType from the modoule, and give it
Guido van Rossum <guido@python.org>
parents: 8433
diff changeset
1144 Return a non-zero integer that uniquely identifies the current thread\n\
ff9adb57b8b5 Added doc strings. Also export LockType from the modoule, and give it
Guido van Rossum <guido@python.org>
parents: 8433
diff changeset
1145 amongst other threads that exist simultaneously.\n\
ff9adb57b8b5 Added doc strings. Also export LockType from the modoule, and give it
Guido van Rossum <guido@python.org>
parents: 8433
diff changeset
1146 This may be used to identify per-thread resources.\n\
ff9adb57b8b5 Added doc strings. Also export LockType from the modoule, and give it
Guido van Rossum <guido@python.org>
parents: 8433
diff changeset
1147 Even though on some platforms threads identities may appear to be\n\
ff9adb57b8b5 Added doc strings. Also export LockType from the modoule, and give it
Guido van Rossum <guido@python.org>
parents: 8433
diff changeset
1148 allocated consecutive numbers starting at 1, this behavior should not\n\
ff9adb57b8b5 Added doc strings. Also export LockType from the modoule, and give it
Guido van Rossum <guido@python.org>
parents: 8433
diff changeset
1149 be relied upon, and the number should be seen purely as a magic cookie.\n\
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 22865
diff changeset
1150 A thread's identity may be reused for another thread after it exits.");
8562
ff9adb57b8b5 Added doc strings. Also export LockType from the modoule, and give it
Guido van Rossum <guido@python.org>
parents: 8433
diff changeset
1151
39442
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38669
diff changeset
1152 static PyObject *
56981
6cf84e5a6dd7 Merged revisions 75958 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56440
diff changeset
1153 thread__count(PyObject *self)
6cf84e5a6dd7 Merged revisions 75958 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56440
diff changeset
1154 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1155 return PyLong_FromLong(nb_threads);
56981
6cf84e5a6dd7 Merged revisions 75958 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56440
diff changeset
1156 }
6cf84e5a6dd7 Merged revisions 75958 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56440
diff changeset
1157
6cf84e5a6dd7 Merged revisions 75958 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56440
diff changeset
1158 PyDoc_STRVAR(_count_doc,
6cf84e5a6dd7 Merged revisions 75958 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56440
diff changeset
1159 "_count() -> integer\n\
6cf84e5a6dd7 Merged revisions 75958 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56440
diff changeset
1160 \n\
56992
bf93e4df7bfb Merged revisions 75969 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56981
diff changeset
1161 \
bf93e4df7bfb Merged revisions 75969 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56981
diff changeset
1162 Return the number of currently running Python threads, excluding \n\
bf93e4df7bfb Merged revisions 75969 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56981
diff changeset
1163 the main thread. The returned number comprises all threads created\n\
bf93e4df7bfb Merged revisions 75969 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56981
diff changeset
1164 through `start_new_thread()` as well as `threading.Thread`, and not\n\
bf93e4df7bfb Merged revisions 75969 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56981
diff changeset
1165 yet finished.\n\
bf93e4df7bfb Merged revisions 75969 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56981
diff changeset
1166 \n\
bf93e4df7bfb Merged revisions 75969 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56981
diff changeset
1167 This function is meant for internal and specialized purposes only.\n\
bf93e4df7bfb Merged revisions 75969 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56981
diff changeset
1168 In most applications `threading.enumerate()` should be used instead.");
56981
6cf84e5a6dd7 Merged revisions 75958 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56440
diff changeset
1169
6cf84e5a6dd7 Merged revisions 75958 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56440
diff changeset
1170 static PyObject *
39442
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38669
diff changeset
1171 thread_stack_size(PyObject *self, PyObject *args)
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38669
diff changeset
1172 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1173 size_t old_size;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1174 Py_ssize_t new_size = 0;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1175 int rc;
39442
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38669
diff changeset
1176
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1177 if (!PyArg_ParseTuple(args, "|n:stack_size", &new_size))
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1178 return NULL;
39442
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38669
diff changeset
1179
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1180 if (new_size < 0) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1181 PyErr_SetString(PyExc_ValueError,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1182 "size must be 0 or a positive value");
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1183 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1184 }
39442
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38669
diff changeset
1185
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1186 old_size = PyThread_get_stacksize();
39442
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38669
diff changeset
1187
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1188 rc = PyThread_set_stacksize((size_t) new_size);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1189 if (rc == -1) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1190 PyErr_Format(PyExc_ValueError,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1191 "size not valid: %zd bytes",
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1192 new_size);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1193 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1194 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1195 if (rc == -2) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1196 PyErr_SetString(ThreadError,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1197 "setting stack size not supported");
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1198 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1199 }
39442
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38669
diff changeset
1200
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1201 return PyLong_FromSsize_t((Py_ssize_t) old_size);
39442
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38669
diff changeset
1202 }
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38669
diff changeset
1203
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38669
diff changeset
1204 PyDoc_STRVAR(stack_size_doc,
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38669
diff changeset
1205 "stack_size([size]) -> size\n\
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38669
diff changeset
1206 \n\
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38669
diff changeset
1207 Return the thread stack size used when creating new threads. The\n\
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38669
diff changeset
1208 optional size argument specifies the stack size (in bytes) to be used\n\
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38669
diff changeset
1209 for subsequently created threads, and must be 0 (use platform or\n\
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38669
diff changeset
1210 configured default) or a positive integer value of at least 32,768 (32k).\n\
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38669
diff changeset
1211 If changing the thread stack size is unsupported, a ThreadError\n\
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38669
diff changeset
1212 exception is raised. If the specified size is invalid, a ValueError\n\
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38669
diff changeset
1213 exception is raised, and the stack size is unmodified. 32k bytes\n\
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38669
diff changeset
1214 currently the minimum supported stack size value to guarantee\n\
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38669
diff changeset
1215 sufficient stack space for the interpreter itself.\n\
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38669
diff changeset
1216 \n\
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38669
diff changeset
1217 Note that some platforms may have particular restrictions on values for\n\
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38669
diff changeset
1218 the stack size, such as requiring a minimum stack size larger than 32kB or\n\
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38669
diff changeset
1219 requiring allocation in multiples of the system memory page size\n\
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38669
diff changeset
1220 - platform documentation should be referred to for more information\n\
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38669
diff changeset
1221 (4kB pages are common; using multiples of 4096 for the stack size is\n\
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38669
diff changeset
1222 the suggested approach in the absence of more specific information).");
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38669
diff changeset
1223
4751
7ab835f87f86 Renamed.
Barry Warsaw <barry@python.org>
parents: 4600
diff changeset
1224 static PyMethodDef thread_methods[] = {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1225 {"start_new_thread", (PyCFunction)thread_PyThread_start_new_thread,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1226 METH_VARARGS,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1227 start_new_doc},
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1228 {"start_new", (PyCFunction)thread_PyThread_start_new_thread,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1229 METH_VARARGS,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1230 start_new_doc},
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1231 {"allocate_lock", (PyCFunction)thread_PyThread_allocate_lock,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1232 METH_NOARGS, allocate_doc},
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1233 {"allocate", (PyCFunction)thread_PyThread_allocate_lock,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1234 METH_NOARGS, allocate_doc},
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1235 {"exit_thread", (PyCFunction)thread_PyThread_exit_thread,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1236 METH_NOARGS, exit_doc},
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1237 {"exit", (PyCFunction)thread_PyThread_exit_thread,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1238 METH_NOARGS, exit_doc},
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1239 {"interrupt_main", (PyCFunction)thread_PyThread_interrupt_main,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1240 METH_NOARGS, interrupt_doc},
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1241 {"get_ident", (PyCFunction)thread_get_ident,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1242 METH_NOARGS, get_ident_doc},
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1243 {"_count", (PyCFunction)thread__count,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1244 METH_NOARGS, _count_doc},
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1245 {"stack_size", (PyCFunction)thread_stack_size,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1246 METH_VARARGS,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1247 stack_size_doc},
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1248 {NULL, NULL} /* sentinel */
923
72aceed365d4 * Makefile adapted to changes below.
Guido van Rossum <guido@python.org>
parents:
diff changeset
1249 };
72aceed365d4 * Makefile adapted to changes below.
Guido van Rossum <guido@python.org>
parents:
diff changeset
1250
72aceed365d4 * Makefile adapted to changes below.
Guido van Rossum <guido@python.org>
parents:
diff changeset
1251
72aceed365d4 * Makefile adapted to changes below.
Guido van Rossum <guido@python.org>
parents:
diff changeset
1252 /* Initialization function */
72aceed365d4 * Makefile adapted to changes below.
Guido van Rossum <guido@python.org>
parents:
diff changeset
1253
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 22865
diff changeset
1254 PyDoc_STRVAR(thread_doc,
8562
ff9adb57b8b5 Added doc strings. Also export LockType from the modoule, and give it
Guido van Rossum <guido@python.org>
parents: 8433
diff changeset
1255 "This module provides primitive operations to write multi-threaded programs.\n\
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 22865
diff changeset
1256 The 'threading' module provides a more convenient interface.");
8562
ff9adb57b8b5 Added doc strings. Also export LockType from the modoule, and give it
Guido van Rossum <guido@python.org>
parents: 8433
diff changeset
1257
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 22865
diff changeset
1258 PyDoc_STRVAR(lock_doc,
8562
ff9adb57b8b5 Added doc strings. Also export LockType from the modoule, and give it
Guido van Rossum <guido@python.org>
parents: 8433
diff changeset
1259 "A lock object is a synchronization primitive. To create a lock,\n\
9679
877d23bd5bdc Thanks to Chris Herborth, the thread primitives now have proper Py*
Guido van Rossum <guido@python.org>
parents: 9588
diff changeset
1260 call the PyThread_allocate_lock() function. Methods are:\n\
8562
ff9adb57b8b5 Added doc strings. Also export LockType from the modoule, and give it
Guido van Rossum <guido@python.org>
parents: 8433
diff changeset
1261 \n\
ff9adb57b8b5 Added doc strings. Also export LockType from the modoule, and give it
Guido van Rossum <guido@python.org>
parents: 8433
diff changeset
1262 acquire() -- lock the lock, possibly blocking until it can be obtained\n\
ff9adb57b8b5 Added doc strings. Also export LockType from the modoule, and give it
Guido van Rossum <guido@python.org>
parents: 8433
diff changeset
1263 release() -- unlock of the lock\n\
ff9adb57b8b5 Added doc strings. Also export LockType from the modoule, and give it
Guido van Rossum <guido@python.org>
parents: 8433
diff changeset
1264 locked() -- test whether the lock is currently locked\n\
ff9adb57b8b5 Added doc strings. Also export LockType from the modoule, and give it
Guido van Rossum <guido@python.org>
parents: 8433
diff changeset
1265 \n\
ff9adb57b8b5 Added doc strings. Also export LockType from the modoule, and give it
Guido van Rossum <guido@python.org>
parents: 8433
diff changeset
1266 A lock is not owned by the thread that locked it; another thread may\n\
ff9adb57b8b5 Added doc strings. Also export LockType from the modoule, and give it
Guido van Rossum <guido@python.org>
parents: 8433
diff changeset
1267 unlock it. A thread attempting to lock a lock that it has already locked\n\
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 22865
diff changeset
1268 will block until another thread unlocks it. Deadlocks may ensue.");
8562
ff9adb57b8b5 Added doc strings. Also export LockType from the modoule, and give it
Guido van Rossum <guido@python.org>
parents: 8433
diff changeset
1269
47580
94f64f11fdd0 Implement PEP 3121: new module initialization and finalization API.
Martin v. Löwis <martin@v.loewis.de>
parents: 47285
diff changeset
1270 static struct PyModuleDef threadmodule = {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1271 PyModuleDef_HEAD_INIT,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1272 "_thread",
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1273 thread_doc,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1274 -1,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1275 thread_methods,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1276 NULL,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1277 NULL,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1278 NULL,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1279 NULL
47580
94f64f11fdd0 Implement PEP 3121: new module initialization and finalization API.
Martin v. Löwis <martin@v.loewis.de>
parents: 47285
diff changeset
1280 };
94f64f11fdd0 Implement PEP 3121: new module initialization and finalization API.
Martin v. Löwis <martin@v.loewis.de>
parents: 47285
diff changeset
1281
94f64f11fdd0 Implement PEP 3121: new module initialization and finalization API.
Martin v. Löwis <martin@v.loewis.de>
parents: 47285
diff changeset
1282
24471
f66b3a3509c7 Excise DL_EXPORT/DL_IMPORT from Modules/*. Required adding a prototype
Mark Hammond <mhammond@skippinet.com.au>
parents: 24280
diff changeset
1283 PyMODINIT_FUNC
47580
94f64f11fdd0 Implement PEP 3121: new module initialization and finalization API.
Martin v. Löwis <martin@v.loewis.de>
parents: 47285
diff changeset
1284 PyInit__thread(void)
923
72aceed365d4 * Makefile adapted to changes below.
Guido van Rossum <guido@python.org>
parents:
diff changeset
1285 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1286 PyObject *m, *d, *timeout_max;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1287
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1288 /* Initialize types: */
63897
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
1289 if (PyType_Ready(&localdummytype) < 0)
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
1290 return NULL;
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1291 if (PyType_Ready(&localtype) < 0)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1292 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1293 if (PyType_Ready(&Locktype) < 0)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1294 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1295 if (PyType_Ready(&RLocktype) < 0)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1296 return NULL;
923
72aceed365d4 * Makefile adapted to changes below.
Guido van Rossum <guido@python.org>
parents:
diff changeset
1297
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1298 /* Create the module and add the functions */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1299 m = PyModule_Create(&threadmodule);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1300 if (m == NULL)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1301 return NULL;
923
72aceed365d4 * Makefile adapted to changes below.
Guido van Rossum <guido@python.org>
parents:
diff changeset
1302
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1303 timeout_max = PyFloat_FromDouble(PY_TIMEOUT_MAX / 1000000);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1304 if (!timeout_max)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1305 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1306 if (PyModule_AddObject(m, "TIMEOUT_MAX", timeout_max) < 0)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1307 return NULL;
60598
01d1fd775d16 Issue #7316: the acquire() method of lock objects in the :mod:`threading`
Antoine Pitrou <solipsis@pitrou.net>
parents: 59316
diff changeset
1308
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1309 /* Add a symbolic constant */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1310 d = PyModule_GetDict(m);
68191
2ddca55e098d Issue #11140: Lock.release() now raises a RuntimeError when attempting
Antoine Pitrou <solipsis@pitrou.net>
parents: 68102
diff changeset
1311 ThreadError = PyExc_RuntimeError;
2ddca55e098d Issue #11140: Lock.release() now raises a RuntimeError when attempting
Antoine Pitrou <solipsis@pitrou.net>
parents: 68102
diff changeset
1312 Py_INCREF(ThreadError);
2ddca55e098d Issue #11140: Lock.release() now raises a RuntimeError when attempting
Antoine Pitrou <solipsis@pitrou.net>
parents: 68102
diff changeset
1313
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1314 PyDict_SetItemString(d, "error", ThreadError);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1315 Locktype.tp_doc = lock_doc;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1316 Py_INCREF(&Locktype);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1317 PyDict_SetItemString(d, "LockType", (PyObject *)&Locktype);
923
72aceed365d4 * Makefile adapted to changes below.
Guido van Rossum <guido@python.org>
parents:
diff changeset
1318
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1319 Py_INCREF(&RLocktype);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1320 if (PyModule_AddObject(m, "RLock", (PyObject *)&RLocktype) < 0)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1321 return NULL;
57172
6d91aaadddd0 Issue #3001: Add a C implementation of recursive locks which is used by
Antoine Pitrou <solipsis@pitrou.net>
parents: 56992
diff changeset
1322
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1323 Py_INCREF(&localtype);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1324 if (PyModule_AddObject(m, "_local", (PyObject *)&localtype) < 0)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1325 return NULL;
32673
97768d87394a Implemented thread-local data as proposed on python-dev:
Jim Fulton <jim@zope.com>
parents: 31797
diff changeset
1326
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1327 nb_threads = 0;
56981
6cf84e5a6dd7 Merged revisions 75958 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56440
diff changeset
1328
64298
0265d5f7bd07 Issue #1868: Eliminate subtle timing issues in thread-local objects by
Antoine Pitrou <solipsis@pitrou.net>
parents: 64076
diff changeset
1329 str_dict = PyUnicode_InternFromString("__dict__");
0265d5f7bd07 Issue #1868: Eliminate subtle timing issues in thread-local objects by
Antoine Pitrou <solipsis@pitrou.net>
parents: 64076
diff changeset
1330 if (str_dict == NULL)
0265d5f7bd07 Issue #1868: Eliminate subtle timing issues in thread-local objects by
Antoine Pitrou <solipsis@pitrou.net>
parents: 64076
diff changeset
1331 return NULL;
0265d5f7bd07 Issue #1868: Eliminate subtle timing issues in thread-local objects by
Antoine Pitrou <solipsis@pitrou.net>
parents: 64076
diff changeset
1332
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1333 /* Initialize the C thread library */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1334 PyThread_init_thread();
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1335 return m;
923
72aceed365d4 * Makefile adapted to changes below.
Guido van Rossum <guido@python.org>
parents:
diff changeset
1336 }