@@ -27,7 +27,9 @@ bool _hasattr(object o, const char* name)
27
27
return PyObject_HasAttrString (o.ptr (), name);
28
28
}
29
29
30
- void _sock_connect_cb (object pymod_socket, object fut, object sock, object addr)
30
+ }
31
+
32
+ void event_loop::_sock_connect_cb (object pymod_socket, object fut, object sock, object addr)
31
33
{
32
34
try
33
35
{
@@ -61,11 +63,10 @@ void _sock_connect_cb(object pymod_socket, object fut, object sock, object addr)
61
63
}
62
64
}
63
65
64
- void _sock_accept (event_loop& loop, object fut, object sock)
66
+ void event_loop:: _sock_accept (event_loop& loop, object fut, object sock)
65
67
{
66
68
int fd = extract<int >(sock.attr (" fileno" )());
67
- object conn;
68
- object address;
69
+ object conn, address;
69
70
try
70
71
{
71
72
object ret = sock.attr (" accept" )();
@@ -80,9 +81,7 @@ void _sock_accept(event_loop& loop, object fut, object sock)
80
81
|| PyErr_ExceptionMatches (PyExc_InterruptedError))
81
82
{
82
83
PyErr_Clear ();
83
- loop.add_reader (fd, make_function (bind (
84
- _sock_accept, boost::ref (loop), fut, sock),
85
- default_call_policies (), boost::mpl::vector<void , object>()));
84
+ loop._async_wait_fd (fd, bind (_sock_accept, boost::ref (loop), fut, sock), loop._write_key (fd));
86
85
}
87
86
else if (PyErr_ExceptionMatches (PyExc_SystemExit)
88
87
|| PyErr_ExceptionMatches (PyExc_KeyboardInterrupt))
@@ -94,12 +93,11 @@ void _sock_accept(event_loop& loop, object fut, object sock)
94
93
PyErr_Clear ();
95
94
fut.attr (" set_exception" )(std::current_exception ());
96
95
}
97
- }
98
- }
99
-
96
+ }
100
97
}
101
98
102
- void event_loop::_add_reader_or_writer (int fd, object f, int key)
99
+ template <typename F>
100
+ void event_loop::_async_wait_fd (int fd, F f, int key)
103
101
{
104
102
// add descriptor
105
103
if (_descriptor_map.find (key) == _descriptor_map.end ())
@@ -110,30 +108,14 @@ void event_loop::_add_reader_or_writer(int fd, object f, int key)
110
108
}
111
109
112
110
_descriptor_map.find (key)->second ->async_wait (boost::asio::posix::descriptor::wait_type::wait_read,
113
- boost::asio::bind_executor (_strand, [key, f, loop= this ] (const boost::system ::error_code& ec)
111
+ boost::asio::bind_executor (_strand, [this , key, f ] (const boost::system ::error_code& ec)
114
112
{
115
- // move descriptor
116
- auto iter = loop->_descriptor_map .find (key);
117
- if (iter != loop->_descriptor_map .end ())
118
- {
119
- iter->second ->release ();
120
- loop->_descriptor_map .erase (iter);
121
- }
122
- loop->call_soon (f);
113
+ _descriptor_map.erase (key);
114
+ f ();
123
115
}));
124
116
return ;
125
117
}
126
118
127
- void event_loop::_remove_reader_or_writer (int key)
128
- {
129
- auto iter = _descriptor_map.find (key);
130
- if (iter != _descriptor_map.end ())
131
- {
132
- iter->second ->release ();
133
- _descriptor_map.erase (iter);
134
- }
135
- }
136
-
137
119
void event_loop::call_later (double delay, object f)
138
120
{
139
121
auto p_timer = std::make_shared<boost::asio::steady_timer>(_strand.context (),
@@ -156,13 +138,13 @@ object event_loop::sock_recv(object sock, size_t nbytes)
156
138
int fd = extract<int >(sock.attr (" fileno" )());
157
139
int fd_dup = dup (fd);
158
140
object py_fut = _pymod_concurrent_future.attr (" Future" )();
159
- add_reader (fd_dup, make_function (
160
- [py_fut, nbytes, fd=fd_dup] (object obj) {
141
+ _async_wait_fd (fd_dup,
142
+ [py_fut, nbytes, fd=fd_dup] {
161
143
std::vector<char > buffer (nbytes);
162
144
read (fd, buffer.data (), nbytes);
163
145
py_fut.attr (" set_result" )(object (handle<>(PyBytes_FromStringAndSize (buffer.data (), nbytes))));
164
146
},
165
- default_call_policies (), boost::mpl::vector< void , object>() ));
147
+ _read_key (fd ));
166
148
return py_fut;
167
149
}
168
150
@@ -172,13 +154,13 @@ object event_loop::sock_recv_into(object sock, object buffer)
172
154
int fd_dup = dup (fd);
173
155
ssize_t nbytes = len (buffer);
174
156
object py_fut = _pymod_concurrent_future.attr (" Future" )();
175
- add_reader (fd_dup, make_function (
176
- [py_fut, nbytes, fd=fd_dup] (object obj) {
157
+ _async_wait_fd (fd_dup,
158
+ [py_fut, nbytes, fd=fd_dup] {
177
159
std::vector<char > buffer (nbytes);
178
160
ssize_t nbytes_read = read (fd, buffer.data (), nbytes);
179
161
py_fut.attr (" set_result" )(nbytes_read);
180
- },
181
- default_call_policies (), boost::mpl::vector< void , object>() ));
162
+ },
163
+ _read_key (fd ));
182
164
return py_fut;
183
165
}
184
166
@@ -189,12 +171,12 @@ object event_loop::sock_sendall(object sock, object data)
189
171
char const * py_str = extract<char const *>(data.attr (" decode" )());
190
172
ssize_t py_str_len = len (data);
191
173
object py_fut = _pymod_concurrent_future.attr (" Future" )();
192
- add_writer (fd_dup, make_function (
193
- [py_fut, fd, py_str, py_str_len] (object obj) {
174
+ _async_wait_fd (fd_dup,
175
+ [py_fut, fd, py_str, py_str_len] {
194
176
write (fd, py_str, py_str_len);
195
177
py_fut.attr (" set_result" )(object ());
196
- },
197
- default_call_policies (), boost::mpl::vector< void , object>() ));
178
+ },
179
+ _write_key (fd ));
198
180
return py_fut;
199
181
}
200
182
@@ -205,22 +187,20 @@ object event_loop::sock_connect(object sock, object address)
205
187
{
206
188
// TODO: _ensure_resolve
207
189
}
208
- object fut = _pymod_concurrent_future.attr (" Future" )();
190
+ object py_fut = _pymod_concurrent_future.attr (" Future" )();
209
191
int fd = extract<int >(sock.attr (" fileno" )());
210
192
try
211
193
{
212
194
sock.attr (" connect" )(address);
213
- fut .attr (" set_result" )(object ());
195
+ py_fut .attr (" set_result" )(object ());
214
196
}
215
197
catch (const error_already_set& e)
216
198
{
217
199
if (PyErr_ExceptionMatches (PyExc_BlockingIOError)
218
200
|| PyErr_ExceptionMatches (PyExc_InterruptedError))
219
201
{
220
202
PyErr_Clear ();
221
- add_writer (dup (fd), make_function (bind (
222
- _sock_connect_cb, _pymod_socket, fut, sock, address),
223
- default_call_policies (), boost::mpl::vector<void , object>()));
203
+ _async_wait_fd (dup (fd), bind (_sock_connect_cb, _pymod_socket, py_fut, sock, address), _write_key (fd));
224
204
}
225
205
else if (PyErr_ExceptionMatches (PyExc_SystemExit)
226
206
|| PyErr_ExceptionMatches (PyExc_KeyboardInterrupt))
@@ -230,17 +210,17 @@ object event_loop::sock_connect(object sock, object address)
230
210
else
231
211
{
232
212
PyErr_Clear ();
233
- fut .attr (" set_exception" )(std::current_exception ());
213
+ py_fut .attr (" set_exception" )(std::current_exception ());
234
214
}
235
215
}
236
- return fut ;
216
+ return py_fut ;
237
217
}
238
218
239
219
object event_loop::sock_accept (object sock)
240
220
{
241
- object fut = _pymod_concurrent_future.attr (" Future" )();
242
- _sock_accept (*this , fut , sock);
243
- return fut ;
221
+ object py_fut = _pymod_concurrent_future.attr (" Future" )();
222
+ _sock_accept (*this , py_fut , sock);
223
+ return py_fut ;
244
224
}
245
225
246
226
// TODO: implement this
@@ -263,26 +243,22 @@ object event_loop::start_tls(object transport, object protocol, object sslcontex
263
243
object event_loop::getaddrinfo (object host, int port, int family, int type, int proto, int flags)
264
244
{
265
245
object py_fut = _pymod_concurrent_future.attr (" Future" )();
266
- call_soon ( make_function (
267
- [this , py_fut, host, port, family, type, proto, flags] (object obj) {
246
+ _strand. post (
247
+ [this , py_fut, host, port, family, type, proto, flags] {
268
248
object res = _pymod_socket.attr (" getaddrinfo" )(host, port, family, type, proto, flags);
269
249
py_fut.attr (" set_result" )(res);
270
- },
271
- default_call_policies (),
272
- boost::mpl::vector<void , object>()));
250
+ });
273
251
return py_fut;
274
252
}
275
253
276
254
object event_loop::getnameinfo (object sockaddr, int flags)
277
255
{
278
256
object py_fut = _pymod_concurrent_future.attr (" Future" )();
279
- call_soon ( make_function (
280
- [this , py_fut, sockaddr, flags] (object obj) {
257
+ _strand. post (
258
+ [this , py_fut, sockaddr, flags] {
281
259
object res = _pymod_socket.attr (" getnameinfo" )(sockaddr, flags);
282
260
py_fut.attr (" set_result" )(res);
283
- },
284
- default_call_policies (),
285
- boost::mpl::vector<void , object>()));
261
+ });
286
262
return py_fut;
287
263
}
288
264
0 commit comments