Mercurial > cpython-lru_cache-weakref
annotate Modules/_multiprocessing/socket_connection.c @ 80661:94de77bd0b4b 2.7
Issue #16194: document imp.load_dynamic problems
when read several extension modules from the same binary object file.
| author | Andrew Svetlov <andrew.svetlov@gmail.com> |
|---|---|
| date | Thu, 29 Nov 2012 19:51:28 +0200 |
| parents | 60a7b704de5c |
| children | da5e520a7ba5 |
| 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 |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
11 #ifdef MS_WINDOWS |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
12 # 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
|
13 # 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
|
14 # define CLOSE(h) closesocket((SOCKET)h) |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
15 #else |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
16 # 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
|
17 # 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
|
18 # define CLOSE(h) close(h) |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
19 #endif |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
20 |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
21 /* |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
22 * Send string to file descriptor |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
23 */ |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
24 |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
25 static Py_ssize_t |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
26 _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
|
27 { |
|
61463
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
51569
diff
changeset
|
28 char *p = string; |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
51569
diff
changeset
|
29 Py_ssize_t res; |
|
47595
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
30 |
|
61463
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
51569
diff
changeset
|
31 while (length > 0) { |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
51569
diff
changeset
|
32 res = WRITE(h, p, length); |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
51569
diff
changeset
|
33 if (res < 0) |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
51569
diff
changeset
|
34 return MP_SOCKET_ERROR; |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
51569
diff
changeset
|
35 length -= res; |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
51569
diff
changeset
|
36 p += res; |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
51569
diff
changeset
|
37 } |
|
47595
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
38 |
|
61463
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
51569
diff
changeset
|
39 return MP_SUCCESS; |
|
47595
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
40 } |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
41 |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
42 /* |
|
61463
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
51569
diff
changeset
|
43 * 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
|
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 static Py_ssize_t |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
47 _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
|
48 { |
|
61463
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
51569
diff
changeset
|
49 size_t remaining = length; |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
51569
diff
changeset
|
50 Py_ssize_t temp; |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
51569
diff
changeset
|
51 char *p = buffer; |
|
47595
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 while (remaining > 0) { |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
51569
diff
changeset
|
54 temp = READ(h, p, remaining); |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
51569
diff
changeset
|
55 if (temp <= 0) { |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
51569
diff
changeset
|
56 if (temp == 0) |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
51569
diff
changeset
|
57 return remaining == length ? |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
51569
diff
changeset
|
58 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
|
59 else |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
51569
diff
changeset
|
60 return temp; |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
51569
diff
changeset
|
61 } |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
51569
diff
changeset
|
62 remaining -= temp; |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
51569
diff
changeset
|
63 p += temp; |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
51569
diff
changeset
|
64 } |
|
47595
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
65 |
|
61463
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
51569
diff
changeset
|
66 return MP_SUCCESS; |
|
47595
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
67 } |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
68 |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
69 /* |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
70 * 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
|
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 static Py_ssize_t |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
74 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
|
75 { |
|
61463
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
51569
diff
changeset
|
76 Py_ssize_t res; |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
51569
diff
changeset
|
77 /* 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
|
78 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
|
79 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
|
80 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
|
81 them at once. */ |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
51569
diff
changeset
|
82 if (length < (16*1024)) { |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
51569
diff
changeset
|
83 char *message; |
|
47595
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
84 |
|
61463
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
51569
diff
changeset
|
85 message = PyMem_Malloc(length+4); |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
51569
diff
changeset
|
86 if (message == NULL) |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
51569
diff
changeset
|
87 return MP_MEMORY_ERROR; |
|
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 *(UINT32*)message = htonl((UINT32)length); |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
51569
diff
changeset
|
90 memcpy(message+4, string, length); |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
51569
diff
changeset
|
91 Py_BEGIN_ALLOW_THREADS |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
51569
diff
changeset
|
92 res = _conn_sendall(conn->handle, message, length+4); |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
51569
diff
changeset
|
93 Py_END_ALLOW_THREADS |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
51569
diff
changeset
|
94 PyMem_Free(message); |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
51569
diff
changeset
|
95 } else { |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
51569
diff
changeset
|
96 UINT32 lenbuff; |
|
47595
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
97 |
|
61463
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
51569
diff
changeset
|
98 if (length > MAX_MESSAGE_LENGTH) |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
51569
diff
changeset
|
99 return MP_BAD_MESSAGE_LENGTH; |
|
47595
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
100 |
|
61463
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
51569
diff
changeset
|
101 lenbuff = htonl((UINT32)length); |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
51569
diff
changeset
|
102 Py_BEGIN_ALLOW_THREADS |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
51569
diff
changeset
|
103 res = _conn_sendall(conn->handle, (char*)&lenbuff, 4) || |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
51569
diff
changeset
|
104 _conn_sendall(conn->handle, string, length); |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
51569
diff
changeset
|
105 Py_END_ALLOW_THREADS |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
51569
diff
changeset
|
106 } |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
51569
diff
changeset
|
107 return res; |
|
47595
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
108 } |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
109 |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
110 /* |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
111 * 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
|
112 * |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
113 * Returns number of bytes read. |
|
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 |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
116 static Py_ssize_t |
|
61463
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
51569
diff
changeset
|
117 conn_recv_string(ConnectionObject *conn, char *buffer, |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
51569
diff
changeset
|
118 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
|
119 { |
|
77408
60a7b704de5c
Issue #10133: Make multiprocessing deallocate buffer if socket read fails.
Richard Oudkerk <shibturn@gmail.com>
parents:
61463
diff
changeset
|
120 Py_ssize_t res; |
|
61463
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
51569
diff
changeset
|
121 UINT32 ulength; |
|
47595
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
122 |
|
61463
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
51569
diff
changeset
|
123 *newbuffer = NULL; |
|
47595
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
124 |
|
61463
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
51569
diff
changeset
|
125 Py_BEGIN_ALLOW_THREADS |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
51569
diff
changeset
|
126 res = _conn_recvall(conn->handle, (char*)&ulength, 4); |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
51569
diff
changeset
|
127 Py_END_ALLOW_THREADS |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
51569
diff
changeset
|
128 if (res < 0) |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
51569
diff
changeset
|
129 return res; |
|
47595
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
130 |
|
61463
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
51569
diff
changeset
|
131 ulength = ntohl(ulength); |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
51569
diff
changeset
|
132 if (ulength > maxlength) |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
51569
diff
changeset
|
133 return MP_BAD_MESSAGE_LENGTH; |
|
47595
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
134 |
|
77408
60a7b704de5c
Issue #10133: Make multiprocessing deallocate buffer if socket read fails.
Richard Oudkerk <shibturn@gmail.com>
parents:
61463
diff
changeset
|
135 if (ulength > buflength) { |
|
60a7b704de5c
Issue #10133: Make multiprocessing deallocate buffer if socket read fails.
Richard Oudkerk <shibturn@gmail.com>
parents:
61463
diff
changeset
|
136 *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
|
137 if (buffer == NULL) |
|
61463
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
51569
diff
changeset
|
138 return MP_MEMORY_ERROR; |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
51569
diff
changeset
|
139 } |
|
77408
60a7b704de5c
Issue #10133: Make multiprocessing deallocate buffer if socket read fails.
Richard Oudkerk <shibturn@gmail.com>
parents:
61463
diff
changeset
|
140 |
|
60a7b704de5c
Issue #10133: Make multiprocessing deallocate buffer if socket read fails.
Richard Oudkerk <shibturn@gmail.com>
parents:
61463
diff
changeset
|
141 Py_BEGIN_ALLOW_THREADS |
|
60a7b704de5c
Issue #10133: Make multiprocessing deallocate buffer if socket read fails.
Richard Oudkerk <shibturn@gmail.com>
parents:
61463
diff
changeset
|
142 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
|
143 Py_END_ALLOW_THREADS |
|
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 if (res >= 0) { |
|
60a7b704de5c
Issue #10133: Make multiprocessing deallocate buffer if socket read fails.
Richard Oudkerk <shibturn@gmail.com>
parents:
61463
diff
changeset
|
146 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
|
147 } else if (*newbuffer != NULL) { |
|
60a7b704de5c
Issue #10133: Make multiprocessing deallocate buffer if socket read fails.
Richard Oudkerk <shibturn@gmail.com>
parents:
61463
diff
changeset
|
148 PyMem_Free(*newbuffer); |
|
60a7b704de5c
Issue #10133: Make multiprocessing deallocate buffer if socket read fails.
Richard Oudkerk <shibturn@gmail.com>
parents:
61463
diff
changeset
|
149 *newbuffer = NULL; |
|
60a7b704de5c
Issue #10133: Make multiprocessing deallocate buffer if socket read fails.
Richard Oudkerk <shibturn@gmail.com>
parents:
61463
diff
changeset
|
150 } |
|
60a7b704de5c
Issue #10133: Make multiprocessing deallocate buffer if socket read fails.
Richard Oudkerk <shibturn@gmail.com>
parents:
61463
diff
changeset
|
151 return res; |
|
47595
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
152 } |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
153 |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
154 /* |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
155 * 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
|
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 static int |
|
51569
9a932f92f394
Merge 68778,68788 to maint
Jesse Noller <jnoller@gmail.com>
parents:
48611
diff
changeset
|
159 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
|
160 { |
|
61463
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
51569
diff
changeset
|
161 int res; |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
51569
diff
changeset
|
162 fd_set rfds; |
|
47595
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
163 |
|
61463
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
51569
diff
changeset
|
164 /* |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
51569
diff
changeset
|
165 * 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
|
166 */ |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
51569
diff
changeset
|
167 #ifndef MS_WINDOWS |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
51569
diff
changeset
|
168 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
|
169 Py_BLOCK_THREADS |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
51569
diff
changeset
|
170 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
|
171 Py_UNBLOCK_THREADS |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
51569
diff
changeset
|
172 return MP_EXCEPTION_HAS_BEEN_SET; |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
51569
diff
changeset
|
173 } |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
51569
diff
changeset
|
174 #endif |
|
51569
9a932f92f394
Merge 68778,68788 to maint
Jesse Noller <jnoller@gmail.com>
parents:
48611
diff
changeset
|
175 |
|
61463
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
51569
diff
changeset
|
176 FD_ZERO(&rfds); |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
51569
diff
changeset
|
177 FD_SET((SOCKET)conn->handle, &rfds); |
|
47595
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
178 |
|
61463
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
51569
diff
changeset
|
179 if (timeout < 0.0) { |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
51569
diff
changeset
|
180 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
|
181 } else { |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
51569
diff
changeset
|
182 struct timeval tv; |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
51569
diff
changeset
|
183 tv.tv_sec = (long)timeout; |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
51569
diff
changeset
|
184 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
|
185 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
|
186 } |
|
47595
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
187 |
|
61463
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
51569
diff
changeset
|
188 if (res < 0) { |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
51569
diff
changeset
|
189 return MP_SOCKET_ERROR; |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
51569
diff
changeset
|
190 } else if (FD_ISSET(conn->handle, &rfds)) { |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
51569
diff
changeset
|
191 return TRUE; |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
51569
diff
changeset
|
192 } else { |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
51569
diff
changeset
|
193 assert(res == 0); |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
51569
diff
changeset
|
194 return FALSE; |
|
fd25030223b0
Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents:
51569
diff
changeset
|
195 } |
|
47595
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
196 } |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
197 |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
198 /* |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
199 * "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
|
200 */ |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
201 |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
202 #define CONNECTION_NAME "Connection" |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
203 #define CONNECTION_TYPE ConnectionType |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
204 |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
205 #include "connection.h" |
