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

Reply via email to