@@ -27,24 +27,27 @@ bool _hasattr(object o, const char* name)
27
27
return PyObject_HasAttrString (o.ptr (), name);
28
28
}
29
29
30
- void _sock_recv_handler (
31
- std::promise<std::vector<char >>& prom_data,
32
- std::promise<size_t >& prom_nbytes_read,
33
- size_t nbytes,
34
- int fd)
30
+ void _sock_recv_handler (object fut, size_t nbytes, int fd)
35
31
{
36
32
std::vector<char > buffer (nbytes);
37
- prom_nbytes_read. set_value ( read (fd, buffer.data (), nbytes) );
38
- prom_data. set_value ( std::move ( buffer));
33
+ read (fd, buffer.data (), nbytes);
34
+ fut. attr ( " set_result " )( object (handle<>( PyBytes_FromStringAndSize ( buffer. data (), nbytes)) ));
39
35
}
40
36
41
- void _sock_send_handler (std::promise< size_t >& prom, int fd, const char *py_str, ssize_t len )
37
+ void _sock_recv_into_handler (object fut, size_t nbytes, int fd )
42
38
{
43
- size_t nwrite = write (fd, py_str, len);
44
- prom.set_value (nwrite);
39
+ std::vector<char > buffer (nbytes);
40
+ ssize_t nbytes_read = read (fd, buffer.data (), nbytes);
41
+ fut.attr (" set_result" )(nbytes_read);
42
+ }
43
+
44
+ void _sock_send_handler (object fut, int fd, const char *py_str, ssize_t len)
45
+ {
46
+ write (fd, py_str, len);
47
+ fut.attr (" set_result" )(object ());
45
48
}
46
49
47
- void _sock_connect_cb (object pymod_socket, std::promise< void >& prom, std::future< void >& fut, object sock, object addr)
50
+ void _sock_connect_cb (object pymod_socket, object fut, object sock, object addr)
48
51
{
49
52
try
50
53
{
@@ -55,7 +58,7 @@ void _sock_connect_cb(object pymod_socket, std::promise<void>& prom, std::future
55
58
PyErr_SetString (PyExc_OSError, " Connect call failed {address}" );
56
59
throw_error_already_set ();
57
60
}
58
- prom. set_value ( );
61
+ fut. attr ( " set_result " )( object () );
59
62
}
60
63
catch (const error_already_set& e)
61
64
{
@@ -73,12 +76,12 @@ void _sock_connect_cb(object pymod_socket, std::promise<void>& prom, std::future
73
76
else
74
77
{
75
78
PyErr_Clear ();
76
- prom. set_exception (std::current_exception ());
79
+ fut. attr ( " set_exception" ) (std::current_exception ());
77
80
}
78
81
}
79
82
}
80
83
81
- void _sock_accept (event_loop& loop, std::promise< object>& prom, std::future<object>& fut, object sock)
84
+ void _sock_accept (event_loop& loop, object fut, object sock)
82
85
{
83
86
int fd = extract<int >(sock.attr (" fileno" )());
84
87
object conn;
@@ -89,7 +92,7 @@ void _sock_accept(event_loop& loop, std::promise<object>& prom, std::future<obje
89
92
conn = ret[0 ];
90
93
address = ret[1 ];
91
94
conn.attr (" setblocking" )(object (false ));
92
- prom. set_value (make_tuple (conn, address));
95
+ fut. attr ( " set_result " ) (make_tuple (conn, address));
93
96
}
94
97
catch (const error_already_set& e)
95
98
{
@@ -98,7 +101,7 @@ void _sock_accept(event_loop& loop, std::promise<object>& prom, std::future<obje
98
101
{
99
102
PyErr_Clear ();
100
103
loop.add_reader (fd, make_function (bind (
101
- _sock_accept, boost::ref (loop), boost::ref (prom), boost::ref ( fut) , sock),
104
+ _sock_accept, boost::ref (loop), fut, sock),
102
105
default_call_policies (), boost::mpl::vector<void , object>()));
103
106
}
104
107
else if (PyErr_ExceptionMatches (PyExc_SystemExit)
@@ -109,22 +112,22 @@ void _sock_accept(event_loop& loop, std::promise<object>& prom, std::future<obje
109
112
else
110
113
{
111
114
PyErr_Clear ();
112
- prom. set_exception (std::current_exception ());
115
+ fut. attr ( " set_exception" ) (std::current_exception ());
113
116
}
114
117
}
115
118
}
116
119
117
- void _getaddrinfo_handler (object pymod_socket, std::promise< object>& prom ,
120
+ void _getaddrinfo_handler (object pymod_socket, object fut ,
118
121
object host, int port, int family, int type, int proto, int flags)
119
122
{
120
123
object res = pymod_socket.attr (" getaddrinfo" )(host, port, family, type, proto, flags);
121
- prom. set_value (res);
124
+ fut. attr ( " set_result " ) (res);
122
125
}
123
126
124
- void _getnameinfo_handler (object pymod_socket, std::promise< object>& prom , object sockaddr, int flags)
127
+ void _getnameinfo_handler (object pymod_socket, object fut , object sockaddr, int flags)
125
128
{
126
129
object res = pymod_socket.attr (" getnameinfo" )(sockaddr, flags);
127
- prom. set_value (res);
130
+ fut. attr ( " set_result " ) (res);
128
131
}
129
132
130
133
}
@@ -193,58 +196,46 @@ void event_loop::call_at(double when, object f)
193
196
object event_loop::sock_recv (object sock, size_t nbytes)
194
197
{
195
198
int fd = extract<int >(sock.attr (" fileno" )());
196
- std::promise<std::vector<char >> prom_data;
197
- std::future<std::vector<char >> fut_data = prom_data.get_future ();
198
- std::promise<size_t > prom_nbytes_read;
199
- std::future<size_t > fut_nbytes_read = prom_nbytes_read.get_future ();
200
- add_reader (fd, make_function (bind (_sock_recv_handler,
201
- boost::ref (prom_data), boost::ref (prom_nbytes_read), nbytes, fd),
199
+ object fut = _pymod_concurrent_future.attr (" Future" )();
200
+ add_reader (fd, make_function (bind (_sock_recv_handler, fut, nbytes, fd),
202
201
default_call_policies (), boost::mpl::vector<void , object>()));
203
- return object (handle<>( PyBytes_FromStringAndSize (fut_data. get (). data (), nbytes))) ;
202
+ return fut ;
204
203
}
205
204
206
- size_t event_loop::sock_recv_into (object sock, object buffer)
205
+ object event_loop::sock_recv_into (object sock, object buffer)
207
206
{
208
207
int fd = extract<int >(sock.attr (" fileno" )());
209
208
ssize_t nbytes = len (buffer);
210
- std::promise<std::vector<char >> prom_data;
211
- std::future<std::vector<char >> fut_data = prom_data.get_future ();
212
- std::promise<size_t > prom_nbytes_read;
213
- std::future<size_t > fut_nbytes_read = prom_nbytes_read.get_future ();
214
- add_reader (fd, make_function (bind (_sock_recv_handler,
215
- boost::ref (prom_data), boost::ref (prom_nbytes_read), nbytes, fd),
209
+ object fut = _pymod_concurrent_future.attr (" Future" )();
210
+ add_reader (fd, make_function (bind (_sock_recv_into_handler, fut, nbytes, fd),
216
211
default_call_policies (), boost::mpl::vector<void , object>()));
217
- buffer = object (handle<>(PyBytes_FromStringAndSize (fut_data.get ().data (), nbytes)));
218
- return fut_nbytes_read.get ();
212
+ return fut;
219
213
}
220
214
221
215
object event_loop::sock_sendall (object sock, object data)
222
216
{
223
217
int fd = extract<int >(sock.attr (" fileno" )());
224
218
char const * py_str = extract<char const *>(data.attr (" decode" )());
225
219
ssize_t py_str_len = len (data);
226
- std::promise<size_t > prom;
227
- std::future<size_t > fut = prom.get_future ();
228
- add_writer (fd, make_function (bind (_sock_send_handler, std::ref (prom), fd, py_str, py_str_len),
220
+ object fut = _pymod_concurrent_future.attr (" Future" )();
221
+ add_writer (fd, make_function (bind (_sock_send_handler, fut, fd, py_str, py_str_len),
229
222
default_call_policies (), boost::mpl::vector<void , object>()));
230
- fut.wait ();
231
- return object ();
223
+ return fut;
232
224
}
233
225
234
- void event_loop::sock_connect (object sock, object address)
226
+ object event_loop::sock_connect (object sock, object address)
235
227
{
236
228
237
229
if (!_hasattr (_pymod_socket, " AF_UNIX" ) || sock.attr (" family" ) != _pymod_socket.attr (" AF_UNIX" ))
238
230
{
239
231
// TODO: _ensure_resolve
240
232
}
241
- std::promise<void > prom;
242
- std::future<void > fut = prom.get_future ();
233
+ object fut = _pymod_concurrent_future.attr (" Future" )();
243
234
int fd = extract<int >(sock.attr (" fileno" )());
244
235
try
245
236
{
246
237
sock.attr (" connect" )(address);
247
- prom. set_value ( );
238
+ fut. attr ( " set_result " )( object () );
248
239
}
249
240
catch (const error_already_set& e)
250
241
{
@@ -253,7 +244,7 @@ void event_loop::sock_connect(object sock, object address)
253
244
{
254
245
PyErr_Clear ();
255
246
add_writer (fd, make_function (bind (
256
- _sock_connect_cb, _pymod_socket, boost::ref (prom), boost::ref ( fut) , sock, address),
247
+ _sock_connect_cb, _pymod_socket, fut, sock, address),
257
248
default_call_policies (), boost::mpl::vector<void , object>()));
258
249
}
259
250
else if (PyErr_ExceptionMatches (PyExc_SystemExit)
@@ -264,55 +255,54 @@ void event_loop::sock_connect(object sock, object address)
264
255
else
265
256
{
266
257
PyErr_Clear ();
267
- prom. set_exception (std::current_exception ());
258
+ fut. attr ( " set_exception" ) (std::current_exception ());
268
259
}
269
260
}
270
- fut. wait () ;
261
+ return fut;
271
262
}
272
263
273
264
object event_loop::sock_accept (object sock)
274
265
{
275
- std::promise<object> prom;
276
- std::future<object> fut = prom.get_future ();
277
- _sock_accept (*this , prom, fut, sock);
278
- return fut.get ();
266
+ object fut = _pymod_concurrent_future.attr (" Future" )();
267
+ _sock_accept (*this , fut, sock);
268
+ return fut;
279
269
}
280
270
281
271
// TODO: implement this
282
- void event_loop::sock_sendfile (object sock, object file, int offset, int count, bool fallback)
272
+ object event_loop::sock_sendfile (object sock, object file, int offset, int count, bool fallback)
283
273
{
284
274
PyErr_SetString (PyExc_NotImplementedError, " Not implemented!" );
285
275
throw_error_already_set ();
276
+ return object ();
286
277
}
287
278
288
279
// TODO: implement this
289
- void event_loop::start_tls (object transport, object protocol, object sslcontext,
280
+ object event_loop::start_tls (object transport, object protocol, object sslcontext,
290
281
bool server_side, object server_hostname, object ssl_handshake_timeout)
291
282
{
292
283
PyErr_SetString (PyExc_NotImplementedError, " Not implemented!" );
293
284
throw_error_already_set ();
285
+ return object ();
294
286
}
295
287
296
288
object event_loop::getaddrinfo (object host, int port, int family, int type, int proto, int flags)
297
289
{
298
- std::promise<object> prom;
299
- std::future<object> fut = prom.get_future ();
290
+ object fut = _pymod_concurrent_future.attr (" Future" )();
300
291
call_soon (make_function (
301
- bind (_getaddrinfo_handler, _pymod_socket, boost::ref (prom) , host, port, family, type, proto, flags),
292
+ bind (_getaddrinfo_handler, _pymod_socket, fut , host, port, family, type, proto, flags),
302
293
default_call_policies (),
303
294
boost::mpl::vector<void , object>()));
304
- return fut. get () ;
295
+ return fut;
305
296
}
306
297
307
298
object event_loop::getnameinfo (object sockaddr, int flags)
308
299
{
309
- std::promise<object> prom;
310
- std::future<object> fut = prom.get_future ();
300
+ object fut = _pymod_concurrent_future.attr (" Future" )();
311
301
call_soon (make_function (
312
- bind (_getnameinfo_handler, _pymod_socket, boost::ref (prom) , sockaddr, flags),
302
+ bind (_getnameinfo_handler, _pymod_socket, fut , sockaddr, flags),
313
303
default_call_policies (),
314
304
boost::mpl::vector<void , object>()));
315
- return fut. get () ;
305
+ return fut;
316
306
}
317
307
318
308
void event_loop::default_exception_handler (object context)
0 commit comments