void RPCChannel::DispatchIncall(const Message& call) { AssertWorkerThread(); mMonitor->AssertNotCurrentThreadOwns(); RPC_ASSERT(call.is_rpc() && !call.is_reply(), "wrong message type"); Message* reply = nullptr; ++mRemoteStackDepthGuess; Result rv = Listener()->OnCallReceived(call, reply); --mRemoteStackDepthGuess; if (!MaybeHandleError(rv, "RPCChannel")) { delete reply; reply = new Message(); reply->set_rpc(); reply->set_reply(); reply->set_reply_error(); } reply->set_seqno(call.seqno()); { MonitorAutoLock lock(*mMonitor); if (ChannelConnected == mChannelState) mLink->SendMessage(reply); } }
void SyncChannel::OnDispatchMessage(const Message& msg) { AssertWorkerThread(); NS_ABORT_IF_FALSE(msg.is_sync(), "only sync messages here"); NS_ABORT_IF_FALSE(!msg.is_reply(), "wasn't awaiting reply"); Message* reply = 0; mProcessingSyncMessage = true; Result rv = static_cast<SyncListener*>(mListener)->OnMessageReceived(msg, reply); mProcessingSyncMessage = false; if (!MaybeHandleError(rv, "SyncChannel")) { // FIXME/cjones: error handling; OnError()? delete reply; reply = new Message(); reply->set_sync(); reply->set_reply(); reply->set_reply_error(); } reply->set_seqno(msg.seqno()); { MonitorAutoLock lock(mMonitor); if (ChannelConnected == mChannelState) SendThroughTransport(reply); } }
void AsyncChannel::OnDispatchMessage(const Message& msg) { AssertWorkerThread(); NS_ASSERTION(!msg.is_reply(), "can't process replies here"); NS_ASSERTION(!(msg.is_sync() || msg.is_rpc()), "async dispatch only"); if (MSG_ROUTING_NONE == msg.routing_id()) { if (!OnSpecialMessage(msg.type(), msg)) // XXX real error handling NS_RUNTIMEABORT("unhandled special message!"); return; } // it's OK to dispatch messages if the channel is closed/error'd, // since we don't have a reply to send back (void)MaybeHandleError(mListener->OnMessageReceived(msg), "AsyncChannel"); }