Wait_On_Read.cpp

Go to the documentation of this file.
00001 // $Id: Wait_On_Read.cpp 79151 2007-08-01 09:04:36Z johnnyw $
00002 
00003 #include "tao/Wait_On_Read.h"
00004 #include "tao/Transport.h"
00005 #include "tao/Resume_Handle.h"
00006 #include "tao/Synch_Reply_Dispatcher.h"
00007 #include "tao/Client_Strategy_Factory.h"
00008 #include "tao/ORB_Core.h"
00009 #include "ace/Reactor.h"
00010 #include "ace/Countdown_Time.h"
00011 
00012 ACE_RCSID (tao,
00013            Wait_On_Read,
00014            "$Id: Wait_On_Read.cpp 79151 2007-08-01 09:04:36Z johnnyw $")
00015 
00016 TAO_BEGIN_VERSIONED_NAMESPACE_DECL
00017 
00018 // Constructor.
00019 TAO_Wait_On_Read::TAO_Wait_On_Read (TAO_Transport *transport)
00020   : TAO_Wait_Strategy (transport)
00021 {
00022 }
00023 
00024 // Destructor.
00025 TAO_Wait_On_Read::~TAO_Wait_On_Read (void)
00026 {
00027 }
00028 
00029 /*
00030  * Hook to specialize the wait strategy when the concrete strategy is
00031  * a simple "rw" strategy. Add all public/protected/private methods
00032  * within the *COPY* hooks.
00033  */
00034 
00035 //@@ WAIT_STRATEGY_SPL_COPY_HOOK_START
00036 
00037 // Wait on the read operation.
00038 int
00039 TAO_Wait_On_Read::wait (ACE_Time_Value * max_wait_time,
00040                         TAO_Synch_Reply_Dispatcher &rd)
00041 {
00042   // Start the count down timer to account for the time spent in this
00043   // method.
00044   ACE_Countdown_Time countdown (max_wait_time);
00045 
00046   rd.state_changed (TAO_LF_Event::LFS_ACTIVE,
00047                     this->transport_->orb_core ()->leader_follower ());
00048 
00049   // Do the same sort of looping that is done in other wait
00050   // strategies.
00051   int retval = 0;
00052   TAO_Resume_Handle rh;
00053   while (1)
00054     {
00055       retval = this->transport_->handle_input (rh, max_wait_time);
00056 
00057       // If we got our reply, no need to run the loop any
00058       // further.
00059       if (!rd.keep_waiting ())
00060         break;
00061 
00062       // @@ We are not checking for timeouts here...
00063 
00064       // If we got an error just break
00065       if (retval == -1)
00066         break;
00067     }
00068 
00069   if (rd.error_detected () == -1 || retval == -1)
00070     {
00071       this->transport_->close_connection ();
00072     }
00073 
00074   if (rd.successful ())
00075      {
00076        TAO_ORB_Core * const oc =
00077          this->transport_->orb_core ();
00078 
00079        if (!oc->client_factory ()->use_cleanup_options ())
00080          return 0;
00081 
00082        if (TAO_debug_level > 0)
00083          ACE_DEBUG ((LM_DEBUG,
00084                      ACE_TEXT ("TAO (%P|%t) - TAO_Wait_On_Read[%d]::wait (), ")
00085                      ACE_TEXT ("registering handle for cleanup \n"),
00086                      this->transport_->id ()));
00087 
00088        ACE_Event_Handler * const eh =
00089          this->transport_->event_handler_i ();
00090 
00091        ACE_Reactor * const r =
00092          this->transport_->orb_core ()->reactor ();
00093 
00094        if (r->register_handler (eh,
00095                                 ACE_Event_Handler::READ_MASK) == -1)
00096          {
00097            if (TAO_debug_level > 0)
00098              ACE_ERROR ((LM_ERROR,
00099                          ACE_TEXT ("TAO (%P|%t) - TAO_Wait_On_Read[%d]::wait (), ")
00100                         ACE_TEXT ("registration with reactor returned an error \n"),
00101                          this->transport_->id ()));
00102         }
00103        else {
00104    // Only set this flag when registration succeeds
00105    this->is_registered_ = true;
00106        }
00107 
00108        return 0;
00109      }
00110 
00111   if (rd.error_detected ())
00112     return -1;
00113 
00114   return 1;
00115 }
00116 
00117 // No-op.
00118 int
00119 TAO_Wait_On_Read::register_handler (void)
00120 {
00121   return 0;
00122 }
00123 
00124 bool
00125 TAO_Wait_On_Read::non_blocking (void) const
00126 {
00127   return false;
00128 }
00129 
00130 bool
00131 TAO_Wait_On_Read::can_process_upcalls (void) const
00132 {
00133   return true;
00134 }
00135 
00136 //@@ WAIT_STRATEGY_SPL_COPY_HOOK_END
00137 /*
00138  * End copy hook.
00139  */
00140 
00141 TAO_END_VERSIONED_NAMESPACE_DECL

Generated on Tue Feb 2 17:37:53 2010 for TAO by  doxygen 1.4.7