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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
47595
5c6cdfcd6eae Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1 /*
5c6cdfcd6eae Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
2 * A type which wraps a 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"