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
00012 #include "ace/Static_Object_Lock.h"
00013 #include "ace/Recursive_Thread_Mutex.h"
00014 #include "ace/Log_Msg.h"
00015 #include "ace/CORBA_macros.h"
00016
00017 ACE_RCSID (PI,
00018 ORBInitializer_Registry,
00019 "$Id: ORBInitializer_Registry_Impl.cpp 84281 2009-01-30 15:01:17Z wotte $")
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 try
00046 {
00047
00048
00049 ACE_NEW_THROW_EX (temp_orb_initializer,
00050 TAO_PI_ORBInitializer,
00051 CORBA::NO_MEMORY (
00052 CORBA::SystemException::_tao_minor_code (
00053 TAO::VMCID,
00054 ENOMEM),
00055 CORBA::COMPLETED_NO));
00056
00057 orb_initializer = temp_orb_initializer;
00058
00059 this->register_orb_initializer (orb_initializer.in ());
00060 }
00061 catch (const ::CORBA::Exception& ex)
00062 {
00063 if (TAO_debug_level > 0)
00064 {
00065 ex._tao_print_exception ("(%P|%t) Caught exception:");
00066 }
00067 return -1;
00068 }
00069 #endif
00070 return 0;
00071 }
00072
00073 int
00074 TAO::ORBInitializer_Registry::fini (void)
00075 {
00076 ACE_GUARD_RETURN (TAO_SYNCH_RECURSIVE_MUTEX,
00077 guard,
00078 this->lock_,
00079 -1);
00080
00081
00082 size_t const initializer_count (this->initializers_.size ());
00083 for (size_t i = initializer_count; i > 0;)
00084 {
00085 --i;
00086 if (TAO_debug_level > 8)
00087 {
00088 ACE_DEBUG((LM_DEBUG, ACE_TEXT("TAO (%P|%t) - ORBInitializer_Registry::fini clearing %d @%@\n"),
00089 i, this->initializers_[i].operator->()
00090 ));
00091 }
00092 this->initializers_[i] = PortableInterceptor::ORBInitializer::_nil();
00093 }
00094
00095 return 0;
00096 }
00097
00098 void
00099 TAO::ORBInitializer_Registry::register_orb_initializer (
00100 PortableInterceptor::ORBInitializer_ptr init)
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 throw ::CORBA::INTERNAL ();
00113
00114
00115 if (TAO_debug_level > 8)
00116 {
00117 ACE_DEBUG((LM_DEBUG, ACE_TEXT("TAO (%P|%t) - ORBInitializer_Registry::register_orb_initializer %d @%@\n"),
00118 cur_len, init
00119 ));
00120 }
00121
00122 this->initializers_[cur_len] =
00123 PortableInterceptor::ORBInitializer::_duplicate (init);
00124 }
00125 else
00126 throw ::CORBA::INV_OBJREF (
00127 CORBA::SystemException::_tao_minor_code (
00128 0,
00129 EINVAL),
00130 CORBA::COMPLETED_NO);
00131 }
00132
00133 size_t
00134 TAO::ORBInitializer_Registry::pre_init (
00135 TAO_ORB_Core *orb_core,
00136 int argc,
00137 char *argv[],
00138 PortableInterceptor::SlotId &slotid)
00139 {
00140 ACE_GUARD_RETURN (TAO_SYNCH_RECURSIVE_MUTEX,
00141 guard,
00142 this->lock_,
00143 0);
00144
00145 size_t const initializer_count (this->initializers_.size ());
00146
00147 if (initializer_count > 0)
00148 {
00149 TAO_ORBInitInfo * orb_init_info_temp = 0;
00150
00151 ACE_NEW_THROW_EX (orb_init_info_temp,
00152 TAO_ORBInitInfo (orb_core,
00153 argc,
00154 argv,
00155 slotid),
00156 CORBA::NO_MEMORY (
00157 CORBA::SystemException::_tao_minor_code (
00158 0,
00159 ENOMEM),
00160 CORBA::COMPLETED_NO));
00161
00162 TAO_ORBInitInfo_var orb_init_info_ = orb_init_info_temp;
00163
00164 for (size_t i = 0; i < initializer_count; ++i)
00165 {
00166 this->initializers_[i]->pre_init (orb_init_info_.in ());
00167 }
00168
00169 slotid = orb_init_info_temp->slot_count ();
00170
00171
00172
00173
00174 orb_init_info_temp->invalidate ();
00175 }
00176
00177 return initializer_count;
00178 }
00179
00180 void
00181 TAO::ORBInitializer_Registry::post_init (
00182 size_t pre_init_count,
00183 TAO_ORB_Core *orb_core,
00184 int argc,
00185 char *argv[],
00186 PortableInterceptor::SlotId slotid)
00187 {
00188 if (pre_init_count > 0)
00189 {
00190 ACE_GUARD (TAO_SYNCH_RECURSIVE_MUTEX,
00191 guard,
00192 this->lock_);
00193
00194 TAO_ORBInitInfo * orb_init_info_temp = 0;
00195
00196 ACE_NEW_THROW_EX (orb_init_info_temp,
00197 TAO_ORBInitInfo (orb_core,
00198 argc,
00199 argv,
00200 slotid),
00201 CORBA::NO_MEMORY (
00202 CORBA::SystemException::_tao_minor_code (
00203 0,
00204 ENOMEM),
00205 CORBA::COMPLETED_NO));
00206
00207 TAO_ORBInitInfo_var orb_init_info_ = orb_init_info_temp;
00208
00209 for (size_t i = 0; i < pre_init_count; ++i)
00210 {
00211 this->initializers_[i]->post_init (orb_init_info_.in ());
00212 }
00213
00214 #if TAO_HAS_INTERCEPTORS == 1
00215 CORBA::Object_ptr picurrent_ptr = orb_core->pi_current ();
00216 PortableInterceptor::SlotId slot_count = orb_init_info_->slot_count ();
00217
00218 if (CORBA::is_nil (picurrent_ptr) && slot_count != 0)
00219 {
00220
00221
00222 CORBA::Object_var tmp = orb_core->resolve_picurrent ();
00223 picurrent_ptr = orb_core->pi_current ();
00224 }
00225
00226 if (!CORBA::is_nil (picurrent_ptr))
00227 {
00228 TAO::PICurrent *pi = dynamic_cast <TAO::PICurrent*> (picurrent_ptr);
00229
00230 if (pi)
00231 {
00232 pi->initialize (slot_count);
00233 }
00234 }
00235 #endif
00236
00237
00238
00239
00240 orb_init_info_temp->invalidate ();
00241 }
00242 }
00243
00244 ACE_STATIC_SVC_DEFINE (ORBInitializer_Registry,
00245 ACE_TEXT ("ORBInitializer_Registry"),
00246 ACE_SVC_OBJ_T,
00247 &ACE_SVC_NAME (ORBInitializer_Registry),
00248 ACE_Service_Type::DELETE_THIS | ACE_Service_Type::DELETE_OBJ,
00249 0)
00250
00251 ACE_FACTORY_NAMESPACE_DEFINE (TAO_PI, ORBInitializer_Registry, TAO::ORBInitializer_Registry)
00252
00253 TAO_END_VERSIONED_NAMESPACE_DECL
00254