📄 omniobjref.cc
字号:
{ omni::internalLock->lock(); pd_flags.object_exists = 1; omni::internalLock->unlock(); } }}CORBA::Boolean omniObjRef::__is_equivalent(omniObjRef* o_obj){ ASSERT_OMNI_TRACEDMUTEX_HELD(*omni::internalLock, 0); { omni_tracedmutex_lock sync(*omni::internalLock); return pd_id->is_equivalent(o_obj->pd_id); }}CORBA::ULongomniObjRef::__hash(CORBA::ULong maximum){ ASSERT_OMNI_TRACEDMUTEX_HELD(*omni::internalLock, 0); const CORBA::Octet* key; int keysize; { omni_tracedmutex_lock sync(*omni::internalLock); key = pd_id->key(); keysize = pd_id->keysize(); return CORBA::ULong(omni::hash(key, keysize) % maximum); }}//////////////////////////////////////////////////////////////////////CORBA::BooleanomniObjRef::_remote_is_a(const char* a_repoId){ ASSERT_OMNI_TRACEDMUTEX_HELD(*omni::internalLock, 0); omni_is_a_CallDesc call_desc("_is_a", sizeof("_is_a"), a_repoId); _invoke(call_desc, 0); return call_desc.result;}//////////////////////////////////////////////////////////////////////CORBA::BooleanomniObjRef::_remote_non_existent(){ ASSERT_OMNI_TRACEDMUTEX_HELD(*omni::internalLock, 0); omni_non_existent_CallDesc call_desc("_non_existent", sizeof("_non_existent")); _invoke(call_desc, 0); return call_desc.result;}//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////void*omniObjRef::_transientExceptionHandler(void*& cookie){ if (pd_flags.transient_exception_handler) { omniExHandlers_iterator iter; omniExHandlers* hp = iter.find(this); if (hp != 0) { cookie = hp->transient_cookie; void* result = hp->transient_hdr; return result; } } return 0;}voidomniObjRef::_transientExceptionHandler(void* new_handler,void* cookie){ omniExHandlers_iterator iter; omniExHandlers* hp = iter.find_or_create(this); hp->transient_cookie = cookie; hp->transient_hdr = new_handler; pd_flags.transient_exception_handler = 1;}void*omniObjRef::_commFailureExceptionHandler(void*& cookie){ if (pd_flags.commfail_exception_handler) { omniExHandlers_iterator iter; omniExHandlers* hp = iter.find(this); if (hp != 0) { cookie = hp->commfail_cookie; void* result = hp->commfail_hdr; return result; } } return 0;}voidomniObjRef::_commFailureExceptionHandler(void* new_handler, void* cookie){ omniExHandlers_iterator iter; omniExHandlers* hp = iter.find_or_create(this); hp->commfail_cookie = cookie; hp->commfail_hdr = new_handler; pd_flags.commfail_exception_handler = 1;}void*omniObjRef::_systemExceptionHandler(void*& cookie){ if (pd_flags.system_exception_handler) { omniExHandlers_iterator iter; omniExHandlers* hp = iter.find(this); if (hp != 0) { cookie = hp->sysexcpt_cookie; void* result = hp->sysexcpt_hdr; return result; } } return 0;}voidomniObjRef::_systemExceptionHandler(void* new_handler,void* cookie){ omniExHandlers_iterator iter; omniExHandlers* hp = iter.find_or_create(this); hp->sysexcpt_cookie = cookie; hp->sysexcpt_hdr = new_handler; pd_flags.system_exception_handler = 1;}//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////omniObjRef::~omniObjRef(){ if( pd_refCount ) { if( omniORB::traceLevel > 0 ) { omniORB::logger log; log << "omniORB: ERROR -- an object reference has been explicity deleted.\n" " This is not legal, and will probably lead to a crash. Good luck!\n"; } } if (!pd_ior) return; // Nil ASSERT_OMNI_TRACEDMUTEX_HELD(*omni::internalLock, 0); { omni_tracedmutex_lock sync(*omni::objref_rc_lock); *pd_prev = pd_next; if (pd_next) pd_next->pd_prev = pd_prev; } if (pd_flags.static_repoId) { if (pd_mostDerivedRepoId != pd_intfRepoId) delete [] pd_mostDerivedRepoId; } else { if( pd_intfRepoId != pd_mostDerivedRepoId ) delete[] pd_intfRepoId; if( pd_mostDerivedRepoId ) delete[] pd_mostDerivedRepoId; } if (pd_ior) pd_ior->release(); OMNIORB_ASSERT(pd_id == 0);}omniObjRef::omniObjRef() : pd_refCount(0), pd_mostDerivedRepoId(0), pd_intfRepoId(0), pd_ior(0), pd_id(0), pd_next(0), pd_prev(0){ // Nil objref. pd_flags.orb_shutdown = 0;}omniObjRef::omniObjRef(const char* intfRepoId, omniIOR* ior, omniIdentity* id, _CORBA_Boolean static_repoId) : pd_refCount(1), pd_ior(ior), pd_id(id), pd_timeout_secs(0), pd_timeout_nanosecs(0){ OMNIORB_ASSERT(intfRepoId); OMNIORB_ASSERT(ior); OMNIORB_ASSERT(id); if (static_repoId) { pd_intfRepoId = (char*)intfRepoId; // Excuse the dodgy cast :-) } else { pd_intfRepoId = new char[strlen(intfRepoId) + 1]; strcpy(pd_intfRepoId, intfRepoId); } if( omni::ptrStrMatch(intfRepoId, ior->repositoryID()) ) { pd_mostDerivedRepoId = pd_intfRepoId; } else { pd_mostDerivedRepoId = new char[strlen(ior->repositoryID()) + 1]; strcpy(pd_mostDerivedRepoId, ior->repositoryID()); } { omni_tracedmutex_lock sync(*omni::objref_rc_lock); pd_next = objref_list; pd_prev = &objref_list; if (pd_next) pd_next->pd_prev = &pd_next; objref_list = this; } pd_flags.forward_location = 0; pd_flags.type_verified = 1; pd_flags.object_exists = omniObjTableEntry::downcast(id) ? 1 : 0; pd_flags.transient_exception_handler = 0; pd_flags.commfail_exception_handler = 0; pd_flags.system_exception_handler = 0; pd_flags.static_repoId = static_repoId; pd_flags.orb_shutdown = 0;}voidomniObjRef::_shutdown(){ omni_tracedmutex_lock sync(*omni::internalLock); omni_tracedmutex_lock sync2(*omni::objref_rc_lock); int i=0; for (omniObjRef* o = objref_list; o; o = o->pd_next, i++) o->_disable(); if (omniORB::trace(15)) { omniORB::logger l; l << i << " object reference" << (i == 1 ? "" : "s") << " present at ORB shutdown.\n"; }}voidomniObjRef::_disable(){ ASSERT_OMNI_TRACEDMUTEX_HELD(*omni::internalLock, 1); if (omniORB::trace(25)) { omniORB::logger l; l << "Disable ObjRef(" << pd_mostDerivedRepoId << ") " << pd_id << "\n"; } _setIdentity(omniShutdownIdentity::singleton()); pd_flags.orb_shutdown = 1;}voidomniObjRef::_invoke(omniCallDescriptor& call_desc, CORBA::Boolean do_assert){#define RECOVER_FORWARD do {\ omni::revertToOriginalProfile(this); \ CORBA::TRANSIENT ex2(TRANSIENT_FailedOnForwarded, ex.completed()); \ if( !_omni_callTransientExceptionHandler(this, retries++, ex2) ) \ throw ex2; \} while(0) int retries = 0;#if defined(__DECCXX) && __DECCXX_VER < 60300000 // Work-around for bug in Compaq C++ optimiser volatile#endif int fwd = 0; if( _is_nil() ) _CORBA_invoked_nil_objref(); call_desc.objref(this); omniCurrent* current; unsigned long abs_secs = 0, abs_nanosecs = 0; if (pd_timeout_secs || pd_timeout_nanosecs) { omni_thread::get_time(&abs_secs,&abs_nanosecs, pd_timeout_secs, pd_timeout_nanosecs); } else if (orbParameters::supportPerThreadTimeOut && (current = omniCurrent::get()) && (current->timeout_secs() || current->timeout_nanosecs())) { if (current->timeout_absolute()) { abs_secs = current->timeout_secs(); abs_nanosecs = current->timeout_nanosecs(); } else { omni_thread::get_time(&abs_secs,&abs_nanosecs, current->timeout_secs(), current->timeout_nanosecs()); } } else if (orbParameters::clientCallTimeOutPeriod.secs || orbParameters::clientCallTimeOutPeriod.nanosecs) { omni_thread::get_time(&abs_secs,&abs_nanosecs, orbParameters::clientCallTimeOutPeriod.secs, orbParameters::clientCallTimeOutPeriod.nanosecs); } if (abs_secs || abs_nanosecs) call_desc.setDeadline(abs_secs,abs_nanosecs); while(1) { if( orbParameters::verifyObjectExistsAndType && do_assert ) _assertExistsAndTypeVerified(); try{ omni::internalLock->lock(); fwd = pd_flags.forward_location; _identity()->dispatch(call_desc); return; } catch(const giopStream::CommFailure& ex) { if (ex.retry()) continue; if( fwd ) { RECOVER_FORWARD; continue; } if (is_COMM_FAILURE_minor(ex.minor())) { CORBA::COMM_FAILURE ex2(ex.minor(), ex.completed()); if( !_omni_callCommFailureExceptionHandler(this, retries++, ex2) ) OMNIORB_THROW(COMM_FAILURE,ex.minor(),ex.completed()); } else { CORBA::TRANSIENT ex2(ex.minor(), ex.completed()); if( !_omni_callTransientExceptionHandler(this, retries++, ex2) ) OMNIORB_THROW(TRANSIENT,ex.minor(),ex.completed()); } } catch(CORBA::COMM_FAILURE& ex) { if( fwd ) { RECOVER_FORWARD; continue; } if( !_omni_callCommFailureExceptionHandler(this, retries++, ex) ) OMNIORB_THROW(COMM_FAILURE,ex.minor(),ex.completed()); } catch(CORBA::TRANSIENT& ex) { if( !_omni_callTransientExceptionHandler(this, retries++, ex) ) OMNIORB_THROW(TRANSIENT,ex.minor(),ex.completed()); } catch(CORBA::OBJECT_NOT_EXIST& ex) { if( fwd ) { RECOVER_FORWARD; continue; } if( !_omni_callSystemExceptionHandler(this, retries++, ex) ) OMNIORB_THROW(OBJECT_NOT_EXIST,ex.minor(),ex.completed()); } catch(CORBA::SystemException& ex) { if( !_omni_callSystemExceptionHandler(this, retries++, ex) ) throw; } catch(omniORB::LOCATION_FORWARD& ex) { if( CORBA::is_nil(ex.get_obj()) ) { CORBA::TRANSIENT ex2(TRANSIENT_NoUsableProfile, CORBA::COMPLETED_NO); if( omniORB::traceLevel > 10 ){ omniORB::logger log; log << "Received GIOP::LOCATION_FORWARD message that" " contains a nil object reference.\n";
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -