@@ -27,7 +27,9 @@ bool _hasattr(object o, const char* name)
2727 return PyObject_HasAttrString (o.ptr (), name);
2828}
2929
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)
3133{
3234 try
3335 {
@@ -61,11 +63,10 @@ void _sock_connect_cb(object pymod_socket, object fut, object sock, object addr)
6163 }
6264}
6365
64- void _sock_accept (event_loop& loop, object fut, object sock)
66+ void event_loop:: _sock_accept (event_loop& loop, object fut, object sock)
6567{
6668 int fd = extract<int >(sock.attr (" fileno" )());
67- object conn;
68- object address;
69+ object conn, address;
6970 try
7071 {
7172 object ret = sock.attr (" accept" )();
@@ -80,9 +81,7 @@ void _sock_accept(event_loop& loop, object fut, object sock)
8081 || PyErr_ExceptionMatches (PyExc_InterruptedError))
8182 {
8283 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));
8685 }
8786 else if (PyErr_ExceptionMatches (PyExc_SystemExit)
8887 || PyErr_ExceptionMatches (PyExc_KeyboardInterrupt))
@@ -94,43 +93,6 @@ void _sock_accept(event_loop& loop, object fut, object sock)
9493 PyErr_Clear ();
9594 fut.attr (" set_exception" )(std::current_exception ());
9695 }
97- }
98- }
99-
100- }
101-
102- void event_loop::_add_reader_or_writer (int fd, object f, int key)
103- {
104- // add descriptor
105- if (_descriptor_map.find (key) == _descriptor_map.end ())
106- {
107- _descriptor_map.emplace (key,
108- std::move (std::make_unique<boost::asio::posix::stream_descriptor>(_strand.context (), fd))
109- );
110- }
111-
112- _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)
114- {
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);
123- }));
124- return ;
125- }
126-
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);
13496 }
13597}
13698
@@ -155,14 +117,14 @@ object event_loop::sock_recv(object sock, size_t nbytes)
155117{
156118 int fd = extract<int >(sock.attr (" fileno" )());
157119 int fd_dup = dup (fd);
158- object py_fut = _pymod_concurrent_future.attr (" Future" )();
159- add_reader (fd_dup, make_function (
160- [py_fut, nbytes, fd=fd_dup] (object obj) {
120+ object py_fut = _py_wrap_future ( _pymod_concurrent_future.attr (" Future" )() );
121+ _async_wait_fd (fd_dup,
122+ [py_fut, nbytes, fd=fd_dup] {
161123 std::vector<char > buffer (nbytes);
162124 read (fd, buffer.data (), nbytes);
163125 py_fut.attr (" set_result" )(object (handle<>(PyBytes_FromStringAndSize (buffer.data (), nbytes))));
164126 },
165- default_call_policies (), boost::mpl::vector< void , object>() ));
127+ _read_key (fd ));
166128 return py_fut;
167129}
168130
@@ -171,14 +133,14 @@ object event_loop::sock_recv_into(object sock, object buffer)
171133 int fd = extract<int >(sock.attr (" fileno" )());
172134 int fd_dup = dup (fd);
173135 ssize_t nbytes = len (buffer);
174- object py_fut = _pymod_concurrent_future.attr (" Future" )();
175- add_reader (fd_dup, make_function (
176- [py_fut, nbytes, fd=fd_dup] (object obj) {
136+ object py_fut = _py_wrap_future ( _pymod_concurrent_future.attr (" Future" )() );
137+ _async_wait_fd (fd_dup,
138+ [py_fut, nbytes, fd=fd_dup] {
177139 std::vector<char > buffer (nbytes);
178140 ssize_t nbytes_read = read (fd, buffer.data (), nbytes);
179141 py_fut.attr (" set_result" )(nbytes_read);
180- },
181- default_call_policies (), boost::mpl::vector< void , object>() ));
142+ },
143+ _read_key (fd ));
182144 return py_fut;
183145}
184146
@@ -188,13 +150,13 @@ object event_loop::sock_sendall(object sock, object data)
188150 int fd_dup = dup (fd);
189151 char const * py_str = extract<char const *>(data.attr (" decode" )());
190152 ssize_t py_str_len = len (data);
191- 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) {
153+ object py_fut = _py_wrap_future ( _pymod_concurrent_future.attr (" Future" )() );
154+ _async_wait_fd (fd_dup,
155+ [py_fut, fd, py_str, py_str_len] {
194156 write (fd, py_str, py_str_len);
195157 py_fut.attr (" set_result" )(object ());
196- },
197- default_call_policies (), boost::mpl::vector< void , object>() ));
158+ },
159+ _write_key (fd ));
198160 return py_fut;
199161}
200162
@@ -205,22 +167,20 @@ object event_loop::sock_connect(object sock, object address)
205167 {
206168 // TODO: _ensure_resolve
207169 }
208- object fut = _pymod_concurrent_future.attr (" Future" )();
170+ object py_fut = _py_wrap_future ( _pymod_concurrent_future.attr (" Future" )() );
209171 int fd = extract<int >(sock.attr (" fileno" )());
210172 try
211173 {
212174 sock.attr (" connect" )(address);
213- fut .attr (" set_result" )(object ());
175+ py_fut .attr (" set_result" )(object ());
214176 }
215177 catch (const error_already_set& e)
216178 {
217179 if (PyErr_ExceptionMatches (PyExc_BlockingIOError)
218180 || PyErr_ExceptionMatches (PyExc_InterruptedError))
219181 {
220182 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>()));
183+ _async_wait_fd (dup (fd), bind (_sock_connect_cb, _pymod_socket, py_fut, sock, address), _write_key (fd));
224184 }
225185 else if (PyErr_ExceptionMatches (PyExc_SystemExit)
226186 || PyErr_ExceptionMatches (PyExc_KeyboardInterrupt))
@@ -230,17 +190,17 @@ object event_loop::sock_connect(object sock, object address)
230190 else
231191 {
232192 PyErr_Clear ();
233- fut .attr (" set_exception" )(std::current_exception ());
193+ py_fut .attr (" set_exception" )(std::current_exception ());
234194 }
235195 }
236- return fut ;
196+ return py_fut ;
237197}
238198
239199object event_loop::sock_accept (object sock)
240200{
241- object fut = _pymod_concurrent_future.attr (" Future" )();
242- _sock_accept (*this , fut , sock);
243- return fut ;
201+ object py_fut = _py_wrap_future ( _pymod_concurrent_future.attr (" Future" )() );
202+ _sock_accept (*this , py_fut , sock);
203+ return py_fut ;
244204}
245205
246206// TODO: implement this
@@ -262,27 +222,23 @@ object event_loop::start_tls(object transport, object protocol, object sslcontex
262222
263223object event_loop::getaddrinfo (object host, int port, int family, int type, int proto, int flags)
264224{
265- 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) {
225+ object py_fut = _py_wrap_future ( _pymod_concurrent_future.attr (" Future" )() );
226+ _strand. post (
227+ [this , py_fut, host, port, family, type, proto, flags] {
268228 object res = _pymod_socket.attr (" getaddrinfo" )(host, port, family, type, proto, flags);
269229 py_fut.attr (" set_result" )(res);
270- },
271- default_call_policies (),
272- boost::mpl::vector<void , object>()));
230+ });
273231 return py_fut;
274232}
275233
276234object event_loop::getnameinfo (object sockaddr, int flags)
277235{
278- object py_fut = _pymod_concurrent_future.attr (" Future" )();
279- call_soon ( make_function (
280- [this , py_fut, sockaddr, flags] (object obj) {
236+ object py_fut = _py_wrap_future ( _pymod_concurrent_future.attr (" Future" )() );
237+ _strand. post (
238+ [this , py_fut, sockaddr, flags] {
281239 object res = _pymod_socket.attr (" getnameinfo" )(sockaddr, flags);
282240 py_fut.attr (" set_result" )(res);
283- },
284- default_call_policies (),
285- boost::mpl::vector<void , object>()));
241+ });
286242 return py_fut;
287243}
288244
@@ -345,7 +301,7 @@ void event_loop::default_exception_handler(object context)
345301 dict kwargs;
346302 args.append (str (" \n " ).join (log_lines));
347303 kwargs[" exc_info" ] = exc_info;
348- _pymod_logger .attr (" error" )(tuple (args), **kwargs);
304+ _py_logger .attr (" error" )(tuple (args), **kwargs);
349305}
350306
351307void event_loop::call_exception_handler (object context)
@@ -370,7 +326,7 @@ void event_loop::call_exception_handler(object context)
370326 dict kwargs;
371327 args.append (str (" Exception in default exception handler" ));
372328 kwargs[" exc_info" ] = true ;
373- _pymod_logger .attr (" error" )(tuple (args), **kwargs);
329+ _py_logger .attr (" error" )(tuple (args), **kwargs);
374330 }
375331 }
376332 }
@@ -416,7 +372,7 @@ void event_loop::call_exception_handler(object context)
416372 boost::python::dict kwargs;
417373 args.append (str (" Exception in default exception handler" ));
418374 kwargs[" exc_info" ] = true ;
419- _pymod_logger .attr (" error" )(tuple (args), **kwargs);
375+ _py_logger .attr (" error" )(tuple (args), **kwargs);
420376 }
421377 }
422378 }
0 commit comments