⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 poa.cc

📁 编译工具
💻 CC
📖 第 1 页 / 共 5 页
字号:
  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 + -