Skip to content

Commit 29408b0

Browse files
committed
add interface to set default eventloop
1 parent a9efac6 commit 29408b0

File tree

2 files changed

+59
-1
lines changed

2 files changed

+59
-1
lines changed

include/boost/python/eventloop.hpp

+8-1
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
#include <unordered_map>
1313
#include <boost/asio.hpp>
1414
#include <boost/python.hpp>
15+
#include <boost/mpl/vector.hpp>
1516

1617
namespace boost { namespace python { namespace asio {
1718

@@ -159,7 +160,13 @@ class event_loop
159160
static void _sock_accept(event_loop& loop, object fut, object sock);
160161
};
161162

162-
}}} // namespace boost::python
163+
void set_default_event_loop(const boost::asio::io_context::strand& strand);
164+
165+
extern "C"
166+
{
167+
PyObject* PyInit_boost_el();
168+
}
163169

170+
}}} // namespace boost::python
164171

165172
# endif

src/eventloop.cpp

+51
Original file line numberDiff line numberDiff line change
@@ -398,5 +398,56 @@ void event_loop::call_exception_handler(object context)
398398
}
399399
}
400400

401+
void set_default_event_loop(const boost::asio::io_context::strand& strand)
402+
{
403+
import("boost_el");
404+
object asyncio = import("asyncio");
405+
object abstract_policy = asyncio.attr("AbstractEventLoopPolicy");
406+
407+
dict method_dict;
408+
std::shared_ptr<event_loop> p_loop = std::make_shared<event_loop>(strand);
409+
410+
method_dict["get_event_loop"] = make_function(
411+
[p_loop] (object e) {return object(boost::ref(*p_loop));},
412+
default_call_policies(),
413+
boost::mpl::vector<object, object>()
414+
);
415+
416+
object class_boost_policy = call<object>(
417+
(PyObject*)&PyType_Type,
418+
str("BoostEventLoopPolicy"),
419+
boost::python::make_tuple(abstract_policy),
420+
method_dict);
421+
422+
object boost_policy_instance = class_boost_policy.attr("__call__")();
423+
asyncio.attr("set_event_loop_policy")(boost_policy_instance);
424+
}
425+
426+
BOOST_PYTHON_MODULE(boost_el)
427+
{
428+
class_<event_loop, boost::noncopyable>("Eventloop", init<boost::asio::io_context::strand&>())
429+
.def("call_soon", &event_loop::call_soon)
430+
.def("call_soon_thread_safe", &event_loop::call_soon_thread_safe)
431+
.def("call_later", &event_loop::call_later)
432+
.def("call_at", &event_loop::call_at)
433+
.def("time", &event_loop::time)
434+
.def("add_reader", &event_loop::add_reader)
435+
.def("remove_reader", &event_loop::remove_reader)
436+
.def("add_writer", &event_loop::add_writer)
437+
.def("remove_writer", &event_loop::remove_writer)
438+
.def("sock_recv", &event_loop::sock_recv)
439+
.def("sock_recv_into", &event_loop::sock_recv_into)
440+
.def("sock_sendall", &event_loop::sock_sendall)
441+
.def("sock_connect", &event_loop::sock_connect)
442+
.def("sock_accept", &event_loop::sock_accept)
443+
.def("sock_sendfile", &event_loop::sock_sendfile)
444+
.def("start_tls", &event_loop::start_tls)
445+
.def("getaddrinfo", &event_loop::getaddrinfo)
446+
.def("getnameinfo", &event_loop::getnameinfo)
447+
.def("set_exception_handler", &event_loop::set_exception_handler)
448+
.def("get_exception_handler", &event_loop::get_exception_handler)
449+
.def("default_exception_handler", &event_loop::default_exception_handler)
450+
.def("call_exception_handler", &event_loop::call_exception_handler);
451+
}
401452

402453
}}} // namespace boost::python

0 commit comments

Comments
 (0)