Skip to content

Commit afcccbc

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

File tree

2 files changed

+50
-1
lines changed

2 files changed

+50
-1
lines changed

include/boost/python/eventloop.hpp

Lines changed: 3 additions & 1 deletion
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,8 @@ 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);
163164

165+
}}} // namespace boost::python
164166

165167
# endif

src/eventloop.cpp

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -398,5 +398,52 @@ 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+
class_<event_loop, boost::noncopyable>("BoostAsioEventLoop", init<boost::asio::io_context::strand&>())
404+
.def("call_soon", &event_loop::call_soon)
405+
.def("call_soon_thread_safe", &event_loop::call_soon_thread_safe)
406+
.def("call_later", &event_loop::call_later)
407+
.def("call_at", &event_loop::call_at)
408+
.def("time", &event_loop::time)
409+
.def("add_reader", &event_loop::add_reader)
410+
.def("remove_reader", &event_loop::remove_reader)
411+
.def("add_writer", &event_loop::add_writer)
412+
.def("remove_writer", &event_loop::remove_writer)
413+
.def("sock_recv", &event_loop::sock_recv)
414+
.def("sock_recv_into", &event_loop::sock_recv_into)
415+
.def("sock_sendall", &event_loop::sock_sendall)
416+
.def("sock_connect", &event_loop::sock_connect)
417+
.def("sock_accept", &event_loop::sock_accept)
418+
.def("sock_sendfile", &event_loop::sock_sendfile)
419+
.def("start_tls", &event_loop::start_tls)
420+
.def("getaddrinfo", &event_loop::getaddrinfo)
421+
.def("getnameinfo", &event_loop::getnameinfo)
422+
.def("set_exception_handler", &event_loop::set_exception_handler)
423+
.def("get_exception_handler", &event_loop::get_exception_handler)
424+
.def("default_exception_handler", &event_loop::default_exception_handler)
425+
.def("call_exception_handler", &event_loop::call_exception_handler);
426+
427+
object asyncio = import("asyncio");
428+
object abstract_policy = asyncio.attr("AbstractEventLoopPolicy");
429+
430+
dict method_dict;
431+
std::shared_ptr<event_loop> p_loop = std::make_shared<event_loop>(strand);
432+
433+
method_dict["get_event_loop"] = make_function(
434+
[p_loop] (object e) {return object(boost::ref(*p_loop));},
435+
default_call_policies(),
436+
boost::mpl::vector<object, object>()
437+
);
438+
439+
object class_boost_policy = call<object>(
440+
(PyObject*)&PyType_Type,
441+
str("BoostEventLoopPolicy"),
442+
boost::python::make_tuple(abstract_policy),
443+
method_dict);
444+
445+
object boost_policy_instance = class_boost_policy.attr("__call__")();
446+
asyncio.attr("set_event_loop_policy")(boost_policy_instance);
447+
}
401448

402449
}}} // namespace boost::python

0 commit comments

Comments
 (0)