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

📄 objectadapter.cc

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