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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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
c1a3cec0acd4 merge 70783 to py3k
Jesse Noller <jnoller@gmail.com>
parents: 51271
diff changeset
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 }