Skip to content

Commit 570a387

Browse files
committed
replace make_function with lambda
1 parent 914a18d commit 570a387

File tree

2 files changed

+78
-92
lines changed

2 files changed

+78
-92
lines changed

Diff for: include/boost/python/eventloop.hpp

+39-9
Original file line numberDiff line numberDiff line change
@@ -37,8 +37,7 @@ class event_loop
3737
// TODO: An instance of asyncio.Handle is returned, which can be used later to cancel the callback.
3838
inline void call_soon(object f)
3939
{
40-
_strand.post([f, loop=this] {f();});
41-
return;
40+
_strand.post([f]{f();});
4241
}
4342

4443
// TODO: implement this
@@ -57,22 +56,22 @@ class event_loop
5756

5857
inline void add_reader(int fd, object f)
5958
{
60-
_add_reader_or_writer(fd, f, fd * 2);
59+
_async_wait_fd(fd, f, _read_key(fd));
6160
}
6261

6362
inline void remove_reader(int fd)
6463
{
65-
_remove_reader_or_writer(fd * 2);
64+
_descriptor_map.erase(_read_key(fd));
6665
}
6766

6867
inline void add_writer(int fd, object f)
6968
{
70-
_add_reader_or_writer(fd, f, fd * 2 + 1);
69+
_async_wait_fd(fd, f, _write_key(fd));
7170
}
7271

7372
inline void remove_writer(int fd)
7473
{
75-
_remove_reader_or_writer(fd * 2 + 1);
74+
_descriptor_map.erase(_write_key(fd));
7675
}
7776

7877

@@ -119,16 +118,47 @@ class event_loop
119118
object _pymod_ssl = object();
120119
object _pymod_socket = import("socket");
121120
object _pymod_traceback = import("traceback");
122-
object _pymod_logger = import("asyncio.log").attr("logger");
121+
object _py_wrap_future = import("asyncio").attr("wrap_future");
122+
object _py_logger = import("asyncio.log").attr("logger");
123123
object _pymod_concurrent_future = import("concurrent").attr("futures");
124124
object _exception_handler = object();
125125
boost::asio::io_context::strand _strand;
126126
// read: key = fd * 2 + 0, write: key = fd * 2 + 1
127127
std::unordered_map<int, std::unique_ptr<boost::asio::posix::stream_descriptor>> _descriptor_map;
128128
std::chrono::steady_clock::time_point _created_time;
129129

130-
void _add_reader_or_writer(int fd, object f, int key);
131-
void _remove_reader_or_writer(int key);
130+
inline int _read_key(int fd)
131+
{
132+
return fd * 2;
133+
}
134+
135+
inline int _write_key(int fd)
136+
{
137+
return fd * 2 + 1;
138+
}
139+
140+
template<typename F>
141+
void _async_wait_fd(int fd, F f, int key)
142+
{
143+
// add descriptor
144+
if (_descriptor_map.find(key) == _descriptor_map.end())
145+
{
146+
_descriptor_map.emplace(key,
147+
std::move(std::make_unique<boost::asio::posix::stream_descriptor>(_strand.context(), fd))
148+
);
149+
}
150+
151+
_descriptor_map.find(key)->second->async_wait(boost::asio::posix::descriptor::wait_type::wait_read,
152+
boost::asio::bind_executor(_strand, [this, key, f] (const boost::system::error_code& ec)
153+
{
154+
_descriptor_map.erase(key);
155+
f();
156+
}));
157+
return;
158+
}
159+
160+
static void _sock_connect_cb(object pymod_socket, object fut, object sock, object addr);
161+
static void _sock_accept(event_loop& loop, object fut, object sock);
132162
};
133163

134164
}}}

Diff for: src/eventloop.cpp

+39-83
Original file line numberDiff line numberDiff line change
@@ -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

239199
object 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

263223
object 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

276234
object 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

351307
void 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

Comments
 (0)