📄 objectadapter.cc
字号:
if ( !oa_servers.empty() ) { omnivector<orbServer*>::iterator j,last; j = oa_servers.begin(); last = oa_servers.end(); for ( ; j != last; j++ ) { (*j)->stop(); } } } pd_isActive = 0;}//////////////////////////////////////////////////////////////////////voidomniObjAdapter::waitForActiveRequestsToComplete(int locked){ ASSERT_OMNI_TRACEDMUTEX_HELD(*omni::internalLock, locked); if( !locked ) omni::internalLock->lock(); OMNIORB_ASSERT(pd_nReqActive >= 0); pd_signalOnZeroInvocations++; while( pd_nReqActive ) pd_signal->wait(); pd_signalOnZeroInvocations--; if( !locked ) omni::internalLock->unlock();}//////////////////////////////////////////////////////////////////////voidomniObjAdapter::waitForAllRequestsToComplete(int locked){ ASSERT_OMNI_TRACEDMUTEX_HELD(*omni::internalLock, locked); if( !locked ) omni::internalLock->lock(); OMNIORB_ASSERT(pd_nReqInThis >= 0); pd_signalOnZeroInvocations++; while( pd_nReqInThis ) pd_signal->wait(); pd_signalOnZeroInvocations--; if( !locked ) omni::internalLock->unlock();}//////////////////////////////////////////////////////////////////////voidomniObjAdapter::met_detached_object(){ ASSERT_OMNI_TRACEDMUTEX_HELD(*omni::internalLock, 0); sd_detachedObjectLock.lock(); OMNIORB_ASSERT(pd_nDetachedObjects > 0); int do_signal = --pd_nDetachedObjects == 0 && pd_signalOnZeroDetachedObjects; sd_detachedObjectLock.unlock(); if( do_signal ) sd_detachedObjectSignal.broadcast();}//////////////////////////////////////////////////////////////////////voidomniObjAdapter::wait_for_detached_objects(){ ASSERT_OMNI_TRACEDMUTEX_HELD(*omni::internalLock, 0); sd_detachedObjectLock.lock(); pd_signalOnZeroDetachedObjects++; OMNIORB_ASSERT(pd_nDetachedObjects >= 0); while( pd_nDetachedObjects ) sd_detachedObjectSignal.wait(); pd_signalOnZeroDetachedObjects--; sd_detachedObjectLock.unlock();}////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////Rope*omniObjAdapter::defaultLoopBack(){ omni_tracedmutex_lock sync(oa_lock); if (!oa_loopback) { // This is tough!!! Haven't got a loop back! // May be the object adaptor has been destroyed!!! OMNIORB_THROW(INITIALIZE,INITIALIZE_TransportError, CORBA::COMPLETED_NO); } return oa_loopback;}//////////////////////////////////////////////////////////////////////staticconst char*pick_endpoint(omnivector<const char*>& endpoints,const char* prefix) { omnivector<const char*>::iterator i,last; i = endpoints.begin(); last = endpoints.end(); int len = strlen(prefix); for ( ; i != last; i++) { if (strncmp((*i),prefix,len) == 0) { return (*i); } } return 0;}//////////////////////////////////////////////////////////////////////staticvoidinstantiate_defaultloopback(omnivector<const char*>& endpoints) { // Until we have a fast in-memory loop back. We use a stream loopback to // talk to ourself. // XXX We are restricting ourselves to just giop:* transports. // We can generalise this to allow other (and faster) loopback to // be used but that is probably not very useful because in the // long run we would like to have a in-memory loopback. const char* loopback_endpoint = 0; // We prefer unix to tcp. ssl is the last choice. loopback_endpoint = pick_endpoint(endpoints,"giop:unix"); if (!loopback_endpoint) { loopback_endpoint = pick_endpoint(endpoints,"giop:tcp"); } if (!loopback_endpoint) { loopback_endpoint = pick_endpoint(endpoints,"giop:ssl"); } if (loopback_endpoint) { giopAddress* addr = giopAddress::str2Address(loopback_endpoint); if (addr) { omni_tracedmutex_lock sync(*omniTransportLock); oa_loopback = new giopRope(addr,1); } } if (!oa_loopback) { if (omniORB::trace(1)) { omniORB::logger log; log << "Warning: Unable to create a loopback transport to talk to this ORB.\n" " Any attempt to talk to a local object may fail.\n" " This error is caused by the lack of a suitable endpoint\n" " that is layered on top of TCP, SSL or UNIX socket.\n" " To correct this problem, check if the -ORBendPoint\n" " options are consistent.\n"; } }}//////////////////////////////////////////////////////////////////////CORBA::BooleanomniObjAdapter::matchMyEndpoints(const char* addr){ for ( omnivector<const char*>::iterator i = oa_endpoints.begin(); i != oa_endpoints.end(); i++) { if (omni::ptrStrMatch((*i),addr)) return 1; } return 0;}//////////////////////////////////////////////////////////////////////const omnivector<const char*>&omniObjAdapter::listMyEndpoints(){ return oa_endpoints;}//////////////////////////////////////////////////////////////////////omniObjAdapter::omniObjAdapter(int nil) : pd_nReqInThis(0), pd_nReqActive(0), pd_signalOnZeroInvocations(0), pd_signal(0), pd_nDetachedObjects(0), pd_signalOnZeroDetachedObjects(0), pd_isActive(0){ if (!nil) pd_signal = new omni_tracedcondition(omni::internalLock);}//////////////////////////////////////////////////////////////////////voidomniObjAdapter::adapterDestroyed(){ OMNIORB_ASSERT(pd_signal); delete pd_signal; pd_signal = 0;}//////////////////////////////////////////////////////////////////////omniObjAdapter::Options::~Options() { for( EndpointURIList::iterator i = options.endpoints.begin(); i != options.endpoints.end(); i++ ) { delete (*i); }}/////////////////////////////////////////////////////////////////////////////// Handlers for Configuration Options ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////class endpointHandler : public orbOptions::Handler {public: endpointHandler() : orbOptions::Handler("endPoint", "endPoint = <endpoint uri>", 1, "-ORBendPoint = <endpoint uri>\n"" <endpoint uri> = \"giop:tcp:<host>:<port>\" |\n"" *\"giop:ssl:<host>:<port>\" |\n"" *\"giop:unix:<filename>\" |\n"" *\"giop:fd:<no.>\" |\n"" *\"<other protocol>:<network protocol>:<options>\"\n"" * may not be supported on the platform.\n") {} void visit(const char* value,orbOptions::Source) throw (orbOptions::BadParam) { omniObjAdapter::Options::EndpointURI* opt; opt = new omniObjAdapter::Options::EndpointURI(); opt->no_publish = opt->no_listen = 0; opt->uri = value; omniObjAdapter::options.endpoints.push_back(opt); } void dump(orbOptions::sequenceString& result) { omniObjAdapter::Options::EndpointURIList::iterator last, i; i = omniObjAdapter::options.endpoints.begin(); last = omniObjAdapter::options.endpoints.end(); if (i == last) { // none specified, output the default orbOptions::addKVString(key(),"giop:tcp::",result); return; } for (; i != last; i++) { if (! ((*i)->no_publish || (*i)->no_listen) ) { orbOptions::addKVString(key(),(*i)->uri,result); } } }};static endpointHandler endpointHandler_;/////////////////////////////////////////////////////////////////////////////class endpointNoPublishHandler : public orbOptions::Handler {public: endpointNoPublishHandler() : orbOptions::Handler("endPointNoPublish", "endPointNoPublish = <endpoint uri>", 1, "-ORBendPointNoPublish <endpoint uri>") {} void visit(const char* value,orbOptions::Source) throw (orbOptions::BadParam) { omniObjAdapter::Options::EndpointURI* opt; opt = new omniObjAdapter::Options::EndpointURI(); opt->no_publish = 1; opt->no_listen = 0; opt->uri = value; omniObjAdapter::options.endpoints.push_back(opt); } void dump(orbOptions::sequenceString& result) { omniObjAdapter::Options::EndpointURIList::iterator last, i; i = omniObjAdapter::options.endpoints.begin(); last = omniObjAdapter::options.endpoints.end(); for (; i != last; i++) { if ( (*i)->no_publish ) { orbOptions::addKVString(key(),(*i)->uri,result); } } }};static endpointNoPublishHandler endpointNoPublishHandler_;/////////////////////////////////////////////////////////////////////////////class endpointNoListenHandler : public orbOptions::Handler {public: endpointNoListenHandler() : orbOptions::Handler("endPointNoListen", "endPointNoListen = <endpoint uri>", 1, "-ORBendPointNoListen <endpoint uri>") {} void visit(const char* value,orbOptions::Source) throw (orbOptions::BadParam) { omniObjAdapter::Options::EndpointURI* opt; opt = new omniObjAdapter::Options::EndpointURI(); opt->no_publish = 0; opt->no_listen = 1; opt->uri = value; omniObjAdapter::options.endpoints.push_back(opt); } void dump(orbOptions::sequenceString& result) { omniObjAdapter::Options::EndpointURIList::iterator last, i; i = omniObjAdapter::options.endpoints.begin(); last = omniObjAdapter::options.endpoints.end(); for (; i != last; i++) { if ( (*i)->no_listen ) { orbOptions::addKVString(key(),(*i)->uri,result); } } }};static endpointNoListenHandler endpointNoListenHandler_;/////////////////////////////////////////////////////////////////////////////class endpointPublishAllIFsHandler : public orbOptions::Handler {public: endpointPublishAllIFsHandler() : orbOptions::Handler("endPointPublishAllIFs", "endPointPublishAllIFs = 0 or 1", 1, "-ORBendPointPublishAllIFs < 0 | 1 >") {} void visit(const char* value,orbOptions::Source) throw (orbOptions::BadParam) { CORBA::Boolean v; if (!orbOptions::getBoolean(value,v)) { throw orbOptions::BadParam(key(),value, orbOptions::expect_boolean_msg); } omniObjAdapter::options.publish_all = v; } void dump(orbOptions::sequenceString& result) { orbOptions::addKVBoolean(key(),omniObjAdapter::options.publish_all, result); }};static endpointPublishAllIFsHandler endpointPublishAllIFsHandler_;//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// Module initialiser ///////////////////////////////////////////////////////////////////////////////class omni_objadpt_initialiser : public omniInitialiser {public: omni_objadpt_initialiser() { orbOptions::singleton().registerHandler(endpointHandler_); orbOptions::singleton().registerHandler(endpointNoPublishHandler_); orbOptions::singleton().registerHandler(endpointNoListenHandler_); orbOptions::singleton().registerHandler(endpointPublishAllIFsHandler_); } void attach() { // Make sure that endpointNoListen or endpointNoPublish is not // the only endpoint* option defined. omniObjAdapter::Options::EndpointURIList::iterator last, i; i = omniObjAdapter::options.endpoints.begin(); last = omniObjAdapter::options.endpoints.end(); if (i != last) { CORBA::Boolean only_listen = 1; CORBA::Boolean only_publish = 1; for ( ; i != last; i++ ) { if ((*i)->no_publish) { only_listen = 0; } else if ((*i)->no_listen) { only_publish = 0; } else { only_listen = only_publish = 0; } } if ( only_listen || only_publish ) { if ( omniORB::trace(1) ) { omniORB::logger log; log << "CORBA::ORB_init failed -- endPointNoListen or \n" "endPointNoPublish cannot be used alone.\n" "At least 1 endpoint or endPointNoPublish should be specified.\n"; } OMNIORB_THROW(INITIALIZE,INITIALIZE_InvalidORBInitArgs, CORBA::COMPLETED_NO); } } } void detach() { omniORB::logs(20, "Clear endPoint options."); omniObjAdapter::Options::EndpointURIList::iterator i; for (i = omniObjAdapter::options.endpoints.begin(); i != omniObjAdapter::options.endpoints.end(); i++) { delete (*i); } omniObjAdapter::options.endpoints.erase( omniObjAdapter::options.endpoints.begin(), omniObjAdapter::options.endpoints.end()); omniObjAdapter::options.publish_all = 0; }};static omni_objadpt_initialiser initialiser;omniInitialiser& omni_objadpt_initialiser_ = initialiser;OMNI_NAMESPACE_END(omni)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -