[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