#include <Wait_On_Read.h>
Inheritance diagram for TAO_Wait_On_Read:
Public Member Functions | |
TAO_Wait_On_Read (TAO_Transport *transport) | |
Constructor. | |
virtual | ~TAO_Wait_On_Read (void) |
Destructor. | |
virtual int | wait (ACE_Time_Value *max_wait_time, TAO_Synch_Reply_Dispatcher &rd) |
virtual int | register_handler (void) |
virtual bool | non_blocking (void) const |
virtual bool | can_process_upcalls (void) const |
Definition at line 32 of file Wait_On_Read.h.
|
Constructor.
Definition at line 19 of file Wait_On_Read.cpp.
00020 : TAO_Wait_Strategy (transport) 00021 { 00022 } |
|
Destructor.
Definition at line 25 of file Wait_On_Read.cpp.
00026 { 00027 } |
|
This flag is to check whether the thread can process upcalls while waiting for the reply. Some wait strategies, like Wait_On_LF_No_Upcall does not allow the client threads to process requests while waiting for the reply. Implements TAO_Wait_Strategy. Definition at line 132 of file Wait_On_Read.cpp.
00133 { 00134 return true; 00135 } |
|
Returns a value to indicate whether the transport needs to set the socket on which it is waiting to non-blocking mode or not. Implements TAO_Wait_Strategy. Definition at line 126 of file Wait_On_Read.cpp.
00127 { 00128 return false; 00129 } |
|
Register the handler needs with the reactor provided that it makes sense for the strategy. Implements TAO_Wait_Strategy. Definition at line 120 of file Wait_On_Read.cpp.
00121 {
00122 return 0;
00123 }
|
|
Base class virtual method. Wait till the Implements TAO_Wait_Strategy. Definition at line 39 of file Wait_On_Read.cpp. References ACE_DEBUG, ACE_ERROR, ACE_TEXT, TAO_ORB_Core::client_factory(), TAO_Transport::close_connection(), TAO_LF_Invocation_Event::error_detected(), TAO_Transport::event_handler_i(), TAO_Transport::handle_input(), TAO_LF_Event::keep_waiting(), LM_DEBUG, LM_ERROR, TAO_Transport::orb_core(), TAO_ORB_Core::reactor(), ACE_Reactor::register_handler(), TAO_LF_Event::state_changed(), TAO_LF_Invocation_Event::successful(), TAO_debug_level, and TAO_Client_Strategy_Factory::use_cleanup_options().
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 = 00056 this->transport_->handle_input (rh, 00057 max_wait_time, 00058 1); 00059 00060 // If we got our reply, no need to run the loop any 00061 // further. 00062 if (!rd.keep_waiting ()) 00063 break; 00064 00065 // @@ We are not checking for timeouts here... 00066 00067 // If we got an error just break 00068 if (retval == -1) 00069 break; 00070 } 00071 00072 if (rd.error_detected () == -1 || retval == -1) 00073 { 00074 this->transport_->close_connection (); 00075 } 00076 00077 if (rd.successful ()) 00078 { 00079 TAO_ORB_Core *oc = 00080 this->transport_->orb_core (); 00081 00082 if (!oc->client_factory ()->use_cleanup_options ()) 00083 return 0; 00084 00085 if (TAO_debug_level > 0) 00086 ACE_DEBUG ((LM_DEBUG, 00087 ACE_TEXT ("TAO (%P|%t) - TAO_Wait_On_Read[%d]::wait (), ") 00088 ACE_TEXT ("registering handle for cleanup \n"), 00089 this->transport_->id ())); 00090 00091 ACE_Event_Handler * const eh = 00092 this->transport_->event_handler_i (); 00093 00094 ACE_Reactor * const r = 00095 this->transport_->orb_core ()->reactor (); 00096 00097 if (r->register_handler (eh, 00098 ACE_Event_Handler::READ_MASK) == -1) 00099 { 00100 if (TAO_debug_level > 0) 00101 ACE_ERROR ((LM_ERROR, 00102 ACE_TEXT ("TAO (%P|%t) - TAO_Wait_On_Read[%d]::wait (), ") 00103 ACE_TEXT ("registration with reactor returned an error \n"), 00104 this->transport_->id ())); 00105 } 00106 00107 this->is_registered_ = true; 00108 00109 return 0; 00110 } 00111 00112 if (rd.error_detected ()) 00113 return -1; 00114 00115 return 1; 00116 } |