diff --git a/src/agrpc/detail/register_awaitable_request_handler.hpp b/src/agrpc/detail/register_awaitable_request_handler.hpp index ea198771..68309da6 100644 --- a/src/agrpc/detail/register_awaitable_request_handler.hpp +++ b/src/agrpc/detail/register_awaitable_request_handler.hpp @@ -34,6 +34,7 @@ struct AwaitableRequestHandlerOperation using typename Base::Allocator; using typename Base::RefCountGuard; using typename Base::RPCRequest; + using typename Base::ServerRPCExecutor; using typename Base::Service; using Awaitable = detail::RebindCoroutineT().invoke( @@ -42,10 +43,9 @@ struct AwaitableRequestHandlerOperation using UseAwaitable = detail::CoroutineCompletionTokenT; template - AwaitableRequestHandlerOperation(agrpc::GrpcContext& grpc_context, Service& service, + AwaitableRequestHandlerOperation(const ServerRPCExecutor& executor, Service& service, RequestHandler&& request_handler, Ch&& completion_handler) - : Base(grpc_context, service, static_cast(request_handler), - static_cast(completion_handler), + : Base(executor, service, static_cast(request_handler), static_cast(completion_handler), &detail::register_request_handler_asio_do_complete) { initiate(); @@ -54,7 +54,7 @@ struct AwaitableRequestHandlerOperation void initiate() { this->increment_ref_count(); - asio::co_spawn(asio::get_associated_executor(this->completion_handler(), this->grpc_context()), + asio::co_spawn(asio::get_associated_executor(this->completion_handler(), this->get_executor()), perform_request_and_repeat(), [g = RefCountGuard{*this}](std::exception_ptr eptr) { @@ -76,7 +76,7 @@ struct AwaitableRequestHandlerOperation Awaitable perform_request_and_repeat() { - auto rpc = detail::ServerRPCContextBaseAccess::construct(this->grpc_context().get_executor()); + auto rpc = detail::ServerRPCContextBaseAccess::construct(this->get_executor()); RPCRequest req; if (!co_await req.start(rpc, this->service(), use_awaitable())) { diff --git a/src/agrpc/detail/register_request_handler_asio_base.hpp b/src/agrpc/detail/register_request_handler_asio_base.hpp index 7a516175..d631e75e 100644 --- a/src/agrpc/detail/register_request_handler_asio_base.hpp +++ b/src/agrpc/detail/register_request_handler_asio_base.hpp @@ -67,22 +67,23 @@ class RegisterRequestHandlerOperationAsioBase }; public: + using typename Base::ServerRPCExecutor; using typename Base::Service; - using Executor = detail::AssociatedExecutorT; + using Executor = detail::AssociatedExecutorT; using Allocator = detail::AssociatedAllocatorT; using RPCRequest = detail::RPCRequest; using RefCountGuard = detail::ScopeGuard; template - RegisterRequestHandlerOperationAsioBase(agrpc::GrpcContext& grpc_context, Service& service, + RegisterRequestHandlerOperationAsioBase(const ServerRPCExecutor& executor, Service& service, RequestHandler&& request_handler, Ch&& completion_handler, detail::OperationOnComplete on_complete) - : Base(grpc_context, service, static_cast(request_handler)), - WorkTracker(exec::get_executor(completion_handler)), + : Base(executor, service, static_cast(request_handler)), detail::QueueableOperationBase(on_complete), + WorkTracker(exec::get_executor(completion_handler)), completion_handler_(static_cast(completion_handler)) { - grpc_context.work_started(); + this->grpc_context().work_started(); this->stop_context_.emplace(exec::get_stop_token(completion_handler_)); } @@ -100,17 +101,18 @@ struct RegisterRequestHandlerInitiator { template void operator()(CompletionHandler&& completion_handler, const typename ServerRPC::executor_type& executor, - detail::GetServerRPCServiceT& service, RequestHandler&& request_handler) const + RequestHandler&& request_handler) const { using Ch = detail::RemoveCrefT; using DecayedRequestHandler = detail::RemoveCrefT; - auto& grpc_context = detail::query_grpc_context(executor); const auto allocator = exec::get_allocator(completion_handler); detail::allocate>( - allocator, grpc_context, service, static_cast(request_handler), + allocator, executor, service_, static_cast(request_handler), static_cast(completion_handler)) .release(); } + + detail::GetServerRPCServiceT& service_; }; template diff --git a/src/agrpc/detail/register_request_handler_base.hpp b/src/agrpc/detail/register_request_handler_base.hpp index 7c10de33..70ab49cb 100644 --- a/src/agrpc/detail/register_request_handler_base.hpp +++ b/src/agrpc/detail/register_request_handler_base.hpp @@ -45,12 +45,11 @@ template struct RegisterRequestHandlerOperationBase { using Service = detail::GetServerRPCServiceT; + using ServerRPCExecutor = typename ServerRPC::executor_type; - RegisterRequestHandlerOperationBase(agrpc::GrpcContext& grpc_context, Service& service, + RegisterRequestHandlerOperationBase(const ServerRPCExecutor& executor, Service& service, RequestHandler&& request_handler) - : grpc_context_(grpc_context), - service_(service), - request_handler_(static_cast(request_handler)) + : executor_(executor), service_(service), request_handler_(static_cast(request_handler)) { } @@ -61,11 +60,13 @@ struct RegisterRequestHandlerOperationBase void stop() noexcept { stop_context_.stop(); } - agrpc::GrpcContext& grpc_context() const noexcept { return grpc_context_; } + agrpc::GrpcContext& grpc_context() const noexcept { return detail::query_grpc_context(executor_); } + + const ServerRPCExecutor& get_executor() const noexcept { return executor_; } Service& service() const noexcept { return service_; } - const RequestHandler& request_handler() const noexcept { return request_handler_; } + RequestHandler& request_handler() noexcept { return request_handler_; } void set_error(std::exception_ptr&& eptr) noexcept { @@ -81,7 +82,7 @@ struct RegisterRequestHandlerOperationBase [[nodiscard]] bool decrement_ref_count() noexcept { return 0 == --reference_count_; } - agrpc::GrpcContext& grpc_context_; + ServerRPCExecutor executor_; Service& service_; std::atomic_size_t reference_count_{}; std::exception_ptr eptr_{}; diff --git a/src/agrpc/detail/register_sender_request_handler.hpp b/src/agrpc/detail/register_sender_request_handler.hpp index 52124832..c8e5c822 100644 --- a/src/agrpc/detail/register_sender_request_handler.hpp +++ b/src/agrpc/detail/register_sender_request_handler.hpp @@ -71,7 +71,7 @@ struct RegisterRequestHandlerSenderOperationBase { RegisterRequestHandlerSenderOperationBase(RequestHandlerSender&& sender, RegisterRequestHandlerOperationComplete::Complete complete) - : RegisterRequestHandlerOperationBase{sender.grpc_context_, + : RegisterRequestHandlerOperationBase{sender.grpc_context_.get_executor(), sender.service_, static_cast( sender.request_handler_)}, @@ -224,7 +224,7 @@ struct RequestHandlerOperation explicit RequestHandlerOperation(RegisterRequestHandlerSenderOperationBase& operation, const Allocator& allocator) : base_(operation), impl1_(operation.request_handler()), - rpc_(detail::ServerRPCContextBaseAccess::construct(operation.grpc_context().get_executor())), + rpc_(detail::ServerRPCContextBaseAccess::construct(operation.get_executor())), impl2_(detail::SecondThenVariadic{}, allocator, std::in_place_type, detail::InplaceWithFunction{}, [&] diff --git a/src/agrpc/detail/register_yield_request_handler.hpp b/src/agrpc/detail/register_yield_request_handler.hpp index c48b64bb..d361e83e 100644 --- a/src/agrpc/detail/register_yield_request_handler.hpp +++ b/src/agrpc/detail/register_yield_request_handler.hpp @@ -49,13 +49,13 @@ struct YieldRequestHandlerOperation using typename Base::Allocator; using typename Base::RefCountGuard; using typename Base::RPCRequest; + using typename Base::ServerRPCExecutor; using typename Base::Service; template - YieldRequestHandlerOperation(agrpc::GrpcContext& grpc_context, Service& service, RequestHandler&& request_handler, + YieldRequestHandlerOperation(const ServerRPCExecutor& executor, Service& service, RequestHandler&& request_handler, Ch&& completion_handler) - : Base(grpc_context, service, static_cast(request_handler), - static_cast(completion_handler), + : Base(executor, service, static_cast(request_handler), static_cast(completion_handler), &detail::register_request_handler_asio_do_complete) { initiate(); @@ -64,7 +64,7 @@ struct YieldRequestHandlerOperation void initiate() { this->increment_ref_count(); - detail::spawn(asio::get_associated_executor(this->completion_handler(), this->grpc_context()), + detail::spawn(asio::get_associated_executor(this->completion_handler(), this->get_executor()), [g = RefCountGuard{*this}](const auto& yield) { static_cast(g.get().self_).perform_request_and_repeat(yield); @@ -82,7 +82,7 @@ struct YieldRequestHandlerOperation template void perform_request_and_repeat(const Yield& yield) { - auto rpc = detail::ServerRPCContextBaseAccess::construct(this->grpc_context().get_executor()); + auto rpc = detail::ServerRPCContextBaseAccess::construct(this->get_executor()); RPCRequest req; if (!req.start(rpc, this->service(), use_yield(yield))) { diff --git a/src/agrpc/detail/work_tracking_completion_handler.hpp b/src/agrpc/detail/work_tracking_completion_handler.hpp index b163aabf..68c499aa 100644 --- a/src/agrpc/detail/work_tracking_completion_handler.hpp +++ b/src/agrpc/detail/work_tracking_completion_handler.hpp @@ -71,7 +71,7 @@ void dispatch_with_args(Handler&& handler, Args&&... args) std::move(executor), [handler = static_cast(handler), args = detail::Tuple{static_cast(args)...}]() mutable { - detail::apply(static_cast(handler), std::move(args)); + detail::apply(std::move(handler), std::move(args)); }); } @@ -120,7 +120,7 @@ template void dispatch_complete(AllocationGuard& guard, Args&&... args) { auto handler{std::move(guard->completion_handler())}; - auto tracker{std::move(guard->work_tracker())}; + [[maybe_unused]] auto tracker{std::move(guard->work_tracker())}; guard.reset(); detail::dispatch_with_args(std::move(handler), static_cast(args)...); } diff --git a/src/agrpc/register_awaitable_request_handler.hpp b/src/agrpc/register_awaitable_request_handler.hpp index 002401cf..bcc2e5b0 100644 --- a/src/agrpc/register_awaitable_request_handler.hpp +++ b/src/agrpc/register_awaitable_request_handler.hpp @@ -30,7 +30,7 @@ auto register_awaitable_request_handler(const typename ServerRPC::executor_type& RequestHandler request_handler, CompletionToken token) { return asio::async_initiate( - detail::AwaitableRequestHandlerInitiator{}, token, executor, service, + detail::AwaitableRequestHandlerInitiator{service}, token, executor, static_cast(request_handler)); } diff --git a/src/agrpc/register_sender_request_handler.hpp b/src/agrpc/register_sender_request_handler.hpp index 5482581b..d3cba439 100644 --- a/src/agrpc/register_sender_request_handler.hpp +++ b/src/agrpc/register_sender_request_handler.hpp @@ -19,9 +19,9 @@ AGRPC_NAMESPACE_BEGIN() -template +template [[nodiscard]] detail::RequestHandlerSender register_sender_request_handler( - agrpc::GrpcContext& grpc_context, Service& service, RequestHandler request_handler) + agrpc::GrpcContext& grpc_context, detail::GetServerRPCServiceT& service, RequestHandler request_handler) { return {grpc_context, service, static_cast(request_handler)}; } diff --git a/src/agrpc/register_yield_request_handler.hpp b/src/agrpc/register_yield_request_handler.hpp index ab6d3591..d14f28a8 100644 --- a/src/agrpc/register_yield_request_handler.hpp +++ b/src/agrpc/register_yield_request_handler.hpp @@ -26,7 +26,7 @@ auto register_yield_request_handler(const typename ServerRPC::executor_type& exe CompletionToken token) { return asio::async_initiate( - detail::YieldRequestHandlerInitiator{}, token, executor, service, + detail::YieldRequestHandlerInitiator{service}, token, executor, static_cast(request_handler)); }