Skip to content

Commit

Permalink
Simplifying (a)synchronous conditional compilation:
Browse files Browse the repository at this point in the history
* 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@comp.lancs.ac.uk>
  • Loading branch information
simpsonst authored and greearb committed Mar 31, 2011
1 parent 619aad8 commit 350e78b
Show file tree
Hide file tree
Showing 12 changed files with 54 additions and 162 deletions.
29 changes: 7 additions & 22 deletions xorp/libxipc/finder_client.cc
Expand Up @@ -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;
Expand All @@ -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");
}
}

Expand Down
13 changes: 4 additions & 9 deletions xorp/libxipc/finder_client.hh
Expand Up @@ -32,7 +32,6 @@
#include "finder_messenger.hh"

#include "xrl_pf.hh"
#include "xrl_cmd_map.hh"

class FinderClientOp;
class FinderClientObserver;
Expand Down Expand Up @@ -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;
};

/**
Expand Down Expand Up @@ -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();
Expand Down
30 changes: 0 additions & 30 deletions xorp/libxipc/finder_client_xrl_target.cc
Expand Up @@ -85,45 +85,15 @@ 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,
uint32_t& xrl_errno,
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
}
11 changes: 0 additions & 11 deletions xorp/libxipc/finder_client_xrl_target.hh
Expand Up @@ -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__
10 changes: 2 additions & 8 deletions xorp/libxipc/finder_messenger.cc
Expand Up @@ -102,28 +102,22 @@ 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
if (manager())
manager()->messenger_inactive_event(this);
}

#ifdef XORP_ENABLE_ASYNC_SERVER
void
FinderMessengerBase::dispatch_xrl_cb(const XrlCmdError &e,
const XrlArgs *reply_args,
uint32_t seqno)
{
reply(seqno, e, XrlCmdError::OKAY() == e ? reply_args : NULL);
}
#endif

void
FinderMessengerBase::unhook_manager()
Expand Down
2 changes: 0 additions & 2 deletions xorp/libxipc/finder_messenger.hh
Expand Up @@ -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:
Expand Down
11 changes: 2 additions & 9 deletions xorp/libxipc/xrl_cmd_map.hh
Expand Up @@ -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;
Expand All @@ -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:
Expand Down
29 changes: 16 additions & 13 deletions xorp/libxipc/xrl_dispatcher.cc
Expand Up @@ -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*
Expand All @@ -82,23 +84,24 @@ 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,
XrlDispatcherCallback resp) const
{
resp->dispatch(err, outputs);
}
#endif
37 changes: 5 additions & 32 deletions xorp/libxipc/xrl_dispatcher.hh
Expand Up @@ -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 {
Expand All @@ -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__

0 comments on commit 350e78b

Please sign in to comment.