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