annotate Modules/_multiprocessing/connection.h @ 79675:c0a2294de787 2.7

Issue #16199: Backport 2to3 typo fix from 3.2.
author Chris Jerdonek <chris.jerdonek@gmail.com>
date Thu, 11 Oct 2012 16:15:46 -0700
parents b36cb4602e21
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
47577
4511ecd25634 add the multiprocessing package to fulfill PEP 371
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1 /*
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
2 * Definition of a `Connection` type.
47577
4511ecd25634 add the multiprocessing package to fulfill PEP 371
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
3 * Used by `socket_connection.c` and `pipe_connection.c`.
4511ecd25634 add the multiprocessing package to fulfill PEP 371
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
4 *
4511ecd25634 add the multiprocessing package to fulfill PEP 371
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
5 * connection.h
4511ecd25634 add the multiprocessing package to fulfill PEP 371
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
6 *
4511ecd25634 add the multiprocessing package to fulfill PEP 371
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
7 * Copyright (c) 2006-2008, R Oudkerk --- see COPYING.txt
4511ecd25634 add the multiprocessing package to fulfill PEP 371
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
8 */
4511ecd25634 add the multiprocessing package to fulfill PEP 371
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
9
4511ecd25634 add the multiprocessing package to fulfill PEP 371
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
10 #ifndef CONNECTION_H
4511ecd25634 add the multiprocessing package to fulfill PEP 371
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
11 #define CONNECTION_H
4511ecd25634 add the multiprocessing package to fulfill PEP 371
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
12
4511ecd25634 add the multiprocessing package to fulfill PEP 371
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
13 /*
4511ecd25634 add the multiprocessing package to fulfill PEP 371
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
14 * Read/write flags
4511ecd25634 add the multiprocessing package to fulfill PEP 371
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
15 */
4511ecd25634 add the multiprocessing package to fulfill PEP 371
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
16
4511ecd25634 add the multiprocessing package to fulfill PEP 371
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
17 #define READABLE 1
4511ecd25634 add the multiprocessing package to fulfill PEP 371
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
18 #define WRITABLE 2
4511ecd25634 add the multiprocessing package to fulfill PEP 371
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
19
4511ecd25634 add the multiprocessing package to fulfill PEP 371
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
20 #define CHECK_READABLE(self) \
4511ecd25634 add the multiprocessing package to fulfill PEP 371
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
21 if (!(self->flags & READABLE)) { \
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
22 PyErr_SetString(PyExc_IOError, "connection is write-only"); \
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
23 return NULL; \
47577
4511ecd25634 add the multiprocessing package to fulfill PEP 371
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
24 }
4511ecd25634 add the multiprocessing package to fulfill PEP 371
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
25
4511ecd25634 add the multiprocessing package to fulfill PEP 371
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
26 #define CHECK_WRITABLE(self) \
4511ecd25634 add the multiprocessing package to fulfill PEP 371
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
27 if (!(self->flags & WRITABLE)) { \
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
28 PyErr_SetString(PyExc_IOError, "connection is read-only"); \
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
29 return NULL; \
47577
4511ecd25634 add the multiprocessing package to fulfill PEP 371
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
30 }
4511ecd25634 add the multiprocessing package to fulfill PEP 371
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
31
4511ecd25634 add the multiprocessing package to fulfill PEP 371
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
32 /*
4511ecd25634 add the multiprocessing package to fulfill PEP 371
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
33 * Allocation and deallocation
4511ecd25634 add the multiprocessing package to fulfill PEP 371
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
34 */
4511ecd25634 add the multiprocessing package to fulfill PEP 371
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
35
4511ecd25634 add the multiprocessing package to fulfill PEP 371
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
36 static PyObject *
4511ecd25634 add the multiprocessing package to fulfill PEP 371
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
37 connection_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
4511ecd25634 add the multiprocessing package to fulfill PEP 371
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
38 {
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
39 ConnectionObject *self;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
40 HANDLE handle;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
41 BOOL readable = TRUE, writable = TRUE;
47577
4511ecd25634 add the multiprocessing package to fulfill PEP 371
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
42
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
43 static char *kwlist[] = {"handle", "readable", "writable", NULL};
47577
4511ecd25634 add the multiprocessing package to fulfill PEP 371
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
44
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
45 if (!PyArg_ParseTupleAndKeywords(args, kwds, F_HANDLE "|ii", kwlist,
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
46 &handle, &readable, &writable))
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
47 return NULL;
47577
4511ecd25634 add the multiprocessing package to fulfill PEP 371
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
48
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
49 if (handle == INVALID_HANDLE_VALUE || (Py_ssize_t)handle < 0) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
50 PyErr_Format(PyExc_IOError, "invalid handle %zd",
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
51 (Py_ssize_t)handle);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
52 return NULL;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
53 }
47577
4511ecd25634 add the multiprocessing package to fulfill PEP 371
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
54
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
55 if (!readable && !writable) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
56 PyErr_SetString(PyExc_ValueError,
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
57 "either readable or writable must be true");
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
58 return NULL;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
59 }
47577
4511ecd25634 add the multiprocessing package to fulfill PEP 371
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
60
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
61 self = PyObject_New(ConnectionObject, type);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
62 if (self == NULL)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
63 return NULL;
47577
4511ecd25634 add the multiprocessing package to fulfill PEP 371
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
64
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
65 self->weakreflist = NULL;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
66 self->handle = handle;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
67 self->flags = 0;
47577
4511ecd25634 add the multiprocessing package to fulfill PEP 371
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
68
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
69 if (readable)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
70 self->flags |= READABLE;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
71 if (writable)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
72 self->flags |= WRITABLE;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
73 assert(self->flags >= 1 && self->flags <= 3);
47577
4511ecd25634 add the multiprocessing package to fulfill PEP 371
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
74
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
75 return (PyObject*)self;
47577
4511ecd25634 add the multiprocessing package to fulfill PEP 371
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
76 }
4511ecd25634 add the multiprocessing package to fulfill PEP 371
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
77
4511ecd25634 add the multiprocessing package to fulfill PEP 371
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
78 static void
4511ecd25634 add the multiprocessing package to fulfill PEP 371
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
79 connection_dealloc(ConnectionObject* self)
4511ecd25634 add the multiprocessing package to fulfill PEP 371
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
80 {
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
81 if (self->weakreflist != NULL)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
82 PyObject_ClearWeakRefs((PyObject*)self);
47577
4511ecd25634 add the multiprocessing package to fulfill PEP 371
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
83
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
84 if (self->handle != INVALID_HANDLE_VALUE) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
85 Py_BEGIN_ALLOW_THREADS
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
86 CLOSE(self->handle);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
87 Py_END_ALLOW_THREADS
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
88 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
89 PyObject_Del(self);
47577
4511ecd25634 add the multiprocessing package to fulfill PEP 371
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
90 }
4511ecd25634 add the multiprocessing package to fulfill PEP 371
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
91
4511ecd25634 add the multiprocessing package to fulfill PEP 371
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
92 /*
4511ecd25634 add the multiprocessing package to fulfill PEP 371
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
93 * Functions for transferring buffers
4511ecd25634 add the multiprocessing package to fulfill PEP 371
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
94 */
4511ecd25634 add the multiprocessing package to fulfill PEP 371
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
95
4511ecd25634 add the multiprocessing package to fulfill PEP 371
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
96 static PyObject *
4511ecd25634 add the multiprocessing package to fulfill PEP 371
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
97 connection_sendbytes(ConnectionObject *self, PyObject *args)
4511ecd25634 add the multiprocessing package to fulfill PEP 371
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
98 {
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
99 char *buffer;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
100 Py_ssize_t length, offset=0, size=PY_SSIZE_T_MIN;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
101 int res;
47577
4511ecd25634 add the multiprocessing package to fulfill PEP 371
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
102
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
103 if (!PyArg_ParseTuple(args, F_RBUFFER "#|" F_PY_SSIZE_T F_PY_SSIZE_T,
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
104 &buffer, &length, &offset, &size))
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
105 return NULL;
47577
4511ecd25634 add the multiprocessing package to fulfill PEP 371
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
106
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
107 CHECK_WRITABLE(self);
47577
4511ecd25634 add the multiprocessing package to fulfill PEP 371
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
108
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
109 if (offset < 0) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
110 PyErr_SetString(PyExc_ValueError, "offset is negative");
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
111 return NULL;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
112 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
113 if (length < offset) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
114 PyErr_SetString(PyExc_ValueError, "buffer length < offset");
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
115 return NULL;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
116 }
47577
4511ecd25634 add the multiprocessing package to fulfill PEP 371
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
117
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
118 if (size == PY_SSIZE_T_MIN) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
119 size = length - offset;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
120 } else {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
121 if (size < 0) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
122 PyErr_SetString(PyExc_ValueError, "size is negative");
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
123 return NULL;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
124 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
125 if (offset + size > length) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
126 PyErr_SetString(PyExc_ValueError,
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
127 "buffer length < offset + size");
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
128 return NULL;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
129 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
130 }
47577
4511ecd25634 add the multiprocessing package to fulfill PEP 371
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
131
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
132 res = conn_send_string(self, buffer + offset, size);
47577
4511ecd25634 add the multiprocessing package to fulfill PEP 371
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
133
61463
fd25030223b0 Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61262
diff changeset
134 if (res < 0) {
fd25030223b0 Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61262
diff changeset
135 if (PyErr_Occurred())
fd25030223b0 Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61262
diff changeset
136 return NULL;
fd25030223b0 Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61262
diff changeset
137 else
fd25030223b0 Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61262
diff changeset
138 return mp_SetError(PyExc_IOError, res);
fd25030223b0 Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61262
diff changeset
139 }
47577
4511ecd25634 add the multiprocessing package to fulfill PEP 371
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
140
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
141 Py_RETURN_NONE;
47577
4511ecd25634 add the multiprocessing package to fulfill PEP 371
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
142 }
4511ecd25634 add the multiprocessing package to fulfill PEP 371
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
143
4511ecd25634 add the multiprocessing package to fulfill PEP 371
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
144 static PyObject *
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
145 connection_recvbytes(ConnectionObject *self, PyObject *args)
47577
4511ecd25634 add the multiprocessing package to fulfill PEP 371
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
146 {
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
147 char *freeme = NULL;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
148 Py_ssize_t res, maxlength = PY_SSIZE_T_MAX;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
149 PyObject *result = NULL;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
150
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
151 if (!PyArg_ParseTuple(args, "|" F_PY_SSIZE_T, &maxlength))
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
152 return NULL;
47577
4511ecd25634 add the multiprocessing package to fulfill PEP 371
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
153
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
154 CHECK_READABLE(self);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
155
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
156 if (maxlength < 0) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
157 PyErr_SetString(PyExc_ValueError, "maxlength < 0");
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
158 return NULL;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
159 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
160
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
161 res = conn_recv_string(self, self->buffer, CONNECTION_BUFFER_SIZE,
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
162 &freeme, maxlength);
47577
4511ecd25634 add the multiprocessing package to fulfill PEP 371
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
163
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
164 if (res < 0) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
165 if (res == MP_BAD_MESSAGE_LENGTH) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
166 if ((self->flags & WRITABLE) == 0) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
167 Py_BEGIN_ALLOW_THREADS
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
168 CLOSE(self->handle);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
169 Py_END_ALLOW_THREADS
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
170 self->handle = INVALID_HANDLE_VALUE;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
171 } else {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
172 self->flags = WRITABLE;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
173 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
174 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
175 mp_SetError(PyExc_IOError, res);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
176 } else {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
177 if (freeme == NULL) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
178 result = PyString_FromStringAndSize(self->buffer, res);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
179 } else {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
180 result = PyString_FromStringAndSize(freeme, res);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
181 PyMem_Free(freeme);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
182 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
183 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
184
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
185 return result;
47577
4511ecd25634 add the multiprocessing package to fulfill PEP 371
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
186 }
4511ecd25634 add the multiprocessing package to fulfill PEP 371
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
187
4511ecd25634 add the multiprocessing package to fulfill PEP 371
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
188 static PyObject *
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
189 connection_recvbytes_into(ConnectionObject *self, PyObject *args)
47577
4511ecd25634 add the multiprocessing package to fulfill PEP 371
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
190 {
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
191 char *freeme = NULL, *buffer = NULL;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
192 Py_ssize_t res, length, offset = 0;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
193 PyObject *result = NULL;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
194 Py_buffer pbuf;
47577
4511ecd25634 add the multiprocessing package to fulfill PEP 371
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
195
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
196 CHECK_READABLE(self);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
197
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
198 if (!PyArg_ParseTuple(args, "w*|" F_PY_SSIZE_T,
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
199 &pbuf, &offset))
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
200 return NULL;
47577
4511ecd25634 add the multiprocessing package to fulfill PEP 371
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
201
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
202 buffer = pbuf.buf;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
203 length = pbuf.len;
47577
4511ecd25634 add the multiprocessing package to fulfill PEP 371
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
204
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
205 if (offset < 0) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
206 PyErr_SetString(PyExc_ValueError, "negative offset");
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
207 goto _error;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
208 }
47577
4511ecd25634 add the multiprocessing package to fulfill PEP 371
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
209
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
210 if (offset > length) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
211 PyErr_SetString(PyExc_ValueError, "offset too large");
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
212 goto _error;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
213 }
47577
4511ecd25634 add the multiprocessing package to fulfill PEP 371
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
214
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
215 res = conn_recv_string(self, buffer+offset, length-offset,
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
216 &freeme, PY_SSIZE_T_MAX);
47577
4511ecd25634 add the multiprocessing package to fulfill PEP 371
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
217
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
218 if (res < 0) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
219 if (res == MP_BAD_MESSAGE_LENGTH) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
220 if ((self->flags & WRITABLE) == 0) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
221 Py_BEGIN_ALLOW_THREADS
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
222 CLOSE(self->handle);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
223 Py_END_ALLOW_THREADS
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
224 self->handle = INVALID_HANDLE_VALUE;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
225 } else {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
226 self->flags = WRITABLE;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
227 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
228 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
229 mp_SetError(PyExc_IOError, res);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
230 } else {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
231 if (freeme == NULL) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
232 result = PyInt_FromSsize_t(res);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
233 } else {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
234 result = PyObject_CallFunction(BufferTooShort,
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
235 F_RBUFFER "#",
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
236 freeme, res);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
237 PyMem_Free(freeme);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
238 if (result) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
239 PyErr_SetObject(BufferTooShort, result);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
240 Py_DECREF(result);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
241 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
242 goto _error;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
243 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
244 }
47577
4511ecd25634 add the multiprocessing package to fulfill PEP 371
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
245
48221
b8c4bf393794 Issue #3139: Make buffer-interface thread-safe wrt. PyArg_ParseTuple,
Martin v. Löwis <martin@v.loewis.de>
parents: 48125
diff changeset
246 _cleanup:
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
247 PyBuffer_Release(&pbuf);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
248 return result;
48221
b8c4bf393794 Issue #3139: Make buffer-interface thread-safe wrt. PyArg_ParseTuple,
Martin v. Löwis <martin@v.loewis.de>
parents: 48125
diff changeset
249
b8c4bf393794 Issue #3139: Make buffer-interface thread-safe wrt. PyArg_ParseTuple,
Martin v. Löwis <martin@v.loewis.de>
parents: 48125
diff changeset
250 _error:
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
251 result = NULL;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
252 goto _cleanup;
47577
4511ecd25634 add the multiprocessing package to fulfill PEP 371
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
253 }
4511ecd25634 add the multiprocessing package to fulfill PEP 371
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
254
4511ecd25634 add the multiprocessing package to fulfill PEP 371
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
255 /*
4511ecd25634 add the multiprocessing package to fulfill PEP 371
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
256 * Functions for transferring objects
4511ecd25634 add the multiprocessing package to fulfill PEP 371
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
257 */
4511ecd25634 add the multiprocessing package to fulfill PEP 371
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
258
4511ecd25634 add the multiprocessing package to fulfill PEP 371
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
259 static PyObject *
4511ecd25634 add the multiprocessing package to fulfill PEP 371
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
260 connection_send_obj(ConnectionObject *self, PyObject *obj)
4511ecd25634 add the multiprocessing package to fulfill PEP 371
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
261 {
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
262 char *buffer;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
263 int res;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
264 Py_ssize_t length;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
265 PyObject *pickled_string = NULL;
47577
4511ecd25634 add the multiprocessing package to fulfill PEP 371
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
266
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
267 CHECK_WRITABLE(self);
47577
4511ecd25634 add the multiprocessing package to fulfill PEP 371
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
268
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
269 pickled_string = PyObject_CallFunctionObjArgs(pickle_dumps, obj,
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
270 pickle_protocol, NULL);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
271 if (!pickled_string)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
272 goto failure;
47577
4511ecd25634 add the multiprocessing package to fulfill PEP 371
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
273
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
274 if (PyString_AsStringAndSize(pickled_string, &buffer, &length) < 0)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
275 goto failure;
47577
4511ecd25634 add the multiprocessing package to fulfill PEP 371
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
276
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
277 res = conn_send_string(self, buffer, (int)length);
47577
4511ecd25634 add the multiprocessing package to fulfill PEP 371
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
278
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
279 if (res < 0) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
280 mp_SetError(PyExc_IOError, res);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
281 goto failure;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
282 }
47577
4511ecd25634 add the multiprocessing package to fulfill PEP 371
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
283
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
284 Py_XDECREF(pickled_string);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
285 Py_RETURN_NONE;
47577
4511ecd25634 add the multiprocessing package to fulfill PEP 371
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
286
4511ecd25634 add the multiprocessing package to fulfill PEP 371
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
287 failure:
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
288 Py_XDECREF(pickled_string);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
289 return NULL;
47577
4511ecd25634 add the multiprocessing package to fulfill PEP 371
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
290 }
4511ecd25634 add the multiprocessing package to fulfill PEP 371
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
291
4511ecd25634 add the multiprocessing package to fulfill PEP 371
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
292 static PyObject *
4511ecd25634 add the multiprocessing package to fulfill PEP 371
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
293 connection_recv_obj(ConnectionObject *self)
4511ecd25634 add the multiprocessing package to fulfill PEP 371
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
294 {
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
295 char *freeme = NULL;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
296 Py_ssize_t res;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
297 PyObject *temp = NULL, *result = NULL;
47577
4511ecd25634 add the multiprocessing package to fulfill PEP 371
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
298
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
299 CHECK_READABLE(self);
47577
4511ecd25634 add the multiprocessing package to fulfill PEP 371
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
300
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
301 res = conn_recv_string(self, self->buffer, CONNECTION_BUFFER_SIZE,
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
302 &freeme, PY_SSIZE_T_MAX);
47577
4511ecd25634 add the multiprocessing package to fulfill PEP 371
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
303
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
304 if (res < 0) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
305 if (res == MP_BAD_MESSAGE_LENGTH) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
306 if ((self->flags & WRITABLE) == 0) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
307 Py_BEGIN_ALLOW_THREADS
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
308 CLOSE(self->handle);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
309 Py_END_ALLOW_THREADS
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
310 self->handle = INVALID_HANDLE_VALUE;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
311 } else {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
312 self->flags = WRITABLE;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
313 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
314 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
315 mp_SetError(PyExc_IOError, res);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
316 } else {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
317 if (freeme == NULL) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
318 temp = PyString_FromStringAndSize(self->buffer, res);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
319 } else {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
320 temp = PyString_FromStringAndSize(freeme, res);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
321 PyMem_Free(freeme);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
322 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
323 }
47577
4511ecd25634 add the multiprocessing package to fulfill PEP 371
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
324
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
325 if (temp)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
326 result = PyObject_CallFunctionObjArgs(pickle_loads,
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
327 temp, NULL);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
328 Py_XDECREF(temp);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
329 return result;
47577
4511ecd25634 add the multiprocessing package to fulfill PEP 371
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
330 }
4511ecd25634 add the multiprocessing package to fulfill PEP 371
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
331
4511ecd25634 add the multiprocessing package to fulfill PEP 371
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
332 /*
4511ecd25634 add the multiprocessing package to fulfill PEP 371
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
333 * Other functions
4511ecd25634 add the multiprocessing package to fulfill PEP 371
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
334 */
4511ecd25634 add the multiprocessing package to fulfill PEP 371
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
335
4511ecd25634 add the multiprocessing package to fulfill PEP 371
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
336 static PyObject *
4511ecd25634 add the multiprocessing package to fulfill PEP 371
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
337 connection_poll(ConnectionObject *self, PyObject *args)
4511ecd25634 add the multiprocessing package to fulfill PEP 371
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
338 {
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
339 PyObject *timeout_obj = NULL;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
340 double timeout = 0.0;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
341 int res;
47577
4511ecd25634 add the multiprocessing package to fulfill PEP 371
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
342
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
343 CHECK_READABLE(self);
47577
4511ecd25634 add the multiprocessing package to fulfill PEP 371
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
344
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
345 if (!PyArg_ParseTuple(args, "|O", &timeout_obj))
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
346 return NULL;
47577
4511ecd25634 add the multiprocessing package to fulfill PEP 371
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
347
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
348 if (timeout_obj == NULL) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
349 timeout = 0.0;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
350 } else if (timeout_obj == Py_None) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
351 timeout = -1.0; /* block forever */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
352 } else {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
353 timeout = PyFloat_AsDouble(timeout_obj);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
354 if (PyErr_Occurred())
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
355 return NULL;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
356 if (timeout < 0.0)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
357 timeout = 0.0;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
358 }
47577
4511ecd25634 add the multiprocessing package to fulfill PEP 371
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
359
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
360 Py_BEGIN_ALLOW_THREADS
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
361 res = conn_poll(self, timeout, _save);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
362 Py_END_ALLOW_THREADS
47577
4511ecd25634 add the multiprocessing package to fulfill PEP 371
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
363
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
364 switch (res) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
365 case TRUE:
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
366 Py_RETURN_TRUE;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
367 case FALSE:
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
368 Py_RETURN_FALSE;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
369 default:
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
370 return mp_SetError(PyExc_IOError, res);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
371 }
47577
4511ecd25634 add the multiprocessing package to fulfill PEP 371
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
372 }
4511ecd25634 add the multiprocessing package to fulfill PEP 371
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
373
4511ecd25634 add the multiprocessing package to fulfill PEP 371
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
374 static PyObject *
4511ecd25634 add the multiprocessing package to fulfill PEP 371
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
375 connection_fileno(ConnectionObject* self)
4511ecd25634 add the multiprocessing package to fulfill PEP 371
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
376 {
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
377 if (self->handle == INVALID_HANDLE_VALUE) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
378 PyErr_SetString(PyExc_IOError, "handle is invalid");
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
379 return NULL;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
380 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
381 return PyInt_FromLong((long)self->handle);
47577
4511ecd25634 add the multiprocessing package to fulfill PEP 371
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
382 }
4511ecd25634 add the multiprocessing package to fulfill PEP 371
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
383
4511ecd25634 add the multiprocessing package to fulfill PEP 371
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
384 static PyObject *
4511ecd25634 add the multiprocessing package to fulfill PEP 371
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
385 connection_close(ConnectionObject *self)
4511ecd25634 add the multiprocessing package to fulfill PEP 371
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
386 {
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
387 if (self->handle != INVALID_HANDLE_VALUE) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
388 Py_BEGIN_ALLOW_THREADS
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
389 CLOSE(self->handle);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
390 Py_END_ALLOW_THREADS
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
391 self->handle = INVALID_HANDLE_VALUE;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
392 }
47577
4511ecd25634 add the multiprocessing package to fulfill PEP 371
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
393
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
394 Py_RETURN_NONE;
47577
4511ecd25634 add the multiprocessing package to fulfill PEP 371
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
395 }
4511ecd25634 add the multiprocessing package to fulfill PEP 371
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
396
4511ecd25634 add the multiprocessing package to fulfill PEP 371
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
397 static PyObject *
4511ecd25634 add the multiprocessing package to fulfill PEP 371
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
398 connection_repr(ConnectionObject *self)
4511ecd25634 add the multiprocessing package to fulfill PEP 371
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
399 {
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
400 static char *conn_type[] = {"read-only", "write-only", "read-write"};
47577
4511ecd25634 add the multiprocessing package to fulfill PEP 371
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
401
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
402 assert(self->flags >= 1 && self->flags <= 3);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
403 return FROM_FORMAT("<%s %s, handle %zd>",
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
404 conn_type[self->flags - 1],
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
405 CONNECTION_NAME, (Py_ssize_t)self->handle);
47577
4511ecd25634 add the multiprocessing package to fulfill PEP 371
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
406 }
4511ecd25634 add the multiprocessing package to fulfill PEP 371
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
407
4511ecd25634 add the multiprocessing package to fulfill PEP 371
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
408 /*
4511ecd25634 add the multiprocessing package to fulfill PEP 371
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
409 * Getters and setters
4511ecd25634 add the multiprocessing package to fulfill PEP 371
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
410 */
4511ecd25634 add the multiprocessing package to fulfill PEP 371
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
411
4511ecd25634 add the multiprocessing package to fulfill PEP 371
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
412 static PyObject *
4511ecd25634 add the multiprocessing package to fulfill PEP 371
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
413 connection_closed(ConnectionObject *self, void *closure)
4511ecd25634 add the multiprocessing package to fulfill PEP 371
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
414 {
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
415 return PyBool_FromLong((long)(self->handle == INVALID_HANDLE_VALUE));
47577
4511ecd25634 add the multiprocessing package to fulfill PEP 371
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
416 }
4511ecd25634 add the multiprocessing package to fulfill PEP 371
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
417
4511ecd25634 add the multiprocessing package to fulfill PEP 371
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
418 static PyObject *
4511ecd25634 add the multiprocessing package to fulfill PEP 371
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
419 connection_readable(ConnectionObject *self, void *closure)
4511ecd25634 add the multiprocessing package to fulfill PEP 371
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
420 {
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
421 return PyBool_FromLong((long)(self->flags & READABLE));
47577
4511ecd25634 add the multiprocessing package to fulfill PEP 371
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
422 }
4511ecd25634 add the multiprocessing package to fulfill PEP 371
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
423
4511ecd25634 add the multiprocessing package to fulfill PEP 371
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
424 static PyObject *
4511ecd25634 add the multiprocessing package to fulfill PEP 371
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
425 connection_writable(ConnectionObject *self, void *closure)
4511ecd25634 add the multiprocessing package to fulfill PEP 371
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
426 {
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
427 return PyBool_FromLong((long)(self->flags & WRITABLE));
47577
4511ecd25634 add the multiprocessing package to fulfill PEP 371
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
428 }
4511ecd25634 add the multiprocessing package to fulfill PEP 371
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
429
4511ecd25634 add the multiprocessing package to fulfill PEP 371
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
430 /*
4511ecd25634 add the multiprocessing package to fulfill PEP 371
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
431 * Tables
4511ecd25634 add the multiprocessing package to fulfill PEP 371
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
432 */
4511ecd25634 add the multiprocessing package to fulfill PEP 371
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
433
4511ecd25634 add the multiprocessing package to fulfill PEP 371
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
434 static PyMethodDef connection_methods[] = {
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
435 {"send_bytes", (PyCFunction)connection_sendbytes, METH_VARARGS,
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
436 "send the byte data from a readable buffer-like object"},
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
437 {"recv_bytes", (PyCFunction)connection_recvbytes, METH_VARARGS,
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
438 "receive byte data as a string"},
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
439 {"recv_bytes_into",(PyCFunction)connection_recvbytes_into,METH_VARARGS,
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
440 "receive byte data into a writeable buffer-like object\n"
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
441 "returns the number of bytes read"},
47577
4511ecd25634 add the multiprocessing package to fulfill PEP 371
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
442
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
443 {"send", (PyCFunction)connection_send_obj, METH_O,
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
444 "send a (picklable) object"},
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
445 {"recv", (PyCFunction)connection_recv_obj, METH_NOARGS,
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
446 "receive a (picklable) object"},
47577
4511ecd25634 add the multiprocessing package to fulfill PEP 371
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
447
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
448 {"poll", (PyCFunction)connection_poll, METH_VARARGS,
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
449 "whether there is any input available to be read"},
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
450 {"fileno", (PyCFunction)connection_fileno, METH_NOARGS,
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
451 "file descriptor or handle of the connection"},
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
452 {"close", (PyCFunction)connection_close, METH_NOARGS,
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
453 "close the connection"},
47577
4511ecd25634 add the multiprocessing package to fulfill PEP 371
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
454
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
455 {NULL} /* Sentinel */
47577
4511ecd25634 add the multiprocessing package to fulfill PEP 371
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
456 };
4511ecd25634 add the multiprocessing package to fulfill PEP 371
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
457
4511ecd25634 add the multiprocessing package to fulfill PEP 371
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
458 static PyGetSetDef connection_getset[] = {
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
459 {"closed", (getter)connection_closed, NULL,
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
460 "True if the connection is closed", NULL},
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
461 {"readable", (getter)connection_readable, NULL,
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
462 "True if the connection is readable", NULL},
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
463 {"writable", (getter)connection_writable, NULL,
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
464 "True if the connection is writable", NULL},
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
465 {NULL}
47577
4511ecd25634 add the multiprocessing package to fulfill PEP 371
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
466 };
4511ecd25634 add the multiprocessing package to fulfill PEP 371
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
467
4511ecd25634 add the multiprocessing package to fulfill PEP 371
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
468 /*
4511ecd25634 add the multiprocessing package to fulfill PEP 371
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
469 * Connection type
4511ecd25634 add the multiprocessing package to fulfill PEP 371
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
470 */
4511ecd25634 add the multiprocessing package to fulfill PEP 371
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
471
4511ecd25634 add the multiprocessing package to fulfill PEP 371
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
472 PyDoc_STRVAR(connection_doc,
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
473 "Connection type whose constructor signature is\n\n"
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
474 " Connection(handle, readable=True, writable=True).\n\n"
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
475 "The constructor does *not* duplicate the handle.");
47577
4511ecd25634 add the multiprocessing package to fulfill PEP 371
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
476
4511ecd25634 add the multiprocessing package to fulfill PEP 371
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
477 PyTypeObject CONNECTION_TYPE = {
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
478 PyVarObject_HEAD_INIT(NULL, 0)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
479 /* tp_name */ "_multiprocessing." CONNECTION_NAME,
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
480 /* tp_basicsize */ sizeof(ConnectionObject),
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
481 /* tp_itemsize */ 0,
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
482 /* tp_dealloc */ (destructor)connection_dealloc,
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
483 /* tp_print */ 0,
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
484 /* tp_getattr */ 0,
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
485 /* tp_setattr */ 0,
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
486 /* tp_compare */ 0,
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
487 /* tp_repr */ (reprfunc)connection_repr,
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
488 /* tp_as_number */ 0,
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
489 /* tp_as_sequence */ 0,
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
490 /* tp_as_mapping */ 0,
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
491 /* tp_hash */ 0,
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
492 /* tp_call */ 0,
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
493 /* tp_str */ 0,
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
494 /* tp_getattro */ 0,
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
495 /* tp_setattro */ 0,
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
496 /* tp_as_buffer */ 0,
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
497 /* tp_flags */ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE |
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
498 Py_TPFLAGS_HAVE_WEAKREFS,
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
499 /* tp_doc */ connection_doc,
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
500 /* tp_traverse */ 0,
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
501 /* tp_clear */ 0,
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
502 /* tp_richcompare */ 0,
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
503 /* tp_weaklistoffset */ offsetof(ConnectionObject, weakreflist),
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
504 /* tp_iter */ 0,
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
505 /* tp_iternext */ 0,
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
506 /* tp_methods */ connection_methods,
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
507 /* tp_members */ 0,
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
508 /* tp_getset */ connection_getset,
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
509 /* tp_base */ 0,
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
510 /* tp_dict */ 0,
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
511 /* tp_descr_get */ 0,
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
512 /* tp_descr_set */ 0,
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
513 /* tp_dictoffset */ 0,
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
514 /* tp_init */ 0,
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
515 /* tp_alloc */ 0,
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 52445
diff changeset
516 /* tp_new */ connection_new,
47577
4511ecd25634 add the multiprocessing package to fulfill PEP 371
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
517 };
4511ecd25634 add the multiprocessing package to fulfill PEP 371
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
518
4511ecd25634 add the multiprocessing package to fulfill PEP 371
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
519 #endif /* CONNECTION_H */