summaryrefslogtreecommitdiff
path: root/trunk/TAO/tao/Wait_On_Read.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'trunk/TAO/tao/Wait_On_Read.cpp')
-rw-r--r--trunk/TAO/tao/Wait_On_Read.cpp144
1 files changed, 144 insertions, 0 deletions
diff --git a/trunk/TAO/tao/Wait_On_Read.cpp b/trunk/TAO/tao/Wait_On_Read.cpp
new file mode 100644
index 00000000000..2de7e599ff3
--- /dev/null
+++ b/trunk/TAO/tao/Wait_On_Read.cpp
@@ -0,0 +1,144 @@
+// $Id$
+
+#include "tao/Wait_On_Read.h"
+#include "tao/Transport.h"
+#include "tao/Resume_Handle.h"
+#include "tao/Synch_Reply_Dispatcher.h"
+#include "tao/Client_Strategy_Factory.h"
+#include "tao/ORB_Core.h"
+#include "ace/Reactor.h"
+#include "ace/Countdown_Time.h"
+
+ACE_RCSID (tao,
+ Wait_On_Read,
+ "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+// Constructor.
+TAO_Wait_On_Read::TAO_Wait_On_Read (TAO_Transport *transport)
+ : TAO_Wait_Strategy (transport)
+{
+}
+
+// Destructor.
+TAO_Wait_On_Read::~TAO_Wait_On_Read (void)
+{
+}
+
+/*
+ * Hook to specialize the wait strategy when the concrete strategy is
+ * a simple "rw" strategy. Add all public/protected/private methods
+ * within the *COPY* hooks.
+ */
+
+//@@ WAIT_STRATEGY_SPL_COPY_HOOK_START
+
+// Wait on the read operation.
+int
+TAO_Wait_On_Read::wait (ACE_Time_Value * max_wait_time,
+ TAO_Synch_Reply_Dispatcher &rd)
+{
+ // Start the count down timer to account for the time spent in this
+ // method.
+ ACE_Countdown_Time countdown (max_wait_time);
+
+ rd.state_changed (TAO_LF_Event::LFS_ACTIVE,
+ this->transport_->orb_core ()->leader_follower ());
+
+ // Do the same sort of looping that is done in other wait
+ // strategies.
+ int retval = 0;
+ TAO_Resume_Handle rh;
+ while (1)
+ {
+ retval =
+ this->transport_->handle_input (rh,
+ max_wait_time,
+ 1);
+
+ // If we got our reply, no need to run the loop any
+ // further.
+ if (!rd.keep_waiting ())
+ break;
+
+ // @@ We are not checking for timeouts here...
+
+ // If we got an error just break
+ if (retval == -1)
+ break;
+ }
+
+ if (rd.error_detected () == -1 || retval == -1)
+ {
+ this->transport_->close_connection ();
+ }
+
+ if (rd.successful ())
+ {
+ TAO_ORB_Core * const oc =
+ this->transport_->orb_core ();
+
+ if (!oc->client_factory ()->use_cleanup_options ())
+ return 0;
+
+ if (TAO_debug_level > 0)
+ ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("TAO (%P|%t) - TAO_Wait_On_Read[%d]::wait (), ")
+ ACE_TEXT ("registering handle for cleanup \n"),
+ this->transport_->id ()));
+
+ ACE_Event_Handler * const eh =
+ this->transport_->event_handler_i ();
+
+ ACE_Reactor * const r =
+ this->transport_->orb_core ()->reactor ();
+
+ if (r->register_handler (eh,
+ ACE_Event_Handler::READ_MASK) == -1)
+ {
+ if (TAO_debug_level > 0)
+ ACE_ERROR ((LM_ERROR,
+ ACE_TEXT ("TAO (%P|%t) - TAO_Wait_On_Read[%d]::wait (), ")
+ ACE_TEXT ("registration with reactor returned an error \n"),
+ this->transport_->id ()));
+ }
+ else {
+ // Only set this flag when registration succeeds
+ this->is_registered_ = true;
+ }
+
+ return 0;
+ }
+
+ if (rd.error_detected ())
+ return -1;
+
+ return 1;
+}
+
+// No-op.
+int
+TAO_Wait_On_Read::register_handler (void)
+{
+ return 0;
+}
+
+bool
+TAO_Wait_On_Read::non_blocking (void) const
+{
+ return false;
+}
+
+bool
+TAO_Wait_On_Read::can_process_upcalls (void) const
+{
+ return true;
+}
+
+//@@ WAIT_STRATEGY_SPL_COPY_HOOK_END
+/*
+ * End copy hook.
+ */
+
+TAO_END_VERSIONED_NAMESPACE_DECL