annotate Modules/_multiprocessing/multiprocessing.c @ 78069:a8aa77458e12 3.2

Add c_size_t and c_ssize_t to the ctypes summary table.
author Antoine Pitrou <solipsis@pitrou.net>
date Thu, 12 Jul 2012 20:31:50 +0200
parents 49e82c885d6b
children 4a27b5ab2710
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
47698
6d1dc761ab4e fix multiprocessing line endings in py3k
Benjamin Peterson <benjamin@python.org>
parents: 47685
diff changeset
1 /*
6d1dc761ab4e fix multiprocessing line endings in py3k
Benjamin Peterson <benjamin@python.org>
parents: 47685
diff changeset
2 * Extension module used by multiprocessing package
6d1dc761ab4e fix multiprocessing line endings in py3k
Benjamin Peterson <benjamin@python.org>
parents: 47685
diff changeset
3 *
6d1dc761ab4e fix multiprocessing line endings in py3k
Benjamin Peterson <benjamin@python.org>
parents: 47685
diff changeset
4 * multiprocessing.c
6d1dc761ab4e fix multiprocessing line endings in py3k
Benjamin Peterson <benjamin@python.org>
parents: 47685
diff changeset
5 *
6d1dc761ab4e fix multiprocessing line endings in py3k
Benjamin Peterson <benjamin@python.org>
parents: 47685
diff changeset
6 * Copyright (c) 2006-2008, R Oudkerk --- see COPYING.txt
6d1dc761ab4e fix multiprocessing line endings in py3k
Benjamin Peterson <benjamin@python.org>
parents: 47685
diff changeset
7 */
6d1dc761ab4e fix multiprocessing line endings in py3k
Benjamin Peterson <benjamin@python.org>
parents: 47685
diff changeset
8
6d1dc761ab4e fix multiprocessing line endings in py3k
Benjamin Peterson <benjamin@python.org>
parents: 47685
diff changeset
9 #include "multiprocessing.h"
6d1dc761ab4e fix multiprocessing line endings in py3k
Benjamin Peterson <benjamin@python.org>
parents: 47685
diff changeset
10
73962
49e82c885d6b Issue #4028: Make multiprocessing build on SunOS.
Charles-François Natali <neologix@free.fr>
parents: 72435
diff changeset
11 #if (defined(CMSG_LEN) && defined(SCM_RIGHTS))
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57491
diff changeset
12 #define HAVE_FD_TRANSFER 1
52902
d3887dfe661f Merged revisions 70908,70939,71009,71022,71036 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 47698
diff changeset
13 #else
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57491
diff changeset
14 #define HAVE_FD_TRANSFER 0
52902
d3887dfe661f Merged revisions 70908,70939,71009,71022,71036 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 47698
diff changeset
15 #endif
d3887dfe661f Merged revisions 70908,70939,71009,71022,71036 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 47698
diff changeset
16
47698
6d1dc761ab4e fix multiprocessing line endings in py3k
Benjamin Peterson <benjamin@python.org>
parents: 47685
diff changeset
17 PyObject *create_win32_namespace(void);
6d1dc761ab4e fix multiprocessing line endings in py3k
Benjamin Peterson <benjamin@python.org>
parents: 47685
diff changeset
18
6d1dc761ab4e fix multiprocessing line endings in py3k
Benjamin Peterson <benjamin@python.org>
parents: 47685
diff changeset
19 PyObject *pickle_dumps, *pickle_loads, *pickle_protocol;
6d1dc761ab4e fix multiprocessing line endings in py3k
Benjamin Peterson <benjamin@python.org>
parents: 47685
diff changeset
20 PyObject *ProcessError, *BufferTooShort;
6d1dc761ab4e fix multiprocessing line endings in py3k
Benjamin Peterson <benjamin@python.org>
parents: 47685
diff changeset
21
6d1dc761ab4e fix multiprocessing line endings in py3k
Benjamin Peterson <benjamin@python.org>
parents: 47685
diff changeset
22 /*
6d1dc761ab4e fix multiprocessing line endings in py3k
Benjamin Peterson <benjamin@python.org>
parents: 47685
diff changeset
23 * Function which raises exceptions based on error codes
6d1dc761ab4e fix multiprocessing line endings in py3k
Benjamin Peterson <benjamin@python.org>
parents: 47685
diff changeset
24 */
6d1dc761ab4e fix multiprocessing line endings in py3k
Benjamin Peterson <benjamin@python.org>
parents: 47685
diff changeset
25
6d1dc761ab4e fix multiprocessing line endings in py3k
Benjamin Peterson <benjamin@python.org>
parents: 47685
diff changeset
26 PyObject *
6d1dc761ab4e fix multiprocessing line endings in py3k
Benjamin Peterson <benjamin@python.org>
parents: 47685
diff changeset
27 mp_SetError(PyObject *Type, int num)
6d1dc761ab4e fix multiprocessing line endings in py3k
Benjamin Peterson <benjamin@python.org>
parents: 47685
diff changeset
28 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57491
diff changeset
29 switch (num) {
47698
6d1dc761ab4e fix multiprocessing line endings in py3k
Benjamin Peterson <benjamin@python.org>
parents: 47685
diff changeset
30 #ifdef MS_WINDOWS
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57491
diff changeset
31 case MP_STANDARD_ERROR:
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57491
diff changeset
32 if (Type == NULL)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57491
diff changeset
33 Type = PyExc_WindowsError;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57491
diff changeset
34 PyErr_SetExcFromWindowsErr(Type, 0);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57491
diff changeset
35 break;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57491
diff changeset
36 case MP_SOCKET_ERROR:
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57491
diff changeset
37 if (Type == NULL)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57491
diff changeset
38 Type = PyExc_WindowsError;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57491
diff changeset
39 PyErr_SetExcFromWindowsErr(Type, WSAGetLastError());
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57491
diff changeset
40 break;
47698
6d1dc761ab4e fix multiprocessing line endings in py3k
Benjamin Peterson <benjamin@python.org>
parents: 47685
diff changeset
41 #else /* !MS_WINDOWS */
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57491
diff changeset
42 case MP_STANDARD_ERROR:
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57491
diff changeset
43 case MP_SOCKET_ERROR:
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57491
diff changeset
44 if (Type == NULL)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57491
diff changeset
45 Type = PyExc_OSError;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57491
diff changeset
46 PyErr_SetFromErrno(Type);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57491
diff changeset
47 break;
47698
6d1dc761ab4e fix multiprocessing line endings in py3k
Benjamin Peterson <benjamin@python.org>
parents: 47685
diff changeset
48 #endif /* !MS_WINDOWS */
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57491
diff changeset
49 case MP_MEMORY_ERROR:
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57491
diff changeset
50 PyErr_NoMemory();
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57491
diff changeset
51 break;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57491
diff changeset
52 case MP_END_OF_FILE:
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57491
diff changeset
53 PyErr_SetNone(PyExc_EOFError);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57491
diff changeset
54 break;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57491
diff changeset
55 case MP_EARLY_END_OF_FILE:
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57491
diff changeset
56 PyErr_SetString(PyExc_IOError,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57491
diff changeset
57 "got end of file during message");
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57491
diff changeset
58 break;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57491
diff changeset
59 case MP_BAD_MESSAGE_LENGTH:
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57491
diff changeset
60 PyErr_SetString(PyExc_IOError, "bad message length");
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57491
diff changeset
61 break;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57491
diff changeset
62 case MP_EXCEPTION_HAS_BEEN_SET:
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57491
diff changeset
63 break;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57491
diff changeset
64 default:
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57491
diff changeset
65 PyErr_Format(PyExc_RuntimeError,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57491
diff changeset
66 "unkown error number %d", num);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57491
diff changeset
67 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57491
diff changeset
68 return NULL;
47698
6d1dc761ab4e fix multiprocessing line endings in py3k
Benjamin Peterson <benjamin@python.org>
parents: 47685
diff changeset
69 }
6d1dc761ab4e fix multiprocessing line endings in py3k
Benjamin Peterson <benjamin@python.org>
parents: 47685
diff changeset
70
6d1dc761ab4e fix multiprocessing line endings in py3k
Benjamin Peterson <benjamin@python.org>
parents: 47685
diff changeset
71
6d1dc761ab4e fix multiprocessing line endings in py3k
Benjamin Peterson <benjamin@python.org>
parents: 47685
diff changeset
72 /*
6d1dc761ab4e fix multiprocessing line endings in py3k
Benjamin Peterson <benjamin@python.org>
parents: 47685
diff changeset
73 * Windows only
6d1dc761ab4e fix multiprocessing line endings in py3k
Benjamin Peterson <benjamin@python.org>
parents: 47685
diff changeset
74 */
6d1dc761ab4e fix multiprocessing line endings in py3k
Benjamin Peterson <benjamin@python.org>
parents: 47685
diff changeset
75
6d1dc761ab4e fix multiprocessing line endings in py3k
Benjamin Peterson <benjamin@python.org>
parents: 47685
diff changeset
76 #ifdef MS_WINDOWS
6d1dc761ab4e fix multiprocessing line endings in py3k
Benjamin Peterson <benjamin@python.org>
parents: 47685
diff changeset
77
6d1dc761ab4e fix multiprocessing line endings in py3k
Benjamin Peterson <benjamin@python.org>
parents: 47685
diff changeset
78 /* On Windows we set an event to signal Ctrl-C; compare with timemodule.c */
6d1dc761ab4e fix multiprocessing line endings in py3k
Benjamin Peterson <benjamin@python.org>
parents: 47685
diff changeset
79
6d1dc761ab4e fix multiprocessing line endings in py3k
Benjamin Peterson <benjamin@python.org>
parents: 47685
diff changeset
80 HANDLE sigint_event = NULL;
6d1dc761ab4e fix multiprocessing line endings in py3k
Benjamin Peterson <benjamin@python.org>
parents: 47685
diff changeset
81
6d1dc761ab4e fix multiprocessing line endings in py3k
Benjamin Peterson <benjamin@python.org>
parents: 47685
diff changeset
82 static BOOL WINAPI
6d1dc761ab4e fix multiprocessing line endings in py3k
Benjamin Peterson <benjamin@python.org>
parents: 47685
diff changeset
83 ProcessingCtrlHandler(DWORD dwCtrlType)
6d1dc761ab4e fix multiprocessing line endings in py3k
Benjamin Peterson <benjamin@python.org>
parents: 47685
diff changeset
84 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57491
diff changeset
85 SetEvent(sigint_event);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57491
diff changeset
86 return FALSE;
47698
6d1dc761ab4e fix multiprocessing line endings in py3k
Benjamin Peterson <benjamin@python.org>
parents: 47685
diff changeset
87 }
6d1dc761ab4e fix multiprocessing line endings in py3k
Benjamin Peterson <benjamin@python.org>
parents: 47685
diff changeset
88
6d1dc761ab4e fix multiprocessing line endings in py3k
Benjamin Peterson <benjamin@python.org>
parents: 47685
diff changeset
89 /*
6d1dc761ab4e fix multiprocessing line endings in py3k
Benjamin Peterson <benjamin@python.org>
parents: 47685
diff changeset
90 * Unix only
6d1dc761ab4e fix multiprocessing line endings in py3k
Benjamin Peterson <benjamin@python.org>
parents: 47685
diff changeset
91 */
6d1dc761ab4e fix multiprocessing line endings in py3k
Benjamin Peterson <benjamin@python.org>
parents: 47685
diff changeset
92
6d1dc761ab4e fix multiprocessing line endings in py3k
Benjamin Peterson <benjamin@python.org>
parents: 47685
diff changeset
93 #else /* !MS_WINDOWS */
6d1dc761ab4e fix multiprocessing line endings in py3k
Benjamin Peterson <benjamin@python.org>
parents: 47685
diff changeset
94
6d1dc761ab4e fix multiprocessing line endings in py3k
Benjamin Peterson <benjamin@python.org>
parents: 47685
diff changeset
95 #if HAVE_FD_TRANSFER
6d1dc761ab4e fix multiprocessing line endings in py3k
Benjamin Peterson <benjamin@python.org>
parents: 47685
diff changeset
96
6d1dc761ab4e fix multiprocessing line endings in py3k
Benjamin Peterson <benjamin@python.org>
parents: 47685
diff changeset
97 /* Functions for transferring file descriptors between processes.
6d1dc761ab4e fix multiprocessing line endings in py3k
Benjamin Peterson <benjamin@python.org>
parents: 47685
diff changeset
98 Reimplements some of the functionality of the fdcred
6d1dc761ab4e fix multiprocessing line endings in py3k
Benjamin Peterson <benjamin@python.org>
parents: 47685
diff changeset
99 module at http://www.mca-ltd.com/resources/fdcred_1.tgz. */
72332
0f50b8379614 Close #12950: multiprocessing "test_fd_transfer" fails under OpenIndiana
Jesus Cea <jcea@jcea.es>
parents: 72051
diff changeset
100 /* Based in http://resin.csoft.net/cgi-bin/man.cgi?section=3&topic=CMSG_DATA */
47698
6d1dc761ab4e fix multiprocessing line endings in py3k
Benjamin Peterson <benjamin@python.org>
parents: 47685
diff changeset
101
6d1dc761ab4e fix multiprocessing line endings in py3k
Benjamin Peterson <benjamin@python.org>
parents: 47685
diff changeset
102 static PyObject *
6d1dc761ab4e fix multiprocessing line endings in py3k
Benjamin Peterson <benjamin@python.org>
parents: 47685
diff changeset
103 multiprocessing_sendfd(PyObject *self, PyObject *args)
6d1dc761ab4e fix multiprocessing line endings in py3k
Benjamin Peterson <benjamin@python.org>
parents: 47685
diff changeset
104 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57491
diff changeset
105 int conn, fd, res;
72332
0f50b8379614 Close #12950: multiprocessing "test_fd_transfer" fails under OpenIndiana
Jesus Cea <jcea@jcea.es>
parents: 72051
diff changeset
106 struct iovec dummy_iov;
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57491
diff changeset
107 char dummy_char;
72332
0f50b8379614 Close #12950: multiprocessing "test_fd_transfer" fails under OpenIndiana
Jesus Cea <jcea@jcea.es>
parents: 72051
diff changeset
108 struct msghdr msg;
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57491
diff changeset
109 struct cmsghdr *cmsg;
72332
0f50b8379614 Close #12950: multiprocessing "test_fd_transfer" fails under OpenIndiana
Jesus Cea <jcea@jcea.es>
parents: 72051
diff changeset
110 union {
0f50b8379614 Close #12950: multiprocessing "test_fd_transfer" fails under OpenIndiana
Jesus Cea <jcea@jcea.es>
parents: 72051
diff changeset
111 struct cmsghdr hdr;
0f50b8379614 Close #12950: multiprocessing "test_fd_transfer" fails under OpenIndiana
Jesus Cea <jcea@jcea.es>
parents: 72051
diff changeset
112 unsigned char buf[CMSG_SPACE(sizeof(int))];
0f50b8379614 Close #12950: multiprocessing "test_fd_transfer" fails under OpenIndiana
Jesus Cea <jcea@jcea.es>
parents: 72051
diff changeset
113 } cmsgbuf;
47698
6d1dc761ab4e fix multiprocessing line endings in py3k
Benjamin Peterson <benjamin@python.org>
parents: 47685
diff changeset
114
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57491
diff changeset
115 if (!PyArg_ParseTuple(args, "ii", &conn, &fd))
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57491
diff changeset
116 return NULL;
47698
6d1dc761ab4e fix multiprocessing line endings in py3k
Benjamin Peterson <benjamin@python.org>
parents: 47685
diff changeset
117
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57491
diff changeset
118 dummy_iov.iov_base = &dummy_char;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57491
diff changeset
119 dummy_iov.iov_len = 1;
72332
0f50b8379614 Close #12950: multiprocessing "test_fd_transfer" fails under OpenIndiana
Jesus Cea <jcea@jcea.es>
parents: 72051
diff changeset
120
0f50b8379614 Close #12950: multiprocessing "test_fd_transfer" fails under OpenIndiana
Jesus Cea <jcea@jcea.es>
parents: 72051
diff changeset
121 memset(&msg, 0, sizeof(msg));
0f50b8379614 Close #12950: multiprocessing "test_fd_transfer" fails under OpenIndiana
Jesus Cea <jcea@jcea.es>
parents: 72051
diff changeset
122 msg.msg_control = &cmsgbuf.buf;
0f50b8379614 Close #12950: multiprocessing "test_fd_transfer" fails under OpenIndiana
Jesus Cea <jcea@jcea.es>
parents: 72051
diff changeset
123 msg.msg_controllen = sizeof(cmsgbuf.buf);
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57491
diff changeset
124 msg.msg_iov = &dummy_iov;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57491
diff changeset
125 msg.msg_iovlen = 1;
72332
0f50b8379614 Close #12950: multiprocessing "test_fd_transfer" fails under OpenIndiana
Jesus Cea <jcea@jcea.es>
parents: 72051
diff changeset
126
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57491
diff changeset
127 cmsg = CMSG_FIRSTHDR(&msg);
72332
0f50b8379614 Close #12950: multiprocessing "test_fd_transfer" fails under OpenIndiana
Jesus Cea <jcea@jcea.es>
parents: 72051
diff changeset
128 cmsg->cmsg_len = CMSG_LEN(sizeof(int));
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57491
diff changeset
129 cmsg->cmsg_level = SOL_SOCKET;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57491
diff changeset
130 cmsg->cmsg_type = SCM_RIGHTS;
72051
5b2f357989bb Issue #11657: Fix sending file descriptors over 255 over a multiprocessing Pipe.
Antoine Pitrou <solipsis@pitrou.net>
parents: 65495
diff changeset
131 * (int *) CMSG_DATA(cmsg) = fd;
47698
6d1dc761ab4e fix multiprocessing line endings in py3k
Benjamin Peterson <benjamin@python.org>
parents: 47685
diff changeset
132
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57491
diff changeset
133 Py_BEGIN_ALLOW_THREADS
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57491
diff changeset
134 res = sendmsg(conn, &msg, 0);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57491
diff changeset
135 Py_END_ALLOW_THREADS
47698
6d1dc761ab4e fix multiprocessing line endings in py3k
Benjamin Peterson <benjamin@python.org>
parents: 47685
diff changeset
136
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57491
diff changeset
137 if (res < 0)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57491
diff changeset
138 return PyErr_SetFromErrno(PyExc_OSError);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57491
diff changeset
139 Py_RETURN_NONE;
47698
6d1dc761ab4e fix multiprocessing line endings in py3k
Benjamin Peterson <benjamin@python.org>
parents: 47685
diff changeset
140 }
6d1dc761ab4e fix multiprocessing line endings in py3k
Benjamin Peterson <benjamin@python.org>
parents: 47685
diff changeset
141
6d1dc761ab4e fix multiprocessing line endings in py3k
Benjamin Peterson <benjamin@python.org>
parents: 47685
diff changeset
142 static PyObject *
6d1dc761ab4e fix multiprocessing line endings in py3k
Benjamin Peterson <benjamin@python.org>
parents: 47685
diff changeset
143 multiprocessing_recvfd(PyObject *self, PyObject *args)
6d1dc761ab4e fix multiprocessing line endings in py3k
Benjamin Peterson <benjamin@python.org>
parents: 47685
diff changeset
144 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57491
diff changeset
145 int conn, fd, res;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57491
diff changeset
146 char dummy_char;
72332
0f50b8379614 Close #12950: multiprocessing "test_fd_transfer" fails under OpenIndiana
Jesus Cea <jcea@jcea.es>
parents: 72051
diff changeset
147 struct iovec dummy_iov;
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57491
diff changeset
148 struct msghdr msg = {0};
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57491
diff changeset
149 struct cmsghdr *cmsg;
72332
0f50b8379614 Close #12950: multiprocessing "test_fd_transfer" fails under OpenIndiana
Jesus Cea <jcea@jcea.es>
parents: 72051
diff changeset
150 union {
0f50b8379614 Close #12950: multiprocessing "test_fd_transfer" fails under OpenIndiana
Jesus Cea <jcea@jcea.es>
parents: 72051
diff changeset
151 struct cmsghdr hdr;
0f50b8379614 Close #12950: multiprocessing "test_fd_transfer" fails under OpenIndiana
Jesus Cea <jcea@jcea.es>
parents: 72051
diff changeset
152 unsigned char buf[CMSG_SPACE(sizeof(int))];
0f50b8379614 Close #12950: multiprocessing "test_fd_transfer" fails under OpenIndiana
Jesus Cea <jcea@jcea.es>
parents: 72051
diff changeset
153 } cmsgbuf;
47698
6d1dc761ab4e fix multiprocessing line endings in py3k
Benjamin Peterson <benjamin@python.org>
parents: 47685
diff changeset
154
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57491
diff changeset
155 if (!PyArg_ParseTuple(args, "i", &conn))
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57491
diff changeset
156 return NULL;
47698
6d1dc761ab4e fix multiprocessing line endings in py3k
Benjamin Peterson <benjamin@python.org>
parents: 47685
diff changeset
157
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57491
diff changeset
158 dummy_iov.iov_base = &dummy_char;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57491
diff changeset
159 dummy_iov.iov_len = 1;
72332
0f50b8379614 Close #12950: multiprocessing "test_fd_transfer" fails under OpenIndiana
Jesus Cea <jcea@jcea.es>
parents: 72051
diff changeset
160
0f50b8379614 Close #12950: multiprocessing "test_fd_transfer" fails under OpenIndiana
Jesus Cea <jcea@jcea.es>
parents: 72051
diff changeset
161 memset(&msg, 0, sizeof(msg));
0f50b8379614 Close #12950: multiprocessing "test_fd_transfer" fails under OpenIndiana
Jesus Cea <jcea@jcea.es>
parents: 72051
diff changeset
162 msg.msg_control = &cmsgbuf.buf;
0f50b8379614 Close #12950: multiprocessing "test_fd_transfer" fails under OpenIndiana
Jesus Cea <jcea@jcea.es>
parents: 72051
diff changeset
163 msg.msg_controllen = sizeof(cmsgbuf.buf);
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57491
diff changeset
164 msg.msg_iov = &dummy_iov;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57491
diff changeset
165 msg.msg_iovlen = 1;
72332
0f50b8379614 Close #12950: multiprocessing "test_fd_transfer" fails under OpenIndiana
Jesus Cea <jcea@jcea.es>
parents: 72051
diff changeset
166
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57491
diff changeset
167 cmsg = CMSG_FIRSTHDR(&msg);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57491
diff changeset
168 cmsg->cmsg_level = SOL_SOCKET;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57491
diff changeset
169 cmsg->cmsg_type = SCM_RIGHTS;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57491
diff changeset
170 cmsg->cmsg_len = CMSG_LEN(sizeof(int));
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57491
diff changeset
171 msg.msg_controllen = cmsg->cmsg_len;
47698
6d1dc761ab4e fix multiprocessing line endings in py3k
Benjamin Peterson <benjamin@python.org>
parents: 47685
diff changeset
172
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57491
diff changeset
173 Py_BEGIN_ALLOW_THREADS
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57491
diff changeset
174 res = recvmsg(conn, &msg, 0);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57491
diff changeset
175 Py_END_ALLOW_THREADS
47698
6d1dc761ab4e fix multiprocessing line endings in py3k
Benjamin Peterson <benjamin@python.org>
parents: 47685
diff changeset
176
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57491
diff changeset
177 if (res < 0)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57491
diff changeset
178 return PyErr_SetFromErrno(PyExc_OSError);
47698
6d1dc761ab4e fix multiprocessing line endings in py3k
Benjamin Peterson <benjamin@python.org>
parents: 47685
diff changeset
179
72435
447770470d00 Close #13022: _multiprocessing.recvfd() doesn't check that file descriptor was actually received
Jesus Cea <jcea@jcea.es>
parents: 72332
diff changeset
180 if (msg.msg_controllen < CMSG_LEN(sizeof(int)) ||
447770470d00 Close #13022: _multiprocessing.recvfd() doesn't check that file descriptor was actually received
Jesus Cea <jcea@jcea.es>
parents: 72332
diff changeset
181 (cmsg = CMSG_FIRSTHDR(&msg)) == NULL ||
447770470d00 Close #13022: _multiprocessing.recvfd() doesn't check that file descriptor was actually received
Jesus Cea <jcea@jcea.es>
parents: 72332
diff changeset
182 cmsg->cmsg_level != SOL_SOCKET ||
447770470d00 Close #13022: _multiprocessing.recvfd() doesn't check that file descriptor was actually received
Jesus Cea <jcea@jcea.es>
parents: 72332
diff changeset
183 cmsg->cmsg_type != SCM_RIGHTS ||
447770470d00 Close #13022: _multiprocessing.recvfd() doesn't check that file descriptor was actually received
Jesus Cea <jcea@jcea.es>
parents: 72332
diff changeset
184 cmsg->cmsg_len < CMSG_LEN(sizeof(int))) {
447770470d00 Close #13022: _multiprocessing.recvfd() doesn't check that file descriptor was actually received
Jesus Cea <jcea@jcea.es>
parents: 72332
diff changeset
185 /* If at least one control message is present, there should be
447770470d00 Close #13022: _multiprocessing.recvfd() doesn't check that file descriptor was actually received
Jesus Cea <jcea@jcea.es>
parents: 72332
diff changeset
186 no room for any further data in the buffer. */
447770470d00 Close #13022: _multiprocessing.recvfd() doesn't check that file descriptor was actually received
Jesus Cea <jcea@jcea.es>
parents: 72332
diff changeset
187 PyErr_SetString(PyExc_RuntimeError, "No file descriptor received");
447770470d00 Close #13022: _multiprocessing.recvfd() doesn't check that file descriptor was actually received
Jesus Cea <jcea@jcea.es>
parents: 72332
diff changeset
188 return NULL;
447770470d00 Close #13022: _multiprocessing.recvfd() doesn't check that file descriptor was actually received
Jesus Cea <jcea@jcea.es>
parents: 72332
diff changeset
189 }
447770470d00 Close #13022: _multiprocessing.recvfd() doesn't check that file descriptor was actually received
Jesus Cea <jcea@jcea.es>
parents: 72332
diff changeset
190
72051
5b2f357989bb Issue #11657: Fix sending file descriptors over 255 over a multiprocessing Pipe.
Antoine Pitrou <solipsis@pitrou.net>
parents: 65495
diff changeset
191 fd = * (int *) CMSG_DATA(cmsg);
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57491
diff changeset
192 return Py_BuildValue("i", fd);
47698
6d1dc761ab4e fix multiprocessing line endings in py3k
Benjamin Peterson <benjamin@python.org>
parents: 47685
diff changeset
193 }
6d1dc761ab4e fix multiprocessing line endings in py3k
Benjamin Peterson <benjamin@python.org>
parents: 47685
diff changeset
194
6d1dc761ab4e fix multiprocessing line endings in py3k
Benjamin Peterson <benjamin@python.org>
parents: 47685
diff changeset
195 #endif /* HAVE_FD_TRANSFER */
6d1dc761ab4e fix multiprocessing line endings in py3k
Benjamin Peterson <benjamin@python.org>
parents: 47685
diff changeset
196
6d1dc761ab4e fix multiprocessing line endings in py3k
Benjamin Peterson <benjamin@python.org>
parents: 47685
diff changeset
197 #endif /* !MS_WINDOWS */
6d1dc761ab4e fix multiprocessing line endings in py3k
Benjamin Peterson <benjamin@python.org>
parents: 47685
diff changeset
198
6d1dc761ab4e fix multiprocessing line endings in py3k
Benjamin Peterson <benjamin@python.org>
parents: 47685
diff changeset
199
6d1dc761ab4e fix multiprocessing line endings in py3k
Benjamin Peterson <benjamin@python.org>
parents: 47685
diff changeset
200 /*
6d1dc761ab4e fix multiprocessing line endings in py3k
Benjamin Peterson <benjamin@python.org>
parents: 47685
diff changeset
201 * All platforms
6d1dc761ab4e fix multiprocessing line endings in py3k
Benjamin Peterson <benjamin@python.org>
parents: 47685
diff changeset
202 */
6d1dc761ab4e fix multiprocessing line endings in py3k
Benjamin Peterson <benjamin@python.org>
parents: 47685
diff changeset
203
6d1dc761ab4e fix multiprocessing line endings in py3k
Benjamin Peterson <benjamin@python.org>
parents: 47685
diff changeset
204 static PyObject*
6d1dc761ab4e fix multiprocessing line endings in py3k
Benjamin Peterson <benjamin@python.org>
parents: 47685
diff changeset
205 multiprocessing_address_of_buffer(PyObject *self, PyObject *obj)
6d1dc761ab4e fix multiprocessing line endings in py3k
Benjamin Peterson <benjamin@python.org>
parents: 47685
diff changeset
206 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57491
diff changeset
207 void *buffer;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57491
diff changeset
208 Py_ssize_t buffer_len;
47698
6d1dc761ab4e fix multiprocessing line endings in py3k
Benjamin Peterson <benjamin@python.org>
parents: 47685
diff changeset
209
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57491
diff changeset
210 if (PyObject_AsWriteBuffer(obj, &buffer, &buffer_len) < 0)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57491
diff changeset
211 return NULL;
47698
6d1dc761ab4e fix multiprocessing line endings in py3k
Benjamin Peterson <benjamin@python.org>
parents: 47685
diff changeset
212
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57491
diff changeset
213 return Py_BuildValue("N" F_PY_SSIZE_T,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57491
diff changeset
214 PyLong_FromVoidPtr(buffer), buffer_len);
47698
6d1dc761ab4e fix multiprocessing line endings in py3k
Benjamin Peterson <benjamin@python.org>
parents: 47685
diff changeset
215 }
6d1dc761ab4e fix multiprocessing line endings in py3k
Benjamin Peterson <benjamin@python.org>
parents: 47685
diff changeset
216
6d1dc761ab4e fix multiprocessing line endings in py3k
Benjamin Peterson <benjamin@python.org>
parents: 47685
diff changeset
217
6d1dc761ab4e fix multiprocessing line endings in py3k
Benjamin Peterson <benjamin@python.org>
parents: 47685
diff changeset
218 /*
6d1dc761ab4e fix multiprocessing line endings in py3k
Benjamin Peterson <benjamin@python.org>
parents: 47685
diff changeset
219 * Function table
6d1dc761ab4e fix multiprocessing line endings in py3k
Benjamin Peterson <benjamin@python.org>
parents: 47685
diff changeset
220 */
6d1dc761ab4e fix multiprocessing line endings in py3k
Benjamin Peterson <benjamin@python.org>
parents: 47685
diff changeset
221
6d1dc761ab4e fix multiprocessing line endings in py3k
Benjamin Peterson <benjamin@python.org>
parents: 47685
diff changeset
222 static PyMethodDef module_methods[] = {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57491
diff changeset
223 {"address_of_buffer", multiprocessing_address_of_buffer, METH_O,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57491
diff changeset
224 "address_of_buffer(obj) -> int\n"
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57491
diff changeset
225 "Return address of obj assuming obj supports buffer inteface"},
47698
6d1dc761ab4e fix multiprocessing line endings in py3k
Benjamin Peterson <benjamin@python.org>
parents: 47685
diff changeset
226 #if HAVE_FD_TRANSFER
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57491
diff changeset
227 {"sendfd", multiprocessing_sendfd, METH_VARARGS,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57491
diff changeset
228 "sendfd(sockfd, fd) -> None\n"
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57491
diff changeset
229 "Send file descriptor given by fd over the unix domain socket\n"
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57491
diff changeset
230 "whose file decriptor is sockfd"},
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57491
diff changeset
231 {"recvfd", multiprocessing_recvfd, METH_VARARGS,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57491
diff changeset
232 "recvfd(sockfd) -> fd\n"
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57491
diff changeset
233 "Receive a file descriptor over a unix domain socket\n"
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57491
diff changeset
234 "whose file decriptor is sockfd"},
47698
6d1dc761ab4e fix multiprocessing line endings in py3k
Benjamin Peterson <benjamin@python.org>
parents: 47685
diff changeset
235 #endif
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57491
diff changeset
236 {NULL}
47698
6d1dc761ab4e fix multiprocessing line endings in py3k
Benjamin Peterson <benjamin@python.org>
parents: 47685
diff changeset
237 };
6d1dc761ab4e fix multiprocessing line endings in py3k
Benjamin Peterson <benjamin@python.org>
parents: 47685
diff changeset
238
6d1dc761ab4e fix multiprocessing line endings in py3k
Benjamin Peterson <benjamin@python.org>
parents: 47685
diff changeset
239
6d1dc761ab4e fix multiprocessing line endings in py3k
Benjamin Peterson <benjamin@python.org>
parents: 47685
diff changeset
240 /*
6d1dc761ab4e fix multiprocessing line endings in py3k
Benjamin Peterson <benjamin@python.org>
parents: 47685
diff changeset
241 * Initialize
6d1dc761ab4e fix multiprocessing line endings in py3k
Benjamin Peterson <benjamin@python.org>
parents: 47685
diff changeset
242 */
6d1dc761ab4e fix multiprocessing line endings in py3k
Benjamin Peterson <benjamin@python.org>
parents: 47685
diff changeset
243
6d1dc761ab4e fix multiprocessing line endings in py3k
Benjamin Peterson <benjamin@python.org>
parents: 47685
diff changeset
244 static struct PyModuleDef multiprocessing_module = {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57491
diff changeset
245 PyModuleDef_HEAD_INIT,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57491
diff changeset
246 "_multiprocessing",
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57491
diff changeset
247 NULL,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57491
diff changeset
248 -1,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57491
diff changeset
249 module_methods,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57491
diff changeset
250 NULL,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57491
diff changeset
251 NULL,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57491
diff changeset
252 NULL,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57491
diff changeset
253 NULL
47698
6d1dc761ab4e fix multiprocessing line endings in py3k
Benjamin Peterson <benjamin@python.org>
parents: 47685
diff changeset
254 };
6d1dc761ab4e fix multiprocessing line endings in py3k
Benjamin Peterson <benjamin@python.org>
parents: 47685
diff changeset
255
6d1dc761ab4e fix multiprocessing line endings in py3k
Benjamin Peterson <benjamin@python.org>
parents: 47685
diff changeset
256
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57491
diff changeset
257 PyMODINIT_FUNC
47698
6d1dc761ab4e fix multiprocessing line endings in py3k
Benjamin Peterson <benjamin@python.org>
parents: 47685
diff changeset
258 PyInit__multiprocessing(void)
6d1dc761ab4e fix multiprocessing line endings in py3k
Benjamin Peterson <benjamin@python.org>
parents: 47685
diff changeset
259 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57491
diff changeset
260 PyObject *module, *temp, *value;
47698
6d1dc761ab4e fix multiprocessing line endings in py3k
Benjamin Peterson <benjamin@python.org>
parents: 47685
diff changeset
261
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57491
diff changeset
262 /* Initialize module */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57491
diff changeset
263 module = PyModule_Create(&multiprocessing_module);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57491
diff changeset
264 if (!module)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57491
diff changeset
265 return NULL;
47698
6d1dc761ab4e fix multiprocessing line endings in py3k
Benjamin Peterson <benjamin@python.org>
parents: 47685
diff changeset
266
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57491
diff changeset
267 /* Get copy of objects from pickle */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57491
diff changeset
268 temp = PyImport_ImportModule(PICKLE_MODULE);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57491
diff changeset
269 if (!temp)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57491
diff changeset
270 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57491
diff changeset
271 pickle_dumps = PyObject_GetAttrString(temp, "dumps");
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57491
diff changeset
272 pickle_loads = PyObject_GetAttrString(temp, "loads");
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57491
diff changeset
273 pickle_protocol = PyObject_GetAttrString(temp, "HIGHEST_PROTOCOL");
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57491
diff changeset
274 Py_XDECREF(temp);
47698
6d1dc761ab4e fix multiprocessing line endings in py3k
Benjamin Peterson <benjamin@python.org>
parents: 47685
diff changeset
275
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57491
diff changeset
276 /* Get copy of BufferTooShort */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57491
diff changeset
277 temp = PyImport_ImportModule("multiprocessing");
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57491
diff changeset
278 if (!temp)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57491
diff changeset
279 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57491
diff changeset
280 BufferTooShort = PyObject_GetAttrString(temp, "BufferTooShort");
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57491
diff changeset
281 Py_XDECREF(temp);
47698
6d1dc761ab4e fix multiprocessing line endings in py3k
Benjamin Peterson <benjamin@python.org>
parents: 47685
diff changeset
282
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57491
diff changeset
283 /* Add connection type to module */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57491
diff changeset
284 if (PyType_Ready(&ConnectionType) < 0)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57491
diff changeset
285 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57491
diff changeset
286 Py_INCREF(&ConnectionType);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57491
diff changeset
287 PyModule_AddObject(module, "Connection", (PyObject*)&ConnectionType);
47698
6d1dc761ab4e fix multiprocessing line endings in py3k
Benjamin Peterson <benjamin@python.org>
parents: 47685
diff changeset
288
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57491
diff changeset
289 #if defined(MS_WINDOWS) || \
57491
3d77d7c16c90 Merged revisions 76566 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 52902
diff changeset
290 (defined(HAVE_SEM_OPEN) && !defined(POSIX_SEMAPHORES_NOT_ENABLED))
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57491
diff changeset
291 /* Add SemLock type to module */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57491
diff changeset
292 if (PyType_Ready(&SemLockType) < 0)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57491
diff changeset
293 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57491
diff changeset
294 Py_INCREF(&SemLockType);
65426
eabc5c53f134 Fix multiprocessing Semaphore's on netbsd5. SEM_VALUE_MAX is defined
Gregory P. Smith <greg@mad-scientist.com>
parents: 61466
diff changeset
295 {
eabc5c53f134 Fix multiprocessing Semaphore's on netbsd5. SEM_VALUE_MAX is defined
Gregory P. Smith <greg@mad-scientist.com>
parents: 61466
diff changeset
296 PyObject *py_sem_value_max;
eabc5c53f134 Fix multiprocessing Semaphore's on netbsd5. SEM_VALUE_MAX is defined
Gregory P. Smith <greg@mad-scientist.com>
parents: 61466
diff changeset
297 /* Some systems define SEM_VALUE_MAX as an unsigned value that
eabc5c53f134 Fix multiprocessing Semaphore's on netbsd5. SEM_VALUE_MAX is defined
Gregory P. Smith <greg@mad-scientist.com>
parents: 61466
diff changeset
298 * causes it to be negative when used as an int (NetBSD). */
eabc5c53f134 Fix multiprocessing Semaphore's on netbsd5. SEM_VALUE_MAX is defined
Gregory P. Smith <greg@mad-scientist.com>
parents: 61466
diff changeset
299 if ((int)(SEM_VALUE_MAX) < 0)
eabc5c53f134 Fix multiprocessing Semaphore's on netbsd5. SEM_VALUE_MAX is defined
Gregory P. Smith <greg@mad-scientist.com>
parents: 61466
diff changeset
300 py_sem_value_max = PyLong_FromLong(INT_MAX);
eabc5c53f134 Fix multiprocessing Semaphore's on netbsd5. SEM_VALUE_MAX is defined
Gregory P. Smith <greg@mad-scientist.com>
parents: 61466
diff changeset
301 else
eabc5c53f134 Fix multiprocessing Semaphore's on netbsd5. SEM_VALUE_MAX is defined
Gregory P. Smith <greg@mad-scientist.com>
parents: 61466
diff changeset
302 py_sem_value_max = PyLong_FromLong(SEM_VALUE_MAX);
eabc5c53f134 Fix multiprocessing Semaphore's on netbsd5. SEM_VALUE_MAX is defined
Gregory P. Smith <greg@mad-scientist.com>
parents: 61466
diff changeset
303 if (py_sem_value_max == NULL)
eabc5c53f134 Fix multiprocessing Semaphore's on netbsd5. SEM_VALUE_MAX is defined
Gregory P. Smith <greg@mad-scientist.com>
parents: 61466
diff changeset
304 return NULL;
eabc5c53f134 Fix multiprocessing Semaphore's on netbsd5. SEM_VALUE_MAX is defined
Gregory P. Smith <greg@mad-scientist.com>
parents: 61466
diff changeset
305 PyDict_SetItemString(SemLockType.tp_dict, "SEM_VALUE_MAX",
eabc5c53f134 Fix multiprocessing Semaphore's on netbsd5. SEM_VALUE_MAX is defined
Gregory P. Smith <greg@mad-scientist.com>
parents: 61466
diff changeset
306 py_sem_value_max);
eabc5c53f134 Fix multiprocessing Semaphore's on netbsd5. SEM_VALUE_MAX is defined
Gregory P. Smith <greg@mad-scientist.com>
parents: 61466
diff changeset
307 }
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57491
diff changeset
308 PyModule_AddObject(module, "SemLock", (PyObject*)&SemLockType);
47698
6d1dc761ab4e fix multiprocessing line endings in py3k
Benjamin Peterson <benjamin@python.org>
parents: 47685
diff changeset
309 #endif
6d1dc761ab4e fix multiprocessing line endings in py3k
Benjamin Peterson <benjamin@python.org>
parents: 47685
diff changeset
310
6d1dc761ab4e fix multiprocessing line endings in py3k
Benjamin Peterson <benjamin@python.org>
parents: 47685
diff changeset
311 #ifdef MS_WINDOWS
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57491
diff changeset
312 /* Add PipeConnection to module */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57491
diff changeset
313 if (PyType_Ready(&PipeConnectionType) < 0)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57491
diff changeset
314 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57491
diff changeset
315 Py_INCREF(&PipeConnectionType);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57491
diff changeset
316 PyModule_AddObject(module, "PipeConnection",
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57491
diff changeset
317 (PyObject*)&PipeConnectionType);
47698
6d1dc761ab4e fix multiprocessing line endings in py3k
Benjamin Peterson <benjamin@python.org>
parents: 47685
diff changeset
318
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57491
diff changeset
319 /* Initialize win32 class and add to multiprocessing */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57491
diff changeset
320 temp = create_win32_namespace();
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57491
diff changeset
321 if (!temp)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57491
diff changeset
322 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57491
diff changeset
323 PyModule_AddObject(module, "win32", temp);
47698
6d1dc761ab4e fix multiprocessing line endings in py3k
Benjamin Peterson <benjamin@python.org>
parents: 47685
diff changeset
324
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57491
diff changeset
325 /* Initialize the event handle used to signal Ctrl-C */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57491
diff changeset
326 sigint_event = CreateEvent(NULL, TRUE, FALSE, NULL);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57491
diff changeset
327 if (!sigint_event) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57491
diff changeset
328 PyErr_SetFromWindowsErr(0);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57491
diff changeset
329 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57491
diff changeset
330 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57491
diff changeset
331 if (!SetConsoleCtrlHandler(ProcessingCtrlHandler, TRUE)) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57491
diff changeset
332 PyErr_SetFromWindowsErr(0);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57491
diff changeset
333 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57491
diff changeset
334 }
47698
6d1dc761ab4e fix multiprocessing line endings in py3k
Benjamin Peterson <benjamin@python.org>
parents: 47685
diff changeset
335 #endif
6d1dc761ab4e fix multiprocessing line endings in py3k
Benjamin Peterson <benjamin@python.org>
parents: 47685
diff changeset
336
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57491
diff changeset
337 /* Add configuration macros */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57491
diff changeset
338 temp = PyDict_New();
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57491
diff changeset
339 if (!temp)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57491
diff changeset
340 return NULL;
47698
6d1dc761ab4e fix multiprocessing line endings in py3k
Benjamin Peterson <benjamin@python.org>
parents: 47685
diff changeset
341
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57491
diff changeset
342 #define ADD_FLAG(name) \
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57491
diff changeset
343 value = Py_BuildValue("i", name); \
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57491
diff changeset
344 if (value == NULL) { Py_DECREF(temp); return NULL; } \
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57491
diff changeset
345 if (PyDict_SetItemString(temp, #name, value) < 0) { \
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57491
diff changeset
346 Py_DECREF(temp); Py_DECREF(value); return NULL; } \
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57491
diff changeset
347 Py_DECREF(value)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57491
diff changeset
348
57491
3d77d7c16c90 Merged revisions 76566 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 52902
diff changeset
349 #if defined(HAVE_SEM_OPEN) && !defined(POSIX_SEMAPHORES_NOT_ENABLED)
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57491
diff changeset
350 ADD_FLAG(HAVE_SEM_OPEN);
47698
6d1dc761ab4e fix multiprocessing line endings in py3k
Benjamin Peterson <benjamin@python.org>
parents: 47685
diff changeset
351 #endif
6d1dc761ab4e fix multiprocessing line endings in py3k
Benjamin Peterson <benjamin@python.org>
parents: 47685
diff changeset
352 #ifdef HAVE_SEM_TIMEDWAIT
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57491
diff changeset
353 ADD_FLAG(HAVE_SEM_TIMEDWAIT);
47698
6d1dc761ab4e fix multiprocessing line endings in py3k
Benjamin Peterson <benjamin@python.org>
parents: 47685
diff changeset
354 #endif
6d1dc761ab4e fix multiprocessing line endings in py3k
Benjamin Peterson <benjamin@python.org>
parents: 47685
diff changeset
355 #ifdef HAVE_FD_TRANSFER
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57491
diff changeset
356 ADD_FLAG(HAVE_FD_TRANSFER);
47698
6d1dc761ab4e fix multiprocessing line endings in py3k
Benjamin Peterson <benjamin@python.org>
parents: 47685
diff changeset
357 #endif
6d1dc761ab4e fix multiprocessing line endings in py3k
Benjamin Peterson <benjamin@python.org>
parents: 47685
diff changeset
358 #ifdef HAVE_BROKEN_SEM_GETVALUE
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57491
diff changeset
359 ADD_FLAG(HAVE_BROKEN_SEM_GETVALUE);
47698
6d1dc761ab4e fix multiprocessing line endings in py3k
Benjamin Peterson <benjamin@python.org>
parents: 47685
diff changeset
360 #endif
6d1dc761ab4e fix multiprocessing line endings in py3k
Benjamin Peterson <benjamin@python.org>
parents: 47685
diff changeset
361 #ifdef HAVE_BROKEN_SEM_UNLINK
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57491
diff changeset
362 ADD_FLAG(HAVE_BROKEN_SEM_UNLINK);
47698
6d1dc761ab4e fix multiprocessing line endings in py3k
Benjamin Peterson <benjamin@python.org>
parents: 47685
diff changeset
363 #endif
6d1dc761ab4e fix multiprocessing line endings in py3k
Benjamin Peterson <benjamin@python.org>
parents: 47685
diff changeset
364
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57491
diff changeset
365 if (PyModule_AddObject(module, "flags", temp) < 0)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57491
diff changeset
366 return NULL;
47698
6d1dc761ab4e fix multiprocessing line endings in py3k
Benjamin Peterson <benjamin@python.org>
parents: 47685
diff changeset
367
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57491
diff changeset
368 return module;
47698
6d1dc761ab4e fix multiprocessing line endings in py3k
Benjamin Peterson <benjamin@python.org>
parents: 47685
diff changeset
369 }