@@ -26,7 +26,7 @@ void CustomBuildField(TypeList<>,
2626 // future calls over this connection can reuse it.
2727 auto [callback_thread, _]{SetThread (
2828 GuardedRef{thread_context.waiter ->m_mutex , thread_context.callback_threads }, &connection,
29- [&] { return connection.m_threads .add (kj::heap<ProxyServer<Thread>>(thread_context, std::thread{})); })};
29+ [&] { return connection.m_threads .add (kj::heap<ProxyServer<Thread>>(connection, thread_context, std::thread{})); })};
3030
3131 // Call remote ThreadMap.makeThread function so server will create a
3232 // dedicated worker thread to run function calls from this thread. Store the
@@ -61,11 +61,10 @@ auto PassField(Priority<1>, TypeList<>, ServerContext& server_context, const Fn&
6161{
6262 const auto & params = server_context.call_context .getParams ();
6363 Context::Reader context_arg = Accessor::get (params);
64- auto future = kj::newPromiseAndFulfiller<typename ServerContext::CallContext>();
6564 auto & server = server_context.proxy_server ;
6665 int req = server_context.req ;
67- auto invoke = [fulfiller = kj::mv (future. fulfiller ),
68- call_context = kj::mv (server_context. call_context ), & server, req, fn, args...]() mutable {
66+ auto invoke = [call_context = kj::mv (server_context. call_context ), &server, req, fn, args...]() mutable {
67+ MP_LOG (*server. m_context . loop , Log::Debug) << " IPC server executing request # " << req;
6968 const auto & params = call_context.getParams ();
7069 Context::Reader context_arg = Accessor::get (params);
7170 ServerContext server_context{server, call_context, req};
@@ -125,18 +124,7 @@ auto PassField(Priority<1>, TypeList<>, ServerContext& server_context, const Fn&
125124 });
126125 fn.invoke (server_context, args...);
127126 }
128- KJ_IF_MAYBE (exception, kj::runCatchingExceptions ([&]() {
129- server.m_context .loop ->sync ([&] {
130- auto fulfiller_dispose = kj::mv (fulfiller);
131- fulfiller_dispose->fulfill (kj::mv (call_context));
132- });
133- }))
134- {
135- server.m_context .loop ->sync ([&]() {
136- auto fulfiller_dispose = kj::mv (fulfiller);
137- fulfiller_dispose->reject (kj::mv (*exception));
138- });
139- }
127+ return call_context;
140128 };
141129
142130 // Lookup Thread object specified by the client. The specified thread should
@@ -149,23 +137,16 @@ auto PassField(Priority<1>, TypeList<>, ServerContext& server_context, const Fn&
149137 // `invoke` lambda above which will invoke the function on that
150138 // thread.
151139 KJ_IF_MAYBE (thread_server, perhaps) {
152- const auto & thread = static_cast <ProxyServer<Thread>&>(*thread_server);
140+ auto & thread = static_cast <ProxyServer<Thread>&>(*thread_server);
153141 MP_LOG (*server.m_context .loop , Log::Debug)
154142 << " IPC server post request #" << req << " {" << thread.m_thread_context .thread_name << " }" ;
155- if (!thread.m_thread_context .waiter ->post (std::move (invoke))) {
156- MP_LOG (*server.m_context .loop , Log::Error)
157- << " IPC server error request #" << req
158- << " {" << thread.m_thread_context .thread_name << " }" << " , thread busy" ;
159- throw std::runtime_error (" thread busy" );
160- }
143+ return thread.template post <typename ServerContext::CallContext>(std::move (invoke));
161144 } else {
162145 MP_LOG (*server.m_context .loop , Log::Error)
163146 << " IPC server error request #" << req << " , missing thread to execute request" ;
164147 throw std::runtime_error (" invalid thread handle" );
165148 }
166- })
167- // Wait for the invocation to finish before returning to the caller.
168- .then ([invoke_wait = kj::mv (future.promise )]() mutable { return kj::mv (invoke_wait); });
149+ });
169150}
170151} // namespace mp
171152
0 commit comments