📄 controltaskserver.cpp
字号:
} catch (CORBA::Exception &e) { log(Error) << "CORBA exception raised!" << endlog(); log() << e._info().c_str() << endlog(); } } bool ControlTaskServer::InitOrb(int argc, char* argv[] ) { if ( orb.in() ) return false; try { // First initialize the ORB, that will remove some arguments... orb = CORBA::ORB_init (argc, argv, "" /* the ORB name, it can be anything! */); CORBA::Object_var poa_object = orb->resolve_initial_references ("RootPOA"); rootPOA = PortableServer::POA::_narrow (poa_object.in ()); PortableServer::POAManager_var poa_manager = rootPOA->the_POAManager (); poa_manager->activate (); return true; } catch (CORBA::Exception &e) { log(Error) << "Orb Init : CORBA exception raised!" << endlog(); log() << e._info().c_str() << endlog(); } return false; } void ControlTaskServer::CleanupServers() { if ( !CORBA::is_nil(orb) ) { log(Info) << "Cleaning up ControlTaskServers..."<<endlog(); ServerMap::iterator it = servers.begin(); while ( !servers.empty() ){ delete servers.begin()->second; } log() << "Cleanup done."<<endlog(); } } void ControlTaskServer::ShutdownOrb(bool wait_for_completion) { Logger::In in("ShutdownOrb"); DoShutdownOrb(wait_for_completion); } void ControlTaskServer::DoShutdownOrb(bool wait_for_completion) { if ( CORBA::is_nil(orb) ) { log(Error) << "Orb Shutdown...failed! Orb is nil." << endlog(); return; } try { log(Info) << "Orb Shutdown..."; if (wait_for_completion) log(Info)<<"waiting..."<<endlog(); orb->shutdown( wait_for_completion ); log(Info) << "done." << endlog(); } catch (CORBA::Exception &e) { log(Error) << "Orb Shutdown...failed! CORBA exception raised." << endlog(); log() << e._info().c_str() << endlog(); return; } } void ControlTaskServer::RunOrb() { if ( CORBA::is_nil(orb) ) { log(Error) << "RunOrb...failed! Orb is nil." << endlog(); return; } try { log(Info) <<"Entering orb->run()."<<endlog(); orb->run(); log(Info) <<"Breaking out of orb->run()."<<endlog(); } catch (CORBA::Exception &e) { log(Error) << "Orb Run : CORBA exception raised!" << endlog(); log() << e._info().c_str() << endlog(); } } /** * Class which runs an orb in an Orocos thread. */ struct OrbRunner : public NonPeriodicActivity { OrbRunner() : NonPeriodicActivity(RTT::OS::LowestPriority) {} void loop() { Logger::In in("OrbRunner"); ControlTaskServer::RunOrb(); } bool breakLoop() { return true; } void finalize() { Logger::In in("OrbRunner"); log(Info) <<"Safely stopped."<<endlog(); } }; void ControlTaskServer::ThreadOrb() { Logger::In in("ThreadOrb"); if ( CORBA::is_nil(orb) ) { log(Error) << "ThreadOrb...failed! Orb is nil." << endlog(); return; } if (orbrunner != 0) { log(Error) <<"Orb already running in a thread."<<endlog(); } else { log(Info) <<"Starting Orb in a thread."<<endlog(); orbrunner = new OrbRunner(); orbrunner->start(); } } void ControlTaskServer::DestroyOrb() { Logger::In in("DestroyOrb"); if ( CORBA::is_nil(orb) ) { log(Error) << "DestroyOrb...failed! Orb is nil." << endlog(); return; } if (orbrunner) { orbrunner->stop(); delete orbrunner; orbrunner = 0; } try { // Destroy the POA, waiting until the destruction terminates //poa->destroy (1, 1); CleanupServers(); orb->destroy(); log(Info) <<"Orb destroyed."<<endlog(); } catch (CORBA::Exception &e) { log(Error) << "Orb Destroy : CORBA exception raised!" << endlog(); log() << e._info().c_str() << endlog(); } } ControlTaskServer* ControlTaskServer::Create(TaskContext* tc, bool use_naming) { if ( !orb ) return 0; if ( servers.count(tc) ) { log(Debug) << "Returning existing ControlTaskServer for "<<tc->getName()<<endlog(); return servers.find(tc)->second; } // create new: log(Info) << "Creating new ControlTaskServer for "<<tc->getName()<<endlog(); ControlTaskServer* cts = new ControlTaskServer(tc, use_naming); return cts; } ControlTask_ptr ControlTaskServer::CreateServer(TaskContext* tc, bool use_naming) { if ( !orb ) return 0; if ( servers.count(tc) ) { log(Debug) << "Returning existing ControlTaskServer for "<<tc->getName()<<endlog(); return servers.find(tc)->second->server(); } for (ControlTaskProxy::PMap::iterator it = ControlTaskProxy::proxies.begin(); it != ControlTaskProxy::proxies.end(); ++it) if ( (it->second) == tc ) { log(Debug) << "Returning server of Proxy for "<<tc->getName()<<endlog(); return ControlTask::_duplicate(it->first); } // create new: log(Info) << "Creating new ControlTaskServer for "<<tc->getName()<<endlog(); ControlTaskServer* cts = new ControlTaskServer(tc, use_naming); return cts->server(); } Corba::ControlTask_ptr ControlTaskServer::server() const { return Corba::ControlTask::_duplicate(mtask.in()); }}}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -