From: Steven Simpson <[email protected]> * XrlDispatcher is unconditionally asynchronous - all its conditional macros and typedefs are dropped. Where XrlRouter derives from it, it is also unconditionally asynchronous.
* Many callback functions, that were conditionally added in order to interface with asynchronous dispatchers and command maps, are now compiled unconditionally. * FinderClient's dispatch_tunneled_xrl uses XrlDispatcher's asynchronous interface, but ignores the results as its synchronous version always did, so its own synchronous interface is now presented unconditionally, obviating the inelegant XRL_CMD_OPT_CALLBACK macro. * FinderClientXrlTarget is reverted to its fully synchronous form, as it can now use FinderClient's unconditionally synchronous interface. * Synchronous code in FinderMessengerBase::dispatch_xrl uses (now unconditionally compiled) callback required for asynchronous version. * Re-organized conditional command-map typedefs to make callback type unconditional. Signed-off-by: Steven Simpson <[email protected]> --- xorp/libxipc/finder_client.cc | 29 +++++----------------- xorp/libxipc/finder_client.hh | 13 +++------- xorp/libxipc/finder_client_xrl_target.cc | 30 ------------------------ xorp/libxipc/finder_client_xrl_target.hh | 11 --------- xorp/libxipc/finder_messenger.cc | 10 +------ xorp/libxipc/finder_messenger.hh | 2 - xorp/libxipc/xrl_cmd_map.hh | 11 +------- xorp/libxipc/xrl_dispatcher.cc | 29 +++++++++++++---------- xorp/libxipc/xrl_dispatcher.hh | 37 ++++------------------------- xorp/libxipc/xrl_pf_stcp.cc | 28 ++++++++-------------- xorp/libxipc/xrl_router.cc | 10 ++++---- xorp/libxipc/xrl_router.hh | 6 ++-- 12 files changed, 54 insertions(+), 162 deletions(-) diff --git a/xorp/libxipc/finder_client.cc b/xorp/libxipc/finder_client.cc index 4c3b122..2cc8822 100644 --- a/xorp/libxipc/finder_client.cc +++ b/xorp/libxipc/finder_client.cc @@ -961,20 +961,16 @@ FinderClient::uncache_xrls_from_target(const string& target) XORP_UINT_CAST(n), target.c_str()); } -#ifdef XORP_ENABLE_ASYNC_SERVER void -FinderClient::dispatch_tunneled_xrl_cb(const XrlError &e, const XrlArgs *a, - XrlRespCallback cb) const +FinderClient::dispatch_tunneled_xrl_cb(const XrlError &e, + const XrlArgs *a) const { UNUSED(e); UNUSED(a); - cb->dispatch(XrlCmdError::OKAY(), NULL); } -#endif -XrlCmdRT -FinderClient::dispatch_tunneled_xrl(const string& xrl_str - XRL_CMD_OPT_CALLBACK(cb)) +XrlCmdError +FinderClient::dispatch_tunneled_xrl(const string& xrl_str) { finder_trace_init("dispatch_tunneled_xrl(\"%s\")", xrl_str.c_str()); Xrl xrl; @@ -983,29 +979,18 @@ FinderClient::dispatch_tunneled_xrl(const string& xrl_str InstanceList::iterator i = find_instance(xrl.target()); if (i == _ids.end()) { finder_trace_result("target not found"); - XRL_CMD_RETURN_ERROR - (cb, XrlCmdError::COMMAND_FAILED("target not found")); + return XrlCmdError::COMMAND_FAILED("target not found"); } -#ifdef XORP_ENABLE_ASYNC_SERVER XrlDispatcherCallback ret_vals = - callback(this, &FinderClient::dispatch_tunneled_xrl_cb, cb); -#else - XrlArgs ret_vals; -#endif + callback(this, &FinderClient::dispatch_tunneled_xrl_cb); i->dispatcher()->dispatch_xrl(xrl.command(), xrl.args(), ret_vals); finder_trace_result("success"); - -#ifdef XORP_ENABLE_ASYNC_SERVER - return; -#else return XrlCmdError::OKAY(); -#endif } catch (InvalidString&) { - XRL_CMD_RETURN_ERROR - (cb, XrlCmdError::COMMAND_FAILED("Bad Xrl string")); + return XrlCmdError::COMMAND_FAILED("Bad Xrl string"); } } diff --git a/xorp/libxipc/finder_client.hh b/xorp/libxipc/finder_client.hh index 21f3ed5..ce97f9c 100644 --- a/xorp/libxipc/finder_client.hh +++ b/xorp/libxipc/finder_client.hh @@ -32,7 +32,6 @@ #include "finder_messenger.hh" #include "xrl_pf.hh" -#include "xrl_cmd_map.hh" class FinderClientOp; class FinderClientObserver; @@ -77,8 +76,7 @@ public: virtual ~FinderClientXrlCommandInterface() {} virtual void uncache_xrl(const string& xrl) = 0; virtual void uncache_xrls_from_target(const string& target) = 0; - virtual XrlCmdRT dispatch_tunneled_xrl(const string& xrl - XRL_CMD_OPT_CALLBACK(cb)) = 0; + virtual XrlCmdError dispatch_tunneled_xrl(const string& xrl) = 0; }; /** @@ -314,14 +312,11 @@ protected: // FinderClientXrlCommandInterface void uncache_xrl(const string& xrl); void uncache_xrls_from_target(const string& target); - XrlCmdRT dispatch_tunneled_xrl(const string& xrl - XRL_CMD_OPT_CALLBACK(cb)); -#ifdef XORP_ENABLE_ASYNC_SERVER + XrlCmdError dispatch_tunneled_xrl(const string& xrl); + private: void - dispatch_tunneled_xrl_cb(const XrlError &e, const XrlArgs *a, - XrlRespCallback cb) const; -#endif + dispatch_tunneled_xrl_cb(const XrlError &e, const XrlArgs *a) const; protected: void crank(); diff --git a/xorp/libxipc/finder_client_xrl_target.cc b/xorp/libxipc/finder_client_xrl_target.cc index 66a39fd..0181260 100644 --- a/xorp/libxipc/finder_client_xrl_target.cc +++ b/xorp/libxipc/finder_client_xrl_target.cc @@ -85,29 +85,6 @@ FinderClientXrlTarget::finder_client_0_2_remove_xrls_for_target_from_cache( return XrlCmdError::OKAY(); } -#ifdef XORP_ENABLE_ASYNC_SERVER -void -FinderClientXrlTarget::async_finder_client_0_2_dispatch_tunneled_xrl( - const string& xrl, - FinderClient02DispatchTunneledXrlCB cb) -{ - _client->dispatch_tunneled_xrl(xrl, - callback(this, - &FinderClientXrlTarget::dispatch_tunneled_xrl_cb, - cb)); -} - -void -FinderClientXrlTarget::dispatch_tunneled_xrl_cb( - const XrlCmdError &e, - const XrlArgs *out, - FinderClient02DispatchTunneledXrlCB cb) const -{ - UNUSED(out); - cb->dispatch(XrlCmdError::OKAY(), e.error_code(), e.note()); -} -#endif - XrlCmdError FinderClientXrlTarget::finder_client_0_2_dispatch_tunneled_xrl( const string& xrl, @@ -115,15 +92,8 @@ FinderClientXrlTarget::finder_client_0_2_dispatch_tunneled_xrl( string& xrl_errtxt ) { -#ifdef XORP_ENABLE_ASYNC_SERVER - UNUSED(xrl); - UNUSED(xrl_errno); - UNUSED(xrl_errtxt); - return XrlCmdError::COMMAND_FAILED("Unreachable"); -#else XrlCmdError e = _client->dispatch_tunneled_xrl(xrl); xrl_errno = e.error_code(); xrl_errtxt = e.note(); return XrlCmdError::OKAY(); -#endif } diff --git a/xorp/libxipc/finder_client_xrl_target.hh b/xorp/libxipc/finder_client_xrl_target.hh index 79fa55c..23eb309 100644 --- a/xorp/libxipc/finder_client_xrl_target.hh +++ b/xorp/libxipc/finder_client_xrl_target.hh @@ -46,23 +46,12 @@ public: XrlCmdError finder_client_0_2_remove_xrls_for_target_from_cache( const string& target); -#ifdef XORP_ENABLE_ASYNC_SERVER - void async_finder_client_0_2_dispatch_tunneled_xrl(const string& xrl, - FinderClient02DispatchTunneledXrlCB); -#endif XrlCmdError finder_client_0_2_dispatch_tunneled_xrl(const string& xrl, uint32_t& xrl_errno, string& xrl_errtxt); protected: FinderClientXrlCommandInterface* _client; - -#ifdef XORP_ENABLE_ASYNC_SERVER -private: - void dispatch_tunneled_xrl_cb(const XrlCmdError &e, - const XrlArgs *out, - FinderClient02DispatchTunneledXrlCB cb) const; -#endif }; #endif // __LIBXIPC_FINDER_CLIENT_XRL_TARGET_HH__ diff --git a/xorp/libxipc/finder_messenger.cc b/xorp/libxipc/finder_messenger.cc index a6aef38..5ee4353 100644 --- a/xorp/libxipc/finder_messenger.cc +++ b/xorp/libxipc/finder_messenger.cc @@ -102,12 +102,8 @@ FinderMessengerBase::dispatch_xrl(uint32_t seqno, const Xrl& xrl) callback(this, &FinderMessengerBase::dispatch_xrl_cb, seqno)); #else XrlArgs reply_args; - XrlError e = ce->dispatch(xrl.args(), &reply_args); - if (XrlCmdError::OKAY() == e) { - reply(seqno, e, &reply_args); - } else { - reply(seqno, e, 0); - } + XrlCmdError e = ce->dispatch(xrl.args(), &reply_args); + dispatch_xrl_cb(e, &reply_args, seqno); #endif // Announce we've dispatched xrl @@ -115,7 +111,6 @@ FinderMessengerBase::dispatch_xrl(uint32_t seqno, const Xrl& xrl) manager()->messenger_inactive_event(this); } -#ifdef XORP_ENABLE_ASYNC_SERVER void FinderMessengerBase::dispatch_xrl_cb(const XrlCmdError &e, const XrlArgs *reply_args, @@ -123,7 +118,6 @@ FinderMessengerBase::dispatch_xrl_cb(const XrlCmdError &e, { reply(seqno, e, XrlCmdError::OKAY() == e ? reply_args : NULL); } -#endif void FinderMessengerBase::unhook_manager() diff --git a/xorp/libxipc/finder_messenger.hh b/xorp/libxipc/finder_messenger.hh index 7201cc9..88942a7 100644 --- a/xorp/libxipc/finder_messenger.hh +++ b/xorp/libxipc/finder_messenger.hh @@ -123,12 +123,10 @@ protected: void response_timeout(uint32_t seqno); private: -#ifdef XORP_ENABLE_ASYNC_SERVER void dispatch_xrl_cb(const XrlCmdError &e, const XrlArgs *reply_args, uint32_t seqno); -#endif class ResponseState { public: diff --git a/xorp/libxipc/xrl_cmd_map.hh b/xorp/libxipc/xrl_cmd_map.hh index 0e91ccc..33b8d7d 100644 --- a/xorp/libxipc/xrl_cmd_map.hh +++ b/xorp/libxipc/xrl_cmd_map.hh @@ -47,11 +47,6 @@ XrlRespCallback; typedef XrlRespCallback XrlCmdOT; -#define XRL_CMD_OPT_CALLBACK(V) , const XrlRespCallback& V - -typedef -XorpCallback2<void, const XrlArgs&, XrlRespCallback>::RefPtr XrlRecvCallback; - #else typedef const XrlCmdError XrlCmdRT; @@ -63,12 +58,10 @@ typedef const XrlCmdError XrlCmdRT; typedef XrlArgs* XrlCmdOT; -#define XRL_CMD_OPT_CALLBACK(V) +#endif typedef -XorpCallback2<const XrlCmdError, const XrlArgs&, XrlArgs*>::RefPtr XrlRecvCallback; - -#endif +XorpCallback2<XrlCmdRT, const XrlArgs&, XrlCmdOT>::RefPtr XrlRecvCallback; class XrlCmdEntry { public: diff --git a/xorp/libxipc/xrl_dispatcher.cc b/xorp/libxipc/xrl_dispatcher.cc index 173b579..c9a556e 100644 --- a/xorp/libxipc/xrl_dispatcher.cc +++ b/xorp/libxipc/xrl_dispatcher.cc @@ -51,25 +51,27 @@ do { \ // ---------------------------------------------------------------------------- // XrlDispatcher methods -XrlDispatcherRT +void XrlDispatcher::dispatch_xrl(const string& method_name, const XrlArgs& inputs, - XrlDispatcherOT outputs) const + XrlDispatcherCallback outputs) const { const XrlCmdEntry* c = get_handler(method_name.c_str()); if (c == 0) { trace_xrl_dispatch("dispatch_xrl (invalid) ", method_name); debug_msg("No handler for %s\n", method_name.c_str()); - XRL_DISPATCHER_RETURN_ERROR(outputs, XrlError::NO_SUCH_METHOD()); + return outputs->dispatch(XrlError::NO_SUCH_METHOD(), NULL); } trace_xrl_dispatch("dispatch_xrl (valid) ", method_name); #ifdef XORP_ENABLE_ASYNC_SERVER - XrlCmdOT resp = callback(this, &XrlDispatcher::dispatch_cb, outputs); + XrlRespCallback resp = callback(this, &XrlDispatcher::dispatch_cb, outputs); + return c->dispatch(inputs, resp); #else - XrlCmdOT resp = &outputs; + XrlArgs resp; + XrlCmdError e = c->dispatch(inputs, &resp); + outputs->dispatch(e, &resp); #endif - return c->dispatch(inputs, resp); } XrlDispatcher::XI* @@ -82,18 +84,20 @@ XrlDispatcher::lookup_xrl(const string& name) const return new XI(c); } -XrlDispatcherRT -XrlDispatcher::dispatch_xrl_fast(const XI& xi, XrlDispatcherOT outputs) const +void +XrlDispatcher::dispatch_xrl_fast(const XI& xi, + XrlDispatcherCallback outputs) const { #ifdef XORP_ENABLE_ASYNC_SERVER - XrlCmdOT resp = callback(this, &XrlDispatcher::dispatch_cb, outputs); + XrlRespCallback resp = callback(this, &XrlDispatcher::dispatch_cb, outputs); + return xi._cmd->dispatch(xi._xrl.args(), resp); #else - XrlCmdOT resp = &outputs; + XrlArgs resp; + XrlCmdError e = xi._cmd->dispatch(xi._xrl.args(), &resp); + return outputs->dispatch(e, &resp); #endif - return xi._cmd->dispatch(xi._xrl.args(), resp); } -#ifdef XORP_ENABLE_ASYNC_SERVER void XrlDispatcher::dispatch_cb(const XrlCmdError &err, const XrlArgs *outputs, @@ -101,4 +105,3 @@ XrlDispatcher::dispatch_cb(const XrlCmdError &err, { resp->dispatch(err, outputs); } -#endif diff --git a/xorp/libxipc/xrl_dispatcher.hh b/xorp/libxipc/xrl_dispatcher.hh index 0cf4b41..9d7a8a5 100644 --- a/xorp/libxipc/xrl_dispatcher.hh +++ b/xorp/libxipc/xrl_dispatcher.hh @@ -25,35 +25,10 @@ #include "xrl_cmd_map.hh" -#ifdef XORP_ENABLE_ASYNC_SERVER - -#define XRL_DISPATCHER_RETURN_ERROR(OUT, ERR) \ - do { \ - (OUT)->dispatch((ERR), NULL); \ - return; \ - } while (0) - -typedef void XrlDispatcherRT; - typedef XorpCallback2<void, const XrlError &, const XrlArgs *>::RefPtr XrlDispatcherCallback; -typedef XrlDispatcherCallback XrlDispatcherOT; - -#else - -#define XRL_DISPATCHER_RETURN_ERROR(OUT, ERR) \ - do { \ - return (ERR); \ - } while (0) - - -typedef XrlError XrlDispatcherRT; -typedef XrlArgs& XrlDispatcherOT; - -#endif - class XrlDispatcher : public XrlCmdMap { public: struct XI { @@ -70,17 +45,15 @@ public: virtual ~XrlDispatcher() {} virtual XI* lookup_xrl(const string& name) const; - virtual XrlDispatcherRT dispatch_xrl(const string& method_name, - const XrlArgs& in, - XrlDispatcherOT out) const; - XrlDispatcherRT dispatch_xrl_fast(const XI& xi, - XrlDispatcherOT out) const; + virtual void dispatch_xrl(const string& method_name, + const XrlArgs& in, + XrlDispatcherCallback out) const; + void dispatch_xrl_fast(const XI& xi, + XrlDispatcherCallback out) const; -#ifdef XORP_ENABLE_ASYNC_SERVER private: void dispatch_cb(const XrlCmdError &, const XrlArgs *, XrlDispatcherCallback resp) const; -#endif }; #endif // __LIBXIPC_XRL_DISPATCHER_HH__ diff --git a/xorp/libxipc/xrl_pf_stcp.cc b/xorp/libxipc/xrl_pf_stcp.cc index 3ab358c..4e4e1ba 100644 --- a/xorp/libxipc/xrl_pf_stcp.cc +++ b/xorp/libxipc/xrl_pf_stcp.cc @@ -156,9 +156,9 @@ public: string toString() const; private: - XrlDispatcherRT do_dispatch(const uint8_t* packed_xrl, - size_t packed_xrl_bytes, - XrlDispatcherOT response); + void do_dispatch(const uint8_t* packed_xrl, + size_t packed_xrl_bytes, + XrlDispatcherCallback response); XrlPFSTCPListener& _parent; XorpFd _sock; @@ -257,10 +257,10 @@ STCPRequestHandler::read_event(BufferedAsyncReader* /* source */, _reader.set_trigger_bytes(STCPPacketHeader::header_size()); } -XrlDispatcherRT +void STCPRequestHandler::do_dispatch(const uint8_t* packed_xrl, size_t packed_xrl_bytes, - XrlDispatcherOT response) + XrlDispatcherCallback response) { static XrlError e(XrlError::INTERNAL_ERROR().error_code(), "corrupt xrl"); @@ -270,18 +270,18 @@ STCPRequestHandler::do_dispatch(const uint8_t* packed_xrl, string command; size_t cmdsz = Xrl::unpack_command(command, packed_xrl, packed_xrl_bytes); if (!cmdsz) - XRL_DISPATCHER_RETURN_ERROR(response, e); + return response->dispatch(e, NULL); XrlDispatcher::XI* xi = d->lookup_xrl(command); if (!xi) - XRL_DISPATCHER_RETURN_ERROR(response, e); + return response->dispatch(e, NULL); Xrl& xrl = xi->_xrl; try { if (xi->_new) { if (xrl.unpack(packed_xrl, packed_xrl_bytes) != packed_xrl_bytes) - XRL_DISPATCHER_RETURN_ERROR(response, e); + return response->dispatch(e, NULL); xi->_new = false; } else { @@ -289,10 +289,10 @@ STCPRequestHandler::do_dispatch(const uint8_t* packed_xrl, packed_xrl_bytes -= cmdsz; if (xrl.fill(packed_xrl, packed_xrl_bytes) != packed_xrl_bytes) - XRL_DISPATCHER_RETURN_ERROR(response, e); + return response->dispatch(e, NULL); } } catch (...) { - XRL_DISPATCHER_RETURN_ERROR(response, e); + return response->dispatch(e, NULL); } return d->dispatch_xrl_fast(*xi, response); @@ -304,17 +304,9 @@ STCPRequestHandler::dispatch_request(uint32_t seqno, const uint8_t* packed_xrl, size_t packed_xrl_bytes) { -#ifdef XORP_ENABLE_ASYNC_SERVER do_dispatch(packed_xrl, packed_xrl_bytes, callback(this, &STCPRequestHandler::transmit_response, seqno, batch)); -#else - XrlArgs response; - XrlError e; - - e = do_dispatch(packed_xrl, packed_xrl_bytes, response); - transmit_response(e, &response, seqno, batch); -#endif } diff --git a/xorp/libxipc/xrl_router.cc b/xorp/libxipc/xrl_router.cc index b0edc18..ed66b66 100644 --- a/xorp/libxipc/xrl_router.cc +++ b/xorp/libxipc/xrl_router.cc @@ -650,10 +650,10 @@ XrlRouter::send(const Xrl& xrl, const XrlCallback& user_cb) return true; } -XrlDispatcherRT -XrlRouter::dispatch_xrl(const string& method_name, - const XrlArgs& inputs, - XrlDispatcherOT outputs) const +void +XrlRouter::dispatch_xrl(const string& method_name, + const XrlArgs& inputs, + XrlDispatcherCallback outputs) const { string resolved_method; if (_fc->query_self(method_name, resolved_method) == true) { @@ -661,7 +661,7 @@ XrlRouter::dispatch_xrl(const string& method_name, XrlDispatcher::dispatch_xrl(resolved_method, inputs, outputs); } debug_msg("Could not find mapping for %s\n", method_name.c_str()); - XRL_DISPATCHER_RETURN_ERROR(outputs, XrlError::NO_SUCH_METHOD()); + return outputs->dispatch(XrlError::NO_SUCH_METHOD(), NULL); } XrlDispatcher::XI* diff --git a/xorp/libxipc/xrl_router.hh b/xorp/libxipc/xrl_router.hh index 8477667..5de0194 100644 --- a/xorp/libxipc/xrl_router.hh +++ b/xorp/libxipc/xrl_router.hh @@ -176,9 +176,9 @@ protected: */ virtual void finder_ready_event(const string& tgt_name); - XrlDispatcherRT dispatch_xrl(const string& method_name, - const XrlArgs& inputs, - XrlDispatcherOT outputs) const; + void dispatch_xrl(const string& method_name, + const XrlArgs& inputs, + XrlDispatcherCallback outputs) const; /** * Resolve callback (slow path). -- 1.7.0.4 _______________________________________________ Xorp-hackers mailing list [email protected] http://mailman.ICSI.Berkeley.EDU/mailman/listinfo/xorp-hackers
