📄 poa.cc
字号:
index = _index;}PortableServer::POA::InvalidPolicy& PortableServer::POA::InvalidPolicy::operator=(const PortableServer::POA::InvalidPolicy& _s){ ((CORBA::UserException*) this)->operator=(_s); index = _s.index; return *this;}voidPortableServer::POA::InvalidPolicy::operator>>= (cdrStream& _n) const{ index >>= _n;}voidPortableServer::POA::InvalidPolicy::operator<<= (cdrStream& _n){ index <<= _n;}/////////////////////////////////////////////////////////////////////////////////////////////////// omniOrbPOA ///////////////////////////////////////////////////////////////////////////////////////////////////#define CHECK_NOT_NIL() \ if( _NP_is_nil() ) _CORBA_invoked_nil_pseudo_ref()#define CHECK_NOT_DYING() \ if( pd_dying ) OMNIORB_THROW(OBJECT_NOT_EXIST,OBJECT_NOT_EXIST_POANotInitialised, CORBA::COMPLETED_NO)#define CHECK_NOT_DESTROYED() \ if( pd_destroyed ) OMNIORB_THROW(OBJECT_NOT_EXIST,OBJECT_NOT_EXIST_POANotInitialised, CORBA::COMPLETED_NO)#define CHECK_NOT_NIL_OR_DESTROYED() \ if( _NP_is_nil() ) _CORBA_invoked_nil_pseudo_ref(); \ if( pd_destroyed ) OMNIORB_THROW(OBJECT_NOT_EXIST,OBJECT_NOT_EXIST_POANotInitialised, CORBA::COMPLETED_NO)static void transfer_and_check_policies(omniOrbPOA::Policies& pout, const CORBA::PolicyList& pin);static omni_tracedmutex poa_lock;static omni_tracedcondition adapteractivator_signal(&poa_lock);// Used to signal between threads when using an AdapterActivator// to create a child POA.static omniOrbPOA* theRootPOA = 0;static omniOrbPOA* theINSPOA = 0;// Protected by <poa_lock>.omniOrbPOA::~omniOrbPOA(){ if (!_NP_is_nil()) { switch (pd_policy.threading) { case TP_ORB_CTRL: break; case TP_SINGLE_THREAD: delete pd_call_lock; break; case TP_MAIN_THREAD: delete pd_main_thread_sync.cond; delete pd_main_thread_sync.mu; break; } } if (pd_oidPrefix) delete [] pd_oidPrefix;}PortableServer::POA_ptromniOrbPOA::create_POA(const char* adapter_name, PortableServer::POAManager_ptr manager, const CORBA::PolicyList& policies){ CHECK_NOT_NIL(); if( !adapter_name_is_valid(adapter_name) ) OMNIORB_THROW(BAD_PARAM,BAD_PARAM_InvalidPOAName, CORBA::COMPLETED_NO); // Setup the default policies. Policies policy; policy.threading = TP_ORB_CTRL; policy.transient = 1; policy.multiple_id = 0; policy.user_assigned_id = 0; policy.retain_servants = 1; policy.req_processing = RPP_ACTIVE_OBJ_MAP; policy.implicit_activation = 0; policy.bidirectional_accept = 0; policy.local_shortcut = 0; transfer_and_check_policies(policy, policies); omni_tracedmutex_lock sync(poa_lock); omni_tracedmutex_lock sync2(pd_lock); if (pd_dying) OMNIORB_THROW(BAD_INV_ORDER, BAD_INV_ORDER_POACreationDuringDestruction, CORBA::COMPLETED_NO); // If an adapter of the given name exists, but is in the // process of being destroyed, we should block until // that has completed, and then allow the new one to be // created. Ref CORBA 2.3 11.3.8.4 omniOrbPOA* p = find_child(adapter_name); if( p ) { // Increment its refcount so it doesn't disappear from under us p->incrRefCount(); p->pd_lock.lock(); if( p->pd_dying ) { // Temporarily release other locks pd_lock.unlock(); poa_lock.unlock(); if( omniORB::trace(10) ) { omniORB::logger l; l << "Waiting for destruction of POA(" << adapter_name << ").\n"; } while( p->pd_destroyed != 2 ) p->pd_deathSignal.wait(); p->pd_lock.unlock(); p->decrRefCount(); if( omniORB::trace(10) ) { omniORB::logger l; l << "Continuing the creation of POA(" << adapter_name << ").\n"; } // Reacquire locks poa_lock.lock(); pd_lock.lock(); // It should have gone now OMNIORB_ASSERT(find_child(adapter_name) == 0); } else { p->pd_lock.unlock(); p->decrRefCount(); throw AdapterAlreadyExists(); } } if( CORBA::is_nil(manager) ) manager = new omniOrbPOAManager(); else PortableServer::POAManager::_duplicate(manager); omniOrbPOA* poa = new omniOrbPOA(adapter_name, (omniOrbPOAManager*) manager, policy, this); insert_child(poa); poa->adapterActive(); // Need to ensure state is not changed from HOLDING if POA is // being created by an adapter activator. So in this case do // not attach the new poa to the manager. if( !is_adapteractivating_child(adapter_name) ) ((omniOrbPOAManager*) manager)->gain_poa(poa); poa->incrRefCount(); return poa;}PortableServer::POA_ptromniOrbPOA::find_POA(const char* adapter_name, CORBA::Boolean activate_it){ CHECK_NOT_NIL_OR_DESTROYED(); if( !adapter_name ) OMNIORB_THROW(BAD_PARAM,BAD_PARAM_InvalidPOAName, CORBA::COMPLETED_NO); omni_tracedmutex_lock sync(poa_lock); omniOrbPOA* poa = find_child(adapter_name); if( poa && !poa->pd_dying ) { poa->incrRefCount(); return poa; } if( !activate_it || !pd_adapterActivator ) throw AdapterNonExistent(); try { poa = attempt_to_activate_adapter(adapter_name); }#ifdef HAS_Cplusplus_catch_exception_by_base catch (CORBA::SystemException&)#else catch (...)#endif { OMNIORB_THROW(OBJ_ADAPTER, OBJ_ADAPTER_POAUnknownAdapter, CORBA::COMPLETED_NO); } if( poa && !poa->pd_dying ) { poa->incrRefCount(); return poa; } throw AdapterNonExistent(); return 0; // For dumb compilers}static void destroyer_thread_fn(void* poa_arg);voidomniOrbPOA::destroy(CORBA::Boolean etherealize_objects, CORBA::Boolean wait_for_completion){ CHECK_NOT_NIL(); if( wait_for_completion ) { omniCurrent* current = omniCurrent::get(); if (current && current->callDescriptor()) { // In the context of an operation invocation. // This is interesting. It would be sufficient (but harder) to // only complain if in the context of an invocation in _this_ // POA. However, the 2.4 spec says "...some POA belonging to the // same ORB as this POA...". Since we only ever support one ORB, // life is easy. OMNIORB_THROW(BAD_INV_ORDER, BAD_INV_ORDER_WouldDeadLock, CORBA::COMPLETED_NO); } } // Mark self as being in the process of destruction, sever links // with poa manager, destroy children, deactivate all objects // (possibly waiting for completion of outstanding method // invocations) and then remove self from parent. { pd_lock.lock(); if( pd_destroyed ) { pd_lock.unlock (); OMNIORB_THROW(OBJECT_NOT_EXIST, OBJECT_NOT_EXIST_POANotInitialised, CORBA::COMPLETED_NO); } if( pd_dying ) { // Need to be able to handle multiple concurrent calls to // destroy. If destruction is in progress and wait_f_c is // true, must wait to complete. Otherwise can just return. if( wait_for_completion ) { incrRefCount(); while( pd_destroyed != 2 ) pd_deathSignal.wait(); pd_lock.unlock (); decrRefCount(); } else { pd_lock.unlock (); } return; } pd_dying = 1; pd_lock.unlock (); } { // If we're in the HOLDING state, change state to DISCARDING omni::internalLock->lock(); int old_state = pd_rq_state; if (pd_rq_state == (int) PortableServer::POAManager::HOLDING) pd_rq_state = (int) PortableServer::POAManager::DISCARDING; omni::internalLock->unlock(); if( old_state == (int) PortableServer::POAManager::HOLDING ) pd_signal->broadcast(); } // From this point on we can be sure that no other threads will // try and: // o create child POAs // o activate objects if( omniORB::trace(10) ) { omniORB::logger l; l << "Destroying POA(" << (char*) pd_name << ").\n"; } pd_manager->lose_poa(this); // We release the reference to the manager only when we are // deleted -- since we want <pd_manager> to be immutable. if( wait_for_completion ) { do_destroy(etherealize_objects); } else { omniORB::logs(15, "Starting a POA destroyer thread."); void** args = new void* [2]; args[0] = (omniOrbPOA*) this; args[1] = (void*) (unsigned long) etherealize_objects; (new omni_thread(destroyer_thread_fn, args))->start(); }}char*omniOrbPOA::the_name(){ CHECK_NOT_NIL_OR_DESTROYED(); return CORBA::string_dup(pd_name);}PortableServer::POA_ptromniOrbPOA::the_parent(){ CHECK_NOT_NIL(); omni_tracedmutex_lock sync(poa_lock); CHECK_NOT_DESTROYED(); return pd_parent ? PortableServer::POA::_duplicate(pd_parent) : PortableServer::POA::_nil();}PortableServer::POAList*omniOrbPOA::the_children(){ CHECK_NOT_NIL_OR_DESTROYED(); PortableServer::POAList* childer = new PortableServer::POAList; poa_lock.lock(); childer->length(pd_children.length()); for( CORBA::ULong i = 0; i < pd_children.length(); i++ ) { pd_children[i]->incrRefCount(); (*childer)[i] = pd_children[i]; } poa_lock.unlock(); return childer;}PortableServer::POAManager_ptromniOrbPOA::the_POAManager(){ CHECK_NOT_NIL_OR_DESTROYED(); return PortableServer::POAManager::_duplicate(pd_manager);}PortableServer::AdapterActivator_ptromniOrbPOA::the_activator(){ CHECK_NOT_NIL_OR_DESTROYED(); poa_lock.lock(); PortableServer::AdapterActivator_ptr ret = pd_adapterActivator ? PortableServer::AdapterActivator::_duplicate(pd_adapterActivator) : PortableServer::AdapterActivator::_nil(); poa_lock.unlock(); return ret;}voidomniOrbPOA::the_activator(PortableServer::AdapterActivator_ptr aa){ CHECK_NOT_NIL_OR_DESTROYED(); PortableServer::AdapterActivator_ptr neww = PortableServer::AdapterActivator::_duplicate(aa); if( CORBA::is_nil(neww) ) neww = 0; poa_lock.lock(); PortableServer::AdapterActivator_ptr old = pd_adapterActivator; pd_adapterActivator = neww; poa_lock.unlock(); if( old ) CORBA::release(old);}PortableServer::ServantManager_ptromniOrbPOA::get_servant_manager(){ CHECK_NOT_NIL_OR_DESTROYED(); if( pd_policy.req_processing != RPP_SERVANT_MANAGER ) throw WrongPolicy(); omni_tracedmutex_lock sync(pd_lock); if( pd_policy.retain_servants ) return pd_servantActivator ? PortableServer::ServantActivator::_duplicate(pd_servantActivator) : PortableServer::ServantActivator::_nil(); else return pd_servantLocator ? PortableServer::ServantLocator::_duplicate(pd_servantLocator) : PortableServer::ServantLocator::_nil();}voidomniOrbPOA::set_servant_manager(PortableServer::ServantManager_ptr imgr){ CHECK_NOT_NIL_OR_DESTROYED(); if( pd_policy.req_processing != RPP_SERVANT_MANAGER ) throw WrongPolicy(); if( CORBA::is_nil(imgr) ) OMNIORB_THROW(OBJ_ADAPTER,OBJ_ADAPTER_NoServantManager, CORBA::COMPLETED_NO); { // Check that <imgr> is a local object ... omni::internalLock->lock(); int islocal = imgr->_identity()->inThisAddressSpace(); omni::internalLock->unlock(); if( !islocal ) OMNIORB_THROW(BAD_PARAM,BAD_PARAM_LocalObjectExpected, CORBA::COMPLETED_NO); } omni_tracedmutex_lock sync(pd_lock); if( pd_servantActivator || pd_servantLocator ) OMNIORB_THROW(BAD_INV_ORDER, BAD_INV_ORDER_ServantManagerAlreadySet, CORBA::COMPLETED_NO); if( pd_policy.retain_servants ) { pd_servantActivator = PortableServer::ServantActivator::_narrow(imgr); if( CORBA::is_nil(pd_servantActivator) ) { pd_servantActivator = 0; OMNIORB_THROW(OBJ_ADAPTER, OBJ_ADAPTER_NoServantManager, CORBA::COMPLETED_NO); } } else { pd_servantLocator = PortableServer::ServantLocator::_narrow(imgr); if( CORBA::is_nil(pd_servantLocator) ) { pd_servantLocator = 0; OMNIORB_THROW(OBJ_ADAPTER, OBJ_ADAPTER_NoServantManager, CORBA::COMPLETED_NO); } }}PortableServer::ServantomniOrbPOA::get_servant(){ CHECK_NOT_NIL_OR_DESTROYED();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -