annotate Modules/_threadmodule.c @ 68043:cd14782886ca 3.2

Merged revisions 88652 via svnmerge from svn+ssh://pythondev@svn.python.org/python/branches/py3k ........ r88652 | antoine.pitrou | 2011-02-26 16:58:05 +0100 (sam., 26 févr. 2011) | 4 lines Issue #9931: Fix hangs in GUI tests under Windows in certain conditions. Patch by Hirokazu Yamamoto. ........
author Antoine Pitrou <solipsis@pitrou.net>
date Sat, 26 Feb 2011 16:49:08 +0000
parents b750c45a772c
children 3c9232a684ae e2f96bd29252
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
b750c45a772c Issue #8844: Regular and recursive lock acquisitions can now be interrupted
Antoine Pitrou <solipsis@pitrou.net>
parents: 64298
diff changeset
56 if (microseconds > 0) {
b750c45a772c Issue #8844: Regular and recursive lock acquisitions can now be interrupted
Antoine Pitrou <solipsis@pitrou.net>
parents: 64298
diff changeset
57 _PyTime_gettimeofday(&endtime);
b750c45a772c Issue #8844: Regular and recursive lock acquisitions can now be interrupted
Antoine Pitrou <solipsis@pitrou.net>
parents: 64298
diff changeset
58 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
59 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
60 }
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 do {
b750c45a772c Issue #8844: Regular and recursive lock acquisitions can now be interrupted
Antoine Pitrou <solipsis@pitrou.net>
parents: 64298
diff changeset
64 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
65 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
66 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
67
b750c45a772c Issue #8844: Regular and recursive lock acquisitions can now be interrupted
Antoine Pitrou <solipsis@pitrou.net>
parents: 64298
diff changeset
68 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
69 /* 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
70 * 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
71 * 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
72 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
73 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
74 }
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 /* 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
77 * 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
78 if (microseconds >= 0) {
b750c45a772c Issue #8844: Regular and recursive lock acquisitions can now be interrupted
Antoine Pitrou <solipsis@pitrou.net>
parents: 64298
diff changeset
79 _PyTime_gettimeofday(&curtime);
b750c45a772c Issue #8844: Regular and recursive lock acquisitions can now be interrupted
Antoine Pitrou <solipsis@pitrou.net>
parents: 64298
diff changeset
80 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
81 (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
82
b750c45a772c Issue #8844: Regular and recursive lock acquisitions can now be interrupted
Antoine Pitrou <solipsis@pitrou.net>
parents: 64298
diff changeset
83 /* 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
84 */
b750c45a772c Issue #8844: Regular and recursive lock acquisitions can now be interrupted
Antoine Pitrou <solipsis@pitrou.net>
parents: 64298
diff changeset
85 if (microseconds <= 0) {
b750c45a772c Issue #8844: Regular and recursive lock acquisitions can now be interrupted
Antoine Pitrou <solipsis@pitrou.net>
parents: 64298
diff changeset
86 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
87 }
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 } 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
91
b750c45a772c Issue #8844: Regular and recursive lock acquisitions can now be interrupted
Antoine Pitrou <solipsis@pitrou.net>
parents: 64298
diff changeset
92 return r;
b750c45a772c Issue #8844: Regular and recursive lock acquisitions can now be interrupted
Antoine Pitrou <solipsis@pitrou.net>
parents: 64298
diff changeset
93 }
b750c45a772c Issue #8844: Regular and recursive lock acquisitions can now be interrupted
Antoine Pitrou <solipsis@pitrou.net>
parents: 64298
diff changeset
94
4751
7ab835f87f86 Renamed.
Barry Warsaw <barry@python.org>
parents: 4600
diff changeset
95 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
96 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
97 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
98 char *kwlist[] = {"blocking", "timeout", NULL};
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
99 int blocking = 1;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
100 double timeout = -1;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
101 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
102 PyLockStatus r;
923
72aceed365d4 * Makefile adapted to changes below.
Guido van Rossum <guido@python.org>
parents:
diff changeset
103
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
104 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
105 &blocking, &timeout))
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
106 return NULL;
923
72aceed365d4 * Makefile adapted to changes below.
Guido van Rossum <guido@python.org>
parents:
diff changeset
107
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
108 if (!blocking && timeout != -1) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
109 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
110 "for a non-blocking call");
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
111 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
112 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
113 if (timeout < 0 && timeout != -1) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
114 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
115 "strictly positive");
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
116 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
117 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
118 if (!blocking)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
119 microseconds = 0;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
120 else if (timeout == -1)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
121 microseconds = -1;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
122 else {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
123 timeout *= 1e6;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
124 if (timeout >= (double) PY_TIMEOUT_MAX) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
125 PyErr_SetString(PyExc_OverflowError,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
126 "timeout value is too large");
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
127 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
128 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
129 microseconds = (PY_TIMEOUT_T) timeout;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
130 }
923
72aceed365d4 * Makefile adapted to changes below.
Guido van Rossum <guido@python.org>
parents:
diff changeset
131
66946
b750c45a772c Issue #8844: Regular and recursive lock acquisitions can now be interrupted
Antoine Pitrou <solipsis@pitrou.net>
parents: 64298
diff changeset
132 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
133 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
134 return NULL;
b750c45a772c Issue #8844: Regular and recursive lock acquisitions can now be interrupted
Antoine Pitrou <solipsis@pitrou.net>
parents: 64298
diff changeset
135 }
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
136
66946
b750c45a772c Issue #8844: Regular and recursive lock acquisitions can now be interrupted
Antoine Pitrou <solipsis@pitrou.net>
parents: 64298
diff changeset
137 return PyBool_FromLong(r == PY_LOCK_ACQUIRED);
923
72aceed365d4 * Makefile adapted to changes below.
Guido van Rossum <guido@python.org>
parents:
diff changeset
138 }
72aceed365d4 * Makefile adapted to changes below.
Guido van Rossum <guido@python.org>
parents:
diff changeset
139
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 22865
diff changeset
140 PyDoc_STRVAR(acquire_doc,
22865
7014921820a5 Lock methods acquire() and locked() now return bools.
Guido van Rossum <guido@python.org>
parents: 22709
diff changeset
141 "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
142 (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
143 \n\
ff9adb57b8b5 Added doc strings. Also export LockType from the modoule, and give it
Guido van Rossum <guido@python.org>
parents: 8433
diff changeset
144 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
145 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
146 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
147 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
148 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
149 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
150
4751
7ab835f87f86 Renamed.
Barry Warsaw <barry@python.org>
parents: 4600
diff changeset
151 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
152 lock_PyThread_release_lock(lockobject *self)
923
72aceed365d4 * Makefile adapted to changes below.
Guido van Rossum <guido@python.org>
parents:
diff changeset
153 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
154 /* 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
155 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
156 PyThread_release_lock(self->lock_lock);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
157 PyErr_SetString(ThreadError, "release unlocked lock");
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
158 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
159 }
923
72aceed365d4 * Makefile adapted to changes below.
Guido van Rossum <guido@python.org>
parents:
diff changeset
160
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
161 PyThread_release_lock(self->lock_lock);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
162 Py_INCREF(Py_None);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
163 return Py_None;
923
72aceed365d4 * Makefile adapted to changes below.
Guido van Rossum <guido@python.org>
parents:
diff changeset
164 }
72aceed365d4 * Makefile adapted to changes below.
Guido van Rossum <guido@python.org>
parents:
diff changeset
165
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 22865
diff changeset
166 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
167 "release()\n\
36926
fc10ff322df1 Um, I thought I'd already checked this in.
Guido van Rossum <guido@python.org>
parents: 36895
diff changeset
168 (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
169 \n\
ff9adb57b8b5 Added doc strings. Also export LockType from the modoule, and give it
Guido van Rossum <guido@python.org>
parents: 8433
diff changeset
170 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
171 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
172 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
173
4751
7ab835f87f86 Renamed.
Barry Warsaw <barry@python.org>
parents: 4600
diff changeset
174 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
175 lock_locked_lock(lockobject *self)
923
72aceed365d4 * Makefile adapted to changes below.
Guido van Rossum <guido@python.org>
parents:
diff changeset
176 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
177 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
178 PyThread_release_lock(self->lock_lock);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
179 return PyBool_FromLong(0L);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
180 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
181 return PyBool_FromLong(1L);
923
72aceed365d4 * Makefile adapted to changes below.
Guido van Rossum <guido@python.org>
parents:
diff changeset
182 }
72aceed365d4 * Makefile adapted to changes below.
Guido van Rossum <guido@python.org>
parents:
diff changeset
183
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 22865
diff changeset
184 PyDoc_STRVAR(locked_doc,
22865
7014921820a5 Lock methods acquire() and locked() now return bools.
Guido van Rossum <guido@python.org>
parents: 22709
diff changeset
185 "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
186 (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
187 \n\
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 22865
diff changeset
188 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
189
4751
7ab835f87f86 Renamed.
Barry Warsaw <barry@python.org>
parents: 4600
diff changeset
190 static PyMethodDef lock_methods[] = {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
191 {"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
192 METH_VARARGS | METH_KEYWORDS, acquire_doc},
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
193 {"acquire", (PyCFunction)lock_PyThread_acquire_lock,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
194 METH_VARARGS | METH_KEYWORDS, acquire_doc},
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
195 {"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
196 METH_NOARGS, release_doc},
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
197 {"release", (PyCFunction)lock_PyThread_release_lock,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
198 METH_NOARGS, release_doc},
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
199 {"locked_lock", (PyCFunction)lock_locked_lock,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
200 METH_NOARGS, locked_doc},
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
201 {"locked", (PyCFunction)lock_locked_lock,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
202 METH_NOARGS, locked_doc},
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
203 {"__enter__", (PyCFunction)lock_PyThread_acquire_lock,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
204 METH_VARARGS | METH_KEYWORDS, acquire_doc},
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
205 {"__exit__", (PyCFunction)lock_PyThread_release_lock,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
206 METH_VARARGS, release_doc},
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
207 {NULL, NULL} /* sentinel */
923
72aceed365d4 * Makefile adapted to changes below.
Guido van Rossum <guido@python.org>
parents:
diff changeset
208 };
72aceed365d4 * Makefile adapted to changes below.
Guido van Rossum <guido@python.org>
parents:
diff changeset
209
4751
7ab835f87f86 Renamed.
Barry Warsaw <barry@python.org>
parents: 4600
diff changeset
210 static PyTypeObject Locktype = {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
211 PyVarObject_HEAD_INIT(&PyType_Type, 0)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
212 "_thread.lock", /*tp_name*/
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
213 sizeof(lockobject), /*tp_size*/
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
214 0, /*tp_itemsize*/
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
215 /* methods */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
216 (destructor)lock_dealloc, /*tp_dealloc*/
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
217 0, /*tp_print*/
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
218 0, /*tp_getattr*/
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
219 0, /*tp_setattr*/
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
220 0, /*tp_reserved*/
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
221 0, /*tp_repr*/
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
222 0, /*tp_as_number*/
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
223 0, /*tp_as_sequence*/
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
224 0, /*tp_as_mapping*/
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
225 0, /*tp_hash*/
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
226 0, /*tp_call*/
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
227 0, /*tp_str*/
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
228 0, /*tp_getattro*/
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
229 0, /*tp_setattro*/
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
230 0, /*tp_as_buffer*/
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
231 Py_TPFLAGS_DEFAULT, /*tp_flags*/
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
232 0, /*tp_doc*/
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
233 0, /*tp_traverse*/
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
234 0, /*tp_clear*/
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
235 0, /*tp_richcompare*/
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
236 offsetof(lockobject, in_weakreflist), /*tp_weaklistoffset*/
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
237 0, /*tp_iter*/
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
238 0, /*tp_iternext*/
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
239 lock_methods, /*tp_methods*/
923
72aceed365d4 * Makefile adapted to changes below.
Guido van Rossum <guido@python.org>
parents:
diff changeset
240 };
72aceed365d4 * Makefile adapted to changes below.
Guido van Rossum <guido@python.org>
parents:
diff changeset
241
57172
6d91aaadddd0 Issue #3001: Add a C implementation of recursive locks which is used by
Antoine Pitrou <solipsis@pitrou.net>
parents: 56992
diff changeset
242 /* 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
243
6d91aaadddd0 Issue #3001: Add a C implementation of recursive locks which is used by
Antoine Pitrou <solipsis@pitrou.net>
parents: 56992
diff changeset
244 typedef struct {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
245 PyObject_HEAD
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
246 PyThread_type_lock rlock_lock;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
247 long rlock_owner;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
248 unsigned long rlock_count;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
249 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
250 } rlockobject;
6d91aaadddd0 Issue #3001: Add a C implementation of recursive locks which is used by
Antoine Pitrou <solipsis@pitrou.net>
parents: 56992
diff changeset
251
6d91aaadddd0 Issue #3001: Add a C implementation of recursive locks which is used by
Antoine Pitrou <solipsis@pitrou.net>
parents: 56992
diff changeset
252 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
253 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
254 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
255 assert(self->rlock_lock);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
256 if (self->in_weakreflist != NULL)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
257 PyObject_ClearWeakRefs((PyObject *) self);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
258 /* 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
259 if (self->rlock_count > 0)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
260 PyThread_release_lock(self->rlock_lock);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
261
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
262 PyThread_free_lock(self->rlock_lock);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
263 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
264 }
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 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
267 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
268 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
269 char *kwlist[] = {"blocking", "timeout", NULL};
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
270 int blocking = 1;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
271 double timeout = -1;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
272 PY_TIMEOUT_T microseconds;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
273 long tid;
66946
b750c45a772c Issue #8844: Regular and recursive lock acquisitions can now be interrupted
Antoine Pitrou <solipsis@pitrou.net>
parents: 64298
diff changeset
274 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
275
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
276 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
277 &blocking, &timeout))
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
278 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
279
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
280 if (!blocking && timeout != -1) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
281 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
282 "for a non-blocking call");
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
283 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
284 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
285 if (timeout < 0 && timeout != -1) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
286 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
287 "strictly positive");
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
288 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
289 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
290 if (!blocking)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
291 microseconds = 0;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
292 else if (timeout == -1)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
293 microseconds = -1;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
294 else {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
295 timeout *= 1e6;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
296 if (timeout >= (double) PY_TIMEOUT_MAX) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
297 PyErr_SetString(PyExc_OverflowError,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
298 "timeout value is too large");
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
299 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
300 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
301 microseconds = (PY_TIMEOUT_T) timeout;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
302 }
57172
6d91aaadddd0 Issue #3001: Add a C implementation of recursive locks which is used by
Antoine Pitrou <solipsis@pitrou.net>
parents: 56992
diff changeset
303
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
304 tid = PyThread_get_thread_ident();
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
305 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
306 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
307 if (count <= self->rlock_count) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
308 PyErr_SetString(PyExc_OverflowError,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
309 "Internal lock count overflowed");
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
310 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
311 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
312 self->rlock_count = count;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
313 Py_RETURN_TRUE;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
314 }
57172
6d91aaadddd0 Issue #3001: Add a C implementation of recursive locks which is used by
Antoine Pitrou <solipsis@pitrou.net>
parents: 56992
diff changeset
315
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
316 if (self->rlock_count > 0 ||
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
317 !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
318 if (microseconds == 0) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
319 Py_RETURN_FALSE;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
320 }
66946
b750c45a772c Issue #8844: Regular and recursive lock acquisitions can now be interrupted
Antoine Pitrou <solipsis@pitrou.net>
parents: 64298
diff changeset
321 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
322 }
66946
b750c45a772c Issue #8844: Regular and recursive lock acquisitions can now be interrupted
Antoine Pitrou <solipsis@pitrou.net>
parents: 64298
diff changeset
323 if (r == PY_LOCK_ACQUIRED) {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
324 assert(self->rlock_count == 0);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
325 self->rlock_owner = tid;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
326 self->rlock_count = 1;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
327 }
66946
b750c45a772c Issue #8844: Regular and recursive lock acquisitions can now be interrupted
Antoine Pitrou <solipsis@pitrou.net>
parents: 64298
diff changeset
328 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
329 return NULL;
b750c45a772c Issue #8844: Regular and recursive lock acquisitions can now be interrupted
Antoine Pitrou <solipsis@pitrou.net>
parents: 64298
diff changeset
330 }
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
331
66946
b750c45a772c Issue #8844: Regular and recursive lock acquisitions can now be interrupted
Antoine Pitrou <solipsis@pitrou.net>
parents: 64298
diff changeset
332 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
333 }
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 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
336 "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
337 \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 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
339 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
340 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
341 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
342 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
343 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
344 (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
345 \n\
6d91aaadddd0 Issue #3001: Add a C implementation of recursive locks which is used by
Antoine Pitrou <solipsis@pitrou.net>
parents: 56992
diff changeset
346 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
347 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
348 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
349 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
350
6d91aaadddd0 Issue #3001: Add a C implementation of recursive locks which is used by
Antoine Pitrou <solipsis@pitrou.net>
parents: 56992
diff changeset
351 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
352 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
353 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
354 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
355
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
356 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
357 PyErr_SetString(PyExc_RuntimeError,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
358 "cannot release un-acquired lock");
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
359 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
360 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
361 if (--self->rlock_count == 0) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
362 self->rlock_owner = 0;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
363 PyThread_release_lock(self->rlock_lock);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
364 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
365 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
366 }
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 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
369 "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
370 \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 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
372 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
373 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
374 `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
375 \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 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
377 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
378 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
379
6d91aaadddd0 Issue #3001: Add a C implementation of recursive locks which is used by
Antoine Pitrou <solipsis@pitrou.net>
parents: 56992
diff changeset
380 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
381 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
382 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
383 long owner;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
384 unsigned long count;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
385 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
386
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
387 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
388 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
389
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
390 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
391 Py_BEGIN_ALLOW_THREADS
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
392 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
393 Py_END_ALLOW_THREADS
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
394 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
395 if (!r) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
396 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
397 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
398 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
399 assert(self->rlock_count == 0);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
400 self->rlock_owner = owner;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
401 self->rlock_count = count;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
402 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
403 }
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 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
406 "_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
407 \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 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
409
6d91aaadddd0 Issue #3001: Add a C implementation of recursive locks which is used by
Antoine Pitrou <solipsis@pitrou.net>
parents: 56992
diff changeset
410 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
411 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
412 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
413 long owner;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
414 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
415
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
416 owner = self->rlock_owner;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
417 count = self->rlock_count;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
418 self->rlock_count = 0;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
419 self->rlock_owner = 0;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
420 PyThread_release_lock(self->rlock_lock);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
421 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
422 }
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 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
425 "_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
426 \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 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
428
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 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
431 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
432 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
433 long tid = PyThread_get_thread_ident();
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
434
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
435 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
436 Py_RETURN_TRUE;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
437 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
438 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
439 }
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 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
442 "_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
443 \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 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
445
6d91aaadddd0 Issue #3001: Add a C implementation of recursive locks which is used by
Antoine Pitrou <solipsis@pitrou.net>
parents: 56992
diff changeset
446 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
447 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
448 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
449 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
450
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
451 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
452 if (self != NULL) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
453 self->rlock_lock = PyThread_allocate_lock();
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
454 if (self->rlock_lock == NULL) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
455 type->tp_free(self);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
456 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
457 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
458 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
459 self->in_weakreflist = NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
460 self->rlock_owner = 0;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
461 self->rlock_count = 0;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
462 }
57172
6d91aaadddd0 Issue #3001: Add a C implementation of recursive locks which is used by
Antoine Pitrou <solipsis@pitrou.net>
parents: 56992
diff changeset
463
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
464 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
465 }
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 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
468 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
469 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
470 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
471 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
472 }
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 static PyMethodDef rlock_methods[] = {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
476 {"acquire", (PyCFunction)rlock_acquire,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
477 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
478 {"release", (PyCFunction)rlock_release,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
479 METH_NOARGS, rlock_release_doc},
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
480 {"_is_owned", (PyCFunction)rlock_is_owned,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
481 METH_NOARGS, rlock_is_owned_doc},
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
482 {"_acquire_restore", (PyCFunction)rlock_acquire_restore,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
483 METH_O, rlock_acquire_restore_doc},
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
484 {"_release_save", (PyCFunction)rlock_release_save,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
485 METH_NOARGS, rlock_release_save_doc},
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
486 {"__enter__", (PyCFunction)rlock_acquire,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
487 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
488 {"__exit__", (PyCFunction)rlock_release,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
489 METH_VARARGS, rlock_release_doc},
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
490 {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
491 };
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 static PyTypeObject RLocktype = {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
495 PyVarObject_HEAD_INIT(&PyType_Type, 0)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
496 "_thread.RLock", /*tp_name*/
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
497 sizeof(rlockobject), /*tp_size*/
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
498 0, /*tp_itemsize*/
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
499 /* methods */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
500 (destructor)rlock_dealloc, /*tp_dealloc*/
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
501 0, /*tp_print*/
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
502 0, /*tp_getattr*/
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
503 0, /*tp_setattr*/
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
504 0, /*tp_reserved*/
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
505 (reprfunc)rlock_repr, /*tp_repr*/
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
506 0, /*tp_as_number*/
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
507 0, /*tp_as_sequence*/
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
508 0, /*tp_as_mapping*/
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
509 0, /*tp_hash*/
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
510 0, /*tp_call*/
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
511 0, /*tp_str*/
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
512 0, /*tp_getattro*/
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
513 0, /*tp_setattro*/
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
514 0, /*tp_as_buffer*/
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
515 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
516 0, /*tp_doc*/
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
517 0, /*tp_traverse*/
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
518 0, /*tp_clear*/
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
519 0, /*tp_richcompare*/
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
520 offsetof(rlockobject, in_weakreflist), /*tp_weaklistoffset*/
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
521 0, /*tp_iter*/
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
522 0, /*tp_iternext*/
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
523 rlock_methods, /*tp_methods*/
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
524 0, /* tp_members */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
525 0, /* tp_getset */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
526 0, /* tp_base */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
527 0, /* tp_dict */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
528 0, /* tp_descr_get */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
529 0, /* tp_descr_set */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
530 0, /* tp_dictoffset */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
531 0, /* tp_init */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
532 PyType_GenericAlloc, /* tp_alloc */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
533 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
534 };
6d91aaadddd0 Issue #3001: Add a C implementation of recursive locks which is used by
Antoine Pitrou <solipsis@pitrou.net>
parents: 56992
diff changeset
535
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
536 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
537 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
538 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
539 lockobject *self;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
540 self = PyObject_New(lockobject, &Locktype);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
541 if (self == NULL)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
542 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
543 self->lock_lock = PyThread_allocate_lock();
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
544 self->in_weakreflist = NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
545 if (self->lock_lock == NULL) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
546 Py_DECREF(self);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
547 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
548 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
549 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
550 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
551 }
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
32673
97768d87394a Implemented thread-local data as proposed on python-dev:
Jim Fulton <jim@zope.com>
parents: 31797
diff changeset
553 /* Thread-local objects */
97768d87394a Implemented thread-local data as proposed on python-dev:
Jim Fulton <jim@zope.com>
parents: 31797
diff changeset
554
97768d87394a Implemented thread-local data as proposed on python-dev:
Jim Fulton <jim@zope.com>
parents: 31797
diff changeset
555 #include "structmember.h"
97768d87394a Implemented thread-local data as proposed on python-dev:
Jim Fulton <jim@zope.com>
parents: 31797
diff changeset
556
63897
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
557 /* Quick overview:
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
558
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
559 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
560 (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
561 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
562 - 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
563 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
564 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
565 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
566 - 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
567 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
568
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
569 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
570 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
571 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
572 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
573 (as a /strong reference/),
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
574 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
575 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
576
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
577 Therefore:
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
578 - 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
579 - 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
580 - 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
581 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
582 - 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
583 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
584 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
585 - 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
586 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
587 - 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
588 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
589
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
590 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
591 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
592 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
593 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
594 */
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 typedef struct {
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
597 PyObject_HEAD
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
598 PyObject *localdict; /* Borrowed reference! */
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
599 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
600 } localdummyobject;
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
601
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
602 static void
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
603 localdummy_dealloc(localdummyobject *self)
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
604 {
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
605 if (self->weakreflist != NULL)
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
606 PyObject_ClearWeakRefs((PyObject *) self);
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
607 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
608 }
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 static PyTypeObject localdummytype = {
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
611 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
612 /* tp_name */ "_thread._localdummy",
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
613 /* tp_basicsize */ sizeof(localdummyobject),
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
614 /* tp_itemsize */ 0,
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
615 /* 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
616 /* tp_print */ 0,
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
617 /* tp_getattr */ 0,
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
618 /* tp_setattr */ 0,
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
619 /* tp_reserved */ 0,
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
620 /* tp_repr */ 0,
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
621 /* tp_as_number */ 0,
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
622 /* tp_as_sequence */ 0,
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
623 /* tp_as_mapping */ 0,
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
624 /* tp_hash */ 0,
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
625 /* tp_call */ 0,
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
626 /* tp_str */ 0,
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
627 /* tp_getattro */ 0,
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
628 /* tp_setattro */ 0,
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
629 /* tp_as_buffer */ 0,
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
630 /* 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
631 /* 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
632 /* tp_traverse */ 0,
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
633 /* tp_clear */ 0,
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
634 /* tp_richcompare */ 0,
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
635 /* 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
636 };
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
32673
97768d87394a Implemented thread-local data as proposed on python-dev:
Jim Fulton <jim@zope.com>
parents: 31797
diff changeset
639 typedef struct {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
640 PyObject_HEAD
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
641 PyObject *key;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
642 PyObject *args;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
643 PyObject *kw;
63897
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
644 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
645 /* 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
646 PyObject *dummies;
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
647 /* 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
648 PyObject *wr_callback;
32673
97768d87394a Implemented thread-local data as proposed on python-dev:
Jim Fulton <jim@zope.com>
parents: 31797
diff changeset
649 } localobject;
97768d87394a Implemented thread-local data as proposed on python-dev:
Jim Fulton <jim@zope.com>
parents: 31797
diff changeset
650
63897
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
651 /* Forward declaration */
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
652 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
653 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
654
64298
0265d5f7bd07 Issue #1868: Eliminate subtle timing issues in thread-local objects by
Antoine Pitrou <solipsis@pitrou.net>
parents: 64076
diff changeset
655 /* 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
656 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
657 static PyObject *
63897
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
658 _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
659 {
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
660 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
661 localdummyobject *dummy = NULL;
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
662 int r;
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
663
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
664 tdict = PyThreadState_GetDict();
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
665 if (tdict == NULL) {
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
666 PyErr_SetString(PyExc_SystemError,
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
667 "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
668 goto err;
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
669 }
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 ldict = PyDict_New();
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
672 if (ldict == NULL)
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
673 goto err;
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
674 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
675 if (dummy == NULL)
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
676 goto err;
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
677 dummy->localdict = ldict;
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
678 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
679 if (wr == NULL)
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
680 goto err;
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
681
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
682 /* 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
683 dummy gets deleted */
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
684 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
685 if (r < 0)
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
686 goto err;
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
687 Py_CLEAR(wr);
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
688 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
689 if (r < 0)
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
690 goto err;
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
691 Py_CLEAR(dummy);
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
692
64298
0265d5f7bd07 Issue #1868: Eliminate subtle timing issues in thread-local objects by
Antoine Pitrou <solipsis@pitrou.net>
parents: 64076
diff changeset
693 Py_DECREF(ldict);
0265d5f7bd07 Issue #1868: Eliminate subtle timing issues in thread-local objects by
Antoine Pitrou <solipsis@pitrou.net>
parents: 64076
diff changeset
694 return ldict;
63897
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
695
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
696 err:
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
697 Py_XDECREF(ldict);
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
698 Py_XDECREF(wr);
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
699 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
700 return NULL;
63897
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
701 }
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
702
32673
97768d87394a Implemented thread-local data as proposed on python-dev:
Jim Fulton <jim@zope.com>
parents: 31797
diff changeset
703 static PyObject *
97768d87394a Implemented thread-local data as proposed on python-dev:
Jim Fulton <jim@zope.com>
parents: 31797
diff changeset
704 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
705 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
706 localobject *self;
63897
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
707 PyObject *wr;
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
708 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
709 "_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
710 };
32673
97768d87394a Implemented thread-local data as proposed on python-dev:
Jim Fulton <jim@zope.com>
parents: 31797
diff changeset
711
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
712 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
713 && ((args && PyObject_IsTrue(args))
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
714 || (kw && PyObject_IsTrue(kw)))) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
715 PyErr_SetString(PyExc_TypeError,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
716 "Initialization arguments are not supported");
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
717 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
718 }
32673
97768d87394a Implemented thread-local data as proposed on python-dev:
Jim Fulton <jim@zope.com>
parents: 31797
diff changeset
719
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
720 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
721 if (self == NULL)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
722 return NULL;
32673
97768d87394a Implemented thread-local data as proposed on python-dev:
Jim Fulton <jim@zope.com>
parents: 31797
diff changeset
723
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
724 Py_XINCREF(args);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
725 self->args = args;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
726 Py_XINCREF(kw);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
727 self->kw = kw;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
728 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
729 if (self->key == NULL)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
730 goto err;
32673
97768d87394a Implemented thread-local data as proposed on python-dev:
Jim Fulton <jim@zope.com>
parents: 31797
diff changeset
731
63897
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
732 self->dummies = PyDict_New();
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
733 if (self->dummies == NULL)
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
734 goto err;
32673
97768d87394a Implemented thread-local data as proposed on python-dev:
Jim Fulton <jim@zope.com>
parents: 31797
diff changeset
735
63897
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
736 /* 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
737 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
738 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
739 if (wr == NULL)
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
740 goto err;
63897
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
741 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
742 Py_DECREF(wr);
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
743 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
744 goto err;
32673
97768d87394a Implemented thread-local data as proposed on python-dev:
Jim Fulton <jim@zope.com>
parents: 31797
diff changeset
745
64298
0265d5f7bd07 Issue #1868: Eliminate subtle timing issues in thread-local objects by
Antoine Pitrou <solipsis@pitrou.net>
parents: 64076
diff changeset
746 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
747 goto err;
32673
97768d87394a Implemented thread-local data as proposed on python-dev:
Jim Fulton <jim@zope.com>
parents: 31797
diff changeset
748
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
749 return (PyObject *)self;
35086
c6b7fadf0ada Consistently use hard tabs for indentation.
Michael W. Hudson <mwh@python.net>
parents: 35085
diff changeset
750
c6b7fadf0ada Consistently use hard tabs for indentation.
Michael W. Hudson <mwh@python.net>
parents: 35085
diff changeset
751 err:
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
752 Py_DECREF(self);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
753 return NULL;
32673
97768d87394a Implemented thread-local data as proposed on python-dev:
Jim Fulton <jim@zope.com>
parents: 31797
diff changeset
754 }
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 static int
97768d87394a Implemented thread-local data as proposed on python-dev:
Jim Fulton <jim@zope.com>
parents: 31797
diff changeset
757 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
758 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
759 Py_VISIT(self->args);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
760 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
761 Py_VISIT(self->dummies);
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
762 return 0;
32673
97768d87394a Implemented thread-local data as proposed on python-dev:
Jim Fulton <jim@zope.com>
parents: 31797
diff changeset
763 }
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 static int
97768d87394a Implemented thread-local data as proposed on python-dev:
Jim Fulton <jim@zope.com>
parents: 31797
diff changeset
766 local_clear(localobject *self)
97768d87394a Implemented thread-local data as proposed on python-dev:
Jim Fulton <jim@zope.com>
parents: 31797
diff changeset
767 {
63897
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
768 PyThreadState *tstate;
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
769 Py_CLEAR(self->args);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
770 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
771 Py_CLEAR(self->dummies);
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
772 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
773 /* 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
774 if (self->key
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
775 && (tstate = PyThreadState_Get())
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
776 && tstate->interp) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
777 for(tstate = PyInterpreterState_ThreadHead(tstate->interp);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
778 tstate;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
779 tstate = PyThreadState_Next(tstate))
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
780 if (tstate->dict &&
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
781 PyDict_GetItem(tstate->dict, self->key))
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
782 PyDict_DelItem(tstate->dict, self->key);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
783 }
63897
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
784 return 0;
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
785 }
32673
97768d87394a Implemented thread-local data as proposed on python-dev:
Jim Fulton <jim@zope.com>
parents: 31797
diff changeset
786
63897
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
787 static void
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
788 local_dealloc(localobject *self)
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
789 {
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
790 /* 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
791 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
792 if (self->weakreflist != NULL)
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
793 PyObject_ClearWeakRefs((PyObject *) self);
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
794
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
795 PyObject_GC_UnTrack(self);
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
796
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
797 local_clear(self);
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
798 Py_XDECREF(self->key);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
799 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
800 }
97768d87394a Implemented thread-local data as proposed on python-dev:
Jim Fulton <jim@zope.com>
parents: 31797
diff changeset
801
63897
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
802 /* 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
803 static PyObject *
97768d87394a Implemented thread-local data as proposed on python-dev:
Jim Fulton <jim@zope.com>
parents: 31797
diff changeset
804 _ldict(localobject *self)
97768d87394a Implemented thread-local data as proposed on python-dev:
Jim Fulton <jim@zope.com>
parents: 31797
diff changeset
805 {
63897
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
806 PyObject *tdict, *ldict, *dummy;
32673
97768d87394a Implemented thread-local data as proposed on python-dev:
Jim Fulton <jim@zope.com>
parents: 31797
diff changeset
807
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
808 tdict = PyThreadState_GetDict();
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
809 if (tdict == NULL) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
810 PyErr_SetString(PyExc_SystemError,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
811 "Couldn't get thread-state dictionary");
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
812 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
813 }
32673
97768d87394a Implemented thread-local data as proposed on python-dev:
Jim Fulton <jim@zope.com>
parents: 31797
diff changeset
814
63897
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
815 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
816 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
817 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
818 if (ldict == NULL)
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
819 return NULL;
32673
97768d87394a Implemented thread-local data as proposed on python-dev:
Jim Fulton <jim@zope.com>
parents: 31797
diff changeset
820
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
821 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
822 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
823 self->args, self->kw) < 0) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
824 /* 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
825 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
826 acces */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
827 PyDict_DelItem(tdict, self->key);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
828 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
829 }
63897
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
830 }
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
831 else {
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
832 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
833 ldict = ((localdummyobject *) dummy)->localdict;
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
834 }
32673
97768d87394a Implemented thread-local data as proposed on python-dev:
Jim Fulton <jim@zope.com>
parents: 31797
diff changeset
835
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
836 return ldict;
32673
97768d87394a Implemented thread-local data as proposed on python-dev:
Jim Fulton <jim@zope.com>
parents: 31797
diff changeset
837 }
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 static int
97768d87394a Implemented thread-local data as proposed on python-dev:
Jim Fulton <jim@zope.com>
parents: 31797
diff changeset
840 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
841 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
842 PyObject *ldict;
64298
0265d5f7bd07 Issue #1868: Eliminate subtle timing issues in thread-local objects by
Antoine Pitrou <solipsis@pitrou.net>
parents: 64076
diff changeset
843 int r;
32673
97768d87394a Implemented thread-local data as proposed on python-dev:
Jim Fulton <jim@zope.com>
parents: 31797
diff changeset
844
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
845 ldict = _ldict(self);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
846 if (ldict == NULL)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
847 return -1;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
848
64298
0265d5f7bd07 Issue #1868: Eliminate subtle timing issues in thread-local objects by
Antoine Pitrou <solipsis@pitrou.net>
parents: 64076
diff changeset
849 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
850 if (r == 1) {
0265d5f7bd07 Issue #1868: Eliminate subtle timing issues in thread-local objects by
Antoine Pitrou <solipsis@pitrou.net>
parents: 64076
diff changeset
851 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
852 "'%.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
853 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
854 return -1;
0265d5f7bd07 Issue #1868: Eliminate subtle timing issues in thread-local objects by
Antoine Pitrou <solipsis@pitrou.net>
parents: 64076
diff changeset
855 }
0265d5f7bd07 Issue #1868: Eliminate subtle timing issues in thread-local objects by
Antoine Pitrou <solipsis@pitrou.net>
parents: 64076
diff changeset
856 if (r == -1)
0265d5f7bd07 Issue #1868: Eliminate subtle timing issues in thread-local objects by
Antoine Pitrou <solipsis@pitrou.net>
parents: 64076
diff changeset
857 return -1;
32673
97768d87394a Implemented thread-local data as proposed on python-dev:
Jim Fulton <jim@zope.com>
parents: 31797
diff changeset
858
64298
0265d5f7bd07 Issue #1868: Eliminate subtle timing issues in thread-local objects by
Antoine Pitrou <solipsis@pitrou.net>
parents: 64076
diff changeset
859 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
860 }
97768d87394a Implemented thread-local data as proposed on python-dev:
Jim Fulton <jim@zope.com>
parents: 31797
diff changeset
861
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
862 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
863
32673
97768d87394a Implemented thread-local data as proposed on python-dev:
Jim Fulton <jim@zope.com>
parents: 31797
diff changeset
864 static PyTypeObject localtype = {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
865 PyVarObject_HEAD_INIT(NULL, 0)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
866 /* tp_name */ "_thread._local",
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
867 /* tp_basicsize */ sizeof(localobject),
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
868 /* tp_itemsize */ 0,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
869 /* tp_dealloc */ (destructor)local_dealloc,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
870 /* tp_print */ 0,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
871 /* tp_getattr */ 0,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
872 /* tp_setattr */ 0,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
873 /* tp_reserved */ 0,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
874 /* tp_repr */ 0,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
875 /* tp_as_number */ 0,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
876 /* tp_as_sequence */ 0,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
877 /* tp_as_mapping */ 0,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
878 /* tp_hash */ 0,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
879 /* tp_call */ 0,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
880 /* tp_str */ 0,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
881 /* tp_getattro */ (getattrofunc)local_getattro,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
882 /* tp_setattro */ (setattrofunc)local_setattro,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
883 /* 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
884 /* 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
885 | Py_TPFLAGS_HAVE_GC,
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
886 /* tp_doc */ "Thread-local data",
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
887 /* tp_traverse */ (traverseproc)local_traverse,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
888 /* tp_clear */ (inquiry)local_clear,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
889 /* tp_richcompare */ 0,
63897
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
890 /* tp_weaklistoffset */ offsetof(localobject, weakreflist),
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
891 /* tp_iter */ 0,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
892 /* tp_iternext */ 0,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
893 /* tp_methods */ 0,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
894 /* 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
895 /* tp_getset */ 0,
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
896 /* tp_base */ 0,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
897 /* tp_dict */ 0, /* internal use */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
898 /* tp_descr_get */ 0,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
899 /* 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
900 /* tp_dictoffset */ 0,
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
901 /* tp_init */ 0,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
902 /* tp_alloc */ 0,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
903 /* tp_new */ local_new,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
904 /* 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
905 /* 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
906 };
97768d87394a Implemented thread-local data as proposed on python-dev:
Jim Fulton <jim@zope.com>
parents: 31797
diff changeset
907
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
908 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
909 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
910 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
911 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
912 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
913
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
914 ldict = _ldict(self);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
915 if (ldict == NULL)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
916 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
917
64298
0265d5f7bd07 Issue #1868: Eliminate subtle timing issues in thread-local objects by
Antoine Pitrou <solipsis@pitrou.net>
parents: 64076
diff changeset
918 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
919 if (r == 1) {
0265d5f7bd07 Issue #1868: Eliminate subtle timing issues in thread-local objects by
Antoine Pitrou <solipsis@pitrou.net>
parents: 64076
diff changeset
920 Py_INCREF(ldict);
0265d5f7bd07 Issue #1868: Eliminate subtle timing issues in thread-local objects by
Antoine Pitrou <solipsis@pitrou.net>
parents: 64076
diff changeset
921 return ldict;
0265d5f7bd07 Issue #1868: Eliminate subtle timing issues in thread-local objects by
Antoine Pitrou <solipsis@pitrou.net>
parents: 64076
diff changeset
922 }
0265d5f7bd07 Issue #1868: Eliminate subtle timing issues in thread-local objects by
Antoine Pitrou <solipsis@pitrou.net>
parents: 64076
diff changeset
923 if (r == -1)
0265d5f7bd07 Issue #1868: Eliminate subtle timing issues in thread-local objects by
Antoine Pitrou <solipsis@pitrou.net>
parents: 64076
diff changeset
924 return NULL;
0265d5f7bd07 Issue #1868: Eliminate subtle timing issues in thread-local objects by
Antoine Pitrou <solipsis@pitrou.net>
parents: 64076
diff changeset
925
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
926 if (Py_TYPE(self) != &localtype)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
927 /* 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
928 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
929
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
930 /* Optimization: just look in dict ourselves */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
931 value = PyDict_GetItem(ldict, name);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
932 if (value == NULL)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
933 /* 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
934 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
935
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
936 Py_INCREF(value);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
937 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
938 }
923
72aceed365d4 * Makefile adapted to changes below.
Guido van Rossum <guido@python.org>
parents:
diff changeset
939
63897
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
940 /* 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
941 static PyObject *
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
942 _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
943 {
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
944 PyObject *obj;
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
945 localobject *self;
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
946 assert(PyWeakref_CheckRef(localweakref));
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
947 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
948 if (obj == Py_None)
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
949 Py_RETURN_NONE;
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
950 Py_INCREF(obj);
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
951 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
952 /* 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
953 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
954 self = (localobject *) obj;
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
955 if (self->dummies != NULL) {
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
956 PyObject *ldict;
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
957 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
958 if (ldict != NULL) {
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
959 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
960 }
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
961 if (PyErr_Occurred())
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
962 PyErr_WriteUnraisable(obj);
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
963 }
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
964 Py_DECREF(obj);
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
965 Py_RETURN_NONE;
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
966 }
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
967
923
72aceed365d4 * Makefile adapted to changes below.
Guido van Rossum <guido@python.org>
parents:
diff changeset
968 /* Module functions */
72aceed365d4 * Makefile adapted to changes below.
Guido van Rossum <guido@python.org>
parents:
diff changeset
969
5405
b7871ca930ad Massive changes for separate thread state management.
Guido van Rossum <guido@python.org>
parents: 4944
diff changeset
970 struct bootstate {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
971 PyInterpreterState *interp;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
972 PyObject *func;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
973 PyObject *args;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
974 PyObject *keyw;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
975 PyThreadState *tstate;
5405
b7871ca930ad Massive changes for separate thread state management.
Guido van Rossum <guido@python.org>
parents: 4944
diff changeset
976 };
923
72aceed365d4 * Makefile adapted to changes below.
Guido van Rossum <guido@python.org>
parents:
diff changeset
977
5405
b7871ca930ad Massive changes for separate thread state management.
Guido van Rossum <guido@python.org>
parents: 4944
diff changeset
978 static void
13497
95454b73ea91 ANSI-fication
Peter Schneider-Kamp <nowonder@nowonder.de>
parents: 13256
diff changeset
979 t_bootstrap(void *boot_raw)
5405
b7871ca930ad Massive changes for separate thread state management.
Guido van Rossum <guido@python.org>
parents: 4944
diff changeset
980 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
981 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
982 PyThreadState *tstate;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
983 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
984
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
985 tstate = boot->tstate;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
986 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
987 _PyThreadState_Init(tstate);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
988 PyEval_AcquireThread(tstate);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
989 nb_threads++;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
990 res = PyEval_CallObjectWithKeywords(
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
991 boot->func, boot->args, boot->keyw);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
992 if (res == NULL) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
993 if (PyErr_ExceptionMatches(PyExc_SystemExit))
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
994 PyErr_Clear();
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
995 else {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
996 PyObject *file;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
997 PySys_WriteStderr(
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
998 "Unhandled exception in thread started by ");
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
999 file = PySys_GetObject("stderr");
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1000 if (file != NULL && file != Py_None)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1001 PyFile_WriteObject(boot->func, file, 0);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1002 else
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1003 PyObject_Print(boot->func, stderr, 0);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1004 PySys_WriteStderr("\n");
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1005 PyErr_PrintEx(0);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1006 }
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 else
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1009 Py_DECREF(res);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1010 Py_DECREF(boot->func);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1011 Py_DECREF(boot->args);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1012 Py_XDECREF(boot->keyw);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1013 PyMem_DEL(boot_raw);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1014 nb_threads--;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1015 PyThreadState_Clear(tstate);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1016 PyThreadState_DeleteCurrent();
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1017 PyThread_exit_thread();
923
72aceed365d4 * Makefile adapted to changes below.
Guido van Rossum <guido@python.org>
parents:
diff changeset
1018 }
72aceed365d4 * Makefile adapted to changes below.
Guido van Rossum <guido@python.org>
parents:
diff changeset
1019
4751
7ab835f87f86 Renamed.
Barry Warsaw <barry@python.org>
parents: 4600
diff changeset
1020 static PyObject *
13497
95454b73ea91 ANSI-fication
Peter Schneider-Kamp <nowonder@nowonder.de>
parents: 13256
diff changeset
1021 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
1022 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1023 PyObject *func, *args, *keyw = NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1024 struct bootstate *boot;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1025 long ident;
923
72aceed365d4 * Makefile adapted to changes below.
Guido van Rossum <guido@python.org>
parents:
diff changeset
1026
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1027 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
1028 &func, &args, &keyw))
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1029 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1030 if (!PyCallable_Check(func)) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1031 PyErr_SetString(PyExc_TypeError,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1032 "first arg must be callable");
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1033 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1034 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1035 if (!PyTuple_Check(args)) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1036 PyErr_SetString(PyExc_TypeError,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1037 "2nd arg must be a tuple");
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1038 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1039 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1040 if (keyw != NULL && !PyDict_Check(keyw)) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1041 PyErr_SetString(PyExc_TypeError,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1042 "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
1043 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1044 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1045 boot = PyMem_NEW(struct bootstate, 1);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1046 if (boot == NULL)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1047 return PyErr_NoMemory();
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1048 boot->interp = PyThreadState_GET()->interp;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1049 boot->func = func;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1050 boot->args = args;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1051 boot->keyw = keyw;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1052 boot->tstate = _PyThreadState_Prealloc(boot->interp);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1053 if (boot->tstate == NULL) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1054 PyMem_DEL(boot);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1055 return PyErr_NoMemory();
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1056 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1057 Py_INCREF(func);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1058 Py_INCREF(args);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1059 Py_XINCREF(keyw);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1060 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
1061 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
1062 if (ident == -1) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1063 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
1064 Py_DECREF(func);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1065 Py_DECREF(args);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1066 Py_XDECREF(keyw);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1067 PyThreadState_Clear(boot->tstate);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1068 PyMem_DEL(boot);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1069 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1070 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1071 return PyLong_FromLong(ident);
923
72aceed365d4 * Makefile adapted to changes below.
Guido van Rossum <guido@python.org>
parents:
diff changeset
1072 }
72aceed365d4 * Makefile adapted to changes below.
Guido van Rossum <guido@python.org>
parents:
diff changeset
1073
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 22865
diff changeset
1074 PyDoc_STRVAR(start_new_doc,
20266
241ef8a923c7 Fix typo in docstring
Andrew M. Kuchling <amk@amk.ca>
parents: 16140
diff changeset
1075 "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
1076 (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
1077 \n\
20468
ebfd87e87884 Partial patch from SF #452266, by Jason Petrone.
Guido van Rossum <guido@python.org>
parents: 20266
diff changeset
1078 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
1079 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
1080 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
1081 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
1082 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
1083 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
1084
4751
7ab835f87f86 Renamed.
Barry Warsaw <barry@python.org>
parents: 4600
diff changeset
1085 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
1086 thread_PyThread_exit_thread(PyObject *self)
923
72aceed365d4 * Makefile adapted to changes below.
Guido van Rossum <guido@python.org>
parents:
diff changeset
1087 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1088 PyErr_SetNone(PyExc_SystemExit);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1089 return NULL;
923
72aceed365d4 * Makefile adapted to changes below.
Guido van Rossum <guido@python.org>
parents:
diff changeset
1090 }
72aceed365d4 * Makefile adapted to changes below.
Guido van Rossum <guido@python.org>
parents:
diff changeset
1091
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 22865
diff changeset
1092 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
1093 "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
1094 (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
1095 \n\
ff9adb57b8b5 Added doc strings. Also export LockType from the modoule, and give it
Guido van Rossum <guido@python.org>
parents: 8433
diff changeset
1096 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
1097 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
1098
29444
8d160095eb66 Add interrupt_main() to thread module.
Kurt B. Kaiser <kbk@shore.net>
parents: 28889
diff changeset
1099 static PyObject *
29498
1402f265e48f Correct function name.
Kurt B. Kaiser <kbk@shore.net>
parents: 29444
diff changeset
1100 thread_PyThread_interrupt_main(PyObject * self)
29444
8d160095eb66 Add interrupt_main() to thread module.
Kurt B. Kaiser <kbk@shore.net>
parents: 28889
diff changeset
1101 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1102 PyErr_SetInterrupt();
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1103 Py_INCREF(Py_None);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1104 return Py_None;
29444
8d160095eb66 Add interrupt_main() to thread module.
Kurt B. Kaiser <kbk@shore.net>
parents: 28889
diff changeset
1105 }
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 PyDoc_STRVAR(interrupt_doc,
8d160095eb66 Add interrupt_main() to thread module.
Kurt B. Kaiser <kbk@shore.net>
parents: 28889
diff changeset
1108 "interrupt_main()\n\
8d160095eb66 Add interrupt_main() to thread module.
Kurt B. Kaiser <kbk@shore.net>
parents: 28889
diff changeset
1109 \n\
8d160095eb66 Add interrupt_main() to thread module.
Kurt B. Kaiser <kbk@shore.net>
parents: 28889
diff changeset
1110 Raise a KeyboardInterrupt in the main thread.\n\
29498
1402f265e48f Correct function name.
Kurt B. Kaiser <kbk@shore.net>
parents: 29444
diff changeset
1111 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
1112 );
8d160095eb66 Add interrupt_main() to thread module.
Kurt B. Kaiser <kbk@shore.net>
parents: 28889
diff changeset
1113
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
1114 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
1115
4751
7ab835f87f86 Renamed.
Barry Warsaw <barry@python.org>
parents: 4600
diff changeset
1116 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
1117 thread_PyThread_allocate_lock(PyObject *self)
923
72aceed365d4 * Makefile adapted to changes below.
Guido van Rossum <guido@python.org>
parents:
diff changeset
1118 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1119 return (PyObject *) newlockobject();
923
72aceed365d4 * Makefile adapted to changes below.
Guido van Rossum <guido@python.org>
parents:
diff changeset
1120 }
72aceed365d4 * Makefile adapted to changes below.
Guido van Rossum <guido@python.org>
parents:
diff changeset
1121
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 22865
diff changeset
1122 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
1123 "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
1124 (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
1125 \n\
64076
e3df34544db9 Issue #8983: Corrected docstrings.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 63897
diff changeset
1126 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
1127
4751
7ab835f87f86 Renamed.
Barry Warsaw <barry@python.org>
parents: 4600
diff changeset
1128 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
1129 thread_get_ident(PyObject *self)
1746
1940892d2fe3 Merge alpha100 branch back to main trunk
Guido van Rossum <guido@python.org>
parents: 1418
diff changeset
1130 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1131 long ident;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1132 ident = PyThread_get_thread_ident();
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1133 if (ident == -1) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1134 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
1135 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1136 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1137 return PyLong_FromLong(ident);
1746
1940892d2fe3 Merge alpha100 branch back to main trunk
Guido van Rossum <guido@python.org>
parents: 1418
diff changeset
1138 }
1940892d2fe3 Merge alpha100 branch back to main trunk
Guido van Rossum <guido@python.org>
parents: 1418
diff changeset
1139
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 22865
diff changeset
1140 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
1141 "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
1142 \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 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
1144 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
1145 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
1146 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
1147 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
1148 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
1149 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
1150
39442
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38669
diff changeset
1151 static PyObject *
56981
6cf84e5a6dd7 Merged revisions 75958 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56440
diff changeset
1152 thread__count(PyObject *self)
6cf84e5a6dd7 Merged revisions 75958 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56440
diff changeset
1153 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1154 return PyLong_FromLong(nb_threads);
56981
6cf84e5a6dd7 Merged revisions 75958 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56440
diff changeset
1155 }
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 PyDoc_STRVAR(_count_doc,
6cf84e5a6dd7 Merged revisions 75958 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56440
diff changeset
1158 "_count() -> integer\n\
6cf84e5a6dd7 Merged revisions 75958 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56440
diff changeset
1159 \n\
56992
bf93e4df7bfb Merged revisions 75969 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56981
diff changeset
1160 \
bf93e4df7bfb Merged revisions 75969 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56981
diff changeset
1161 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
1162 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
1163 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
1164 yet finished.\n\
bf93e4df7bfb Merged revisions 75969 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56981
diff changeset
1165 \n\
bf93e4df7bfb Merged revisions 75969 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56981
diff changeset
1166 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
1167 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
1168
6cf84e5a6dd7 Merged revisions 75958 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56440
diff changeset
1169 static PyObject *
39442
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38669
diff changeset
1170 thread_stack_size(PyObject *self, PyObject *args)
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38669
diff changeset
1171 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1172 size_t old_size;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1173 Py_ssize_t new_size = 0;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1174 int rc;
39442
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38669
diff changeset
1175
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1176 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
1177 return NULL;
39442
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38669
diff changeset
1178
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1179 if (new_size < 0) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1180 PyErr_SetString(PyExc_ValueError,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1181 "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
1182 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1183 }
39442
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38669
diff changeset
1184
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1185 old_size = PyThread_get_stacksize();
39442
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38669
diff changeset
1186
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1187 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
1188 if (rc == -1) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1189 PyErr_Format(PyExc_ValueError,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1190 "size not valid: %zd bytes",
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1191 new_size);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1192 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1193 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1194 if (rc == -2) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1195 PyErr_SetString(ThreadError,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1196 "setting stack size not supported");
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1197 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1198 }
39442
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38669
diff changeset
1199
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1200 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
1201 }
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 PyDoc_STRVAR(stack_size_doc,
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38669
diff changeset
1204 "stack_size([size]) -> size\n\
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38669
diff changeset
1205 \n\
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38669
diff changeset
1206 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
1207 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
1208 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
1209 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
1210 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
1211 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
1212 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
1213 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
1214 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
1215 \n\
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38669
diff changeset
1216 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
1217 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
1218 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
1219 - 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
1220 (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
1221 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
1222
4751
7ab835f87f86 Renamed.
Barry Warsaw <barry@python.org>
parents: 4600
diff changeset
1223 static PyMethodDef thread_methods[] = {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1224 {"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
1225 METH_VARARGS,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1226 start_new_doc},
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1227 {"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
1228 METH_VARARGS,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1229 start_new_doc},
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1230 {"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
1231 METH_NOARGS, allocate_doc},
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1232 {"allocate", (PyCFunction)thread_PyThread_allocate_lock,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1233 METH_NOARGS, allocate_doc},
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1234 {"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
1235 METH_NOARGS, exit_doc},
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1236 {"exit", (PyCFunction)thread_PyThread_exit_thread,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1237 METH_NOARGS, exit_doc},
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1238 {"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
1239 METH_NOARGS, interrupt_doc},
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1240 {"get_ident", (PyCFunction)thread_get_ident,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1241 METH_NOARGS, get_ident_doc},
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1242 {"_count", (PyCFunction)thread__count,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1243 METH_NOARGS, _count_doc},
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1244 {"stack_size", (PyCFunction)thread_stack_size,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1245 METH_VARARGS,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1246 stack_size_doc},
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1247 {NULL, NULL} /* sentinel */
923
72aceed365d4 * Makefile adapted to changes below.
Guido van Rossum <guido@python.org>
parents:
diff changeset
1248 };
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 /* Initialization function */
72aceed365d4 * Makefile adapted to changes below.
Guido van Rossum <guido@python.org>
parents:
diff changeset
1252
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 22865
diff changeset
1253 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
1254 "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
1255 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
1256
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 22865
diff changeset
1257 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
1258 "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
1259 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
1260 \n\
ff9adb57b8b5 Added doc strings. Also export LockType from the modoule, and give it
Guido van Rossum <guido@python.org>
parents: 8433
diff changeset
1261 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
1262 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
1263 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
1264 \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 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
1266 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
1267 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
1268
47580
94f64f11fdd0 Implement PEP 3121: new module initialization and finalization API.
Martin v. Löwis <martin@v.loewis.de>
parents: 47285
diff changeset
1269 static struct PyModuleDef threadmodule = {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1270 PyModuleDef_HEAD_INIT,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1271 "_thread",
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1272 thread_doc,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1273 -1,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1274 thread_methods,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1275 NULL,
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
47580
94f64f11fdd0 Implement PEP 3121: new module initialization and finalization API.
Martin v. Löwis <martin@v.loewis.de>
parents: 47285
diff changeset
1279 };
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
24471
f66b3a3509c7 Excise DL_EXPORT/DL_IMPORT from Modules/*. Required adding a prototype
Mark Hammond <mhammond@skippinet.com.au>
parents: 24280
diff changeset
1282 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
1283 PyInit__thread(void)
923
72aceed365d4 * Makefile adapted to changes below.
Guido van Rossum <guido@python.org>
parents:
diff changeset
1284 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1285 PyObject *m, *d, *timeout_max;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1286
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1287 /* Initialize types: */
63897
37156907f359 Issue #3757: thread-local objects now support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61466
diff changeset
1288 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
1289 return NULL;
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1290 if (PyType_Ready(&localtype) < 0)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1291 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1292 if (PyType_Ready(&Locktype) < 0)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1293 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1294 if (PyType_Ready(&RLocktype) < 0)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1295 return NULL;
923
72aceed365d4 * Makefile adapted to changes below.
Guido van Rossum <guido@python.org>
parents:
diff changeset
1296
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1297 /* 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
1298 m = PyModule_Create(&threadmodule);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1299 if (m == NULL)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1300 return NULL;
923
72aceed365d4 * Makefile adapted to changes below.
Guido van Rossum <guido@python.org>
parents:
diff changeset
1301
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1302 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
1303 if (!timeout_max)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1304 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1305 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
1306 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
1307
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1308 /* Add a symbolic constant */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1309 d = PyModule_GetDict(m);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1310 ThreadError = PyErr_NewException("_thread.error", NULL, NULL);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1311 PyDict_SetItemString(d, "error", ThreadError);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1312 Locktype.tp_doc = lock_doc;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1313 Py_INCREF(&Locktype);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1314 PyDict_SetItemString(d, "LockType", (PyObject *)&Locktype);
923
72aceed365d4 * Makefile adapted to changes below.
Guido van Rossum <guido@python.org>
parents:
diff changeset
1315
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1316 Py_INCREF(&RLocktype);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1317 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
1318 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
1319
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1320 Py_INCREF(&localtype);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1321 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
1322 return NULL;
32673
97768d87394a Implemented thread-local data as proposed on python-dev:
Jim Fulton <jim@zope.com>
parents: 31797
diff changeset
1323
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1324 nb_threads = 0;
56981
6cf84e5a6dd7 Merged revisions 75958 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56440
diff changeset
1325
64298
0265d5f7bd07 Issue #1868: Eliminate subtle timing issues in thread-local objects by
Antoine Pitrou <solipsis@pitrou.net>
parents: 64076
diff changeset
1326 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
1327 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
1328 return NULL;
0265d5f7bd07 Issue #1868: Eliminate subtle timing issues in thread-local objects by
Antoine Pitrou <solipsis@pitrou.net>
parents: 64076
diff changeset
1329
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1330 /* Initialize the C thread library */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1331 PyThread_init_thread();
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60598
diff changeset
1332 return m;
923
72aceed365d4 * Makefile adapted to changes below.
Guido van Rossum <guido@python.org>
parents:
diff changeset
1333 }