#include <SHMIOP_Connector.h>
Inheritance diagram for TAO_SHMIOP_Connector:


Concrete instance of the TAO_Connector class. Responsible for establishing a connection with a server and is called from the Connector_Registory.
Definition at line 51 of file SHMIOP_Connector.h.
|
|
Definition at line 90 of file SHMIOP_Connector.h. |
|
|
Definition at line 79 of file SHMIOP_Connector.h. Referenced by open(). |
|
|
Definition at line 82 of file SHMIOP_Connector.h. Referenced by open(). |
|
|
Definition at line 86 of file SHMIOP_Connector.h. |
|
|
Constructor.
Definition at line 26 of file SHMIOP_Connector.cpp. References TAO_TAG_SHMEM_PROFILE.
00027 : TAO_Connector (TAO_TAG_SHMEM_PROFILE), 00028 connect_strategy_ (), 00029 base_connector_ (), 00030 lite_flag_ (flag) 00031 { 00032 } |
|
|
Default destructor.
Definition at line 34 of file SHMIOP_Connector.cpp.
00035 {
00036 }
|
|
|
Cancel the passed cvs handler from the connector.
Implements TAO_Connector. Definition at line 339 of file SHMIOP_Connector.cpp. References ACE_Connector< SVC_HANDLER, ACE_PEER_CONNECTOR_2 >::cancel().
00341 {
00342 TAO_SHMIOP_Connection_Handler* handler=
00343 dynamic_cast<TAO_SHMIOP_Connection_Handler*>(svc_handler);
00344
00345 if (handler)
00346 // Cancel from the connector
00347 return this->base_connector_.cancel (handler);
00348
00349 return -1;
00350 }
|
|
|
Our activation strategy Implements TAO_Connector. Definition at line 291 of file SHMIOP_Connector.cpp. References ACE_OS::strchr(), ACE_OS::strlen(), and ACE_OS::strncasecmp().
00292 {
00293 // Check for a valid string
00294 if (!endpoint || !*endpoint)
00295 return -1; // Failure
00296
00297 const char *protocol[] = { "shmiop", "shmioploc" };
00298
00299 size_t slot = ACE_OS::strchr (endpoint, ':') - endpoint;
00300
00301 size_t len0 = ACE_OS::strlen (protocol[0]);
00302 size_t len1 = ACE_OS::strlen (protocol[1]);
00303
00304 // Check for the proper prefix in the IOR. If the proper prefix
00305 // isn't in the IOR then it is not an IOR we can use.
00306 if (slot == len0
00307 && ACE_OS::strncasecmp (endpoint, protocol[0], len0) == 0)
00308 return 0;
00309 else if (slot == len1
00310 && ACE_OS::strncasecmp (endpoint, protocol[1], len1) == 0)
00311 return 0;
00312
00313 return -1;
00314 // Failure: not an SHMIOP IOR
00315 // DO NOT throw an exception here.
00316 }
|
|
|
Our activation strategy Implements TAO_Connector. Definition at line 84 of file SHMIOP_Connector.cpp. References ACE_Strategy_Connector< SVC_HANDLER, >::close(), ACE_Strategy_Connector< SVC_HANDLER, >::concurrency_strategy(), and ACE_Strategy_Connector< SVC_HANDLER, >::creation_strategy().
00085 {
00086 delete this->base_connector_.concurrency_strategy ();
00087 delete this->base_connector_.creation_strategy ();
00088 return this->base_connector_.close ();
00089 }
|
|
|
Our activation strategy Implements TAO_Connector. Definition at line 252 of file SHMIOP_Connector.cpp. References TAO_Profile::_decr_refcnt(), ACE_NEW_RETURN, and TAO_Profile::decode().
00253 {
00254 TAO_Profile *pfile = 0;
00255 ACE_NEW_RETURN (pfile,
00256 TAO_SHMIOP_Profile (this->orb_core ()),
00257 0);
00258
00259 int r = pfile->decode (cdr);
00260 if (r == -1)
00261 {
00262 pfile->_decr_refcnt ();
00263 pfile = 0;
00264 }
00265
00266 return pfile;
00267 }
|
|
||||||||||||||||
|
Implements TAO_Connector. Definition at line 127 of file SHMIOP_Connector.cpp. References ACE_DEBUG, ACE_ERROR, ACE_TEXT, ACE_TEXT_CHAR_TO_TCHAR, TAO::Transport_Cache_Manager::cache_transport(), TAO_SHMIOP_Connection_Handler::close(), TAO_Transport::close_connection(), ACE_Connector< SVC_HANDLER, ACE_PEER_CONNECTOR_2 >::connect(), TAO_Transport_Descriptor_Interface::endpoint(), TAO_SHMIOP_Endpoint::host(), TAO_Transport::id(), TAO_Transport::is_connected(), TAO_ORB_Core::lane_resources(), LM_DEBUG, LM_ERROR, TAO_SHMIOP_Endpoint::object_addr(), TAO_Connector::orb_core(), ACE_Svc_Handler<, >::peer(), TAO_SHMIOP_Endpoint::port(), TAO_Transport::purge_entry(), TAO_Wait_Strategy::register_handler(), remote_endpoint(), TAO_Connect_Strategy::synch_options(), TAO_debug_level, TAO_Connection_Handler::transport(), TAO_Thread_Lane_Resources::transport_cache(), and TAO_Transport::wait_strategy().
00130 {
00131 if (TAO_debug_level > 0)
00132 ACE_DEBUG ((LM_DEBUG,
00133 ACE_TEXT ("TAO (%P|%t) - SHMIOP_Connector::make_connection, ")
00134 ACE_TEXT ("looking for SHMIOP connection.\n")));
00135
00136 TAO_SHMIOP_Endpoint *shmiop_endpoint =
00137 this->remote_endpoint (desc.endpoint ());
00138
00139 if (shmiop_endpoint == 0)
00140 return 0;
00141
00142 const ACE_INET_Addr &remote_address =
00143 shmiop_endpoint->object_addr ();
00144
00145 if (TAO_debug_level > 2)
00146 ACE_DEBUG ((LM_DEBUG,
00147 "TAO (%P|%t) - SHMIOP_Connector::make_connection, "
00148 "making a new connection to <%s:%d>\n",
00149 ACE_TEXT_CHAR_TO_TCHAR (shmiop_endpoint->host ()),
00150 shmiop_endpoint->port ()));
00151
00152 // Get the right synch options
00153 ACE_Synch_Options synch_options;
00154
00155 this->active_connect_strategy_->synch_options (timeout,
00156 synch_options);
00157
00158 TAO_SHMIOP_Connection_Handler *svc_handler = 0;
00159
00160 // Connect.
00161 int result = this->base_connector_.connect (svc_handler,
00162 remote_address,
00163 synch_options);
00164
00165 // This call creates the service handler and bumps the #REFCOUNT# up
00166 // one extra. There are two possibilities: (a) connection succeeds
00167 // immediately - in this case, the #REFCOUNT# on the handler is two;
00168 // (b) connection fails immediately - in this case, the #REFCOUNT#
00169 // on the handler is one since close() gets called on the handler.
00170 // We always use a blocking connection so the connection is never
00171 // pending.
00172
00173 // Make sure that we always do a remove_reference
00174 ACE_Event_Handler_var svc_handler_auto_ptr (svc_handler);
00175
00176 // In case of errors.
00177 if (result == -1)
00178 {
00179 // Give users a clue to the problem.
00180 if (TAO_debug_level > 0)
00181 {
00182 ACE_ERROR ((LM_ERROR,
00183 ACE_TEXT ("TAO (%P|%t) - SHMIOP_Connector::make_connection, ")
00184 ACE_TEXT ("connection to <%s:%u> failed (%p)\n"),
00185 ACE_TEXT_CHAR_TO_TCHAR (shmiop_endpoint->host ()),
00186 shmiop_endpoint->port (),
00187 ACE_TEXT ("errno")));
00188 }
00189
00190 return 0;
00191 }
00192
00193 // At this point, the connection has be successfully connected.
00194 // #REFCOUNT# is one.
00195 if (TAO_debug_level > 2)
00196 ACE_DEBUG ((LM_DEBUG,
00197 "TAO (%P|%t) - SHMIOP_Connector::make_connection, "
00198 "new connection to <%s:%d> on Transport[%d]\n",
00199 ACE_TEXT_CHAR_TO_TCHAR (shmiop_endpoint->host ()),
00200 shmiop_endpoint->port (),
00201 svc_handler->peer ().get_handle ()));
00202
00203 TAO_Transport *transport =
00204 svc_handler->transport ();
00205
00206 // Add the handler to Cache
00207 int retval =
00208 this->orb_core ()->lane_resources ().transport_cache ().cache_transport (&desc,
00209 transport);
00210
00211 // Failure in adding to cache.
00212 if (retval != 0)
00213 {
00214 // Close the handler.
00215 svc_handler->close ();
00216
00217 if (TAO_debug_level > 0)
00218 {
00219 ACE_ERROR ((LM_ERROR,
00220 "TAO (%P|%t) - SHMIOP_Connector::make_connection, "
00221 "could not add the new connection to cache\n"));
00222 }
00223
00224 return 0;
00225 }
00226
00227 if (transport->is_connected () &&
00228 transport->wait_strategy ()->register_handler () != 0)
00229 {
00230 // Registration failures.
00231
00232 // Purge from the connection cache, if we are not in the cache, this
00233 // just does nothing.
00234 (void) transport->purge_entry ();
00235
00236 // Close the handler.
00237 (void) transport->close_connection ();
00238
00239 if (TAO_debug_level > 0)
00240 ACE_ERROR ((LM_ERROR,
00241 "TAO (%P|%t) - SHMIOP_Connector [%d]::make_connection, "
00242 "could not register the transport in the reactor.\n",
00243 transport->id ()));
00244
00245 return 0;
00246 }
00247
00248 return transport;
00249 }
|
|
|
Implements TAO_Connector. Definition at line 270 of file SHMIOP_Connector.cpp. References ACE_CHECK_RETURN, and ACE_NEW_THROW_EX.
00271 {
00272 // The endpoint should be of the form:
00273 // N.n@port/object_key
00274 // or:
00275 // port/object_key
00276
00277 TAO_Profile *profile = 0;
00278 ACE_NEW_THROW_EX (profile,
00279 TAO_SHMIOP_Profile (this->orb_core ()),
00280 CORBA::NO_MEMORY (
00281 CORBA::SystemException::_tao_minor_code (
00282 TAO::VMCID,
00283 ENOMEM),
00284 CORBA::COMPLETED_NO));
00285 ACE_CHECK_RETURN (0);
00286
00287 return profile;
00288 }
|
|
|
Our activation strategy Implements TAO_Connector. Definition at line 319 of file SHMIOP_Connector.cpp.
00320 {
00321 return TAO_SHMIOP_Profile::object_key_delimiter_;
00322 }
|
|
|
Our activation strategy Implements TAO_Connector. Definition at line 39 of file SHMIOP_Connector.cpp. References ACE_NEW_RETURN, ACE_Connector< SVC_HANDLER, ACE_PEER_CONNECTOR_2 >::connector(), ACE_Strategy_Connector< SVC_HANDLER, >::open(), TAO_Connector::orb_core(), TAO_SHMIOP_CONNECT_CONCURRENCY_STRATEGY, TAO_SHMIOP_CONNECT_CREATION_STRATEGY, and TAO_ORB_Core::thr_mgr().
00040 {
00041 this->orb_core (orb_core);
00042
00043 // The SHMIOP always uses a blocked connect strategy
00044 // @@todo: There are better ways of doing this. Let it be like this
00045 // for the present.
00046 ACE_NEW_RETURN (this->active_connect_strategy_,
00047 TAO_Blocked_Connect_Strategy (orb_core),
00048 -1);
00049
00050 // Our connect creation strategy
00051 TAO_SHMIOP_CONNECT_CREATION_STRATEGY *connect_creation_strategy = 0;
00052
00053 ACE_NEW_RETURN (connect_creation_strategy,
00054 TAO_SHMIOP_CONNECT_CREATION_STRATEGY
00055 (orb_core->thr_mgr (),
00056 orb_core,
00057 this->lite_flag_),
00058 -1);
00059
00060 /// Our activation strategy
00061 TAO_SHMIOP_CONNECT_CONCURRENCY_STRATEGY *concurrency_strategy = 0;
00062
00063 ACE_NEW_RETURN (concurrency_strategy,
00064 TAO_SHMIOP_CONNECT_CONCURRENCY_STRATEGY (orb_core),
00065 -1);
00066
00067 if (this->base_connector_.open (this->orb_core ()->reactor (),
00068 connect_creation_strategy,
00069 &this->connect_strategy_,
00070 concurrency_strategy) == -1)
00071 return -1;
00072 // We can take advantage of the multithreaded shared-memory transport
00073 // if the client will block on read (i.e., will not allow callback.)
00074 else if (orb_core->client_factory ()->allow_callback () == 0)
00075
00076 {
00077 this->base_connector_.connector ().preferred_strategy (ACE_MEM_IO::MT);
00078 this->connect_strategy_.connector ().preferred_strategy (ACE_MEM_IO::MT);
00079 }
00080 return 0;
00081 }
|
|
|
Return the remote endpoint, a helper function.
Definition at line 325 of file SHMIOP_Connector.cpp. References TAO_Endpoint::tag(), and TAO_TAG_SHMEM_PROFILE. Referenced by make_connection().
00326 {
00327 if (endpoint->tag () != TAO_TAG_SHMEM_PROFILE)
00328 return 0;
00329
00330 TAO_SHMIOP_Endpoint *shmiop_endpoint =
00331 dynamic_cast <TAO_SHMIOP_Endpoint *>(endpoint);
00332 if (shmiop_endpoint == 0)
00333 return 0;
00334
00335 return shmiop_endpoint;
00336 }
|
|
|
Implements TAO_Connector. Definition at line 92 of file SHMIOP_Connector.cpp. References ACE_ERROR, ACE_TEXT, ACE_Addr::get_type(), LM_ERROR, TAO_SHMIOP_Endpoint::object_addr(), TAO_Endpoint::tag(), TAO_debug_level, and TAO_TAG_SHMEM_PROFILE.
00093 {
00094 if (endpoint->tag () != TAO_TAG_SHMEM_PROFILE)
00095 return -1;
00096
00097 TAO_SHMIOP_Endpoint *shmiop_endpoint =
00098 dynamic_cast <TAO_SHMIOP_Endpoint *>(endpoint);
00099 if (shmiop_endpoint == 0)
00100 return -1;
00101
00102 const ACE_INET_Addr &remote_address =
00103 shmiop_endpoint->object_addr ();
00104
00105 // Verify that the remote ACE_INET_Addr was initialized properly.
00106 // Failure can occur if hostname lookup failed when initializing the
00107 // remote ACE_INET_Addr.
00108 if (remote_address.get_type () != AF_INET)
00109 {
00110 if (TAO_debug_level > 0)
00111 {
00112 ACE_ERROR ((LM_ERROR,
00113 ACE_TEXT ("TAO (%P|%t) SHMIOP connection failed.\n")
00114 ACE_TEXT ("TAO (%P|%t) This is most likely ")
00115 ACE_TEXT ("due to a hostname lookup ")
00116 ACE_TEXT ("failure.\n")));
00117 }
00118
00119 return -1;
00120 }
00121
00122 return 0;
00123
00124 }
|
|
|
Local address.
Definition at line 119 of file SHMIOP_Connector.h. |
|
|
The connector initiating connection requests for SHMIOP.
Definition at line 125 of file SHMIOP_Connector.h. |
|
|
Our connect strategy.
Definition at line 122 of file SHMIOP_Connector.h. |
|
|
Are we using GIOP lite?
Definition at line 128 of file SHMIOP_Connector.h. |
1.3.6