14#include <boost/asio/io_context.hpp>
15#include <boost/asio/post.hpp>
17#include <rpc/server.h>
38 template <
typename... Args>
39 explicit Server(Args &&... args);
42 template <
typename FunctorT>
46 template <
typename FunctorT>
51 _server.async_run(worker_threads);
56 #ifdef LIBCARLA_INCLUDED_FROM_UE4
58 TRACE_CPUPROFILER_EVENT_SCOPE_STR(__FUNCTION__);
88 template <
typename C,
typename R,
typename... Args>
92 template <
typename C,
typename R,
typename... Args>
104 template <
typename R,
typename... Args>
114 template <
typename FuncT>
115 static auto WrapSyncCall(boost::asio::io_context &io, FuncT &&functor) {
116 return [&io, functor=std::forward<FuncT>(functor)](
Metadata metadata, Args... args) ->
R {
117 auto task = std::packaged_task<R()>([functor=std::move(functor), args...]() {
118 return functor(args...);
120 if (metadata.IsResponseIgnored()) {
126 auto result = task.get_future();
136template <
typename FuncT>
139 if (metadata.IsResponseIgnored()) {
143 return functor(args...);
152template <
typename ... Args>
154 : _server(
std::forward<Args>(args) ...) {
155 _server.suppress_exceptions(
true);
159template <
typename FunctorT>
168template <
typename FunctorT>
173 Wrapper::WrapAsyncCall(std::forward<FunctorT>(functor)));
carla::rpc::Response< T > R
一个RPC服务器,可以将功能绑定为同步或异步运行。
void SyncRunFor(time_duration duration)
void AsyncRun(size_t worker_threads)
boost::asio::io_context _sync_io_context
void BindSync(const std::string &name, FunctorT &&functor)
void BindAsync(const std::string &name, FunctorT &&functor)
Positive time duration up to milliseconds resolution.
constexpr auto to_chrono() const
auto MoveHandler(FunctorT &&func)
下面是一种hack,用于绕过Asio库的限制,使其能够接受仅可移动的处理程序。 如果Asio试图复制一个仅可移动的处理程序,那么编译时可能不会立即报错
static auto WrapSyncCall(boost::asio::io_context &io, FuncT &&functor)
将functor包装为具有等效签名的函数类型。返回的包装函数。 当调用时,将functor放入io_context;如果客户端同步调用此方法,则等待 已发布任务完成,否则立即返回。
static auto WrapAsyncCall(FuncT &&functor)
将functor包装为具有等效签名的函数类型,