ORBInitializer_Registry_Impl.cpp

Go to the documentation of this file.
00001 #include "tao/PI/ORBInitializer_Registry_Impl.h"
00002 #include "tao/PI/ORBInitInfo.h"
00003 #include "tao/PI/PICurrent.h"
00004 #include "tao/PI/PI_ORBInitializer.h"
00005 #include "tao/PI/ClientRequestInterceptor_Factory_Impl.h"
00006 #include "tao/PI/PICurrent_Loader.h"
00007 #include "tao/PI/PolicyFactory_Loader.h"
00008 
00009 #include "tao/ORB_Core.h"
00010 #include "tao/ORB_Constants.h"
00011 #include "tao/SystemException.h"
00012 
00013 #include "ace/Static_Object_Lock.h"
00014 #include "ace/Recursive_Thread_Mutex.h"
00015 #include "ace/Log_Msg.h"
00016 
00017 ACE_RCSID (PI,
00018            ORBInitializer_Registry,
00019            "ORBInitializer_Registry_Impl.cpp,v 1.14 2006/05/10 20:17:28 mesnier_p Exp")
00020 
00021 
00022 TAO_BEGIN_VERSIONED_NAMESPACE_DECL
00023 
00024 TAO::ORBInitializer_Registry::ORBInitializer_Registry (void)
00025   : lock_ (),
00026     initializers_ ()
00027 {
00028 }
00029 
00030 int
00031 TAO::ORBInitializer_Registry::init (int, ACE_TCHAR *[])
00032 {
00033 #if !defined (TAO_AS_STATIC_LIBS) && (TAO_HAS_INTERCEPTORS == 1)
00034   ACE_Service_Config::process_directive
00035     (ace_svc_desc_TAO_ClientRequestInterceptor_Adapter_Factory_Impl);
00036 
00037   ACE_Service_Config::process_directive
00038     (ace_svc_desc_TAO_PICurrent_Loader);
00039 
00040   PortableInterceptor::ORBInitializer_ptr temp_orb_initializer =
00041     PortableInterceptor::ORBInitializer::_nil ();
00042 
00043   PortableInterceptor::ORBInitializer_var orb_initializer;
00044 
00045   ACE_DECLARE_NEW_CORBA_ENV;
00046   ACE_TRY
00047     {
00048       /// Register the PI ORBInitializer.
00049 
00050       ACE_NEW_THROW_EX (temp_orb_initializer,
00051                         TAO_PI_ORBInitializer,
00052                         CORBA::NO_MEMORY (
00053                           CORBA::SystemException::_tao_minor_code (
00054                             TAO::VMCID,
00055                             ENOMEM),
00056                           CORBA::COMPLETED_NO));
00057       ACE_TRY_CHECK;
00058 
00059       orb_initializer = temp_orb_initializer;
00060 
00061       this->register_orb_initializer (orb_initializer.in ()
00062                                                      ACE_ENV_ARG_PARAMETER);
00063       ACE_TRY_CHECK;
00064     }
00065   ACE_CATCHANY
00066     {
00067       if (TAO_debug_level > 0)
00068         {
00069           ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION,
00070                                "(%P|%t) Caught exception:");
00071         }
00072       return -1;
00073     }
00074   ACE_ENDTRY;
00075 #endif /* !TAO_AS_STATIC_LIBS  && TAO_HAS_INTERCEPTORS == 1 */
00076   return 0;
00077 }
00078 
00079 int
00080 TAO::ORBInitializer_Registry::fini (void)
00081 {
00082   ACE_GUARD_RETURN (TAO_SYNCH_RECURSIVE_MUTEX,
00083                     guard,
00084                     this->lock_,
00085                     -1);
00086 
00087   // Release all initializers in the array
00088   size_t const initializer_count (this->initializers_.size ());
00089   for (size_t i = 0; i < initializer_count; ++i)
00090     {
00091       this->initializers_[i] = PortableInterceptor::ORBInitializer::_nil();
00092     }
00093 
00094   return 0;
00095 }
00096 
00097 void
00098 TAO::ORBInitializer_Registry::register_orb_initializer (
00099   PortableInterceptor::ORBInitializer_ptr init
00100   ACE_ENV_ARG_DECL)
00101 {
00102   if (!CORBA::is_nil (init))
00103     {
00104       ACE_GUARD (TAO_SYNCH_RECURSIVE_MUTEX,
00105                  guard,
00106                  this->lock_);
00107 
00108       // Increase the length of the ORBInitializer array by one.
00109       size_t const cur_len = this->initializers_.size ();
00110       size_t const new_len = cur_len + 1;
00111       if (this->initializers_.size (new_len) != 0)
00112         ACE_THROW (CORBA::INTERNAL ());
00113 
00114       // Add the given ORBInitializer to the sequence.
00115       this->initializers_[cur_len] =
00116         PortableInterceptor::ORBInitializer::_duplicate (init);
00117     }
00118   else
00119     ACE_THROW (CORBA::INV_OBJREF (
00120                  CORBA::SystemException::_tao_minor_code (
00121                    0,
00122                    EINVAL),
00123                  CORBA::COMPLETED_NO));
00124 }
00125 
00126 size_t
00127 TAO::ORBInitializer_Registry::pre_init (
00128   TAO_ORB_Core *orb_core,
00129   int argc,
00130   char *argv[],
00131   PortableInterceptor::SlotId &slotid
00132   ACE_ENV_ARG_DECL)
00133 {
00134   ACE_GUARD_RETURN (TAO_SYNCH_RECURSIVE_MUTEX,
00135                     guard,
00136                     this->lock_,
00137                     0);
00138 
00139   size_t const initializer_count (this->initializers_.size ());
00140 
00141   if (initializer_count > 0)
00142     {
00143       TAO_ORBInitInfo * orb_init_info_temp = 0;
00144 
00145       ACE_NEW_THROW_EX (orb_init_info_temp,
00146                         TAO_ORBInitInfo (orb_core,
00147                                          argc,
00148                                          argv,
00149                                          slotid),
00150                         CORBA::NO_MEMORY (
00151                           CORBA::SystemException::_tao_minor_code (
00152                             0,
00153                             ENOMEM),
00154                           CORBA::COMPLETED_NO));
00155       ACE_CHECK_RETURN (0);
00156 
00157       TAO_ORBInitInfo_var orb_init_info_ = orb_init_info_temp;
00158 
00159       for (size_t i = 0; i < initializer_count; ++i)
00160         {
00161           this->initializers_[i]->pre_init (orb_init_info_.in ()
00162                                             ACE_ENV_ARG_PARAMETER);
00163           ACE_CHECK_RETURN (0);
00164         }
00165 
00166       slotid = orb_init_info_temp->slot_count ();
00167 
00168       // Invalidate the ORBInitInfo instance to prevent future
00169       // modifications to the ORB.  This behavior complies with the
00170       // PortableInterceptor specification.
00171       orb_init_info_temp->invalidate ();
00172     }
00173 
00174   return initializer_count;
00175 }
00176 
00177 void
00178 TAO::ORBInitializer_Registry::post_init (
00179   size_t pre_init_count,
00180   TAO_ORB_Core *orb_core,
00181   int argc,
00182   char *argv[],
00183   PortableInterceptor::SlotId slotid
00184   ACE_ENV_ARG_DECL)
00185 {
00186   if (pre_init_count > 0)
00187     {
00188       ACE_GUARD (TAO_SYNCH_RECURSIVE_MUTEX,
00189                  guard,
00190                  this->lock_);
00191 
00192       TAO_ORBInitInfo * orb_init_info_temp = 0;
00193 
00194       ACE_NEW_THROW_EX (orb_init_info_temp,
00195                         TAO_ORBInitInfo (orb_core,
00196                                          argc,
00197                                          argv,
00198                                          slotid),
00199                         CORBA::NO_MEMORY (
00200                           CORBA::SystemException::_tao_minor_code (
00201                             0,
00202                             ENOMEM),
00203                           CORBA::COMPLETED_NO));
00204       ACE_CHECK;
00205 
00206       TAO_ORBInitInfo_var orb_init_info_ = orb_init_info_temp;
00207 
00208       for (size_t i = 0; i < pre_init_count; ++i)
00209         {
00210           this->initializers_[i]->post_init (orb_init_info_.in ()
00211                                              ACE_ENV_ARG_PARAMETER);
00212           ACE_CHECK;
00213         }
00214 
00215 #if TAO_HAS_INTERCEPTORS == 1
00216       CORBA::Object_ptr picurrent_ptr = orb_core->pi_current ();
00217       PortableInterceptor::SlotId slot_count = orb_init_info_->slot_count ();
00218 
00219       if (CORBA::is_nil (picurrent_ptr) && slot_count != 0)
00220         {
00221           // Force instantiation of the PICurrent object. If we do not do it
00222           // now, the slot count will be lost.
00223           CORBA::Object_var tmp = orb_core->resolve_picurrent ();
00224           picurrent_ptr = orb_core->pi_current ();
00225         }
00226 
00227       if (!CORBA::is_nil (picurrent_ptr))
00228         {
00229           TAO::PICurrent *pi = dynamic_cast <TAO::PICurrent*> (picurrent_ptr);
00230 
00231           if (pi)
00232             {
00233               pi->initialize (slot_count ACE_ENV_ARG_PARAMETER);
00234               ACE_CHECK;
00235             }
00236         }
00237 #endif /* TAO_HAS_INTERCEPTORS == 1 */
00238 
00239       // Invalidate the ORBInitInfo instance to prevent future
00240       // modifications to the ORB.  This behavior complies with the
00241       // PortableInterceptor specification.
00242       orb_init_info_temp->invalidate ();
00243     }
00244 }
00245 
00246 TAO_END_VERSIONED_NAMESPACE_DECL
00247 
00248 ACE_STATIC_SVC_DEFINE (ORBInitializer_Registry,
00249                        ACE_TEXT ("ORBInitializer_Registry"),
00250                        ACE_SVC_OBJ_T,
00251                        &ACE_SVC_NAME (ORBInitializer_Registry),
00252                        ACE_Service_Type::DELETE_THIS | ACE_Service_Type::DELETE_OBJ,
00253                        0)
00254 
00255 ACE_FACTORY_NAMESPACE_DEFINE (TAO_PI, ORBInitializer_Registry, TAO::ORBInitializer_Registry)

Generated on Thu Nov 9 12:51:39 2006 for TAO_PI by doxygen 1.3.6