[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