Mercurial > cpython-lru_cache-weakref
annotate Modules/_multiprocessing/socket_connection.c @ 82251:bb5a8564e186 2.7
Issue #13153: Tkinter functions now raise TclError instead of ValueError when
a unicode argument contains non-BMP character.
| author | Serhiy Storchaka <storchaka@gmail.com> |
|---|---|
| date | Mon, 18 Feb 2013 13:00:08 +0200 |
| parents | da5e520a7ba5 |
| children | bc34fe4a0d58 |
| 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 socket |
|
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 * socket_connection.c |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
5 * |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
6 * Copyright (c) 2006-2008, R Oudkerk --- see COPYING.txt |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
7 */ |
|
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 #include "multiprocessing.h" |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
10 |
|
81506
da5e520a7ba5
Issue #10527: Use poll() instead of select() for multiprocessing pipes
Richard Oudkerk <shibturn@gmail.com>
parents:
77408
diff
changeset
|
11 #if defined(HAVE_POLL) && !defined(HAVE_BROKEN_POLL) |
|
da5e520a7ba5
Issue #10527: Use poll() instead of select() for multiprocessing pipes
Richard Oudkerk <shibturn@gmail.com>
parents:
77408
diff
changeset
|
12 # include "poll.h" |
|
da5e520a7ba5
Issue #10527: Use poll() instead of select() for multiprocessing pipes
Richard Oudkerk <shibturn@gmail.com>
parents:
77408
diff
changeset
|
13 #endif |
|
da5e520a7ba5
Issue #10527: Use poll() instead of select() for multiprocessing pipes
Richard Oudkerk <shibturn@gmail.com>
parents:
77408
diff
changeset
|
14 |
|
47595
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
15 #ifdef MS_WINDOWS |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
16 # define WRITE(h, buffer, length) send((SOCKET)h, buffer, length, 0) |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
17 # define READ(h, buffer, length) recv((SOCKET)h, buffer, length, 0) |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
18 # define CLOSE(h) closesocket((SOCKET)h) |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
19 #else |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
20 # define WRITE(h, buffer, length) write(h, buffer, length) |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
21 # define READ(h, buffer, length) read(h, buffer, length) |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
22 # define CLOSE(h) close(h) |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
23 #endif |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
24 |
|
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 * Send string to file descriptor |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
27 */ |
|
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 static Py_ssize_t |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
30 _conn_sendall(HANDLE h, char *string, size_t length) |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
31 { |
|
61463
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
51569
diff
changeset
|
32 char *p = string; |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
51569
diff
changeset
|
33 Py_ssize_t res; |
|
47595
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
34 |
|
61463
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
51569
diff
changeset
|
35 while (length > 0) { |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
51569
diff
changeset
|
36 res = WRITE(h, p, length); |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
51569
diff
changeset
|
37 if (res < 0) |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
51569
diff
changeset
|
38 return MP_SOCKET_ERROR; |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
51569
diff
changeset
|
39 length -= res; |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
51569
diff
changeset
|
40 p += res; |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
51569
diff
changeset
|
41 } |
|
47595
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
42 |
|
61463
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
51569
diff
changeset
|
43 return MP_SUCCESS; |
|
47595
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
44 } |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
45 |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
46 /* |
|
61463
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
51569
diff
changeset
|
47 * Receive string of exact length from file descriptor |
|
47595
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
48 */ |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
49 |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
50 static Py_ssize_t |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
51 _conn_recvall(HANDLE h, char *buffer, size_t length) |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
52 { |
|
61463
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
51569
diff
changeset
|
53 size_t remaining = length; |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
51569
diff
changeset
|
54 Py_ssize_t temp; |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
51569
diff
changeset
|
55 char *p = buffer; |
|
47595
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
56 |
|
61463
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
51569
diff
changeset
|
57 while (remaining > 0) { |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
51569
diff
changeset
|
58 temp = READ(h, p, remaining); |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
51569
diff
changeset
|
59 if (temp <= 0) { |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
51569
diff
changeset
|
60 if (temp == 0) |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
51569
diff
changeset
|
61 return remaining == length ? |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
51569
diff
changeset
|
62 MP_END_OF_FILE : MP_EARLY_END_OF_FILE; |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
51569
diff
changeset
|
63 else |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
51569
diff
changeset
|
64 return temp; |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
51569
diff
changeset
|
65 } |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
51569
diff
changeset
|
66 remaining -= temp; |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
51569
diff
changeset
|
67 p += temp; |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
51569
diff
changeset
|
68 } |
|
47595
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
69 |
|
61463
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
51569
diff
changeset
|
70 return MP_SUCCESS; |
|
47595
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
71 } |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
72 |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
73 /* |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
74 * Send a string prepended by the string length in network byte order |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
75 */ |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
76 |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
77 static Py_ssize_t |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
78 conn_send_string(ConnectionObject *conn, char *string, size_t length) |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
79 { |
|
61463
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
51569
diff
changeset
|
80 Py_ssize_t res; |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
51569
diff
changeset
|
81 /* The "header" of the message is a 32 bit unsigned number (in |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
51569
diff
changeset
|
82 network order) which specifies the length of the "body". If |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
51569
diff
changeset
|
83 the message is shorter than about 16kb then it is quicker to |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
51569
diff
changeset
|
84 combine the "header" and the "body" of the message and send |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
51569
diff
changeset
|
85 them at once. */ |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
51569
diff
changeset
|
86 if (length < (16*1024)) { |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
51569
diff
changeset
|
87 char *message; |
|
47595
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
88 |
|
61463
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
51569
diff
changeset
|
89 message = PyMem_Malloc(length+4); |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
51569
diff
changeset
|
90 if (message == NULL) |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
51569
diff
changeset
|
91 return MP_MEMORY_ERROR; |
|
47595
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
92 |
|
61463
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
51569
diff
changeset
|
93 *(UINT32*)message = htonl((UINT32)length); |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
51569
diff
changeset
|
94 memcpy(message+4, string, length); |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
51569
diff
changeset
|
95 Py_BEGIN_ALLOW_THREADS |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
51569
diff
changeset
|
96 res = _conn_sendall(conn->handle, message, length+4); |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
51569
diff
changeset
|
97 Py_END_ALLOW_THREADS |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
51569
diff
changeset
|
98 PyMem_Free(message); |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
51569
diff
changeset
|
99 } else { |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
51569
diff
changeset
|
100 UINT32 lenbuff; |
|
47595
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
101 |
|
61463
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
51569
diff
changeset
|
102 if (length > MAX_MESSAGE_LENGTH) |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
51569
diff
changeset
|
103 return MP_BAD_MESSAGE_LENGTH; |
|
47595
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
104 |
|
61463
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
51569
diff
changeset
|
105 lenbuff = htonl((UINT32)length); |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
51569
diff
changeset
|
106 Py_BEGIN_ALLOW_THREADS |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
51569
diff
changeset
|
107 res = _conn_sendall(conn->handle, (char*)&lenbuff, 4) || |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
51569
diff
changeset
|
108 _conn_sendall(conn->handle, string, length); |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
51569
diff
changeset
|
109 Py_END_ALLOW_THREADS |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
51569
diff
changeset
|
110 } |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
51569
diff
changeset
|
111 return res; |
|
47595
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
112 } |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
113 |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
114 /* |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
115 * Attempts to read into buffer, or failing that into *newbuffer |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
116 * |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
117 * Returns number of bytes read. |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
118 */ |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
119 |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
120 static Py_ssize_t |
|
61463
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
51569
diff
changeset
|
121 conn_recv_string(ConnectionObject *conn, char *buffer, |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
51569
diff
changeset
|
122 size_t buflength, char **newbuffer, size_t maxlength) |
|
47595
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
123 { |
|
77408
60a7b704de5c
Issue #10133: Make multiprocessing deallocate buffer if socket read fails.
Richard Oudkerk <shibturn@gmail.com>
parents:
61463
diff
changeset
|
124 Py_ssize_t res; |
|
61463
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
51569
diff
changeset
|
125 UINT32 ulength; |
|
47595
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
126 |
|
61463
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
51569
diff
changeset
|
127 *newbuffer = NULL; |
|
47595
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
128 |
|
61463
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
51569
diff
changeset
|
129 Py_BEGIN_ALLOW_THREADS |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
51569
diff
changeset
|
130 res = _conn_recvall(conn->handle, (char*)&ulength, 4); |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
51569
diff
changeset
|
131 Py_END_ALLOW_THREADS |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
51569
diff
changeset
|
132 if (res < 0) |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
51569
diff
changeset
|
133 return res; |
|
47595
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
134 |
|
61463
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
51569
diff
changeset
|
135 ulength = ntohl(ulength); |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
51569
diff
changeset
|
136 if (ulength > maxlength) |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
51569
diff
changeset
|
137 return MP_BAD_MESSAGE_LENGTH; |
|
47595
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
138 |
|
77408
60a7b704de5c
Issue #10133: Make multiprocessing deallocate buffer if socket read fails.
Richard Oudkerk <shibturn@gmail.com>
parents:
61463
diff
changeset
|
139 if (ulength > buflength) { |
|
60a7b704de5c
Issue #10133: Make multiprocessing deallocate buffer if socket read fails.
Richard Oudkerk <shibturn@gmail.com>
parents:
61463
diff
changeset
|
140 *newbuffer = buffer = PyMem_Malloc((size_t)ulength); |
|
60a7b704de5c
Issue #10133: Make multiprocessing deallocate buffer if socket read fails.
Richard Oudkerk <shibturn@gmail.com>
parents:
61463
diff
changeset
|
141 if (buffer == NULL) |
|
61463
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
51569
diff
changeset
|
142 return MP_MEMORY_ERROR; |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
51569
diff
changeset
|
143 } |
|
77408
60a7b704de5c
Issue #10133: Make multiprocessing deallocate buffer if socket read fails.
Richard Oudkerk <shibturn@gmail.com>
parents:
61463
diff
changeset
|
144 |
|
60a7b704de5c
Issue #10133: Make multiprocessing deallocate buffer if socket read fails.
Richard Oudkerk <shibturn@gmail.com>
parents:
61463
diff
changeset
|
145 Py_BEGIN_ALLOW_THREADS |
|
60a7b704de5c
Issue #10133: Make multiprocessing deallocate buffer if socket read fails.
Richard Oudkerk <shibturn@gmail.com>
parents:
61463
diff
changeset
|
146 res = _conn_recvall(conn->handle, buffer, (size_t)ulength); |
|
60a7b704de5c
Issue #10133: Make multiprocessing deallocate buffer if socket read fails.
Richard Oudkerk <shibturn@gmail.com>
parents:
61463
diff
changeset
|
147 Py_END_ALLOW_THREADS |
|
60a7b704de5c
Issue #10133: Make multiprocessing deallocate buffer if socket read fails.
Richard Oudkerk <shibturn@gmail.com>
parents:
61463
diff
changeset
|
148 |
|
60a7b704de5c
Issue #10133: Make multiprocessing deallocate buffer if socket read fails.
Richard Oudkerk <shibturn@gmail.com>
parents:
61463
diff
changeset
|
149 if (res >= 0) { |
|
60a7b704de5c
Issue #10133: Make multiprocessing deallocate buffer if socket read fails.
Richard Oudkerk <shibturn@gmail.com>
parents:
61463
diff
changeset
|
150 res = (Py_ssize_t)ulength; |
|
60a7b704de5c
Issue #10133: Make multiprocessing deallocate buffer if socket read fails.
Richard Oudkerk <shibturn@gmail.com>
parents:
61463
diff
changeset
|
151 } else if (*newbuffer != NULL) { |
|
60a7b704de5c
Issue #10133: Make multiprocessing deallocate buffer if socket read fails.
Richard Oudkerk <shibturn@gmail.com>
parents:
61463
diff
changeset
|
152 PyMem_Free(*newbuffer); |
|
60a7b704de5c
Issue #10133: Make multiprocessing deallocate buffer if socket read fails.
Richard Oudkerk <shibturn@gmail.com>
parents:
61463
diff
changeset
|
153 *newbuffer = NULL; |
|
60a7b704de5c
Issue #10133: Make multiprocessing deallocate buffer if socket read fails.
Richard Oudkerk <shibturn@gmail.com>
parents:
61463
diff
changeset
|
154 } |
|
60a7b704de5c
Issue #10133: Make multiprocessing deallocate buffer if socket read fails.
Richard Oudkerk <shibturn@gmail.com>
parents:
61463
diff
changeset
|
155 return res; |
|
47595
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
156 } |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
157 |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
158 /* |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
159 * Check whether any data is available for reading -- neg timeout blocks |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
160 */ |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
161 |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
162 static int |
|
51569
9a932f92f394
Merge 68778,68788 to maint
Jesse Noller <jnoller@gmail.com>
parents:
48611
diff
changeset
|
163 conn_poll(ConnectionObject *conn, double timeout, PyThreadState *_save) |
|
47595
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
164 { |
|
81506
da5e520a7ba5
Issue #10527: Use poll() instead of select() for multiprocessing pipes
Richard Oudkerk <shibturn@gmail.com>
parents:
77408
diff
changeset
|
165 #if defined(HAVE_POLL) && !defined(HAVE_BROKEN_POLL) |
|
da5e520a7ba5
Issue #10527: Use poll() instead of select() for multiprocessing pipes
Richard Oudkerk <shibturn@gmail.com>
parents:
77408
diff
changeset
|
166 int res; |
|
da5e520a7ba5
Issue #10527: Use poll() instead of select() for multiprocessing pipes
Richard Oudkerk <shibturn@gmail.com>
parents:
77408
diff
changeset
|
167 struct pollfd p; |
|
da5e520a7ba5
Issue #10527: Use poll() instead of select() for multiprocessing pipes
Richard Oudkerk <shibturn@gmail.com>
parents:
77408
diff
changeset
|
168 |
|
da5e520a7ba5
Issue #10527: Use poll() instead of select() for multiprocessing pipes
Richard Oudkerk <shibturn@gmail.com>
parents:
77408
diff
changeset
|
169 p.fd = (int)conn->handle; |
|
da5e520a7ba5
Issue #10527: Use poll() instead of select() for multiprocessing pipes
Richard Oudkerk <shibturn@gmail.com>
parents:
77408
diff
changeset
|
170 p.events = POLLIN | POLLPRI; |
|
da5e520a7ba5
Issue #10527: Use poll() instead of select() for multiprocessing pipes
Richard Oudkerk <shibturn@gmail.com>
parents:
77408
diff
changeset
|
171 p.revents = 0; |
|
da5e520a7ba5
Issue #10527: Use poll() instead of select() for multiprocessing pipes
Richard Oudkerk <shibturn@gmail.com>
parents:
77408
diff
changeset
|
172 |
|
da5e520a7ba5
Issue #10527: Use poll() instead of select() for multiprocessing pipes
Richard Oudkerk <shibturn@gmail.com>
parents:
77408
diff
changeset
|
173 if (timeout < 0) { |
|
da5e520a7ba5
Issue #10527: Use poll() instead of select() for multiprocessing pipes
Richard Oudkerk <shibturn@gmail.com>
parents:
77408
diff
changeset
|
174 res = poll(&p, 1, -1); |
|
da5e520a7ba5
Issue #10527: Use poll() instead of select() for multiprocessing pipes
Richard Oudkerk <shibturn@gmail.com>
parents:
77408
diff
changeset
|
175 } else { |
|
da5e520a7ba5
Issue #10527: Use poll() instead of select() for multiprocessing pipes
Richard Oudkerk <shibturn@gmail.com>
parents:
77408
diff
changeset
|
176 res = poll(&p, 1, (int)(timeout * 1000 + 0.5)); |
|
da5e520a7ba5
Issue #10527: Use poll() instead of select() for multiprocessing pipes
Richard Oudkerk <shibturn@gmail.com>
parents:
77408
diff
changeset
|
177 } |
|
da5e520a7ba5
Issue #10527: Use poll() instead of select() for multiprocessing pipes
Richard Oudkerk <shibturn@gmail.com>
parents:
77408
diff
changeset
|
178 |
|
da5e520a7ba5
Issue #10527: Use poll() instead of select() for multiprocessing pipes
Richard Oudkerk <shibturn@gmail.com>
parents:
77408
diff
changeset
|
179 if (res < 0) { |
|
da5e520a7ba5
Issue #10527: Use poll() instead of select() for multiprocessing pipes
Richard Oudkerk <shibturn@gmail.com>
parents:
77408
diff
changeset
|
180 return MP_SOCKET_ERROR; |
|
da5e520a7ba5
Issue #10527: Use poll() instead of select() for multiprocessing pipes
Richard Oudkerk <shibturn@gmail.com>
parents:
77408
diff
changeset
|
181 } else if (p.revents & (POLLNVAL|POLLERR)) { |
|
da5e520a7ba5
Issue #10527: Use poll() instead of select() for multiprocessing pipes
Richard Oudkerk <shibturn@gmail.com>
parents:
77408
diff
changeset
|
182 Py_BLOCK_THREADS |
|
da5e520a7ba5
Issue #10527: Use poll() instead of select() for multiprocessing pipes
Richard Oudkerk <shibturn@gmail.com>
parents:
77408
diff
changeset
|
183 PyErr_SetString(PyExc_IOError, "poll() gave POLLNVAL or POLLERR"); |
|
da5e520a7ba5
Issue #10527: Use poll() instead of select() for multiprocessing pipes
Richard Oudkerk <shibturn@gmail.com>
parents:
77408
diff
changeset
|
184 Py_UNBLOCK_THREADS |
|
da5e520a7ba5
Issue #10527: Use poll() instead of select() for multiprocessing pipes
Richard Oudkerk <shibturn@gmail.com>
parents:
77408
diff
changeset
|
185 return MP_EXCEPTION_HAS_BEEN_SET; |
|
da5e520a7ba5
Issue #10527: Use poll() instead of select() for multiprocessing pipes
Richard Oudkerk <shibturn@gmail.com>
parents:
77408
diff
changeset
|
186 } else if (p.revents != 0) { |
|
da5e520a7ba5
Issue #10527: Use poll() instead of select() for multiprocessing pipes
Richard Oudkerk <shibturn@gmail.com>
parents:
77408
diff
changeset
|
187 return TRUE; |
|
da5e520a7ba5
Issue #10527: Use poll() instead of select() for multiprocessing pipes
Richard Oudkerk <shibturn@gmail.com>
parents:
77408
diff
changeset
|
188 } else { |
|
da5e520a7ba5
Issue #10527: Use poll() instead of select() for multiprocessing pipes
Richard Oudkerk <shibturn@gmail.com>
parents:
77408
diff
changeset
|
189 assert(res == 0); |
|
da5e520a7ba5
Issue #10527: Use poll() instead of select() for multiprocessing pipes
Richard Oudkerk <shibturn@gmail.com>
parents:
77408
diff
changeset
|
190 return FALSE; |
|
da5e520a7ba5
Issue #10527: Use poll() instead of select() for multiprocessing pipes
Richard Oudkerk <shibturn@gmail.com>
parents:
77408
diff
changeset
|
191 } |
|
da5e520a7ba5
Issue #10527: Use poll() instead of select() for multiprocessing pipes
Richard Oudkerk <shibturn@gmail.com>
parents:
77408
diff
changeset
|
192 #else |
|
61463
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
51569
diff
changeset
|
193 int res; |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
51569
diff
changeset
|
194 fd_set rfds; |
|
47595
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
195 |
|
61463
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
51569
diff
changeset
|
196 /* |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
51569
diff
changeset
|
197 * Verify the handle, issue 3321. Not required for windows. |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
51569
diff
changeset
|
198 */ |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
51569
diff
changeset
|
199 #ifndef MS_WINDOWS |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
51569
diff
changeset
|
200 if (((int)conn->handle) < 0 || ((int)conn->handle) >= FD_SETSIZE) { |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
51569
diff
changeset
|
201 Py_BLOCK_THREADS |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
51569
diff
changeset
|
202 PyErr_SetString(PyExc_IOError, "handle out of range in select()"); |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
51569
diff
changeset
|
203 Py_UNBLOCK_THREADS |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
51569
diff
changeset
|
204 return MP_EXCEPTION_HAS_BEEN_SET; |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
51569
diff
changeset
|
205 } |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
51569
diff
changeset
|
206 #endif |
|
51569
9a932f92f394
Merge 68778,68788 to maint
Jesse Noller <jnoller@gmail.com>
parents:
48611
diff
changeset
|
207 |
|
61463
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
51569
diff
changeset
|
208 FD_ZERO(&rfds); |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
51569
diff
changeset
|
209 FD_SET((SOCKET)conn->handle, &rfds); |
|
47595
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
210 |
|
61463
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
51569
diff
changeset
|
211 if (timeout < 0.0) { |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
51569
diff
changeset
|
212 res = select((int)conn->handle+1, &rfds, NULL, NULL, NULL); |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
51569
diff
changeset
|
213 } else { |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
51569
diff
changeset
|
214 struct timeval tv; |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
51569
diff
changeset
|
215 tv.tv_sec = (long)timeout; |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
51569
diff
changeset
|
216 tv.tv_usec = (long)((timeout - tv.tv_sec) * 1e6 + 0.5); |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
51569
diff
changeset
|
217 res = select((int)conn->handle+1, &rfds, NULL, NULL, &tv); |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
51569
diff
changeset
|
218 } |
|
47595
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
219 |
|
61463
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
51569
diff
changeset
|
220 if (res < 0) { |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
51569
diff
changeset
|
221 return MP_SOCKET_ERROR; |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
51569
diff
changeset
|
222 } else if (FD_ISSET(conn->handle, &rfds)) { |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
51569
diff
changeset
|
223 return TRUE; |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
51569
diff
changeset
|
224 } else { |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
51569
diff
changeset
|
225 assert(res == 0); |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
51569
diff
changeset
|
226 return FALSE; |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
51569
diff
changeset
|
227 } |
|
81506
da5e520a7ba5
Issue #10527: Use poll() instead of select() for multiprocessing pipes
Richard Oudkerk <shibturn@gmail.com>
parents:
77408
diff
changeset
|
228 #endif |
|
47595
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
229 } |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
230 |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
231 /* |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
232 * "connection.h" defines the Connection type using defs above |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
233 */ |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
234 |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
235 #define CONNECTION_NAME "Connection" |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
236 #define CONNECTION_TYPE ConnectionType |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
237 |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
238 #include "connection.h" |
