TAO_Acceptor_Registry Class Reference

Acceptor Registry and Generic Acceptor interface definitions. All loaded ESIOP or GIOP acceptor bridges must register with this object. More...

#include <Acceptor_Registry.h>

Collaboration diagram for TAO_Acceptor_Registry:

Collaboration graph
[legend]
List of all members.

Public Member Functions

 TAO_Acceptor_Registry (void)
 Default constructor.

 ~TAO_Acceptor_Registry (void)
 Default destructor.

int open (TAO_ORB_Core *orb_core, ACE_Reactor *reactor, const TAO_EndpointSet &endpoint_set, bool ignore_address)
 Initialize all registered acceptors. Return -1 on error.

int close_all (void)
 Close all open acceptors.

size_t endpoint_count (void)
 Returns the total number of endpoints in all of its acceptors.

int is_collocated (const TAO_MProfile &mprofile)
TAO_Acceptorget_acceptor (CORBA::ULong tag)
 Return the acceptor bridges.

TAO_AcceptorSetIterator begin (void)
TAO_AcceptorSetIterator end (void)

Private Member Functions

int open_default (TAO_ORB_Core *orb_core, ACE_Reactor *reactor, const char *options)
 Create a default acceptor for all loaded protocols.

int open_default (TAO_ORB_Core *orb_core, ACE_Reactor *reactor, int major, int minor, TAO_ProtocolFactorySetItor &factory, const char *options)
 Create a default acceptor using the specified protocol factory.

int open_default_i (TAO_ORB_Core *orb_core, ACE_Reactor *reactor, int major, int minor, TAO_ProtocolFactorySetItor &factory, TAO_Acceptor *acceptor, const char *options)
 Open a default acceptor.

void extract_endpoint_options (ACE_CString &addrs, ACE_CString &options, TAO_Protocol_Factory *factory)
 Extract endpoint-specific options from the endpoint string.

void extract_endpoint_version (ACE_CString &address, int &major, int &minor)
int open_i (TAO_ORB_Core *orb_core, ACE_Reactor *reactor, ACE_CString &address, TAO_ProtocolFactorySetItor &factory, bool ignore_address)
 TAO_Acceptor_Registry (const TAO_Acceptor_Registry &)
void operator= (const TAO_Acceptor_Registry &)

Private Attributes

TAO_Acceptor ** acceptors_
 List of acceptors that are currently open.

size_t size_
 Number of acceptors that are currently open.


Detailed Description

Acceptor Registry and Generic Acceptor interface definitions. All loaded ESIOP or GIOP acceptor bridges must register with this object.

This class maintains a list os acceptor factories for all loaded ORB protocols. There is one Acceptor_Registry per ORB_Core.

Definition at line 62 of file Acceptor_Registry.h.


Constructor & Destructor Documentation

TAO_BEGIN_VERSIONED_NAMESPACE_DECL TAO_Acceptor_Registry::TAO_Acceptor_Registry void   ) 
 

Default constructor.

Definition at line 36 of file Acceptor_Registry.cpp.

00037   : acceptors_ (0),
00038     size_ (0)
00039 {
00040 }

TAO_Acceptor_Registry::~TAO_Acceptor_Registry void   ) 
 

Default destructor.

Definition at line 42 of file Acceptor_Registry.cpp.

References acceptors_, and close_all().

00043 {
00044   this->close_all ();
00045 
00046   delete [] this->acceptors_;
00047 }

TAO_Acceptor_Registry::TAO_Acceptor_Registry const TAO_Acceptor_Registry  )  [private]
 


Member Function Documentation

TAO_BEGIN_VERSIONED_NAMESPACE_DECL ACE_INLINE TAO_AcceptorSetIterator TAO_Acceptor_Registry::begin void   ) 
 

Definition at line 8 of file Acceptor_Registry.i.

References acceptors_.

Referenced by close_all(), endpoint_count(), get_acceptor(), is_collocated(), and TAO_IIOP_Transport::set_bidir_context_info().

00009 {
00010   return this->acceptors_;
00011 }

int TAO_Acceptor_Registry::close_all void   ) 
 

Close all open acceptors.

Definition at line 620 of file Acceptor_Registry.cpp.

References begin(), TAO_Acceptor::close(), end(), and TAO_AcceptorSetIterator.

Referenced by TAO_Thread_Lane_Resources::finalize(), and ~TAO_Acceptor_Registry().

00621 {
00622   const TAO_AcceptorSetIterator end = this->end ();
00623 
00624   for (TAO_AcceptorSetIterator i = this->begin (); i != end; ++i)
00625     {
00626       if (*i == 0)
00627         {
00628           continue;
00629         }
00630 
00631       (*i)->close ();
00632 
00633       delete *i;
00634     }
00635 
00636   this->size_ = 0;
00637   return 0;
00638 }

ACE_INLINE TAO_AcceptorSetIterator TAO_Acceptor_Registry::end void   ) 
 

Definition at line 14 of file Acceptor_Registry.i.

References acceptors_.

Referenced by close_all(), endpoint_count(), get_acceptor(), is_collocated(), and TAO_IIOP_Transport::set_bidir_context_info().

00015 {
00016   return this->acceptors_ + this->size_;
00017 }

size_t TAO_Acceptor_Registry::endpoint_count void   ) 
 

Returns the total number of endpoints in all of its acceptors.

Definition at line 50 of file Acceptor_Registry.cpp.

References begin(), end(), TAO_Acceptor::endpoint_count(), and TAO_AcceptorSetIterator.

00051 {
00052   int count = 0;
00053   const TAO_AcceptorSetIterator end = this->end ();
00054 
00055   for (TAO_AcceptorSetIterator i = this->begin (); i != end; ++i)
00056     {
00057       count += (*i)->endpoint_count ();
00058     }
00059 
00060   return count;
00061 }

void TAO_Acceptor_Registry::extract_endpoint_options ACE_CString addrs,
ACE_CString options,
TAO_Protocol_Factory factory
[private]
 

Extract endpoint-specific options from the endpoint string.

Definition at line 641 of file Acceptor_Registry.cpp.

References TAO_Protocol_Factory::options_delimiter(), and ssize_t.

Referenced by open_i().

00644 {
00645   const ssize_t options_index =
00646     addrs.find (factory->options_delimiter ());
00647 
00648   if (options_index == static_cast<ssize_t> (addrs.length () - 1))
00649     {
00650       // Get rid of trailing option delimiter.
00651       addrs = addrs.substring (0, addrs.length () - 1);
00652     }
00653   else if (options_index != ACE_CString::npos)
00654     {
00655       options = addrs.substring (options_index + 1);
00656       addrs = addrs.substring (0, options_index);
00657     }
00658 }

void TAO_Acceptor_Registry::extract_endpoint_version ACE_CString address,
int &  major,
int &  minor
[private]
 

Extract endpoint/address specific version from the endpoint string.

Definition at line 661 of file Acceptor_Registry.cpp.

References TAO_DEF_GIOP_MAJOR, and TAO_DEF_GIOP_MINOR.

Referenced by open_i().

00664 {
00665   // Check if an "N.n@" version prefix was
00666   // specified.
00667   major = TAO_DEF_GIOP_MAJOR;
00668   minor = TAO_DEF_GIOP_MINOR;
00669 
00670   if (isdigit (address[0])
00671       && address[1] == '.'
00672       && isdigit (address[2])
00673       && address[3] == '@')
00674     {
00675       major = address[0] - '0';
00676       minor = address[2] - '0';
00677       address = address.substring (4);
00678     }
00679 }

TAO_Acceptor * TAO_Acceptor_Registry::get_acceptor CORBA::ULong  tag  ) 
 

Return the acceptor bridges.

Definition at line 106 of file Acceptor_Registry.cpp.

References begin(), end(), and TAO_AcceptorSetIterator.

Referenced by TAO_Tagged_Profile::extract_object_key().

00107 {
00108   TAO_AcceptorSetIterator end = this->end ();
00109   TAO_AcceptorSetIterator acceptor = this->begin ();
00110 
00111   for (; acceptor != end; ++acceptor)
00112     {
00113       if ((*acceptor)->tag () == tag)
00114         {
00115           return *acceptor;
00116         }
00117     }
00118 
00119   return 0;
00120 }

int TAO_Acceptor_Registry::is_collocated const TAO_MProfile mprofile  ) 
 

Check if there is at least one profile in mprofile that corresponds to a collocated object.

Definition at line 64 of file Acceptor_Registry.cpp.

References begin(), end(), TAO_Profile::endpoint(), TAO_MProfile::get_profile(), TAO_Endpoint::next(), TAO_MProfile::profile_count(), TAO_Profile::tag(), TAO_AcceptorSetIterator, and TAO_PHandle.

Referenced by TAO_Thread_Lane_Resources::is_collocated().

00065 {
00066   const TAO_AcceptorSetIterator end = this->end ();
00067 
00068   const CORBA::ULong count = mprofile.profile_count ();
00069 
00070   // If at least one endpoint in one of the profiles matches one of
00071   // the acceptors, we are collocated.
00072   for (TAO_AcceptorSetIterator i = this->begin (); i != end; ++i)
00073     {
00074       for (TAO_PHandle j = 0; j != count; ++j)
00075         {
00076           const TAO_Profile *profile = mprofile.get_profile (j);
00077 
00078           // @@ We need to invoke a nonconst <endpoint> method on
00079           //    <profile>.  The content of profile/endpoint will not
00080           //    be modified.
00081           TAO_Profile *pf = const_cast<TAO_Profile *> (profile);
00082 
00083           // Check all endpoints for address equality.
00084           if ((*i)->tag () == pf->tag ())
00085             {
00086               // @note This can be a potentially expensive (O(n^2))
00087               //       operation if the below is_collocated() call
00088               //       also executes a loop.
00089               for (TAO_Endpoint *endp = pf->endpoint ();
00090                    endp != 0;
00091                    endp = endp->next ())
00092                 {
00093                   if ((*i)->is_collocated (endp))
00094                     {
00095                       return 1;
00096                     }
00097                 }
00098             }
00099         }
00100     }
00101 
00102   return 0;
00103 }

int TAO_Acceptor_Registry::open TAO_ORB_Core orb_core,
ACE_Reactor reactor,
const TAO_EndpointSet endpoint_set,
bool  ignore_address
 

Initialize all registered acceptors. Return -1 on error.

Definition at line 123 of file Acceptor_Registry.cpp.

References acceptors_, ACE_CHECK_RETURN, ACE_CString, ACE_ENV_ARG_PARAMETER, ACE_ERROR, ACE_NEW_THROW_EX, ACE_TEXT, ACE_TEXT_CHAR_TO_TCHAR, ACE_THROW_RETURN, ACE_Unbounded_Queue_Const_Iterator< T >::advance(), ACE_Unbounded_Set< T >::begin(), ACE_Unbounded_Set< T >::end(), LM_ERROR, ACE_Unbounded_Queue_Const_Iterator< T >::next(), open_default(), open_i(), prefix, TAO_ORB_Core::protocol_factories(), ssize_t, ACE_OS::strchr(), ACE_OS::strlen(), TAO_ACCEPTOR_REGISTRY_OPEN_LOCATION_CODE, TAO_debug_level, TAO_EndpointSetIterator, and TAO_ProtocolFactorySetItor.

Referenced by TAO_Thread_Lane_Resources::open_acceptor_registry().

00128 {
00129   if (endpoint_set.is_empty ()
00130       // No endpoints were specified, we let each protocol pick its
00131       // own default.
00132 
00133       // All TAO pluggable protocols are expected to have the ability
00134       // to create a default endpoint.
00135       && this->open_default (orb_core, reactor, 0) == -1)
00136     {
00137       ACE_THROW_RETURN (CORBA::INTERNAL (
00138                           CORBA::SystemException::_tao_minor_code (
00139                             TAO_ACCEPTOR_REGISTRY_OPEN_LOCATION_CODE,
00140                             0),
00141                           CORBA::COMPLETED_NO),
00142                         -1);
00143     }
00144 
00145   // Count the maximum number of endpoints in the set.  This will be
00146   // the maximum number of acceptors that need to be created.
00147   size_t acceptor_count = 0;
00148   TAO_EndpointSetIterator endpts (endpoint_set);
00149 
00150   for (ACE_CString *ep = 0;
00151        endpts.next (ep) != 0;
00152        endpts.advance ())
00153     {
00154       const ACE_CString &iop = (*ep);
00155 
00156       // IOP://address1,address2
00157       //    ^ slot
00158       const ssize_t slot = iop.find ("://", 0);
00159 
00160       if (slot == iop.npos)
00161         {
00162           if (TAO_debug_level > 0)
00163             {
00164               ACE_ERROR ((LM_ERROR,
00165                           ACE_TEXT ("(%P|%t) Invalid endpoint ")
00166                           ACE_TEXT ("specification: <%s>.\n"),
00167                           ACE_TEXT_CHAR_TO_TCHAR (iop.c_str ())));
00168             }
00169 
00170           ACE_THROW_RETURN (CORBA::BAD_PARAM (
00171               CORBA::SystemException::_tao_minor_code (
00172                 TAO_ACCEPTOR_REGISTRY_OPEN_LOCATION_CODE,
00173                 EINVAL),
00174               CORBA::COMPLETED_NO),
00175             -1);
00176         }
00177 
00178       ++acceptor_count;  // We've got at least one acceptor so far.
00179 #if defined (ACE_WIN32) && defined (ACE_HAS_IPV6)
00180       // Since Win32 has single-stack IPv4/IPv6 we need an additional
00181       // acceptor if an iiop protocol without endpoints is specified
00182       // to open explicitly on IPv6 ANY *and* IPv4 ANY.
00183 
00184       // Now get the list of available protocol factories.
00185       const TAO_ProtocolFactorySetItor end =
00186         orb_core->protocol_factories ()->end ();
00187 
00188       // extract the protocol prefix
00189       const ACE_CString prefix (iop.substring (0, slot));
00190 
00191       for (TAO_ProtocolFactorySetItor factory =
00192              orb_core->protocol_factories ()->begin ();
00193            factory != end;
00194            ++factory)
00195         {
00196           if ((*factory)->factory ()->match_prefix (prefix))
00197             {
00198               if ((*factory)->factory ()->tag () == IOP::TAG_INTERNET_IOP)
00199                 {
00200                   // just add additional space to cover for possibility
00201                   ++acceptor_count;
00202                 }
00203               break; // we found the protocol, no need to go on
00204             }
00205         }
00206 #endif /* ACE_WIN32 && ACE_HAS_IPV6 */
00207 
00208       // Now count the number of commas.  That number will be the
00209       // remaining number of endpoints in the current endpoint
00210       // specification.
00211       const char *ep_end =
00212         ep->c_str () + ACE_OS::strlen (ep->c_str ());
00213 
00214       for (const char *e = ACE_OS::strchr (ep->c_str (), ',');
00215            e != 0 && e != ep_end;
00216            e = ACE_OS::strchr (e, ','))
00217         {
00218           ++acceptor_count;
00219           ++e;
00220         }
00221     }
00222 
00223   // The array containing the TAO_Acceptors will never contain more
00224   // than the number of endpoints stored in TAO_ORB_Parameters.
00225   if (this->acceptors_ == 0)
00226     {
00227       ACE_NEW_THROW_EX (this->acceptors_,
00228                         TAO_Acceptor *[acceptor_count],
00229                         CORBA::NO_MEMORY (
00230                           CORBA::SystemException::_tao_minor_code (
00231                             TAO_ACCEPTOR_REGISTRY_OPEN_LOCATION_CODE,
00232                             ENOMEM),
00233                           CORBA::COMPLETED_NO));
00234       ACE_CHECK_RETURN (-1);
00235     }
00236 
00237   TAO_EndpointSetIterator endpoints (endpoint_set);
00238 
00239   for (ACE_CString *endpoint = 0;
00240        endpoints.next (endpoint) != 0;
00241        endpoints.advance ())
00242     {
00243       const ACE_CString &iop = (*endpoint);
00244 
00245       // IOP://address1,address2
00246       //    ^ slot
00247       const ssize_t slot = iop.find ("://", 0);
00248 
00249       if (slot == iop.npos)
00250         {
00251           if (TAO_debug_level > 0)
00252             {
00253               ACE_ERROR ((LM_ERROR,
00254                           ACE_TEXT ("(%P|%t) Invalid endpoint ")
00255                           ACE_TEXT ("specification: <%s>.\n"),
00256                           ACE_TEXT_CHAR_TO_TCHAR (iop.c_str ())));
00257             }
00258 
00259           ACE_THROW_RETURN (CORBA::BAD_PARAM (
00260               CORBA::SystemException::_tao_minor_code (
00261                 TAO_ACCEPTOR_REGISTRY_OPEN_LOCATION_CODE,
00262                 EINVAL),
00263               CORBA::COMPLETED_NO),
00264             -1);
00265         }
00266 
00267       const ACE_CString prefix (iop.substring (0, slot));
00268 
00269       // @@ We could move the protocol factory loop to the outermost
00270       //    level but for now we leave it inside the endpoint loop
00271       //    under the assumption that there will be more endpoints
00272       //    than protocols.
00273 
00274       // Now get the list of available protocol factories.
00275       const TAO_ProtocolFactorySetItor end =
00276         orb_core->protocol_factories ()->end ();
00277 
00278       bool found = false;
00279       // If usable protocol (factory) is found then this will be
00280       // set equal to true.
00281 
00282       for (TAO_ProtocolFactorySetItor factory =
00283              orb_core->protocol_factories ()->begin ();
00284            factory != end;
00285            ++factory)
00286         {
00287           if ((*factory)->factory ()->match_prefix (prefix))
00288             {
00289               // increment slot past the "://" (i.e. add 3)
00290               ACE_CString addrs = iop.substring (slot + 3);
00291 
00292               const int result = this->open_i (orb_core,
00293                                                reactor,
00294                                                addrs,
00295                                                factory,
00296                                                ignore_address
00297                                                ACE_ENV_ARG_PARAMETER);
00298               ACE_CHECK_RETURN (-1);
00299 
00300               if (result != 0)
00301                 {
00302                   return -1;
00303                 }
00304 
00305               found = true;  // A usable protocol was found.
00306             }
00307           else
00308             {
00309               continue;
00310             }
00311         }
00312 
00313       if (found == false)
00314         {
00315           ACE_ERROR ((LM_ERROR,
00316                       ACE_TEXT ("TAO (%P|%t) ")
00317                       ACE_TEXT ("no usable transport protocol ")
00318                       ACE_TEXT ("was found.\n")));
00319 
00320           ACE_THROW_RETURN (CORBA::BAD_PARAM (
00321               CORBA::SystemException::_tao_minor_code (
00322                 TAO_ACCEPTOR_REGISTRY_OPEN_LOCATION_CODE,
00323                 EINVAL),
00324               CORBA::COMPLETED_NO),
00325             -1);
00326         }
00327     }
00328 
00329   return 0;
00330 }

int TAO_Acceptor_Registry::open_default TAO_ORB_Core orb_core,
ACE_Reactor reactor,
int  major,
int  minor,
TAO_ProtocolFactorySetItor factory,
const char *  options
[private]
 

Create a default acceptor using the specified protocol factory.

Definition at line 543 of file Acceptor_Registry.cpp.

References ACE_ERROR, ACE_TEXT, ACE_TEXT_CHAR_TO_TCHAR, LM_ERROR, open_default_i(), TAO_debug_level, and TAO_ProtocolFactorySetItor.

00549 {
00550   // No endpoints were specified, we let each protocol pick its own
00551   // default endpoint.
00552 
00553   // Make an acceptor
00554   TAO_Acceptor *acceptor =
00555     (*factory)->factory ()->make_acceptor ();
00556 
00557   if (acceptor == 0)
00558     {
00559       if (TAO_debug_level > 0)
00560         {
00561           ACE_ERROR ((
00562               LM_ERROR,
00563               ACE_TEXT ("TAO (%P|%t) unable to create ")
00564               ACE_TEXT ("an acceptor for <%s>\n"),
00565               ACE_TEXT_CHAR_TO_TCHAR ((*factory)->protocol_name ().c_str ())
00566             ));
00567         }
00568 
00569       return -1;
00570     }
00571 
00572   return this->open_default_i (orb_core,
00573                                reactor,
00574                                major,
00575                                minor,
00576                                factory,
00577                                acceptor,
00578                                options);
00579 }

int TAO_Acceptor_Registry::open_default TAO_ORB_Core orb_core,
ACE_Reactor reactor,
const char *  options
[private]
 

Create a default acceptor for all loaded protocols.

Definition at line 334 of file Acceptor_Registry.cpp.

References acceptors_, ACE_ERROR, ACE_IPV6_ANY, ACE_NEW_RETURN, ACE_TEXT, ACE_TEXT_CHAR_TO_TCHAR, ACE_Unbounded_Set< T >::begin(), TAO_ORB_Parameters::connect_ipv6_only(), TAO_IIOP_Acceptor::default_address(), ACE_Unbounded_Set< T >::end(), ACE_INET_Addr::get_port_number(), LM_ERROR, open_default_i(), TAO_ORB_Core::orb_params(), TAO_ORB_Core::protocol_factories(), ACE_INET_Addr::set(), TAO_IIOP_Acceptor::set_default_address(), ACE_Unbounded_Set< T >::size(), TAO_debug_level, TAO_DEF_GIOP_MAJOR, TAO_DEF_GIOP_MINOR, TAO_ProtocolFactorySet, and TAO_ProtocolFactorySetItor.

Referenced by open().

00337 {
00338   // Flag that indicates at least one endpoint was opened.  If one
00339   // wasn't opened then there is a problem.
00340   bool opened_endpoint = false;
00341 
00342 #if defined (ACE_WIN32) && defined (ACE_HAS_IPV6)
00343   if (!orb_core->orb_params ()->connect_ipv6_only () && this->acceptors_ == 0)
00344     {
00345       // Since Win32 has single-stack IPv4/IPv6 we need an additional
00346       // acceptor to open explicitly on IPv6 ANY *and* IPv4 ANY.
00347       // This code takes care of that.
00348 
00349       TAO_ProtocolFactorySet *pfs = orb_core->protocol_factories ();
00350 
00351       // Number of acceptors to set up
00352       size_t acceptor_count = 0;
00353 
00354       const TAO_ProtocolFactorySetItor end = pfs->end ();
00355 
00356       // Loop through all the loaded protocols...
00357       for (TAO_ProtocolFactorySetItor i = pfs->begin (); i != end; ++i)
00358         {
00359           if (!(*i)->factory ()->requires_explicit_endpoint ())
00360             {
00361               if ((*i)->factory ()->tag () == IOP::TAG_INTERNET_IOP)
00362                 acceptor_count += 2; // IPv4 AND IPv6 endpoints
00363               else
00364                 acceptor_count += 1;
00365             }
00366         }
00367 
00368       // Allocate TAO_Acceptor array
00369       ACE_NEW_RETURN (this->acceptors_,
00370                       TAO_Acceptor *[acceptor_count],
00371                       -1);
00372 
00373       // Loop through all the loaded protocols...
00374       for (TAO_ProtocolFactorySetItor i = pfs->begin (); i != end; ++i)
00375         {
00376           // If the protocol requires an explicit -ORBEndpoint option then
00377           // don't use it, otherwise open a default endpoint for that
00378           // protocol, this solves the problem with persistent endpoints
00379           // (such as UNIX domain rendesvouz points) that are not cleaned
00380           // up if the server crashes.
00381           if (!(*i)->factory ()->requires_explicit_endpoint ())
00382             {
00383               // Make an acceptor
00384               TAO_Acceptor *acceptor =
00385                 (*i)->factory ()->make_acceptor ();
00386 
00387               if (acceptor == 0)
00388                 {
00389                   if (TAO_debug_level > 0)
00390                     {
00391                       ACE_ERROR ((
00392                           LM_ERROR,
00393                           ACE_TEXT ("TAO (%P|%t) unable to create ")
00394                           ACE_TEXT ("an acceptor for <%s>\n"),
00395                           ACE_TEXT_CHAR_TO_TCHAR ((*i)->protocol_name ().c_str ())
00396                         ));
00397                     }
00398 
00399                   return -1;
00400                 }
00401 
00402               if ((*i)->factory ()->tag () == IOP::TAG_INTERNET_IOP)
00403                 {
00404                   // Open first acceptor on IPv4 ANY
00405                   ACE_INET_Addr addr(static_cast<unsigned short> (0)); // IPv4 ANY
00406 
00407                   TAO_IIOP_Acceptor* iiop_acceptor = dynamic_cast<TAO_IIOP_Acceptor*> (acceptor);
00408                   iiop_acceptor->set_default_address (addr);
00409 
00410                   if (this->open_default_i (orb_core,
00411                                             reactor,
00412                                             TAO_DEF_GIOP_MAJOR,  // default major
00413                                             TAO_DEF_GIOP_MINOR,  // default minor
00414                                             i,
00415                                             acceptor,
00416                                             options) != 0)
00417                     {
00418                       return -1;
00419                     }
00420 
00421                   // record the port chosen for the IPv4 acceptor
00422                   u_short port = iiop_acceptor->default_address ().get_port_number ();
00423 
00424                   // Create second acceptor for IPV6 traffic
00425                   acceptor =
00426                     (*i)->factory ()->make_acceptor ();
00427 
00428                   if (acceptor == 0)
00429                     {
00430                       if (TAO_debug_level > 0)
00431                         {
00432                           ACE_ERROR ((
00433                               LM_ERROR,
00434                               ACE_TEXT ("TAO (%P|%t) unable to create ")
00435                               ACE_TEXT ("an acceptor for <%s>\n"),
00436                               ACE_TEXT_CHAR_TO_TCHAR ((*i)->protocol_name ().c_str ())
00437                             ));
00438                         }
00439 
00440                       return -1;
00441                     }
00442 
00443                   addr.set (port, ACE_IPV6_ANY, AF_INET6); // IPv6 ANY on specified port
00444 
00445                   iiop_acceptor = dynamic_cast<TAO_IIOP_Acceptor*> (acceptor);
00446                   iiop_acceptor->set_default_address (addr);
00447 
00448                   if (this->open_default_i (orb_core,
00449                                             reactor,
00450                                             TAO_DEF_GIOP_MAJOR,  // default major
00451                                             TAO_DEF_GIOP_MINOR,  // default minor
00452                                             i,
00453                                             acceptor,
00454                                             options) != 0)
00455                     {
00456                       return -1;
00457                     }
00458                 }
00459               else
00460                 {
00461                   if (this->open_default_i (orb_core,
00462                                             reactor,
00463                                             TAO_DEF_GIOP_MAJOR,  // default major
00464                                             TAO_DEF_GIOP_MINOR,  // default minor
00465                                             i,
00466                                             acceptor,
00467                                             options) != 0)
00468                     {
00469                       return -1;
00470                     }
00471                 }
00472 
00473               opened_endpoint = true;
00474             }
00475         }
00476     }
00477   else
00478     {
00479 #endif /* ACE_WIN32 && ACE_HAS_IPV6 */
00480   TAO_ProtocolFactorySet *pfs = orb_core->protocol_factories ();
00481 
00482   // If the TAO_Acceptor array is zero by the time we get here then no
00483   // endpoints were specified by the user, meaning that the number of
00484   // acceptors will never be more than the number of loaded protocols
00485   // in the ORB core.
00486   if (this->acceptors_ == 0)
00487     {
00488       ACE_NEW_RETURN (this->acceptors_,
00489                       TAO_Acceptor *[pfs->size ()],
00490                       -1);
00491     }
00492 
00493   const TAO_ProtocolFactorySetItor end = pfs->end ();
00494 
00495   // Loop through all the loaded protocols...
00496   for (TAO_ProtocolFactorySetItor i = pfs->begin (); i != end; ++i)
00497     {
00498       // If the protocol requires an explicit -ORBEndpoint option then
00499       // don't use it, otherwise open a default endpoint for that
00500       // protocol, this solves the problem with persistent endpoints
00501       // (such as UNIX domain rendesvouz points) that are not cleaned
00502       // up if the server crashes.
00503       if (!(*i)->factory ()->requires_explicit_endpoint ())
00504         {
00505           if (this->open_default (orb_core,
00506                                   reactor,
00507                                   TAO_DEF_GIOP_MAJOR,  // default major
00508                                   TAO_DEF_GIOP_MINOR,  // default minor
00509                                   i,
00510                                   options) != 0)
00511             {
00512               return -1;
00513             }
00514 
00515           opened_endpoint = true;
00516         }
00517     }
00518 #if defined (ACE_WIN32) && defined (ACE_HAS_IPV6)
00519     }
00520 #endif /* ACE_WIN32) && ACE_HAS_IPV6 */
00521 
00522   if (!opened_endpoint)
00523     {
00524       if (TAO_debug_level > 0)
00525         {
00526           ACE_ERROR ((LM_ERROR,
00527                       ACE_TEXT ("TAO (%P|%t) No default endpoints ")
00528                       ACE_TEXT ("opened.\n")
00529                       ACE_TEXT ("Please specify one or more using ")
00530                       ACE_TEXT ("the \"-ORBListenEndpoints\" ")
00531                       ACE_TEXT ("option.\n")));
00532         }
00533 
00534       return -1;
00535     }
00536 
00537   return 0;
00538 }

int TAO_Acceptor_Registry::open_default_i TAO_ORB_Core orb_core,
ACE_Reactor reactor,
int  major,
int  minor,
TAO_ProtocolFactorySetItor factory,
TAO_Acceptor acceptor,
const char *  options
[private]
 

Open a default acceptor.

Definition at line 583 of file Acceptor_Registry.cpp.

References acceptors_, ACE_ERROR, ACE_TEXT, ACE_TEXT_CHAR_TO_TCHAR, LM_ERROR, TAO_Acceptor::open_default(), TAO_debug_level, and TAO_ProtocolFactorySetItor.

Referenced by open_default(), and open_i().

00590 {
00591   // Initialize the acceptor to listen on a default endpoint.
00592   if (acceptor->open_default (orb_core,
00593                               reactor,
00594                               major,
00595                               minor,
00596                               options) == -1)
00597     {
00598       delete acceptor;
00599 
00600       if (TAO_debug_level > 0)
00601         {
00602           ACE_ERROR ((
00603               LM_ERROR,
00604               ACE_TEXT ("TAO (%P|%t) unable to open ")
00605               ACE_TEXT ("default acceptor for <%s>%p\n"),
00606               ACE_TEXT_CHAR_TO_TCHAR ((*factory)->protocol_name ().c_str ()),
00607               ACE_TEXT ("")
00608             ));
00609         }
00610 
00611       return -1;
00612     }
00613 
00614   this->acceptors_[this->size_++] = acceptor;
00615 
00616   return 0;
00617 }

int TAO_Acceptor_Registry::open_i TAO_ORB_Core orb_core,
ACE_Reactor reactor,
ACE_CString address,
TAO_ProtocolFactorySetItor factory,
bool  ignore_address
[private]
 

Iterator through addrs in the string , and create an acceptor for each one.

Definition at line 682 of file Acceptor_Registry.cpp.

References acceptors_, ACE_CString, ACE_ERROR, ACE_IPV6_ANY, ACE_TEXT, ACE_TEXT_CHAR_TO_TCHAR, ACE_THROW_RETURN, TAO_IIOP_Acceptor::default_address(), extract_endpoint_options(), extract_endpoint_version(), ACE_Auto_Basic_Array_Ptr< X >::get(), ACE_INET_Addr::get_port_number(), LM_ERROR, TAO_Acceptor::open(), open_default_i(), ACE_INET_Addr::set(), TAO_IIOP_Acceptor::set_default_address(), ACE_OS::strtok_r(), TAO_ACCEPTOR_REGISTRY_OPEN_LOCATION_CODE, TAO_debug_level, TAO_DEF_GIOP_MAJOR, TAO_DEF_GIOP_MINOR, and TAO_ProtocolFactorySetItor.

Referenced by open().

00688 {
00689   ACE_CString options_tmp;
00690   this->extract_endpoint_options (addrs,
00691                                   options_tmp,
00692                                   (*factory)->factory ());
00693 
00694   const char *options = 0;
00695 
00696   if (options_tmp.length () > 0)
00697     options = options_tmp.c_str ();
00698 
00699   char *last_addr = 0;
00700   ACE_Auto_Basic_Array_Ptr<char> addr_str (addrs.rep ());
00701 
00702   const char *astr = ACE_OS::strtok_r (addr_str.get (),
00703                                        ",",
00704                                        &last_addr);
00705 
00706   // Iterate over the addrs specified in the endpoint.
00707 
00708   do
00709     {
00710       // For the first time only through the loop, it is
00711       // possible for astr to be 0.  This indicates that
00712       // the user is requesting the default endpoint for
00713       // the specified protocol.
00714       ACE_CString address (astr == 0 ? "" : astr);
00715 
00716       TAO_Acceptor *acceptor =
00717         (*factory)->factory ()->make_acceptor ();
00718 
00719       if (acceptor != 0)
00720         {
00721           // Extract the desired endpoint/protocol version if one
00722           // exists.
00723           int major = TAO_DEF_GIOP_MAJOR;
00724           int minor = TAO_DEF_GIOP_MINOR;
00725           this->extract_endpoint_version (address,
00726                                           major,
00727                                           minor);
00728 
00729           // Check for existence of endpoint.
00730           if (ignore_address || address.length () == 0)
00731             {
00732               // Protocol prefix was specified without any endpoints.
00733               // All TAO pluggable protocols are expected to have the
00734               // ability to create a default endpoint.
00735 #if defined (ACE_WIN32) && defined (ACE_HAS_IPV6)
00736               if ((*factory)->factory ()->tag () == IOP::TAG_INTERNET_IOP)
00737                 {
00738                   // Open first acceptor on IPv4 ANY
00739                   ACE_INET_Addr addr(static_cast<unsigned short> (0)); // IPv4 ANY
00740 
00741                   TAO_IIOP_Acceptor* iiop_acceptor = dynamic_cast<TAO_IIOP_Acceptor*> (acceptor);
00742                   iiop_acceptor->set_default_address (addr);
00743 
00744                   if (this->open_default_i (orb_core,
00745                                             reactor,
00746                                             major,
00747                                             minor,
00748                                             factory,
00749                                             acceptor,
00750                                             options) == 0)
00751                     {
00752                       // record the port chosen for the IPv4 acceptor
00753                       u_short port = iiop_acceptor->default_address ().get_port_number ();
00754 
00755                       // Create second acceptor for IPV6 traffic
00756                       acceptor =
00757                         (*factory)->factory ()->make_acceptor ();
00758 
00759                       if (acceptor == 0)
00760                         {
00761                           if (TAO_debug_level > 0)
00762                             {
00763                               ACE_ERROR ((
00764                                   LM_ERROR,
00765                                   ACE_TEXT ("TAO (%P|%t) unable to create ")
00766                                   ACE_TEXT ("an acceptor for <%s>\n"),
00767                                   ACE_TEXT_CHAR_TO_TCHAR ((*factory)->protocol_name ().c_str ())
00768                                 ));
00769                             }
00770 
00771                           ACE_THROW_RETURN (CORBA::NO_MEMORY (
00772                               CORBA::SystemException::_tao_minor_code (
00773                                 TAO_ACCEPTOR_REGISTRY_OPEN_LOCATION_CODE,
00774                                 ENOMEM),
00775                               CORBA::COMPLETED_NO),
00776                             -1);
00777                         }
00778 
00779                       addr.set (port, ACE_IPV6_ANY, AF_INET6); // IPv6 ANY on specified port
00780 
00781                       iiop_acceptor = dynamic_cast<TAO_IIOP_Acceptor*> (acceptor);
00782                       iiop_acceptor->set_default_address (addr);
00783 
00784                       if (this->open_default_i (orb_core,
00785                                                 reactor,
00786                                                 major,
00787                                                 minor,
00788                                                 factory,
00789                                                 acceptor,
00790                                                 options) == 0)
00791                         {
00792                           continue;
00793                         }
00794                     }
00795 
00796                 }
00797               else
00798                 {
00799                   if (this->open_default_i (orb_core,
00800                                             reactor,
00801                                             major,
00802                                             minor,
00803                                             factory,
00804                                             acceptor,
00805                                             options) == 0)
00806                     {
00807                       continue;
00808                     }
00809                 }
00810 
00811               // Could not open a default endpoint, nor an explicit
00812               // one.
00813               ACE_THROW_RETURN (CORBA::INTERNAL (
00814                   CORBA::SystemException::_tao_minor_code (
00815                     TAO_ACCEPTOR_REGISTRY_OPEN_LOCATION_CODE,
00816                     0),
00817                   CORBA::COMPLETED_NO),
00818                 -1);
00819 #else /* ACE_WIN32 && ACE_HAS_IPV6 */
00820               if (this->open_default_i (orb_core,
00821                                         reactor,
00822                                         major,
00823                                         minor,
00824                                         factory,
00825                                         acceptor,
00826                                         options) == 0)
00827                 continue;
00828 
00829               // Could not open a default endpoint, nor an explicit
00830               // one.
00831               else
00832                 {
00833                   ACE_THROW_RETURN (CORBA::INTERNAL (
00834                       CORBA::SystemException::_tao_minor_code (
00835                         TAO_ACCEPTOR_REGISTRY_OPEN_LOCATION_CODE,
00836                         0),
00837                       CORBA::COMPLETED_NO),
00838                     -1);
00839                 }
00840 #endif /* !ACE_WIN32 || !ACE_HAS_IPV6 */
00841             }
00842           // An explicit endpoint was provided.
00843           else if (acceptor->open (orb_core,
00844                                    reactor,
00845                                    major,
00846                                    minor,
00847                                    address.c_str (),
00848                                    options) == -1)
00849             {
00850               /* Need to save the errno value from the acceptor->open(),
00851                * because errno will get reset when we delete acceptor */
00852               const int errno_value = errno;
00853               delete acceptor;
00854 
00855               if (TAO_debug_level > 0)
00856                 {
00857                   ACE_ERROR ((LM_ERROR,
00858                               ACE_TEXT ("TAO (%P|%t) ")
00859                               ACE_TEXT ("unable to open acceptor ")
00860                               ACE_TEXT ("for <%s>%p\n"),
00861                               ACE_TEXT_CHAR_TO_TCHAR (address.c_str ()),
00862                               ACE_TEXT ("")));
00863                 }
00864 
00865               ACE_THROW_RETURN (CORBA::BAD_PARAM (
00866                   CORBA::SystemException::_tao_minor_code (
00867                     TAO_ACCEPTOR_REGISTRY_OPEN_LOCATION_CODE,
00868                     errno_value),
00869                   CORBA::COMPLETED_NO),
00870                 -1);
00871             }
00872 
00873           // add acceptor to list
00874           this->acceptors_[this->size_++] = acceptor;
00875         }
00876       else
00877         {
00878           if (TAO_debug_level > 0)
00879             {
00880               ACE_ERROR ((LM_ERROR,
00881                           ACE_TEXT ("TAO (%P|%t) unable to create ")
00882                           ACE_TEXT ("an acceptor for <%s>.\n"),
00883                           ACE_TEXT_CHAR_TO_TCHAR (address.c_str ())));
00884             }
00885 
00886           ACE_THROW_RETURN (CORBA::NO_MEMORY (
00887               CORBA::SystemException::_tao_minor_code (
00888                 TAO_ACCEPTOR_REGISTRY_OPEN_LOCATION_CODE,
00889                 ENOMEM),
00890               CORBA::COMPLETED_NO),
00891             -1);
00892         }
00893     }
00894   while (astr != 0 && (astr = ACE_OS::strtok_r (0, ",", &last_addr)) != 0);
00895 
00896   return 0;
00897 }

void TAO_Acceptor_Registry::operator= const TAO_Acceptor_Registry  )  [private]
 


Member Data Documentation

TAO_Acceptor** TAO_Acceptor_Registry::acceptors_ [private]
 

List of acceptors that are currently open.

Definition at line 148 of file Acceptor_Registry.h.

Referenced by begin(), end(), open(), open_default(), open_default_i(), open_i(), and ~TAO_Acceptor_Registry().

size_t TAO_Acceptor_Registry::size_ [private]
 

Number of acceptors that are currently open.

Definition at line 151 of file Acceptor_Registry.h.


The documentation for this class was generated from the following files:
Generated on Thu Nov 9 12:12:08 2006 for TAO by doxygen 1.3.6