00001
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
00019 TAO_Wait_On_Read::TAO_Wait_On_Read (TAO_Transport *transport)
00020 : TAO_Wait_Strategy (transport)
00021 {
00022 }
00023
00024
00025 TAO_Wait_On_Read::~TAO_Wait_On_Read (void)
00026 {
00027 }
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038 int
00039 TAO_Wait_On_Read::wait (ACE_Time_Value * max_wait_time,
00040 TAO_Synch_Reply_Dispatcher &rd)
00041 {
00042
00043
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
00050
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
00058
00059 if (!rd.keep_waiting ())
00060 break;
00061
00062
00063
00064
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
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
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
00137
00138
00139
00140
00141 TAO_END_VERSIONED_NAMESPACE_DECL