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
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
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
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
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
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
00169
00170
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
00222
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
00238
00239
00240
00241
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)