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 + -
显示快捷键?