[Xorp-hackers] [PATCH] Simplifying (a)synchronous conditional compilation:

ss at comp.lancs.ac.uk ss at comp.lancs.ac.uk
Thu Mar 31 04:43:03 PDT 2011


From: Steven Simpson <ss at comp.lancs.ac.uk>

* 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 <ss at comp.lancs.ac.uk>
---
 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



More information about the Xorp-hackers mailing list