[Xorp-hackers] [PATCH 2/3] Using XrlArgs* for out-arguments, so that errors can pass 0.
ss at comp.lancs.ac.uk
ss at comp.lancs.ac.uk
Tue Mar 8 05:27:07 PST 2011
From: Steven Simpson <ss at comp.lancs.ac.uk>
Current messenger is marked inactive in call to user code, rather than in callback from it.
---
xorp/libxipc/finder_client.cc | 7 +++----
xorp/libxipc/finder_client.hh | 2 +-
xorp/libxipc/finder_client_xrl_target.cc | 2 +-
xorp/libxipc/finder_client_xrl_target.hh | 2 +-
xorp/libxipc/finder_messenger.cc | 19 ++++++-------------
xorp/libxipc/finder_messenger.hh | 2 +-
xorp/libxipc/xrl_cmd_map.hh | 2 +-
xorp/libxipc/xrl_dispatcher.cc | 4 ++--
xorp/libxipc/xrl_dispatcher.hh | 4 ++--
xorp/libxipc/xrl_pf_stcp.cc | 26 ++++++++++++++++----------
xorp/libxipc/xrl_router.cc | 2 +-
xorp/rtrmgr/task.cc | 8 +++++++-
xorp/xrl/scripts/tgt-gen | 9 +++++----
13 files changed, 47 insertions(+), 42 deletions(-)
diff --git a/xorp/libxipc/finder_client.cc b/xorp/libxipc/finder_client.cc
index 5713e5c..5b20aa8 100644
--- a/xorp/libxipc/finder_client.cc
+++ b/xorp/libxipc/finder_client.cc
@@ -962,7 +962,7 @@ FinderClient::uncache_xrls_from_target(const string& target)
}
void
-FinderClient::dispatch_tunneled_xrl_cb(const XrlError &e, const XrlArgs &a,
+FinderClient::dispatch_tunneled_xrl_cb(const XrlError &e, const XrlArgs *a,
XrlRespCallback cb) const
{
cb->dispatch(XrlCmdError(e), a);
@@ -979,8 +979,7 @@ 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");
- cb->dispatch(XrlCmdError::COMMAND_FAILED("target not found"),
- XrlArgs());
+ cb->dispatch(XrlCmdError::COMMAND_FAILED("target not found"), 0);
}
XrlArgs ret_vals;
@@ -989,7 +988,7 @@ FinderClient::dispatch_tunneled_xrl(const string& xrl_str,
i->dispatcher()->dispatch_xrl(xrl.command(), xrl.args(), mycb);
finder_trace_result("success");
} catch (InvalidString&) {
- cb->dispatch(XrlCmdError::COMMAND_FAILED("Bad Xrl string"), XrlArgs());
+ cb->dispatch(XrlCmdError::COMMAND_FAILED("Bad Xrl string"), 0);
}
}
diff --git a/xorp/libxipc/finder_client.hh b/xorp/libxipc/finder_client.hh
index 2d585ad..a94db26 100644
--- a/xorp/libxipc/finder_client.hh
+++ b/xorp/libxipc/finder_client.hh
@@ -320,7 +320,7 @@ protected:
private:
void
- dispatch_tunneled_xrl_cb(const XrlError &e, const XrlArgs &a,
+ dispatch_tunneled_xrl_cb(const XrlError &e, const XrlArgs *a,
XrlRespCallback cb) const;
protected:
diff --git a/xorp/libxipc/finder_client_xrl_target.cc b/xorp/libxipc/finder_client_xrl_target.cc
index 4e33b21..53e46db 100644
--- a/xorp/libxipc/finder_client_xrl_target.cc
+++ b/xorp/libxipc/finder_client_xrl_target.cc
@@ -102,7 +102,7 @@ FinderClientXrlTarget::async_finder_client_0_2_dispatch_tunneled_xrl
void
FinderClientXrlTarget::dispatch_tunneled_xrl_cb
(const XrlCmdError &e,
- const XrlArgs &out,
+ const XrlArgs *out,
FinderClient02DispatchTunneledXrlCB cb) const
{
UNUSED(out);
diff --git a/xorp/libxipc/finder_client_xrl_target.hh b/xorp/libxipc/finder_client_xrl_target.hh
index b6c4e53..8613c43 100644
--- a/xorp/libxipc/finder_client_xrl_target.hh
+++ b/xorp/libxipc/finder_client_xrl_target.hh
@@ -60,7 +60,7 @@ protected:
private:
void dispatch_tunneled_xrl_cb
(const XrlCmdError &e,
- const XrlArgs &out,
+ const XrlArgs *out,
FinderClient02DispatchTunneledXrlCB cb) const;
};
diff --git a/xorp/libxipc/finder_messenger.cc b/xorp/libxipc/finder_messenger.cc
index 74a5826..27253e4 100644
--- a/xorp/libxipc/finder_messenger.cc
+++ b/xorp/libxipc/finder_messenger.cc
@@ -99,25 +99,18 @@ FinderMessengerBase::dispatch_xrl(uint32_t seqno, const Xrl& xrl)
ce->dispatch(xrl.args(),
callback(this, &FinderMessengerBase::dispatch_xrl_cb, seqno));
+
+ // Announce we've dispatched xrl
+ if (manager())
+ manager()->messenger_inactive_event(this);
}
void
FinderMessengerBase::dispatch_xrl_cb(const XrlCmdError &e,
- const XrlArgs &reply_args,
+ const XrlArgs *reply_args,
uint32_t seqno)
{
- if (XrlCmdError::OKAY() == e) {
- reply(seqno, e, &reply_args);
- } else {
- reply(seqno, e, 0);
- }
-
- // TODO: Is there any context that must be passed to the
- // FinderMessengerManager, now that the events are asynchronous?
-
- // Announce we've dispatched xrl
- if (manager())
- manager()->messenger_inactive_event(this);
+ reply(seqno, e, reply_args);
}
void
diff --git a/xorp/libxipc/finder_messenger.hh b/xorp/libxipc/finder_messenger.hh
index 679bcf3..50ea8c0 100644
--- a/xorp/libxipc/finder_messenger.hh
+++ b/xorp/libxipc/finder_messenger.hh
@@ -125,7 +125,7 @@ protected:
private:
void
dispatch_xrl_cb(const XrlCmdError &e,
- const XrlArgs &reply_args,
+ const XrlArgs *reply_args,
uint32_t seqno);
class ResponseState {
diff --git a/xorp/libxipc/xrl_cmd_map.hh b/xorp/libxipc/xrl_cmd_map.hh
index da8f522..b5336cf 100644
--- a/xorp/libxipc/xrl_cmd_map.hh
+++ b/xorp/libxipc/xrl_cmd_map.hh
@@ -33,7 +33,7 @@
#include "xrl_error.hh"
typedef
-XorpCallback2<void, const XrlCmdError &, const XrlArgs &>::RefPtr
+XorpCallback2<void, const XrlCmdError &, const XrlArgs *>::RefPtr
XrlRespCallback;
typedef
diff --git a/xorp/libxipc/xrl_dispatcher.cc b/xorp/libxipc/xrl_dispatcher.cc
index 04b618f..9e59d94 100644
--- a/xorp/libxipc/xrl_dispatcher.cc
+++ b/xorp/libxipc/xrl_dispatcher.cc
@@ -60,7 +60,7 @@ XrlDispatcher::dispatch_xrl(const string& method_name,
if (c == 0) {
trace_xrl_dispatch("dispatch_xrl (invalid) ", method_name);
debug_msg("No handler for %s\n", method_name.c_str());
- resp->dispatch(XrlError::NO_SUCH_METHOD(), XrlArgs());
+ resp->dispatch(XrlError::NO_SUCH_METHOD(), 0);
return;
}
@@ -89,7 +89,7 @@ XrlDispatcher::dispatch_xrl_fast(const XI& xi,
void
XrlDispatcher::dispatch_cb(const XrlCmdError &err,
- const XrlArgs &outputs,
+ const XrlArgs *outputs,
XrlDispatcherCallback resp) const
{
resp->dispatch(err, outputs);
diff --git a/xorp/libxipc/xrl_dispatcher.hh b/xorp/libxipc/xrl_dispatcher.hh
index 43fb12d..28a5fbf 100644
--- a/xorp/libxipc/xrl_dispatcher.hh
+++ b/xorp/libxipc/xrl_dispatcher.hh
@@ -26,7 +26,7 @@
#include "xrl_cmd_map.hh"
typedef
-XorpCallback2<void, const XrlError &, const XrlArgs &>::RefPtr
+XorpCallback2<void, const XrlError &, const XrlArgs *>::RefPtr
XrlDispatcherCallback;
@@ -53,7 +53,7 @@ public:
XrlDispatcherCallback resp) const;
private:
- void dispatch_cb(const XrlCmdError &, const XrlArgs &,
+ void dispatch_cb(const XrlCmdError &, const XrlArgs *,
XrlDispatcherCallback resp) const;
};
diff --git a/xorp/libxipc/xrl_pf_stcp.cc b/xorp/libxipc/xrl_pf_stcp.cc
index a1b6c58..9e2dbd9 100644
--- a/xorp/libxipc/xrl_pf_stcp.cc
+++ b/xorp/libxipc/xrl_pf_stcp.cc
@@ -130,7 +130,7 @@ public:
void dispatch_request(uint32_t seqno, bool batch, const uint8_t* buffer,
size_t bytes);
- void transmit_response(const XrlError &e, const XrlArgs &response,
+ void transmit_response(const XrlError &e, const XrlArgs *response,
uint32_t seqno, bool batch);
void ack_helo(uint32_t seqno);
@@ -267,13 +267,13 @@ STCPRequestHandler::do_dispatch(const uint8_t* packed_xrl,
string command;
size_t cmdsz = Xrl::unpack_command(command, packed_xrl, packed_xrl_bytes);
if (!cmdsz) {
- cb->dispatch(e, XrlArgs());
+ cb->dispatch(e, 0);
return;
}
XrlDispatcher::XI* xi = d->lookup_xrl(command);
if (!xi) {
- cb->dispatch(e, XrlArgs());
+ cb->dispatch(e, 0);
return;
}
@@ -282,7 +282,7 @@ STCPRequestHandler::do_dispatch(const uint8_t* packed_xrl,
try {
if (xi->_new) {
if (xrl.unpack(packed_xrl, packed_xrl_bytes) != packed_xrl_bytes) {
- cb->dispatch(e, XrlArgs());
+ cb->dispatch(e, 0);
return;
}
@@ -293,13 +293,13 @@ STCPRequestHandler::do_dispatch(const uint8_t* packed_xrl,
packed_xrl_bytes -= cmdsz;
if (xrl.fill(packed_xrl, packed_xrl_bytes) != packed_xrl_bytes) {
- cb->dispatch(e, XrlArgs());
+ cb->dispatch(e, 0);
return;
}
}
} catch (...) {
- cb->dispatch(e, XrlArgs());
+ cb->dispatch(e, 0);
return;
}
@@ -318,11 +318,17 @@ STCPRequestHandler::dispatch_request(uint32_t seqno,
}
void STCPRequestHandler::transmit_response(const XrlError &e,
- const XrlArgs &response,
+ const XrlArgs *response,
uint32_t seqno,
bool batch)
{
- size_t xrl_response_bytes = response.packed_bytes();
+ // If no response arguments were given, provide an empty set of
+ // them.
+ XrlArgs dummy;
+ if (!response)
+ response = &dummy;
+
+ size_t xrl_response_bytes = response->packed_bytes();
size_t note_bytes = e.note().size();
_responses.push_back(vector<uint8_t>(STCPPacketHeader::header_size()
@@ -340,8 +346,8 @@ void STCPRequestHandler::transmit_response(const XrlError &e,
}
if (xrl_response_bytes != 0) {
- response.pack(&r[0] + STCPPacketHeader::header_size() + note_bytes,
- xrl_response_bytes);
+ response->pack(&r[0] + STCPPacketHeader::header_size() + note_bytes,
+ xrl_response_bytes);
}
_writer.add_buffer(&r[0], r.size(),
diff --git a/xorp/libxipc/xrl_router.cc b/xorp/libxipc/xrl_router.cc
index d46f8a9..4274bd4 100644
--- a/xorp/libxipc/xrl_router.cc
+++ b/xorp/libxipc/xrl_router.cc
@@ -661,7 +661,7 @@ XrlRouter::dispatch_xrl(const string& method_name,
return;
}
debug_msg("Could not find mapping for %s\n", method_name.c_str());
- resp->dispatch(XrlError::NO_SUCH_METHOD(), XrlArgs());
+ resp->dispatch(XrlError::NO_SUCH_METHOD(), 0);
}
XrlDispatcher::XI*
diff --git a/xorp/rtrmgr/task.cc b/xorp/rtrmgr/task.cc
index d904a31..727282b 100644
--- a/xorp/rtrmgr/task.cc
+++ b/xorp/rtrmgr/task.cc
@@ -1408,10 +1408,16 @@ TaskXrlItem::execute_done(const XrlError& err, XrlArgs* xrl_args)
break;
case NO_FINDER:
+ // The error was a fatal one for the target - we now
+ // consider the target to be fatally wounded.
+ XLOG_ERROR("NO_FINDER: %s", err.str().c_str());
+ fatal = true;
+ break;
+
case SEND_FAILED:
// The error was a fatal one for the target - we now
// consider the target to be fatally wounded.
- XLOG_ERROR("%s", err.str().c_str());
+ XLOG_ERROR("SEND_FAILED: %s", err.str().c_str());
fatal = true;
break;
diff --git a/xorp/xrl/scripts/tgt-gen b/xorp/xrl/scripts/tgt-gen
index 3ce47e0..53b3744 100755
--- a/xorp/xrl/scripts/tgt-gen
+++ b/xorp/xrl/scripts/tgt-gen
@@ -201,14 +201,15 @@ def target_handler_methods(cls, name, methods):
s += ",\n XrlRespCallback c_b)\n"
s += "{\n"
- s += xorp_indent(1) + "XrlArgs out;\n"
s += \
""" if (e != XrlCmdError::OKAY()) {
XLOG_WARNING(\"Handling method for %%s failed: %%s\",
\"%s\", e.str().c_str());
+ c_b->dispatch(e, 0);
} else {
""" % m.name()
+ s += xorp_indent(2) + "XrlArgs out;\n"
if m.rargs():
s += "\n /* Marshall return values */\n try {\n"
for r in m.rargs():
@@ -221,7 +222,7 @@ def target_handler_methods(cls, name, methods):
"""
- s += " c_b->dispatch(e, out);\n }\n}\n\n"
+ s += " c_b->dispatch(e, &out);\n }\n}\n\n"
s += "\nvoid\n"
@@ -232,7 +233,7 @@ def target_handler_methods(cls, name, methods):
if (xa_inputs.size() != %d) {
XLOG_ERROR(\"Wrong number of arguments (%%u != %%u) handling %%s\",
XORP_UINT_CAST(%d), XORP_UINT_CAST(xa_inputs.size()), \"%s\");
- c_b->dispatch(XrlCmdError::BAD_ARGS(), XrlArgs());
+ c_b->dispatch(XrlCmdError::BAD_ARGS(), 0);
return;
}
""" % (len(m.args()), len(m.args()), m.name())
@@ -255,7 +256,7 @@ def target_handler_methods(cls, name, methods):
s += \
""" } catch (const XrlArgs::BadArgs& e) {
XLOG_ERROR(\"Error decoding the arguments: %s\", e.str().c_str());
- c_b->dispatch(XrlCmdError::BAD_ARGS(e.str()), XrlArgs());
+ c_b->dispatch(XrlCmdError::BAD_ARGS(e.str()), 0);
return;
}
"""
--
1.7.0.4
More information about the Xorp-hackers
mailing list