Commit e5d82bcb authored by Pavel Vainerman's avatar Pavel Vainerman

(UActivator): refactoring the program termination process

parent 410b0c2f
...@@ -150,7 +150,7 @@ void PassiveLProcessor::sysCommand( const uniset::SystemMessage* sm ) ...@@ -150,7 +150,7 @@ void PassiveLProcessor::sysCommand( const uniset::SystemMessage* sm )
{ {
if( !shm->waitSMreadyWithCancellation(smReadyTimeout, cannceled) ) if( !shm->waitSMreadyWithCancellation(smReadyTimeout, cannceled) )
{ {
dcrit << myname << "(ERR): SM not ready. Terminated... " << endl; dcrit << myname << "(ERR): SM not ready. Terminated... " << endl << flush;
// std::terminate(); // std::terminate();
uterminate(); uterminate();
return; return;
......
...@@ -3021,7 +3021,7 @@ namespace uniset ...@@ -3021,7 +3021,7 @@ namespace uniset
if( devices.empty() ) if( devices.empty() )
{ {
mbcrit << myname << "(sysCommand): ************* ITEM MAP EMPTY! terminated... *************" << endl; mbcrit << myname << "(sysCommand): ************* ITEM MAP EMPTY! terminated... *************" << endl << flush;
// std::terminate(); // std::terminate();
uterminate(); uterminate();
return; return;
...@@ -3056,7 +3056,7 @@ namespace uniset ...@@ -3056,7 +3056,7 @@ namespace uniset
if( !isProcActive() ) if( !isProcActive() )
{ {
mbcrit << myname << "(sysCommand): ************* don`t activate?! ************" << endl; mbcrit << myname << "(sysCommand): ************* don`t activate?! ************" << endl << flush;
uterminate(); uterminate();
return; return;
} }
...@@ -3132,7 +3132,7 @@ namespace uniset ...@@ -3132,7 +3132,7 @@ namespace uniset
<< "(askSensors): Не дождались готовности(work) SharedMemory к работе в течение " << "(askSensors): Не дождались готовности(work) SharedMemory к работе в течение "
<< activateTimeout << " мсек"; << activateTimeout << " мсек";
mbcrit << err.str() << endl; mbcrit << err.str() << endl << flush;
// std::terminate(); // прерываем (перезапускаем) процесс... // std::terminate(); // прерываем (перезапускаем) процесс...
uterminate(); uterminate();
return; return;
......
...@@ -582,7 +582,7 @@ namespace uniset ...@@ -582,7 +582,7 @@ namespace uniset
if( vaddr.empty() ) if( vaddr.empty() )
{ {
mbcrit << "(execute_rtu): Unknown my modbus addresses!" << endl; mbcrit << "(execute_rtu): Unknown my modbus addresses!" << endl << flush;
//std::terminate(); //std::terminate();
uterminate(); uterminate();
return; return;
...@@ -622,7 +622,7 @@ namespace uniset ...@@ -622,7 +622,7 @@ namespace uniset
{ {
if( !tcpserver ) if( !tcpserver )
{ {
mbcrit << myname << "(execute_tcp): DYNAMIC CAST ERROR (mbslot --> ModbusTCPServerSlot)" << std::endl; mbcrit << myname << "(execute_tcp): DYNAMIC CAST ERROR (mbslot --> ModbusTCPServerSlot)" << std::endl << flush;
// std::terminate(); // std::terminate();
uterminate(); uterminate();
return; return;
...@@ -645,7 +645,7 @@ namespace uniset ...@@ -645,7 +645,7 @@ namespace uniset
if( vaddr.empty() ) if( vaddr.empty() )
{ {
mbcrit << "(execute_tcp): Unknown my modbus addresses!" << endl; mbcrit << "(execute_tcp): Unknown my modbus addresses!" << endl << flush;
// std::terminate(); // std::terminate();
uterminate(); uterminate();
return; return;
...@@ -686,7 +686,8 @@ namespace uniset ...@@ -686,7 +686,8 @@ namespace uniset
{ {
mbcrit << myname << "(execute_tcp): error run tcpserver: " mbcrit << myname << "(execute_tcp): error run tcpserver: "
<< tcpserver->getInetAddress() << tcpserver->getInetAddress()
<< ":" << tcpserver->getInetPort() << " err: not active.." << endl; << ":" << tcpserver->getInetPort() << " err: not active.."
<< endl << flush;
// std::terminate(); // std::terminate();
uterminate(); uterminate();
return; return;
...@@ -947,7 +948,7 @@ namespace uniset ...@@ -947,7 +948,7 @@ namespace uniset
{ {
if( iomap.empty() ) if( iomap.empty() )
{ {
mbcrit << myname << "(sysCommand): iomap EMPTY! terminated..." << endl; mbcrit << myname << "(sysCommand): iomap EMPTY! terminated..." << endl << flush;
// std::terminate(); // std::terminate();
uterminate(); uterminate();
return; return;
...@@ -1049,8 +1050,8 @@ namespace uniset ...@@ -1049,8 +1050,8 @@ namespace uniset
<< "(askSensors): Не дождались готовности(work) SharedMemory к работе в течение " << "(askSensors): Не дождались готовности(work) SharedMemory к работе в течение "
<< activateTimeout << " мсек"; << activateTimeout << " мсек";
mbcrit << err.str() << endl; mbcrit << err.str() << endl << flush;
kill(SIGTERM, getpid()); // прерываем (перезапускаем) процесс... uterminate();
throw SystemError(err.str()); throw SystemError(err.str());
} }
......
...@@ -270,7 +270,7 @@ namespace uniset ...@@ -270,7 +270,7 @@ namespace uniset
if( !activated ) if( !activated )
{ {
smcrit << myname << "(sysCommand): Don`t activate [timeout=" << activateTimeout << " msec]! TERMINATE.." << endl; smcrit << myname << "(sysCommand): Don`t activate [timeout=" << activateTimeout << " msec]! TERMINATE.." << endl << flush;
// std::terminate(); // std::terminate();
uterminate(); uterminate();
return; return;
...@@ -463,9 +463,9 @@ namespace uniset ...@@ -463,9 +463,9 @@ namespace uniset
<< ") указан неверно (" << ") указан неверно ("
<< it.getProp("iotype") << ") должен быть 'AI'"; << it.getProp("iotype") << ") должен быть 'AI'";
smcrit << msg.str() << endl; smcrit << msg.str() << endl << flush;
kill(getpid(), SIGTERM); uterminate();
// throw NameNotFound(msg.str()); throw SystemError(msg.str());
}; };
HeartBeatInfo hi; HeartBeatInfo hi;
...@@ -478,7 +478,7 @@ namespace uniset ...@@ -478,7 +478,7 @@ namespace uniset
{ {
ostringstream msg; ostringstream msg;
msg << "(SharedMemory::readItem): дискретный датчик (heartbeat_ds_name) связанный с " << it.getProp("name"); msg << "(SharedMemory::readItem): дискретный датчик (heartbeat_ds_name) связанный с " << it.getProp("name");
smwarn << msg.str() << endl; smwarn << msg.str() << endl << flush;
} }
} }
else else
...@@ -492,9 +492,9 @@ namespace uniset ...@@ -492,9 +492,9 @@ namespace uniset
// Если уж задали имя для датчика, то он должен существовать.. // Если уж задали имя для датчика, то он должен существовать..
// поэтому завершаем процесс, если не нашли.. // поэтому завершаем процесс, если не нашли..
smcrit << msg.str() << endl; smcrit << msg.str() << endl << flush;
kill(getpid(), SIGTERM); uterminate();
// throw NameNotFound(msg.str()); throw SystemError(msg.str());
} }
} }
...@@ -507,9 +507,9 @@ namespace uniset ...@@ -507,9 +507,9 @@ namespace uniset
msg << "(SharedMemory::readItem): НЕ УКАЗАН id для " msg << "(SharedMemory::readItem): НЕ УКАЗАН id для "
<< it.getProp("name") << " секция " << sec; << it.getProp("name") << " секция " << sec;
smcrit << msg.str() << endl; smcrit << msg.str() << endl << flush;
kill(getpid(), SIGTERM); uterminate();
// throw NameNotFound(msg.str()); throw SystemError(msg.str());
}; };
// без проверки на дублирование т.к. // без проверки на дублирование т.к.
...@@ -912,7 +912,7 @@ namespace uniset ...@@ -912,7 +912,7 @@ namespace uniset
{ {
ostringstream err; ostringstream err;
err << myname << "(initFromReserv): Not found ID for '" << smName << "'"; err << myname << "(initFromReserv): Not found ID for '" << smName << "'";
smcrit << err.str() << endl; smcrit << err.str() << endl << flush;
// std::terminate(); // std::terminate();
uterminate(); uterminate();
return; return;
...@@ -929,7 +929,7 @@ namespace uniset ...@@ -929,7 +929,7 @@ namespace uniset
{ {
ostringstream err; ostringstream err;
err << myname << "(initFromReserv): Not found NodeID for '" << smNode << "'"; err << myname << "(initFromReserv): Not found NodeID for '" << smNode << "'";
smcrit << err.str() << endl; smcrit << err.str() << endl << flush;
//std::terminate(); //std::terminate();
uterminate(); uterminate();
return; return;
......
...@@ -712,8 +712,8 @@ void UNetExchange::askSensors( UniversalIO::UIOCommand cmd ) ...@@ -712,8 +712,8 @@ void UNetExchange::askSensors( UniversalIO::UIOCommand cmd )
<< "(askSensors): Не дождались готовности(work) SharedMemory к работе в течение " << "(askSensors): Не дождались готовности(work) SharedMemory к работе в течение "
<< activateTimeout << " мсек"; << activateTimeout << " мсек";
unetcrit << err.str() << endl; unetcrit << err.str() << endl << flush;
kill(SIGTERM, getpid()); // прерываем (перезапускаем) процесс... uterminate();
throw SystemError(err.str()); throw SystemError(err.str());
} }
......
...@@ -151,7 +151,7 @@ void UniExchange::execute() ...@@ -151,7 +151,7 @@ void UniExchange::execute()
err << myname << "(execute): Не дождались готовности SharedMemory к работе в течение " err << myname << "(execute): Не дождались готовности SharedMemory к работе в течение "
<< smReadyTimeout << " мсек"; << smReadyTimeout << " мсек";
ucrit << err.str() << endl; ucrit << err.str() << endl << flush;
//throw SystemError(err.str()); //throw SystemError(err.str());
//std::terminate(); //std::terminate();
uterminate(); uterminate();
......
...@@ -97,7 +97,7 @@ namespace uniset ...@@ -97,7 +97,7 @@ namespace uniset
typedef void(ThreadMaster::* Action)(); typedef void(ThreadMaster::* Action)();
OmniThreadCreator( const std::shared_ptr<ThreadMaster>& m, Action a, bool undetached = false ); OmniThreadCreator( const std::shared_ptr<ThreadMaster>& m, Action a, bool undetached = false );
~OmniThreadCreator() {} virtual ~OmniThreadCreator() {}
inline bool isRunning() inline bool isRunning()
{ {
......
...@@ -72,11 +72,15 @@ namespace uniset ...@@ -72,11 +72,15 @@ namespace uniset
// запуск системы // запуск системы
// async = true - асинхронный запуск (создаётся отдельный поток). // async = true - асинхронный запуск (создаётся отдельный поток).
void run( bool async ); // terminate_control = true - управление процессом завершения (обработка сигналов завершения)
void run( bool async, bool terminate_control = true );
// штатное завершение работы // штатное завершение работы
void shutdown(); void shutdown();
// ожидание завершения (если был запуск run(true))
void join();
// прерывание работы // прерывание работы
void terminate(); void terminate();
...@@ -96,7 +100,7 @@ namespace uniset ...@@ -96,7 +100,7 @@ namespace uniset
protected: protected:
void work(); void mainWork();
// уносим в protected, т.к. Activator должен быть только один.. // уносим в protected, т.к. Activator должен быть только один..
UniSetActivator(); UniSetActivator();
...@@ -111,6 +115,7 @@ namespace uniset ...@@ -111,6 +115,7 @@ namespace uniset
std::shared_ptr< OmniThreadCreator<UniSetActivator> > orbthr; std::shared_ptr< OmniThreadCreator<UniSetActivator> > orbthr;
CORBA::ORB_var orb; CORBA::ORB_var orb;
bool termControl = { true };
#ifndef DISABLE_REST_API #ifndef DISABLE_REST_API
std::shared_ptr<uniset::UHttp::UHttpServer> httpserv; std::shared_ptr<uniset::UHttp::UHttpServer> httpserv;
......
...@@ -54,6 +54,14 @@ static std::atomic_bool g_done = ATOMIC_VAR_INIT(0); ...@@ -54,6 +54,14 @@ static std::atomic_bool g_done = ATOMIC_VAR_INIT(0);
static const int TERMINATE_TIMEOUT_SEC = 15; // время отведенное на завершение процесса [сек] static const int TERMINATE_TIMEOUT_SEC = 15; // время отведенное на завершение процесса [сек]
// ------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------
struct ORBThreadDeleter
{
void operator()( OmniThreadCreator<UniSetActivator>* p ) const
{
// не удаляем..
}
};
// ---------------------------------------------------------------------------
namespace uniset namespace uniset
{ {
UniSetActivatorPtr UniSetActivator::inst; UniSetActivatorPtr UniSetActivator::inst;
...@@ -126,10 +134,11 @@ namespace uniset ...@@ -126,10 +134,11 @@ namespace uniset
} }
// ------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------
void UniSetActivator::run( bool thread ) void UniSetActivator::run( bool thread, bool terminate_control )
{ {
ulogsys << myname << "(run): создаю менеджер " << endl; ulogsys << myname << "(run): создаю менеджер " << endl;
termControl = terminate_control;
auto aptr = std::static_pointer_cast<UniSetActivator>(get_ptr()); auto aptr = std::static_pointer_cast<UniSetActivator>(get_ptr());
UniSetManager::initPOA(aptr); UniSetManager::initPOA(aptr);
...@@ -144,7 +153,8 @@ namespace uniset ...@@ -144,7 +153,8 @@ namespace uniset
pman->activate(); pman->activate();
msleep(50); msleep(50);
set_signals(true); if( termControl )
set_signals(true);
#ifndef DISABLE_REST_API #ifndef DISABLE_REST_API
...@@ -168,13 +178,13 @@ namespace uniset ...@@ -168,13 +178,13 @@ namespace uniset
if( thread ) if( thread )
{ {
uinfo << myname << "(run): запускаемся с созданием отдельного потока... " << endl; uinfo << myname << "(run): запускаемся с созданием отдельного потока... " << endl;
orbthr = make_shared< OmniThreadCreator<UniSetActivator> >( aptr, &UniSetActivator::work); orbthr = std::shared_ptr<OmniThreadCreator<UniSetActivator>>(new OmniThreadCreator<UniSetActivator>(aptr, &UniSetActivator::mainWork), ORBThreadDeleter());
orbthr->start(); orbthr->start();
} }
else else
{ {
uinfo << myname << "(run): запускаемся без создания отдельного потока... " << endl; uinfo << myname << "(run): запускаемся без создания отдельного потока... " << endl;
work(); mainWork();
shutdown(); shutdown();
} }
} }
...@@ -189,15 +199,16 @@ namespace uniset ...@@ -189,15 +199,16 @@ namespace uniset
return; return;
active = false; active = false;
set_signals(false); if( termControl )
{ {
std::unique_lock<std::mutex> lk(g_donemutex); set_signals(false);
g_done = false; {
g_finish_guard_thread = make_shared<std::thread>(on_finish_timeout); std::unique_lock<std::mutex> lk(g_donemutex);
g_done = false;
g_finish_guard_thread = make_shared<std::thread>(on_finish_timeout);
}
} }
ulogsys << myname << "(shutdown): deactivate... " << endl; ulogsys << myname << "(shutdown): deactivate... " << endl;
deactivate(); deactivate();
ulogsys << myname << "(shutdown): deactivate ok. " << endl; ulogsys << myname << "(shutdown): deactivate ok. " << endl;
...@@ -238,9 +249,6 @@ namespace uniset ...@@ -238,9 +249,6 @@ namespace uniset
ucrit << myname << "(shutdown): " << ex.what() << endl; ucrit << myname << "(shutdown): " << ex.what() << endl;
} }
if( orbthr )
orbthr->join();
{ {
std::unique_lock<std::mutex> lk(g_donemutex); std::unique_lock<std::mutex> lk(g_donemutex);
g_done = true; g_done = true;
...@@ -252,6 +260,20 @@ namespace uniset ...@@ -252,6 +260,20 @@ namespace uniset
g_finish_guard_thread->join(); g_finish_guard_thread->join();
} }
// ------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------
void UniSetActivator::join()
{
if( g_done )
return;
ulogsys << myname << "(join): ..." << endl;
std::unique_lock<std::mutex> lk(g_donemutex);
g_doneevent.wait(lk, []()
{
return (g_done == true);
} );
}
// ------------------------------------------------------------------------------------------
void UniSetActivator::terminate() void UniSetActivator::terminate()
{ {
ulogsys << myname << "(terminate): ..." << endl; ulogsys << myname << "(terminate): ..." << endl;
...@@ -262,6 +284,7 @@ namespace uniset ...@@ -262,6 +284,7 @@ namespace uniset
{ {
auto act = UniSetActivator::Instance(); auto act = UniSetActivator::Instance();
act->shutdown(); act->shutdown();
ulogsys << "******** activator_terminate finished **** " << endl;
} }
// ------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------
void UniSetActivator::on_finish_timeout() void UniSetActivator::on_finish_timeout()
...@@ -340,7 +363,7 @@ namespace uniset ...@@ -340,7 +363,7 @@ namespace uniset
// sigaction(SIGSEGV, &act, &oact); // sigaction(SIGSEGV, &act, &oact);
} }
// ------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------
void UniSetActivator::work() void UniSetActivator::mainWork()
{ {
ulogsys << myname << "(work): запускаем orb на обработку запросов..." << endl; ulogsys << myname << "(work): запускаем orb на обработку запросов..." << endl;
......
...@@ -760,9 +760,14 @@ namespace uniset ...@@ -760,9 +760,14 @@ namespace uniset
} }
else else
{ {
uinfo << myname << ": ?? не задан ObjectId...(" // выдаём предупреждение только если поток не отключён, но при этом не задан ID
<< "myid=" << myid << " threadcreate=" << threadcreate if( threadcreate )
<< ")" << endl; {
uinfo << myname << ": ?? не задан ObjectId...("
<< "myid=" << myid << " threadcreate=" << threadcreate
<< ")" << endl;
}
thread(false); thread(false);
} }
......
...@@ -123,7 +123,7 @@ void IOController::activateInit() ...@@ -123,7 +123,7 @@ void IOController::activateInit()
} }
catch( const uniset::Exception& ex ) catch( const uniset::Exception& ex )
{ {
ucrit << myname << "(activateInit): " << ex << endl; ucrit << myname << "(activateInit): " << ex << endl << flush;
//std::terminate(); //std::terminate();
uterminate(); uterminate();
} }
......
...@@ -772,7 +772,7 @@ void IONotifyController::readConf() ...@@ -772,7 +772,7 @@ void IONotifyController::readConf()
// Если дамп не удалось считать, значит что-то не то в configure.xml // Если дамп не удалось считать, значит что-то не то в configure.xml
// и безопаснее "вылететь", чем запустится, т.к. часть датчиков не будет работать // и безопаснее "вылететь", чем запустится, т.к. часть датчиков не будет работать
// как ожидается. // как ожидается.
ucrit << myname << "(IONotifyController::readConf): " << ex.what() << endl; ucrit << myname << "(IONotifyController::readConf): " << ex.what() << endl << flush;
//std::terminate(); // std::abort(); //std::terminate(); // std::abort();
uterminate(); uterminate();
} }
......
...@@ -106,7 +106,7 @@ bool ProxyManager::activateObject() ...@@ -106,7 +106,7 @@ bool ProxyManager::activateObject()
} }
catch( const uniset::Exception& ex ) catch( const uniset::Exception& ex )
{ {
ucrit << myname << "(activate): " << ex << endl; ucrit << myname << "(activate): " << ex << endl << flush;
//std::terminate(); //std::terminate();
uterminate(); uterminate();
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment