Go to the documentation of this file.00001
00002
00003 #include "tao/Strategies/SHMIOP_Connection_Handler.h"
00004
00005 #if defined (TAO_HAS_SHMIOP) && (TAO_HAS_SHMIOP != 0)
00006
00007 #include "tao/Timeprobe.h"
00008 #include "tao/debug.h"
00009 #include "tao/ORB_Core.h"
00010 #include "tao/ORB.h"
00011 #include "tao/CDR.h"
00012 #include "tao/Server_Strategy_Factory.h"
00013 #include "tao/Base_Transport_Property.h"
00014 #include "tao/Transport_Cache_Manager.h"
00015 #include "tao/Thread_Lane_Resources.h"
00016 #include "tao/Strategies/SHMIOP_Endpoint.h"
00017 #include "tao/Resume_Handle.h"
00018 #include "tao/Protocols_Hooks.h"
00019
00020 #include "ace/os_include/netinet/os_tcp.h"
00021 #include "ace/os_include/os_netdb.h"
00022
00023 ACE_RCSID (Strategies,
00024 SHMIOP_Connection_Handler,
00025 "$Id: SHMIOP_Connection_Handler.cpp 85817 2009-06-26 20:44:58Z mitza $")
00026
00027 TAO_BEGIN_VERSIONED_NAMESPACE_DECL
00028
00029 TAO_SHMIOP_Connection_Handler::TAO_SHMIOP_Connection_Handler (ACE_Thread_Manager *t)
00030 : TAO_SHMIOP_SVC_HANDLER (t, 0 , 0),
00031 TAO_Connection_Handler (0)
00032 {
00033
00034
00035
00036
00037
00038 ACE_ASSERT (0);
00039 }
00040
00041
00042 TAO_SHMIOP_Connection_Handler::TAO_SHMIOP_Connection_Handler (TAO_ORB_Core *orb_core)
00043 : TAO_SHMIOP_SVC_HANDLER (orb_core->thr_mgr (), 0, 0),
00044 TAO_Connection_Handler (orb_core)
00045 {
00046 TAO_SHMIOP_Transport* specific_transport = 0;
00047 ACE_NEW (specific_transport,
00048 TAO_SHMIOP_Transport(this, orb_core));
00049
00050
00051 this->transport (specific_transport);
00052 }
00053
00054
00055 TAO_SHMIOP_Connection_Handler::~TAO_SHMIOP_Connection_Handler (void)
00056 {
00057 delete this->transport ();
00058 int const result =
00059 this->release_os_resources ();
00060
00061 if (result == -1 && TAO_debug_level)
00062 {
00063 ACE_ERROR ((LM_ERROR,
00064 ACE_TEXT("TAO (%P|%t) - SHMIOP_Connection_Handler::")
00065 ACE_TEXT("~SHMIOP_Connection_Handler, ")
00066 ACE_TEXT("release_os_resources() failed %m\n")));
00067 }
00068
00069 }
00070
00071 int
00072 TAO_SHMIOP_Connection_Handler::open_handler (void *v)
00073 {
00074 return this->open (v);
00075 }
00076
00077 int
00078 TAO_SHMIOP_Connection_Handler::open (void*)
00079 {
00080 if (this->shared_open() == -1)
00081 return -1;
00082
00083 TAO_SHMIOP_Protocol_Properties protocol_properties;
00084
00085
00086 protocol_properties.send_buffer_size_ =
00087 this->orb_core ()->orb_params ()->sock_sndbuf_size ();
00088 protocol_properties.recv_buffer_size_ =
00089 this->orb_core ()->orb_params ()->sock_rcvbuf_size ();
00090 protocol_properties.no_delay_ =
00091 this->orb_core ()->orb_params ()->nodelay ();
00092
00093 TAO_Protocols_Hooks *tph = this->orb_core ()->get_protocols_hooks ();
00094
00095 if (tph != 0)
00096 {
00097 try
00098 {
00099 if (this->transport ()->opened_as () == TAO::TAO_CLIENT_ROLE)
00100 {
00101 tph->client_protocol_properties_at_orb_level (protocol_properties);
00102 }
00103 else
00104 {
00105 tph->server_protocol_properties_at_orb_level (protocol_properties);
00106 }
00107 }
00108 catch (const ::CORBA::Exception&)
00109 {
00110 return -1;
00111 }
00112 }
00113
00114 if (this->set_socket_option (this->peer (),
00115 protocol_properties.send_buffer_size_,
00116 protocol_properties.recv_buffer_size_) == -1)
00117 return -1;
00118
00119 #if !defined (ACE_LACKS_TCP_NODELAY)
00120 if (this->peer ().set_option (ACE_IPPROTO_TCP,
00121 TCP_NODELAY,
00122 (void *) &protocol_properties.no_delay_,
00123 sizeof (protocol_properties.no_delay_)) == -1)
00124 return -1;
00125
00126 #endif
00127
00128 if (this->transport ()->wait_strategy ()->non_blocking ())
00129 {
00130 if (this->peer ().enable (ACE_NONBLOCK) == -1)
00131 return -1;
00132 }
00133
00134
00135
00136 ACE_INET_Addr addr;
00137
00138 ACE_TCHAR local_as_string[MAXHOSTNAMELEN + 16];
00139
00140
00141 if (this->peer ().get_remote_addr (addr) == -1)
00142 return -1;
00143
00144
00145 else if (addr.addr_to_string (local_as_string, sizeof (local_as_string)) == -1)
00146 return -1;
00147
00148 if (TAO_debug_level > 0)
00149 {
00150 ACE_DEBUG ((LM_DEBUG,
00151 ACE_TEXT ("TAO (%P|%t) - SHMIOP connection from client")
00152 ACE_TEXT ("<%s> on %d\n"),
00153 local_as_string, this->peer ().get_handle ()));
00154 }
00155
00156
00157
00158
00159 if (!this->transport ()->post_open ((size_t) this->get_handle ()))
00160 return -1;
00161
00162
00163 this->state_changed (TAO_LF_Event::LFS_SUCCESS,
00164 this->orb_core ()->leader_follower ());
00165
00166 return 0;
00167 }
00168
00169 int
00170 TAO_SHMIOP_Connection_Handler::resume_handler (void)
00171 {
00172 return ACE_Event_Handler::ACE_APPLICATION_RESUMES_HANDLER;
00173 }
00174
00175 int
00176 TAO_SHMIOP_Connection_Handler::close_connection (void)
00177 {
00178 return this->close_connection_eh (this);
00179 }
00180
00181 int
00182 TAO_SHMIOP_Connection_Handler::handle_input (ACE_HANDLE h)
00183 {
00184 return this->handle_input_eh (h, this);
00185 }
00186
00187 int
00188 TAO_SHMIOP_Connection_Handler::handle_output (ACE_HANDLE handle)
00189 {
00190 int result =
00191 this->handle_output_eh (handle, this);
00192
00193 if (result == -1)
00194 {
00195 this->close_connection ();
00196 return 0;
00197 }
00198
00199 return result;
00200 }
00201
00202 int
00203 TAO_SHMIOP_Connection_Handler::handle_timeout (const ACE_Time_Value &,
00204 const void *)
00205 {
00206
00207
00208
00209
00210
00211
00212 TAO_Auto_Reference<TAO_SHMIOP_Connection_Handler> safeguard (*this);
00213
00214
00215
00216
00217
00218
00219
00220 int ret = this->close ();
00221 this->reset_state (TAO_LF_Event::LFS_TIMEOUT);
00222 return ret;
00223 }
00224
00225 int
00226 TAO_SHMIOP_Connection_Handler::handle_close (ACE_HANDLE,
00227 ACE_Reactor_Mask)
00228 {
00229 ACE_ASSERT (0);
00230 return 0;
00231 }
00232
00233 int
00234 TAO_SHMIOP_Connection_Handler::close (u_long flags)
00235 {
00236 return this->close_handler (flags);
00237 }
00238
00239 int
00240 TAO_SHMIOP_Connection_Handler::release_os_resources (void)
00241 {
00242 return this->peer().close ();
00243 }
00244
00245 int
00246 TAO_SHMIOP_Connection_Handler::add_transport_to_cache (void)
00247 {
00248 ACE_INET_Addr addr;
00249
00250
00251 if (this->peer ().get_remote_addr (addr) == -1)
00252 return -1;
00253
00254
00255 TAO_SHMIOP_Endpoint endpoint (
00256 addr,
00257 this->orb_core()->orb_params()->use_dotted_decimal_addresses ());
00258
00259
00260 TAO_Base_Transport_Property prop (&endpoint);
00261
00262 TAO::Transport_Cache_Manager &cache =
00263 this->orb_core ()->lane_resources ().transport_cache ();
00264
00265
00266 return cache.cache_transport (&prop, this->transport ());
00267 }
00268
00269 int
00270 TAO_SHMIOP_Connection_Handler::handle_write_ready (const ACE_Time_Value *t)
00271 {
00272 return ACE::handle_write_ready (this->peer ().get_handle (), t);
00273 }
00274
00275 TAO_END_VERSIONED_NAMESPACE_DECL
00276
00277 #endif