Mercurial > cpython-lru_cache-weakref
annotate Modules/_multiprocessing/semaphore.c @ 87690:66c1c9f32567 default tip
Add use_weakref option to functools.lru_cache
The use_weakref option makes lru_cache create weak references to the function
arguments when creating the cache key, which prevents them from staying in the
memory forever even after all other references to them are gone.
This is a proof of concept for http://bugs.python.org/issue19859
| author | Radomir Dopieralski <devel@sheep.art.pl> |
|---|---|
| date | Tue, 03 Dec 2013 16:02:48 +0100 |
| parents | 3b82e0d83bf9 |
| children |
| rev | line source |
|---|---|
|
47595
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
1 /* |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
2 * A type which wraps a semaphore |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
3 * |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
4 * semaphore.c |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
5 * |
|
76663
25cc0c8fd4e2
Mark multiprocessing files with "Licensed to PSF under a Contributor Agreement"
Richard Oudkerk <shibturn@gmail.com>
parents:
73997
diff
changeset
|
6 * Copyright (c) 2006-2008, R Oudkerk |
|
25cc0c8fd4e2
Mark multiprocessing files with "Licensed to PSF under a Contributor Agreement"
Richard Oudkerk <shibturn@gmail.com>
parents:
73997
diff
changeset
|
7 * Licensed to PSF under a Contributor Agreement. |
|
47595
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
8 */ |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
9 |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
10 #include "multiprocessing.h" |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
11 |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
12 enum { RECURSIVE_MUTEX, SEMAPHORE }; |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
13 |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
14 typedef struct { |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
15 PyObject_HEAD |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
16 SEM_HANDLE handle; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
17 long last_tid; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
18 int count; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
19 int maxvalue; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
20 int kind; |
|
85169
3b82e0d83bf9
Issue #8713: Support alternative start methods in multiprocessing on Unix.
Richard Oudkerk <shibturn@gmail.com>
parents:
81713
diff
changeset
|
21 char *name; |
|
47595
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
22 } SemLockObject; |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
23 |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
24 #define ISMINE(o) (o->count > 0 && PyThread_get_thread_ident() == o->last_tid) |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
25 |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
26 |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
27 #ifdef MS_WINDOWS |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
28 |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
29 /* |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
30 * Windows definitions |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
31 */ |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
32 |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
33 #define SEM_FAILED NULL |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
34 |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
35 #define SEM_CLEAR_ERROR() SetLastError(0) |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
36 #define SEM_GET_LAST_ERROR() GetLastError() |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
37 #define SEM_CREATE(name, val, max) CreateSemaphore(NULL, val, max, NULL) |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
38 #define SEM_CLOSE(sem) (CloseHandle(sem) ? 0 : -1) |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
39 #define SEM_GETVALUE(sem, pval) _GetSemaphoreValue(sem, pval) |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
40 #define SEM_UNLINK(name) 0 |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
41 |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
42 static int |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
43 _GetSemaphoreValue(HANDLE handle, long *value) |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
44 { |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
45 long previous; |
|
47595
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
46 |
|
81712
b71b6517af63
Replace WaitForSingleObject with WaitForSingleObjectEx,
Martin v. Löwis <martin@v.loewis.de>
parents:
81193
diff
changeset
|
47 switch (WaitForSingleObjectEx(handle, 0, FALSE)) { |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
48 case WAIT_OBJECT_0: |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
49 if (!ReleaseSemaphore(handle, 1, &previous)) |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
50 return MP_STANDARD_ERROR; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
51 *value = previous + 1; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
52 return 0; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
53 case WAIT_TIMEOUT: |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
54 *value = 0; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
55 return 0; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
56 default: |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
57 return MP_STANDARD_ERROR; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
58 } |
|
47595
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
59 } |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
60 |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
61 static PyObject * |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
62 semlock_acquire(SemLockObject *self, PyObject *args, PyObject *kwds) |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
63 { |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
64 int blocking = 1; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
65 double timeout; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
66 PyObject *timeout_obj = Py_None; |
|
73670
08953a04b2e6
Issue #12328: Under Windows, refactor handling of Ctrl-C events and
Antoine Pitrou <solipsis@pitrou.net>
parents:
69989
diff
changeset
|
67 DWORD res, full_msecs, nhandles; |
|
08953a04b2e6
Issue #12328: Under Windows, refactor handling of Ctrl-C events and
Antoine Pitrou <solipsis@pitrou.net>
parents:
69989
diff
changeset
|
68 HANDLE handles[2], sigint_event; |
|
47595
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
69 |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
70 static char *kwlist[] = {"block", "timeout", NULL}; |
|
47595
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
71 |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
72 if (!PyArg_ParseTupleAndKeywords(args, kwds, "|iO", kwlist, |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
73 &blocking, &timeout_obj)) |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
74 return NULL; |
|
47595
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
75 |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
76 /* calculate timeout */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
77 if (!blocking) { |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
78 full_msecs = 0; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
79 } else if (timeout_obj == Py_None) { |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
80 full_msecs = INFINITE; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
81 } else { |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
82 timeout = PyFloat_AsDouble(timeout_obj); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
83 if (PyErr_Occurred()) |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
84 return NULL; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
85 timeout *= 1000.0; /* convert to millisecs */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
86 if (timeout < 0.0) { |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
87 timeout = 0.0; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
88 } else if (timeout >= 0.5 * INFINITE) { /* 25 days */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
89 PyErr_SetString(PyExc_OverflowError, |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
90 "timeout is too large"); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
91 return NULL; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
92 } |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
93 full_msecs = (DWORD)(timeout + 0.5); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
94 } |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
95 |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
96 /* check whether we already own the lock */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
97 if (self->kind == RECURSIVE_MUTEX && ISMINE(self)) { |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
98 ++self->count; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
99 Py_RETURN_TRUE; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
100 } |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
101 |
|
73670
08953a04b2e6
Issue #12328: Under Windows, refactor handling of Ctrl-C events and
Antoine Pitrou <solipsis@pitrou.net>
parents:
69989
diff
changeset
|
102 /* check whether we can acquire without releasing the GIL and blocking */ |
|
81712
b71b6517af63
Replace WaitForSingleObject with WaitForSingleObjectEx,
Martin v. Löwis <martin@v.loewis.de>
parents:
81193
diff
changeset
|
103 if (WaitForSingleObjectEx(self->handle, 0, FALSE) == WAIT_OBJECT_0) { |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
104 self->last_tid = GetCurrentThreadId(); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
105 ++self->count; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
106 Py_RETURN_TRUE; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
107 } |
|
47595
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
108 |
|
73670
08953a04b2e6
Issue #12328: Under Windows, refactor handling of Ctrl-C events and
Antoine Pitrou <solipsis@pitrou.net>
parents:
69989
diff
changeset
|
109 /* prepare list of handles */ |
|
08953a04b2e6
Issue #12328: Under Windows, refactor handling of Ctrl-C events and
Antoine Pitrou <solipsis@pitrou.net>
parents:
69989
diff
changeset
|
110 nhandles = 0; |
|
08953a04b2e6
Issue #12328: Under Windows, refactor handling of Ctrl-C events and
Antoine Pitrou <solipsis@pitrou.net>
parents:
69989
diff
changeset
|
111 handles[nhandles++] = self->handle; |
|
08953a04b2e6
Issue #12328: Under Windows, refactor handling of Ctrl-C events and
Antoine Pitrou <solipsis@pitrou.net>
parents:
69989
diff
changeset
|
112 if (_PyOS_IsMainThread()) { |
|
08953a04b2e6
Issue #12328: Under Windows, refactor handling of Ctrl-C events and
Antoine Pitrou <solipsis@pitrou.net>
parents:
69989
diff
changeset
|
113 sigint_event = _PyOS_SigintEvent(); |
|
08953a04b2e6
Issue #12328: Under Windows, refactor handling of Ctrl-C events and
Antoine Pitrou <solipsis@pitrou.net>
parents:
69989
diff
changeset
|
114 assert(sigint_event != NULL); |
|
08953a04b2e6
Issue #12328: Under Windows, refactor handling of Ctrl-C events and
Antoine Pitrou <solipsis@pitrou.net>
parents:
69989
diff
changeset
|
115 handles[nhandles++] = sigint_event; |
|
08953a04b2e6
Issue #12328: Under Windows, refactor handling of Ctrl-C events and
Antoine Pitrou <solipsis@pitrou.net>
parents:
69989
diff
changeset
|
116 } |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
117 |
|
73670
08953a04b2e6
Issue #12328: Under Windows, refactor handling of Ctrl-C events and
Antoine Pitrou <solipsis@pitrou.net>
parents:
69989
diff
changeset
|
118 /* do the wait */ |
|
08953a04b2e6
Issue #12328: Under Windows, refactor handling of Ctrl-C events and
Antoine Pitrou <solipsis@pitrou.net>
parents:
69989
diff
changeset
|
119 Py_BEGIN_ALLOW_THREADS |
|
08953a04b2e6
Issue #12328: Under Windows, refactor handling of Ctrl-C events and
Antoine Pitrou <solipsis@pitrou.net>
parents:
69989
diff
changeset
|
120 if (sigint_event != NULL) |
|
08953a04b2e6
Issue #12328: Under Windows, refactor handling of Ctrl-C events and
Antoine Pitrou <solipsis@pitrou.net>
parents:
69989
diff
changeset
|
121 ResetEvent(sigint_event); |
|
81713
46ed0a25fb2c
Replace WaitForMultipleObjects with WaitForMultipleObjectEx,
Martin v. Löwis <martin@v.loewis.de>
parents:
81712
diff
changeset
|
122 res = WaitForMultipleObjectsEx(nhandles, handles, FALSE, full_msecs, FALSE); |
|
73670
08953a04b2e6
Issue #12328: Under Windows, refactor handling of Ctrl-C events and
Antoine Pitrou <solipsis@pitrou.net>
parents:
69989
diff
changeset
|
123 Py_END_ALLOW_THREADS |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
124 |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
125 /* handle result */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
126 switch (res) { |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
127 case WAIT_TIMEOUT: |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
128 Py_RETURN_FALSE; |
|
73670
08953a04b2e6
Issue #12328: Under Windows, refactor handling of Ctrl-C events and
Antoine Pitrou <solipsis@pitrou.net>
parents:
69989
diff
changeset
|
129 case WAIT_OBJECT_0 + 0: |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
130 self->last_tid = GetCurrentThreadId(); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
131 ++self->count; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
132 Py_RETURN_TRUE; |
|
73670
08953a04b2e6
Issue #12328: Under Windows, refactor handling of Ctrl-C events and
Antoine Pitrou <solipsis@pitrou.net>
parents:
69989
diff
changeset
|
133 case WAIT_OBJECT_0 + 1: |
|
08953a04b2e6
Issue #12328: Under Windows, refactor handling of Ctrl-C events and
Antoine Pitrou <solipsis@pitrou.net>
parents:
69989
diff
changeset
|
134 errno = EINTR; |
|
08953a04b2e6
Issue #12328: Under Windows, refactor handling of Ctrl-C events and
Antoine Pitrou <solipsis@pitrou.net>
parents:
69989
diff
changeset
|
135 return PyErr_SetFromErrno(PyExc_IOError); |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
136 case WAIT_FAILED: |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
137 return PyErr_SetFromWindowsErr(0); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
138 default: |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
139 PyErr_Format(PyExc_RuntimeError, "WaitForSingleObject() or " |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
140 "WaitForMultipleObjects() gave unrecognized " |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
141 "value %d", res); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
142 return NULL; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
143 } |
|
47595
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
144 } |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
145 |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
146 static PyObject * |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
147 semlock_release(SemLockObject *self, PyObject *args) |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
148 { |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
149 if (self->kind == RECURSIVE_MUTEX) { |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
150 if (!ISMINE(self)) { |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
151 PyErr_SetString(PyExc_AssertionError, "attempt to " |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
152 "release recursive lock not owned " |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
153 "by thread"); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
154 return NULL; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
155 } |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
156 if (self->count > 1) { |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
157 --self->count; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
158 Py_RETURN_NONE; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
159 } |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
160 assert(self->count == 1); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
161 } |
|
47595
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
162 |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
163 if (!ReleaseSemaphore(self->handle, 1, NULL)) { |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
164 if (GetLastError() == ERROR_TOO_MANY_POSTS) { |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
165 PyErr_SetString(PyExc_ValueError, "semaphore or lock " |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
166 "released too many times"); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
167 return NULL; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
168 } else { |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
169 return PyErr_SetFromWindowsErr(0); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
170 } |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
171 } |
|
47595
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
172 |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
173 --self->count; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
174 Py_RETURN_NONE; |
|
47595
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
175 } |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
176 |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
177 #else /* !MS_WINDOWS */ |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
178 |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
179 /* |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
180 * Unix definitions |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
181 */ |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
182 |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
183 #define SEM_CLEAR_ERROR() |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
184 #define SEM_GET_LAST_ERROR() 0 |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
185 #define SEM_CREATE(name, val, max) sem_open(name, O_CREAT | O_EXCL, 0600, val) |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
186 #define SEM_CLOSE(sem) sem_close(sem) |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
187 #define SEM_GETVALUE(sem, pval) sem_getvalue(sem, pval) |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
188 #define SEM_UNLINK(name) sem_unlink(name) |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
189 |
|
81191
a5b49db3383d
Issue #9586: Redefine SEM_FAILED on MacOSX to keep compiler happy.
Richard Oudkerk <shibturn@gmail.com>
parents:
73996
diff
changeset
|
190 /* OS X 10.4 defines SEM_FAILED as -1 instead of (sem_t *)-1; this gives |
|
a5b49db3383d
Issue #9586: Redefine SEM_FAILED on MacOSX to keep compiler happy.
Richard Oudkerk <shibturn@gmail.com>
parents:
73996
diff
changeset
|
191 compiler warnings, and (potentially) undefined behaviour. */ |
|
a5b49db3383d
Issue #9586: Redefine SEM_FAILED on MacOSX to keep compiler happy.
Richard Oudkerk <shibturn@gmail.com>
parents:
73996
diff
changeset
|
192 #ifdef __APPLE__ |
|
a5b49db3383d
Issue #9586: Redefine SEM_FAILED on MacOSX to keep compiler happy.
Richard Oudkerk <shibturn@gmail.com>
parents:
73996
diff
changeset
|
193 # undef SEM_FAILED |
|
a5b49db3383d
Issue #9586: Redefine SEM_FAILED on MacOSX to keep compiler happy.
Richard Oudkerk <shibturn@gmail.com>
parents:
73996
diff
changeset
|
194 # define SEM_FAILED ((sem_t *)-1) |
|
a5b49db3383d
Issue #9586: Redefine SEM_FAILED on MacOSX to keep compiler happy.
Richard Oudkerk <shibturn@gmail.com>
parents:
73996
diff
changeset
|
195 #endif |
|
a5b49db3383d
Issue #9586: Redefine SEM_FAILED on MacOSX to keep compiler happy.
Richard Oudkerk <shibturn@gmail.com>
parents:
73996
diff
changeset
|
196 |
|
52902
d3887dfe661f
Merged revisions 70908,70939,71009,71022,71036 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
52504
diff
changeset
|
197 #ifndef HAVE_SEM_UNLINK |
|
47595
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
198 # define sem_unlink(name) 0 |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
199 #endif |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
200 |
|
52902
d3887dfe661f
Merged revisions 70908,70939,71009,71022,71036 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
52504
diff
changeset
|
201 #ifndef HAVE_SEM_TIMEDWAIT |
|
47595
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
202 # define sem_timedwait(sem,deadline) sem_timedwait_save(sem,deadline,_save) |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
203 |
|
79582
fc011f1ef59e
Get rid of circular import and eliminate unprefixed exported symbols
Richard Oudkerk <shibturn@gmail.com>
parents:
76663
diff
changeset
|
204 static int |
|
47595
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
205 sem_timedwait_save(sem_t *sem, struct timespec *deadline, PyThreadState *_save) |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
206 { |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
207 int res; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
208 unsigned long delay, difference; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
209 struct timeval now, tvdeadline, tvdelay; |
|
47595
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
210 |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
211 errno = 0; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
212 tvdeadline.tv_sec = deadline->tv_sec; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
213 tvdeadline.tv_usec = deadline->tv_nsec / 1000; |
|
47595
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
214 |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
215 for (delay = 0 ; ; delay += 1000) { |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
216 /* poll */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
217 if (sem_trywait(sem) == 0) |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
218 return 0; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
219 else if (errno != EAGAIN) |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
220 return MP_STANDARD_ERROR; |
|
47595
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
221 |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
222 /* get current time */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
223 if (gettimeofday(&now, NULL) < 0) |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
224 return MP_STANDARD_ERROR; |
|
47595
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
225 |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
226 /* check for timeout */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
227 if (tvdeadline.tv_sec < now.tv_sec || |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
228 (tvdeadline.tv_sec == now.tv_sec && |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
229 tvdeadline.tv_usec <= now.tv_usec)) { |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
230 errno = ETIMEDOUT; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
231 return MP_STANDARD_ERROR; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
232 } |
|
47595
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
233 |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
234 /* calculate how much time is left */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
235 difference = (tvdeadline.tv_sec - now.tv_sec) * 1000000 + |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
236 (tvdeadline.tv_usec - now.tv_usec); |
|
47595
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
237 |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
238 /* check delay not too long -- maximum is 20 msecs */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
239 if (delay > 20000) |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
240 delay = 20000; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
241 if (delay > difference) |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
242 delay = difference; |
|
47595
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
243 |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
244 /* sleep */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
245 tvdelay.tv_sec = delay / 1000000; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
246 tvdelay.tv_usec = delay % 1000000; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
247 if (select(0, NULL, NULL, NULL, &tvdelay) < 0) |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
248 return MP_STANDARD_ERROR; |
|
47595
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
249 |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
250 /* check for signals */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
251 Py_BLOCK_THREADS |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
252 res = PyErr_CheckSignals(); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
253 Py_UNBLOCK_THREADS |
|
47595
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
254 |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
255 if (res) { |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
256 errno = EINTR; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
257 return MP_EXCEPTION_HAS_BEEN_SET; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
258 } |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
259 } |
|
47595
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
260 } |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
261 |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
262 #endif /* !HAVE_SEM_TIMEDWAIT */ |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
263 |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
264 static PyObject * |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
265 semlock_acquire(SemLockObject *self, PyObject *args, PyObject *kwds) |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
266 { |
|
73996
6a966179c73a
Issue #10350: Read and save errno before calling a function which might overwrite it.
Antoine Pitrou <solipsis@pitrou.net>
parents:
65509
diff
changeset
|
267 int blocking = 1, res, err = 0; |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
268 double timeout; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
269 PyObject *timeout_obj = Py_None; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
270 struct timespec deadline = {0}; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
271 struct timeval now; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
272 long sec, nsec; |
|
47595
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
273 |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
274 static char *kwlist[] = {"block", "timeout", NULL}; |
|
47595
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
275 |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
276 if (!PyArg_ParseTupleAndKeywords(args, kwds, "|iO", kwlist, |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
277 &blocking, &timeout_obj)) |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
278 return NULL; |
|
47595
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
279 |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
280 if (self->kind == RECURSIVE_MUTEX && ISMINE(self)) { |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
281 ++self->count; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
282 Py_RETURN_TRUE; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
283 } |
|
47595
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
284 |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
285 if (timeout_obj != Py_None) { |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
286 timeout = PyFloat_AsDouble(timeout_obj); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
287 if (PyErr_Occurred()) |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
288 return NULL; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
289 if (timeout < 0.0) |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
290 timeout = 0.0; |
|
47595
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
291 |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
292 if (gettimeofday(&now, NULL) < 0) { |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
293 PyErr_SetFromErrno(PyExc_OSError); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
294 return NULL; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
295 } |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
296 sec = (long) timeout; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
297 nsec = (long) (1e9 * (timeout - sec) + 0.5); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
298 deadline.tv_sec = now.tv_sec + sec; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
299 deadline.tv_nsec = now.tv_usec * 1000 + nsec; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
300 deadline.tv_sec += (deadline.tv_nsec / 1000000000); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
301 deadline.tv_nsec %= 1000000000; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
302 } |
|
47595
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
303 |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
304 do { |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
305 Py_BEGIN_ALLOW_THREADS |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
306 if (blocking && timeout_obj == Py_None) |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
307 res = sem_wait(self->handle); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
308 else if (!blocking) |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
309 res = sem_trywait(self->handle); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
310 else |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
311 res = sem_timedwait(self->handle, &deadline); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
312 Py_END_ALLOW_THREADS |
|
73996
6a966179c73a
Issue #10350: Read and save errno before calling a function which might overwrite it.
Antoine Pitrou <solipsis@pitrou.net>
parents:
65509
diff
changeset
|
313 err = errno; |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
314 if (res == MP_EXCEPTION_HAS_BEEN_SET) |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
315 break; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
316 } while (res < 0 && errno == EINTR && !PyErr_CheckSignals()); |
|
47595
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
317 |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
318 if (res < 0) { |
|
73996
6a966179c73a
Issue #10350: Read and save errno before calling a function which might overwrite it.
Antoine Pitrou <solipsis@pitrou.net>
parents:
65509
diff
changeset
|
319 errno = err; |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
320 if (errno == EAGAIN || errno == ETIMEDOUT) |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
321 Py_RETURN_FALSE; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
322 else if (errno == EINTR) |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
323 return NULL; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
324 else |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
325 return PyErr_SetFromErrno(PyExc_OSError); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
326 } |
|
47595
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
327 |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
328 ++self->count; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
329 self->last_tid = PyThread_get_thread_ident(); |
|
47595
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
330 |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
331 Py_RETURN_TRUE; |
|
47595
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
332 } |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
333 |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
334 static PyObject * |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
335 semlock_release(SemLockObject *self, PyObject *args) |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
336 { |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
337 if (self->kind == RECURSIVE_MUTEX) { |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
338 if (!ISMINE(self)) { |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
339 PyErr_SetString(PyExc_AssertionError, "attempt to " |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
340 "release recursive lock not owned " |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
341 "by thread"); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
342 return NULL; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
343 } |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
344 if (self->count > 1) { |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
345 --self->count; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
346 Py_RETURN_NONE; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
347 } |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
348 assert(self->count == 1); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
349 } else { |
|
52902
d3887dfe661f
Merged revisions 70908,70939,71009,71022,71036 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
52504
diff
changeset
|
350 #ifdef HAVE_BROKEN_SEM_GETVALUE |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
351 /* We will only check properly the maxvalue == 1 case */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
352 if (self->maxvalue == 1) { |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
353 /* make sure that already locked */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
354 if (sem_trywait(self->handle) < 0) { |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
355 if (errno != EAGAIN) { |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
356 PyErr_SetFromErrno(PyExc_OSError); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
357 return NULL; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
358 } |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
359 /* it is already locked as expected */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
360 } else { |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
361 /* it was not locked so undo wait and raise */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
362 if (sem_post(self->handle) < 0) { |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
363 PyErr_SetFromErrno(PyExc_OSError); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
364 return NULL; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
365 } |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
366 PyErr_SetString(PyExc_ValueError, "semaphore " |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
367 "or lock released too many " |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
368 "times"); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
369 return NULL; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
370 } |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
371 } |
|
47595
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
372 #else |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
373 int sval; |
|
47595
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
374 |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
375 /* This check is not an absolute guarantee that the semaphore |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
376 does not rise above maxvalue. */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
377 if (sem_getvalue(self->handle, &sval) < 0) { |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
378 return PyErr_SetFromErrno(PyExc_OSError); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
379 } else if (sval >= self->maxvalue) { |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
380 PyErr_SetString(PyExc_ValueError, "semaphore or lock " |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
381 "released too many times"); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
382 return NULL; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
383 } |
|
47595
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
384 #endif |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
385 } |
|
47595
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
386 |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
387 if (sem_post(self->handle) < 0) |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
388 return PyErr_SetFromErrno(PyExc_OSError); |
|
47595
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
389 |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
390 --self->count; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
391 Py_RETURN_NONE; |
|
47595
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
392 } |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
393 |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
394 #endif /* !MS_WINDOWS */ |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
395 |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
396 /* |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
397 * All platforms |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
398 */ |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
399 |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
400 static PyObject * |
|
85169
3b82e0d83bf9
Issue #8713: Support alternative start methods in multiprocessing on Unix.
Richard Oudkerk <shibturn@gmail.com>
parents:
81713
diff
changeset
|
401 newsemlockobject(PyTypeObject *type, SEM_HANDLE handle, int kind, int maxvalue, |
|
3b82e0d83bf9
Issue #8713: Support alternative start methods in multiprocessing on Unix.
Richard Oudkerk <shibturn@gmail.com>
parents:
81713
diff
changeset
|
402 char *name) |
|
47595
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
403 { |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
404 SemLockObject *self; |
|
47595
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
405 |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
406 self = PyObject_New(SemLockObject, type); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
407 if (!self) |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
408 return NULL; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
409 self->handle = handle; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
410 self->kind = kind; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
411 self->count = 0; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
412 self->last_tid = 0; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
413 self->maxvalue = maxvalue; |
|
85169
3b82e0d83bf9
Issue #8713: Support alternative start methods in multiprocessing on Unix.
Richard Oudkerk <shibturn@gmail.com>
parents:
81713
diff
changeset
|
414 self->name = name; |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
415 return (PyObject*)self; |
|
47595
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
416 } |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
417 |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
418 static PyObject * |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
419 semlock_new(PyTypeObject *type, PyObject *args, PyObject *kwds) |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
420 { |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
421 SEM_HANDLE handle = SEM_FAILED; |
|
85169
3b82e0d83bf9
Issue #8713: Support alternative start methods in multiprocessing on Unix.
Richard Oudkerk <shibturn@gmail.com>
parents:
81713
diff
changeset
|
422 int kind, maxvalue, value, unlink; |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
423 PyObject *result; |
|
85169
3b82e0d83bf9
Issue #8713: Support alternative start methods in multiprocessing on Unix.
Richard Oudkerk <shibturn@gmail.com>
parents:
81713
diff
changeset
|
424 char *name, *name_copy = NULL; |
|
3b82e0d83bf9
Issue #8713: Support alternative start methods in multiprocessing on Unix.
Richard Oudkerk <shibturn@gmail.com>
parents:
81713
diff
changeset
|
425 static char *kwlist[] = {"kind", "value", "maxvalue", "name", "unlink", |
|
3b82e0d83bf9
Issue #8713: Support alternative start methods in multiprocessing on Unix.
Richard Oudkerk <shibturn@gmail.com>
parents:
81713
diff
changeset
|
426 NULL}; |
|
47595
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
427 |
|
85169
3b82e0d83bf9
Issue #8713: Support alternative start methods in multiprocessing on Unix.
Richard Oudkerk <shibturn@gmail.com>
parents:
81713
diff
changeset
|
428 if (!PyArg_ParseTupleAndKeywords(args, kwds, "iiisi", kwlist, |
|
3b82e0d83bf9
Issue #8713: Support alternative start methods in multiprocessing on Unix.
Richard Oudkerk <shibturn@gmail.com>
parents:
81713
diff
changeset
|
429 &kind, &value, &maxvalue, &name, &unlink)) |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
430 return NULL; |
|
47595
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
431 |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
432 if (kind != RECURSIVE_MUTEX && kind != SEMAPHORE) { |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
433 PyErr_SetString(PyExc_ValueError, "unrecognized kind"); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
434 return NULL; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
435 } |
|
47595
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
436 |
|
85169
3b82e0d83bf9
Issue #8713: Support alternative start methods in multiprocessing on Unix.
Richard Oudkerk <shibturn@gmail.com>
parents:
81713
diff
changeset
|
437 if (!unlink) { |
|
3b82e0d83bf9
Issue #8713: Support alternative start methods in multiprocessing on Unix.
Richard Oudkerk <shibturn@gmail.com>
parents:
81713
diff
changeset
|
438 name_copy = PyMem_Malloc(strlen(name) + 1); |
|
3b82e0d83bf9
Issue #8713: Support alternative start methods in multiprocessing on Unix.
Richard Oudkerk <shibturn@gmail.com>
parents:
81713
diff
changeset
|
439 if (name_copy == NULL) |
|
3b82e0d83bf9
Issue #8713: Support alternative start methods in multiprocessing on Unix.
Richard Oudkerk <shibturn@gmail.com>
parents:
81713
diff
changeset
|
440 goto failure; |
|
3b82e0d83bf9
Issue #8713: Support alternative start methods in multiprocessing on Unix.
Richard Oudkerk <shibturn@gmail.com>
parents:
81713
diff
changeset
|
441 strcpy(name_copy, name); |
|
3b82e0d83bf9
Issue #8713: Support alternative start methods in multiprocessing on Unix.
Richard Oudkerk <shibturn@gmail.com>
parents:
81713
diff
changeset
|
442 } |
|
47595
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
443 |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
444 SEM_CLEAR_ERROR(); |
|
85169
3b82e0d83bf9
Issue #8713: Support alternative start methods in multiprocessing on Unix.
Richard Oudkerk <shibturn@gmail.com>
parents:
81713
diff
changeset
|
445 handle = SEM_CREATE(name, value, maxvalue); |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
446 /* On Windows we should fail if GetLastError()==ERROR_ALREADY_EXISTS */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
447 if (handle == SEM_FAILED || SEM_GET_LAST_ERROR() != 0) |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
448 goto failure; |
|
47595
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
449 |
|
85169
3b82e0d83bf9
Issue #8713: Support alternative start methods in multiprocessing on Unix.
Richard Oudkerk <shibturn@gmail.com>
parents:
81713
diff
changeset
|
450 if (unlink && SEM_UNLINK(name) < 0) |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
451 goto failure; |
|
47595
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
452 |
|
85169
3b82e0d83bf9
Issue #8713: Support alternative start methods in multiprocessing on Unix.
Richard Oudkerk <shibturn@gmail.com>
parents:
81713
diff
changeset
|
453 result = newsemlockobject(type, handle, kind, maxvalue, name_copy); |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
454 if (!result) |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
455 goto failure; |
|
47595
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
456 |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
457 return result; |
|
47595
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
458 |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
459 failure: |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
460 if (handle != SEM_FAILED) |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
461 SEM_CLOSE(handle); |
|
85169
3b82e0d83bf9
Issue #8713: Support alternative start methods in multiprocessing on Unix.
Richard Oudkerk <shibturn@gmail.com>
parents:
81713
diff
changeset
|
462 PyMem_Free(name_copy); |
|
79582
fc011f1ef59e
Get rid of circular import and eliminate unprefixed exported symbols
Richard Oudkerk <shibturn@gmail.com>
parents:
76663
diff
changeset
|
463 _PyMp_SetError(NULL, MP_STANDARD_ERROR); |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
464 return NULL; |
|
47595
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
465 } |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
466 |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
467 static PyObject * |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
468 semlock_rebuild(PyTypeObject *type, PyObject *args) |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
469 { |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
470 SEM_HANDLE handle; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
471 int kind, maxvalue; |
|
85169
3b82e0d83bf9
Issue #8713: Support alternative start methods in multiprocessing on Unix.
Richard Oudkerk <shibturn@gmail.com>
parents:
81713
diff
changeset
|
472 char *name, *name_copy = NULL; |
|
47595
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
473 |
|
85169
3b82e0d83bf9
Issue #8713: Support alternative start methods in multiprocessing on Unix.
Richard Oudkerk <shibturn@gmail.com>
parents:
81713
diff
changeset
|
474 if (!PyArg_ParseTuple(args, F_SEM_HANDLE "iiz", |
|
3b82e0d83bf9
Issue #8713: Support alternative start methods in multiprocessing on Unix.
Richard Oudkerk <shibturn@gmail.com>
parents:
81713
diff
changeset
|
475 &handle, &kind, &maxvalue, &name)) |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
476 return NULL; |
|
47595
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
477 |
|
85169
3b82e0d83bf9
Issue #8713: Support alternative start methods in multiprocessing on Unix.
Richard Oudkerk <shibturn@gmail.com>
parents:
81713
diff
changeset
|
478 if (name != NULL) { |
|
3b82e0d83bf9
Issue #8713: Support alternative start methods in multiprocessing on Unix.
Richard Oudkerk <shibturn@gmail.com>
parents:
81713
diff
changeset
|
479 name_copy = PyMem_Malloc(strlen(name) + 1); |
|
3b82e0d83bf9
Issue #8713: Support alternative start methods in multiprocessing on Unix.
Richard Oudkerk <shibturn@gmail.com>
parents:
81713
diff
changeset
|
480 if (name_copy == NULL) |
|
3b82e0d83bf9
Issue #8713: Support alternative start methods in multiprocessing on Unix.
Richard Oudkerk <shibturn@gmail.com>
parents:
81713
diff
changeset
|
481 return PyErr_NoMemory(); |
|
3b82e0d83bf9
Issue #8713: Support alternative start methods in multiprocessing on Unix.
Richard Oudkerk <shibturn@gmail.com>
parents:
81713
diff
changeset
|
482 strcpy(name_copy, name); |
|
3b82e0d83bf9
Issue #8713: Support alternative start methods in multiprocessing on Unix.
Richard Oudkerk <shibturn@gmail.com>
parents:
81713
diff
changeset
|
483 } |
|
3b82e0d83bf9
Issue #8713: Support alternative start methods in multiprocessing on Unix.
Richard Oudkerk <shibturn@gmail.com>
parents:
81713
diff
changeset
|
484 |
|
3b82e0d83bf9
Issue #8713: Support alternative start methods in multiprocessing on Unix.
Richard Oudkerk <shibturn@gmail.com>
parents:
81713
diff
changeset
|
485 #ifndef MS_WINDOWS |
|
3b82e0d83bf9
Issue #8713: Support alternative start methods in multiprocessing on Unix.
Richard Oudkerk <shibturn@gmail.com>
parents:
81713
diff
changeset
|
486 if (name != NULL) { |
|
3b82e0d83bf9
Issue #8713: Support alternative start methods in multiprocessing on Unix.
Richard Oudkerk <shibturn@gmail.com>
parents:
81713
diff
changeset
|
487 handle = sem_open(name, 0); |
|
3b82e0d83bf9
Issue #8713: Support alternative start methods in multiprocessing on Unix.
Richard Oudkerk <shibturn@gmail.com>
parents:
81713
diff
changeset
|
488 if (handle == SEM_FAILED) { |
|
3b82e0d83bf9
Issue #8713: Support alternative start methods in multiprocessing on Unix.
Richard Oudkerk <shibturn@gmail.com>
parents:
81713
diff
changeset
|
489 PyMem_Free(name_copy); |
|
3b82e0d83bf9
Issue #8713: Support alternative start methods in multiprocessing on Unix.
Richard Oudkerk <shibturn@gmail.com>
parents:
81713
diff
changeset
|
490 return PyErr_SetFromErrno(PyExc_OSError); |
|
3b82e0d83bf9
Issue #8713: Support alternative start methods in multiprocessing on Unix.
Richard Oudkerk <shibturn@gmail.com>
parents:
81713
diff
changeset
|
491 } |
|
3b82e0d83bf9
Issue #8713: Support alternative start methods in multiprocessing on Unix.
Richard Oudkerk <shibturn@gmail.com>
parents:
81713
diff
changeset
|
492 } |
|
3b82e0d83bf9
Issue #8713: Support alternative start methods in multiprocessing on Unix.
Richard Oudkerk <shibturn@gmail.com>
parents:
81713
diff
changeset
|
493 #endif |
|
3b82e0d83bf9
Issue #8713: Support alternative start methods in multiprocessing on Unix.
Richard Oudkerk <shibturn@gmail.com>
parents:
81713
diff
changeset
|
494 |
|
3b82e0d83bf9
Issue #8713: Support alternative start methods in multiprocessing on Unix.
Richard Oudkerk <shibturn@gmail.com>
parents:
81713
diff
changeset
|
495 return newsemlockobject(type, handle, kind, maxvalue, name_copy); |
|
47595
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
496 } |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
497 |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
498 static void |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
499 semlock_dealloc(SemLockObject* self) |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
500 { |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
501 if (self->handle != SEM_FAILED) |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
502 SEM_CLOSE(self->handle); |
|
85169
3b82e0d83bf9
Issue #8713: Support alternative start methods in multiprocessing on Unix.
Richard Oudkerk <shibturn@gmail.com>
parents:
81713
diff
changeset
|
503 PyMem_Free(self->name); |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
504 PyObject_Del(self); |
|
47595
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
505 } |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
506 |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
507 static PyObject * |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
508 semlock_count(SemLockObject *self) |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
509 { |
|
69989
5dbc23e48fb0
Remove dead code from _multiprocessing
Antoine Pitrou <solipsis@pitrou.net>
parents:
65509
diff
changeset
|
510 return PyLong_FromLong((long)self->count); |
|
47595
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
511 } |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
512 |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
513 static PyObject * |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
514 semlock_ismine(SemLockObject *self) |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
515 { |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
516 /* only makes sense for a lock */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
517 return PyBool_FromLong(ISMINE(self)); |
|
47595
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
518 } |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
519 |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
520 static PyObject * |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
521 semlock_getvalue(SemLockObject *self) |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
522 { |
|
52902
d3887dfe661f
Merged revisions 70908,70939,71009,71022,71036 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
52504
diff
changeset
|
523 #ifdef HAVE_BROKEN_SEM_GETVALUE |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
524 PyErr_SetNone(PyExc_NotImplementedError); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
525 return NULL; |
|
47595
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
526 #else |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
527 int sval; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
528 if (SEM_GETVALUE(self->handle, &sval) < 0) |
|
79582
fc011f1ef59e
Get rid of circular import and eliminate unprefixed exported symbols
Richard Oudkerk <shibturn@gmail.com>
parents:
76663
diff
changeset
|
529 return _PyMp_SetError(NULL, MP_STANDARD_ERROR); |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
530 /* some posix implementations use negative numbers to indicate |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
531 the number of waiting threads */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
532 if (sval < 0) |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
533 sval = 0; |
|
69989
5dbc23e48fb0
Remove dead code from _multiprocessing
Antoine Pitrou <solipsis@pitrou.net>
parents:
65509
diff
changeset
|
534 return PyLong_FromLong((long)sval); |
|
47595
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
535 #endif |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
536 } |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
537 |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
538 static PyObject * |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
539 semlock_iszero(SemLockObject *self) |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
540 { |
|
52902
d3887dfe661f
Merged revisions 70908,70939,71009,71022,71036 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
52504
diff
changeset
|
541 #ifdef HAVE_BROKEN_SEM_GETVALUE |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
542 if (sem_trywait(self->handle) < 0) { |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
543 if (errno == EAGAIN) |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
544 Py_RETURN_TRUE; |
|
79582
fc011f1ef59e
Get rid of circular import and eliminate unprefixed exported symbols
Richard Oudkerk <shibturn@gmail.com>
parents:
76663
diff
changeset
|
545 return _PyMp_SetError(NULL, MP_STANDARD_ERROR); |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
546 } else { |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
547 if (sem_post(self->handle) < 0) |
|
79582
fc011f1ef59e
Get rid of circular import and eliminate unprefixed exported symbols
Richard Oudkerk <shibturn@gmail.com>
parents:
76663
diff
changeset
|
548 return _PyMp_SetError(NULL, MP_STANDARD_ERROR); |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
549 Py_RETURN_FALSE; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
550 } |
|
47595
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
551 #else |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
552 int sval; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
553 if (SEM_GETVALUE(self->handle, &sval) < 0) |
|
79582
fc011f1ef59e
Get rid of circular import and eliminate unprefixed exported symbols
Richard Oudkerk <shibturn@gmail.com>
parents:
76663
diff
changeset
|
554 return _PyMp_SetError(NULL, MP_STANDARD_ERROR); |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
555 return PyBool_FromLong((long)sval == 0); |
|
47595
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
556 #endif |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
557 } |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
558 |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
559 static PyObject * |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
560 semlock_afterfork(SemLockObject *self) |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
561 { |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
562 self->count = 0; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
563 Py_RETURN_NONE; |
|
47595
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
564 } |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
565 |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
566 /* |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
567 * Semaphore methods |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
568 */ |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
569 |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
570 static PyMethodDef semlock_methods[] = { |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
571 {"acquire", (PyCFunction)semlock_acquire, METH_VARARGS | METH_KEYWORDS, |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
572 "acquire the semaphore/lock"}, |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
573 {"release", (PyCFunction)semlock_release, METH_NOARGS, |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
574 "release the semaphore/lock"}, |
| 52504 | 575 {"__enter__", (PyCFunction)semlock_acquire, METH_VARARGS | METH_KEYWORDS, |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
576 "enter the semaphore/lock"}, |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
577 {"__exit__", (PyCFunction)semlock_release, METH_VARARGS, |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
578 "exit the semaphore/lock"}, |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
579 {"_count", (PyCFunction)semlock_count, METH_NOARGS, |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
580 "num of `acquire()`s minus num of `release()`s for this process"}, |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
581 {"_is_mine", (PyCFunction)semlock_ismine, METH_NOARGS, |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
582 "whether the lock is owned by this thread"}, |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
583 {"_get_value", (PyCFunction)semlock_getvalue, METH_NOARGS, |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
584 "get the value of the semaphore"}, |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
585 {"_is_zero", (PyCFunction)semlock_iszero, METH_NOARGS, |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
586 "returns whether semaphore has value zero"}, |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
587 {"_rebuild", (PyCFunction)semlock_rebuild, METH_VARARGS | METH_CLASS, |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
588 ""}, |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
589 {"_after_fork", (PyCFunction)semlock_afterfork, METH_NOARGS, |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
590 "rezero the net acquisition count after fork()"}, |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
591 {NULL} |
|
47595
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
592 }; |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
593 |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
594 /* |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
595 * Member table |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
596 */ |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
597 |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
598 static PyMemberDef semlock_members[] = { |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
599 {"handle", T_SEM_HANDLE, offsetof(SemLockObject, handle), READONLY, |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
600 ""}, |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
601 {"kind", T_INT, offsetof(SemLockObject, kind), READONLY, |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
602 ""}, |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
603 {"maxvalue", T_INT, offsetof(SemLockObject, maxvalue), READONLY, |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
604 ""}, |
|
85169
3b82e0d83bf9
Issue #8713: Support alternative start methods in multiprocessing on Unix.
Richard Oudkerk <shibturn@gmail.com>
parents:
81713
diff
changeset
|
605 {"name", T_STRING, offsetof(SemLockObject, name), READONLY, |
|
3b82e0d83bf9
Issue #8713: Support alternative start methods in multiprocessing on Unix.
Richard Oudkerk <shibturn@gmail.com>
parents:
81713
diff
changeset
|
606 ""}, |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
607 {NULL} |
|
47595
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
608 }; |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
609 |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
610 /* |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
611 * Semaphore type |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
612 */ |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
613 |
|
79582
fc011f1ef59e
Get rid of circular import and eliminate unprefixed exported symbols
Richard Oudkerk <shibturn@gmail.com>
parents:
76663
diff
changeset
|
614 PyTypeObject _PyMp_SemLockType = { |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
615 PyVarObject_HEAD_INIT(NULL, 0) |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
616 /* tp_name */ "_multiprocessing.SemLock", |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
617 /* tp_basicsize */ sizeof(SemLockObject), |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
618 /* tp_itemsize */ 0, |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
619 /* tp_dealloc */ (destructor)semlock_dealloc, |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
620 /* tp_print */ 0, |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
621 /* tp_getattr */ 0, |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
622 /* tp_setattr */ 0, |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
623 /* tp_reserved */ 0, |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
624 /* tp_repr */ 0, |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
625 /* tp_as_number */ 0, |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
626 /* tp_as_sequence */ 0, |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
627 /* tp_as_mapping */ 0, |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
628 /* tp_hash */ 0, |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
629 /* tp_call */ 0, |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
630 /* tp_str */ 0, |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
631 /* tp_getattro */ 0, |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
632 /* tp_setattro */ 0, |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
633 /* tp_as_buffer */ 0, |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
634 /* tp_flags */ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
635 /* tp_doc */ "Semaphore/Mutex type", |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
636 /* tp_traverse */ 0, |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
637 /* tp_clear */ 0, |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
638 /* tp_richcompare */ 0, |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
639 /* tp_weaklistoffset */ 0, |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
640 /* tp_iter */ 0, |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
641 /* tp_iternext */ 0, |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
642 /* tp_methods */ semlock_methods, |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
643 /* tp_members */ semlock_members, |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
644 /* tp_getset */ 0, |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
645 /* tp_base */ 0, |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
646 /* tp_dict */ 0, |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
647 /* tp_descr_get */ 0, |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
648 /* tp_descr_set */ 0, |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
649 /* tp_dictoffset */ 0, |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
650 /* tp_init */ 0, |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
651 /* tp_alloc */ 0, |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52902
diff
changeset
|
652 /* tp_new */ semlock_new, |
|
47595
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
653 }; |
|
85169
3b82e0d83bf9
Issue #8713: Support alternative start methods in multiprocessing on Unix.
Richard Oudkerk <shibturn@gmail.com>
parents:
81713
diff
changeset
|
654 |
|
3b82e0d83bf9
Issue #8713: Support alternative start methods in multiprocessing on Unix.
Richard Oudkerk <shibturn@gmail.com>
parents:
81713
diff
changeset
|
655 /* |
|
3b82e0d83bf9
Issue #8713: Support alternative start methods in multiprocessing on Unix.
Richard Oudkerk <shibturn@gmail.com>
parents:
81713
diff
changeset
|
656 * Function to unlink semaphore names |
|
3b82e0d83bf9
Issue #8713: Support alternative start methods in multiprocessing on Unix.
Richard Oudkerk <shibturn@gmail.com>
parents:
81713
diff
changeset
|
657 */ |
|
3b82e0d83bf9
Issue #8713: Support alternative start methods in multiprocessing on Unix.
Richard Oudkerk <shibturn@gmail.com>
parents:
81713
diff
changeset
|
658 |
|
3b82e0d83bf9
Issue #8713: Support alternative start methods in multiprocessing on Unix.
Richard Oudkerk <shibturn@gmail.com>
parents:
81713
diff
changeset
|
659 PyObject * |
|
3b82e0d83bf9
Issue #8713: Support alternative start methods in multiprocessing on Unix.
Richard Oudkerk <shibturn@gmail.com>
parents:
81713
diff
changeset
|
660 _PyMp_sem_unlink(PyObject *ignore, PyObject *args) |
|
3b82e0d83bf9
Issue #8713: Support alternative start methods in multiprocessing on Unix.
Richard Oudkerk <shibturn@gmail.com>
parents:
81713
diff
changeset
|
661 { |
|
3b82e0d83bf9
Issue #8713: Support alternative start methods in multiprocessing on Unix.
Richard Oudkerk <shibturn@gmail.com>
parents:
81713
diff
changeset
|
662 char *name; |
|
3b82e0d83bf9
Issue #8713: Support alternative start methods in multiprocessing on Unix.
Richard Oudkerk <shibturn@gmail.com>
parents:
81713
diff
changeset
|
663 |
|
3b82e0d83bf9
Issue #8713: Support alternative start methods in multiprocessing on Unix.
Richard Oudkerk <shibturn@gmail.com>
parents:
81713
diff
changeset
|
664 if (!PyArg_ParseTuple(args, "s", &name)) |
|
3b82e0d83bf9
Issue #8713: Support alternative start methods in multiprocessing on Unix.
Richard Oudkerk <shibturn@gmail.com>
parents:
81713
diff
changeset
|
665 return NULL; |
|
3b82e0d83bf9
Issue #8713: Support alternative start methods in multiprocessing on Unix.
Richard Oudkerk <shibturn@gmail.com>
parents:
81713
diff
changeset
|
666 |
|
3b82e0d83bf9
Issue #8713: Support alternative start methods in multiprocessing on Unix.
Richard Oudkerk <shibturn@gmail.com>
parents:
81713
diff
changeset
|
667 if (SEM_UNLINK(name) < 0) { |
|
3b82e0d83bf9
Issue #8713: Support alternative start methods in multiprocessing on Unix.
Richard Oudkerk <shibturn@gmail.com>
parents:
81713
diff
changeset
|
668 _PyMp_SetError(NULL, MP_STANDARD_ERROR); |
|
3b82e0d83bf9
Issue #8713: Support alternative start methods in multiprocessing on Unix.
Richard Oudkerk <shibturn@gmail.com>
parents:
81713
diff
changeset
|
669 return NULL; |
|
3b82e0d83bf9
Issue #8713: Support alternative start methods in multiprocessing on Unix.
Richard Oudkerk <shibturn@gmail.com>
parents:
81713
diff
changeset
|
670 } |
|
3b82e0d83bf9
Issue #8713: Support alternative start methods in multiprocessing on Unix.
Richard Oudkerk <shibturn@gmail.com>
parents:
81713
diff
changeset
|
671 |
|
3b82e0d83bf9
Issue #8713: Support alternative start methods in multiprocessing on Unix.
Richard Oudkerk <shibturn@gmail.com>
parents:
81713
diff
changeset
|
672 Py_RETURN_NONE; |
|
3b82e0d83bf9
Issue #8713: Support alternative start methods in multiprocessing on Unix.
Richard Oudkerk <shibturn@gmail.com>
parents:
81713
diff
changeset
|
673 } |
