omniinternal.cc

来自「编译工具」· CC 代码 · 共 1,724 行 · 第 1/4 页

CC
1,724
字号
      *(id->addrOfNextInObjectTable()) = newtable[j];      newtable[j] = id;      id = next;    }  }  // Replace the old table.  delete[] objectTable;  objectTable = newtable;  objectTableSize = newsize;  maxNumObjects = objectTableSize * 2 / 3;  minNumObjects =    objectTableSizeI ? (objTblSizes[objectTableSizeI - 1] / 3) : 0;}////////////////////////////////////////////////////////////////////////////////////////////////////// omni //////////////////////////////////////////////////////////////////////////////////////////////////////_CORBA_ULongomni::hash(const CORBA::Octet* key, int keysize){  //?? This is from Knuth.  We may be able to do better!  _CORBA_ULong n = 0;  while( keysize-- )  n = ((n << 5) ^ (n >> 27)) ^ *key++;  return n;}omni_tracedmutex&omni::nilRefLock(){  // We are safe just testing this here, as we guarentee that  // it will be initialised during the static initialisation.  // (Which is single-threaded).  If not by this method, then  // by the static initialiser below.  static omni_tracedmutex* nil_ref_lock = 0;  if( !nil_ref_lock )  nil_ref_lock = new omni_tracedmutex;  return *nil_ref_lock;}voidomni::duplicateObjRef(omniObjRef* objref){  OMNIORB_ASSERT(objref);  objref_rc_lock->lock();  objref->pd_refCount++;  objref_rc_lock->unlock();}voidomni::releaseObjRef(omniObjRef* objref){  ASSERT_OMNI_TRACEDMUTEX_HELD(*internalLock, 0);  OMNIORB_ASSERT(objref);  objref_rc_lock->lock();  int rc = --objref->pd_refCount;  objref_rc_lock->unlock();  if( rc > 0 )  return;  if( rc < 0 ) {    omniORB::logs(1,      "ERROR -- trying to release an object with reference count <= 0.\n"      " CORBA::release() may have been called too many times on an object\n"      " reference.");    return;  }  // Clear objref's identity  {    omni_tracedmutex_lock sync(*internalLock);    objref->_setIdentity(0);  }  if( omniORB::trace(15) ) {    omniORB::logger l;    l << "ObjRef(" << objref->_mostDerivedRepoId() << ") -- deleted.\n";  }  // Destroy the reference.  delete objref;}omniObjTableEntry*omniObjTable::locateActive(const _CORBA_Octet* key, int keysize,			   _CORBA_ULong hashv, _CORBA_Boolean wait){  ASSERT_OMNI_TRACEDMUTEX_HELD(*omni::internalLock, 1); again:  omniObjTableEntry** head  = objectTable + hashv % objectTableSize;  omniObjTableEntry*  entry = *head;  while (entry) {    if (entry->is_equal(key, keysize)) break;    entry = entry->nextInObjectTable();  }  omniObjTableEntry::State state;  if (entry) {    if (wait) {      while (entry->state() == omniObjTableEntry::ACTIVATING) {	state = entry->wait(omniObjTableEntry::ACTIVE |			    omniObjTableEntry::DEACTIVATING |			    omniObjTableEntry::ETHEREALISING);	if (state == omniObjTableEntry::DEAD) {	  // The entry has been removed from the object table. Have to	  // start from scratch in case a new entry has been created.	  goto again;	}      }    }    if (entry->state() & (omniObjTableEntry::ACTIVE |			  omniObjTableEntry::DEACTIVATING))      return entry;  }  return 0;}omniObjTableEntry*omniObjTable::locate(const _CORBA_Octet* key, int keysize,		     _CORBA_ULong hashv, _CORBA_ULong set){  ASSERT_OMNI_TRACEDMUTEX_HELD(*omni::internalLock, 1); again:  omniObjTableEntry** head  = objectTable + hashv % objectTableSize;  omniObjTableEntry*  entry = *head;  while (entry) {    if (entry->is_equal(key, keysize)) break;    entry = entry->nextInObjectTable();  }  if (entry) {    while (!(entry->state() & set)) {      if (omniORB::trace(15)) {	omniORB::logger l;	l << "Waiting for object table entry " << entry << "\n";      }      if (entry->wait(set) == omniObjTableEntry::DEAD) {	// The entry has been removed from the object table. Have to	// start from scratch in case a new entry has been created.	goto again;      }    }    return entry;  }  return 0;}omniObjTableEntry*omniObjTable::newEntry(omniObjKey& key){  CORBA::ULong hashv = omni::hash(key.key(), key.size());  return newEntry(key, hashv);}omniObjTableEntry*omniObjTable::newEntry(omniObjKey& key, _CORBA_ULong hashv){  ASSERT_OMNI_TRACEDMUTEX_HELD(*omni::internalLock, 1);  omniObjTableEntry** head  = objectTable + hashv % objectTableSize;  omniObjTableEntry*  entry = *head;  while (entry) {    if (entry->is_equal(key.key(), key.size())) return 0;    entry = entry->nextInObjectTable();  }  if( ++numObjectsInTable > maxNumObjects ) {    omniObjTable::resize();    head = objectTable + hashv % objectTableSize;  }  entry = new omniObjTableEntry(key);    *(entry->addrOfNextInObjectTable()) = *head;  *head = entry;  if (omniORB::trace(10)) {    omniORB::logger l;    l << "Adding " << entry << " to object table.\n";  }  return entry;}omniObjTableEntry::~omniObjTableEntry(){  if (pd_cond) delete pd_cond;  if (omniORB::trace(15)) {    omniORB::logger l;    l << "Object table entry " << this << " deleted.\n";  }}voidomniObjTableEntry::setActive(omniServant* servant, omniObjAdapter* adapter){  ASSERT_OMNI_TRACEDMUTEX_HELD(*omni::internalLock, 1);  OMNIORB_ASSERT(pd_state == ACTIVATING);  setServant(servant, adapter);  servant->_addActivation(this);  if( omniORB::trace(15) ) {    omniORB::logger l;    l << "State " << this << " -> active\n";  }  pd_state = ACTIVE;  if (pd_waiters)    pd_cond->broadcast();}voidomniObjTableEntry::setDeactivating(){  ASSERT_OMNI_TRACEDMUTEX_HELD(*omni::internalLock, 1);  OMNIORB_ASSERT(pd_state == ACTIVE);  OMNIORB_ASSERT(pd_nInvocations > 0);  if( omniORB::trace(15) ) {    omniORB::logger l;    l << "State " << this << " -> deactivating\n";  }  pd_state = DEACTIVATING;  --pd_nInvocations;  if (pd_waiters)    pd_cond->broadcast();}voidomniObjTableEntry::setDeactivatingOA(){  ASSERT_OMNI_TRACEDMUTEX_HELD(*omni::internalLock, 1);  OMNIORB_ASSERT(pd_state == ACTIVE);  OMNIORB_ASSERT(pd_nInvocations > 0);  if( omniORB::trace(15) ) {    omniORB::logger l;    l << "State " << this << " -> deactivating (OA destruction)\n";  }  if (pd_nInvocations == 1)    pd_state = DEACTIVATING_OA;  else    pd_state = DEACTIVATING;  --pd_nInvocations;  if (pd_waiters)    pd_cond->broadcast();}voidomniObjTableEntry::setEtherealising(){  ASSERT_OMNI_TRACEDMUTEX_HELD(*omni::internalLock, 1);  OMNIORB_ASSERT(pd_state & DEACTIVATING);  pd_servant->_removeActivation(this);  if( omniORB::trace(15) ) {    omniORB::logger l;    l << "State " << this << " -> etherealising\n";  }  pd_state       = ETHEREALISING;  pd_deactivated = 1;  if (pd_waiters)    pd_cond->broadcast();}voidomniObjTableEntry::setDead(){  ASSERT_OMNI_TRACEDMUTEX_HELD(*omni::internalLock, 1);  omniObjTableEntry** pid =    objectTable + omni::hash(key(), keysize()) % objectTableSize;  while (*pid) {    if (*pid == this) break;    pid = (*pid)->addrOfNextInObjectTable();  }  OMNIORB_ASSERT(*pid);  if( omniORB::trace(10) ) {    omniORB::logger l;    l << "Removing " << this << " from object table\n";  }  *pid = nextInObjectTable();  if( --numObjectsInTable < minNumObjects )    omniObjTable::resize();  if (pd_state != ETHEREALISING && pd_servant) {    pd_servant->_removeActivation(this);    pd_deactivated = 1;  }  pd_state = DEAD;  if (pd_waiters)    pd_cond->broadcast();  loseRef(); // Drop the object table's entry to ourselves}omniObjTableEntry::StateomniObjTableEntry::wait(_CORBA_ULong set){  ASSERT_OMNI_TRACEDMUTEX_HELD(*omni::internalLock, 1);  if (pd_state & set) return pd_state;  if (!pd_cond) pd_cond = new omni_tracedcondition(omni::internalLock);  gainRef();  ++pd_waiters;  if (omniORB::trace(15)) {    omniORB::logger l;    l << "Waiting for " << this << "\n";  }  while ((pd_state != DEAD) && !(pd_state & set)) pd_cond->wait();  --pd_waiters;  State ret = pd_state;  // If the state is now DEAD, the call to loseRef() below might  // delete this object, so we must save the return state here.  loseRef();  return ret;}voidomniObjTableEntry::gainRef(omniObjRef* objref){  ASSERT_OMNI_TRACEDMUTEX_HELD(*omni::internalLock, 1);  ++pd_refCount;  if (objref)    pd_objRefs.push_back(objref);}voidomniObjTableEntry::loseRef(omniObjRef* objref){  ASSERT_OMNI_TRACEDMUTEX_HELD(*omni::internalLock, 1);  if (objref) {    CORBA::Boolean reference_found = 0;    omnivector<omniObjRef*>::iterator i    = pd_objRefs.begin();    omnivector<omniObjRef*>::iterator last = pd_objRefs.end();    for (; i != last; i++) {      if (*i == objref) {	pd_objRefs.erase(i);	reference_found = 1;	break;      }    }    OMNIORB_ASSERT(reference_found);  }    if (--pd_refCount > 0) return;  OMNIORB_ASSERT(pd_refCount == 0);  // < 0 means someone has released too many references.  OMNIORB_ASSERT(pd_waiters  == 0);  // Waiting threads hold a reference to us, so pd_waiters should be  // zero by the time we get here.  OMNIORB_ASSERT(pd_objRefs.empty());  // If this fails, an object reference released its reference to us  // without passing the objref pointer.  delete this;}void*omniObjTableEntry::thisClassCompare(omniIdentity* id, void* vfn){  classCompare_fn fn = (classCompare_fn)vfn;  if (fn == omniObjTableEntry::thisClassCompare)    return (omniObjTableEntry*)id;  if (fn == omniLocalIdentity::thisClassCompare)    return (omniLocalIdentity*)id;  return 0;}omniIdentity*omni::createIdentity(omniIOR* ior, const char* target, CORBA::Boolean locked){  omniIOR_var holder(ior); // Place the ior inside a var. If ever                           // any function we called results in an                           // exception being thrown, the ior is released

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?