Commit 59185a28 authored by Pavel Vainerman's avatar Pavel Vainerman

Корректировка процесса завершения работы:

Попытка сделать "прозрачное" и надёжное завершение работы многопоточной программы
parent f1235b09
...@@ -329,11 +329,14 @@ void MBExchange::sigterm( int signo ) ...@@ -329,11 +329,14 @@ void MBExchange::sigterm( int signo )
{ {
UniSetObject_LT::sigterm(signo); UniSetObject_LT::sigterm(signo);
} }
catch( ... ) catch( std::exception& ex)
{ {
mbwarn << myname << "SIGTERM(" << signo << "): " << ex.what() << endl;
}
// {
// std::exception_ptr p = std::current_exception(); // std::exception_ptr p = std::current_exception();
// std::clog <<(p ? p.__cxa_exception_type()->name() : "null") << std::endl; // std::clog <<(p ? p.__cxa_exception_type()->name() : "null") << std::endl;
} // }
} }
// ------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------
void MBExchange::readConfiguration() void MBExchange::readConfiguration()
......
...@@ -343,13 +343,19 @@ void MBTCPMultiMaster::poll_thread() ...@@ -343,13 +343,19 @@ void MBTCPMultiMaster::poll_thread()
if( sidExchangeMode != DefaultObjectId && force ) if( sidExchangeMode != DefaultObjectId && force )
exchangeMode = shm->localGetValue(itExchangeMode, sidExchangeMode); exchangeMode = shm->localGetValue(itExchangeMode, sidExchangeMode);
} }
catch(...) {} catch( std::exception& ex )
{
mbwarn << myname << "(poll_thread): " << ex.what() << endl;
}
try try
{ {
poll(); poll();
} }
catch(...) {} catch( std::exception& ex)
{
mbwarn << myname << "(poll_thread): " << ex.what() << endl;
}
if( !checkProcActive() ) if( !checkProcActive() )
break; break;
...@@ -443,13 +449,13 @@ void MBTCPMultiMaster::sigterm( int signo ) ...@@ -443,13 +449,13 @@ void MBTCPMultiMaster::sigterm( int signo )
} }
catch( const std::exception& ex ) catch( const std::exception& ex )
{ {
cerr << "catch: " << ex.what() << endl; mbcrit << myname << "(sigterm): " << ex.what() << std::endl;
}
catch( ... )
{
std::exception_ptr p = std::current_exception();
std::clog << (p ? p.__cxa_exception_type()->name() : "null") << std::endl;
} }
// catch( ... )
// {
// std::exception_ptr p = std::current_exception();
// std::clog << (p ? p.__cxa_exception_type()->name() : "null") << std::endl;
// }
} }
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
......
...@@ -904,7 +904,10 @@ bool MBSlave::deactivateObject() ...@@ -904,7 +904,10 @@ bool MBSlave::deactivateObject()
if( mbslot ) if( mbslot )
mbslot->sigterm(SIGTERM); mbslot->sigterm(SIGTERM);
} }
catch(...) {} catch( std::exception& ex)
{
mbwarn << myname << "(deactivateObject): " << ex.what() << endl;
}
return UniSetObject_LT::deactivateObject(); return UniSetObject_LT::deactivateObject();
} }
...@@ -920,7 +923,10 @@ void MBSlave::sigterm( int signo ) ...@@ -920,7 +923,10 @@ void MBSlave::sigterm( int signo )
if( mbslot ) if( mbslot )
mbslot->sigterm(signo); mbslot->sigterm(signo);
} }
catch(...) {} catch( std::exception& ex)
{
mbwarn << myname << "SIGTERM(" << signo << "): " << ex.what() << endl;
}
UniSetObject_LT::sigterm(signo); UniSetObject_LT::sigterm(signo);
} }
......
...@@ -323,7 +323,10 @@ void MBTCPPersistentSlave::execute_tcp() ...@@ -323,7 +323,10 @@ void MBTCPPersistentSlave::execute_tcp()
} }
} }
} }
catch(...) {} catch( std::exception& ex)
{
mbwarn << myname << "(execute_tcp): " << ex.what() << endl;
}
} }
mbinfo << myname << "(execute_tcp): thread stopped.." << endl; mbinfo << myname << "(execute_tcp): thread stopped.." << endl;
......
...@@ -10,4 +10,5 @@ cd ../../Utilities/Admin/ ...@@ -10,4 +10,5 @@ cd ../../Utilities/Admin/
cd - cd -
./uniset2-start.sh -f ./tests_with_sm $* -- --confile tests_with_sm.xml --e-startup-pause 10 ./uniset2-start.sh -f ./tests_with_sm $* -- --confile tests_with_sm.xml --e-startup-pause 10
#--ulog-add-levels any
...@@ -23,7 +23,8 @@ ModbusTCPServer::ModbusTCPServer( ost::InetAddress& ia, int port ): ...@@ -23,7 +23,8 @@ ModbusTCPServer::ModbusTCPServer( ost::InetAddress& ia, int port ):
// ------------------------------------------------------------------------- // -------------------------------------------------------------------------
ModbusTCPServer::~ModbusTCPServer() ModbusTCPServer::~ModbusTCPServer()
{ {
terminate(); if( !cancelled )
terminate();
} }
// ------------------------------------------------------------------------- // -------------------------------------------------------------------------
void ModbusTCPServer::setMaxSessions( unsigned int num ) void ModbusTCPServer::setMaxSessions( unsigned int num )
...@@ -114,6 +115,11 @@ bool ModbusTCPServer::waitQuery(const std::unordered_set<ModbusAddr>& vmbaddr, t ...@@ -114,6 +115,11 @@ bool ModbusTCPServer::waitQuery(const std::unordered_set<ModbusAddr>& vmbaddr, t
if( dlog->is_warn() ) if( dlog->is_warn() )
dlog->warn() << "(ModbusTCPServer): " << e.what() << endl; dlog->warn() << "(ModbusTCPServer): " << e.what() << endl;
} }
catch( std::exception& e )
{
if( dlog->is_warn() )
dlog->warn() << "(ModbusTCPServer): " << e.what() << endl;
}
return false; return false;
} }
......
...@@ -116,6 +116,8 @@ void ModbusTCPSession::run() ...@@ -116,6 +116,8 @@ void ModbusTCPSession::run()
if( dlog->is_info() ) if( dlog->is_info() )
dlog->info() << peername << "(run): thread stopping..." << endl; dlog->info() << peername << "(run): thread stopping..." << endl;
cancelled = true;
} }
// ------------------------------------------------------------------------- // -------------------------------------------------------------------------
ModbusRTU::mbErrCode ModbusTCPSession::receive( const std::unordered_set<ModbusAddr>& vmbaddr, timeout_t msec ) ModbusRTU::mbErrCode ModbusTCPSession::receive( const std::unordered_set<ModbusAddr>& vmbaddr, timeout_t msec )
......
...@@ -94,6 +94,7 @@ static std::shared_ptr<std::thread> g_term_thread; ...@@ -94,6 +94,7 @@ static std::shared_ptr<std::thread> g_term_thread;
static std::shared_ptr<std::thread> g_fini_thread; static std::shared_ptr<std::thread> g_fini_thread;
static std::shared_ptr<std::thread> g_kill_thread; static std::shared_ptr<std::thread> g_kill_thread;
static const int TERMINATE_TIMEOUT = 3; // время отведенное на завершение процесса [сек] static const int TERMINATE_TIMEOUT = 3; // время отведенное на завершение процесса [сек]
static const int THREAD_TERMINATE_PAUSE = 500; // [мсек] пауза при завершении потока (см. work())
static const int KILL_TIMEOUT = 8; static const int KILL_TIMEOUT = 8;
// ------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------
static void activator_terminate( int signo ) static void activator_terminate( int signo )
...@@ -198,15 +199,21 @@ void terminate_thread() ...@@ -198,15 +199,21 @@ void terminate_thread()
g_fini_thread = make_shared<std::thread>(finished_thread); g_fini_thread = make_shared<std::thread>(finished_thread);
} }
ulogsys << "(TERMINATE THREAD): call terminated.." << endl << flush;
g_act->terminated(g_signo);
#if 0
try try
{ {
ulogsys << "TERMINATE THREAD: destroy.." << endl; ulogsys << "TERMINATE THREAD: orb shutdown.." << endl;
g_act->orb->shutdown(true); if( g_act->orb )
ulogsys << "TERMINATE THREAD: destroy ok.." << endl; g_act->orb->shutdown(true);
ulogsys << "TERMINATE THREAD: orb shutdown ok.." << endl;
} }
catch( const omniORB::fatalException& fe ) catch( const omniORB::fatalException& fe )
{ {
ulogsys << "(TERMINATE THREAD): : поймали omniORB::fatalException:" << endl; ulogsys << "(TERMINATE THREAD): : omniORB::fatalException:" << endl;
ulogsys << "(TERMINATE THREAD): file: " << fe.file() << endl; ulogsys << "(TERMINATE THREAD): file: " << fe.file() << endl;
ulogsys << "(TERMINATE THREAD): line: " << fe.line() << endl; ulogsys << "(TERMINATE THREAD): line: " << fe.line() << endl;
ulogsys << "(TERMINATE THREAD): mesg: " << fe.errmsg() << endl; ulogsys << "(TERMINATE THREAD): mesg: " << fe.errmsg() << endl;
...@@ -215,10 +222,7 @@ void terminate_thread() ...@@ -215,10 +222,7 @@ void terminate_thread()
{ {
ulogsys << "(TERMINATE THREAD): " << ex.what() << endl; ulogsys << "(TERMINATE THREAD): " << ex.what() << endl;
} }
#endif
ulogsys << "(TERMINATE THREAD): call terminated.." << endl << flush;
g_act->terminated(g_signo);
if( g_fini_thread && g_fini_thread->joinable() ) if( g_fini_thread && g_fini_thread->joinable() )
g_fini_thread->join(); g_fini_thread->join();
...@@ -234,7 +238,7 @@ void terminate_thread() ...@@ -234,7 +238,7 @@ void terminate_thread()
} }
catch( const omniORB::fatalException& fe ) catch( const omniORB::fatalException& fe )
{ {
ulogsys << "(TERMINATE THREAD): : поймали omniORB::fatalException:" << endl; ulogsys << "(TERMINATE THREAD): : omniORB::fatalException:" << endl;
ulogsys << "(TERMINATE THREAD): file: " << fe.file() << endl; ulogsys << "(TERMINATE THREAD): file: " << fe.file() << endl;
ulogsys << "(TERMINATE THREAD): line: " << fe.line() << endl; ulogsys << "(TERMINATE THREAD): line: " << fe.line() << endl;
ulogsys << "(TERMINATE THREAD): mesg: " << fe.errmsg() << endl; ulogsys << "(TERMINATE THREAD): mesg: " << fe.errmsg() << endl;
...@@ -329,7 +333,7 @@ UniSetActivator::~UniSetActivator() ...@@ -329,7 +333,7 @@ UniSetActivator::~UniSetActivator()
} }
g_signo = 0; g_signo = 0;
g_termevent.notify_one(); g_termevent.notify_one();
ulogsys << myname << "(run): wait done.." << endl; ulogsys << myname << "(~UniSetActivator): wait done.." << endl;
#if 1 #if 1
// if( g_term_thread->joinable() ) // if( g_term_thread->joinable() )
// g_term_thread->join(); // g_term_thread->join();
...@@ -341,7 +345,7 @@ UniSetActivator::~UniSetActivator() ...@@ -341,7 +345,7 @@ UniSetActivator::~UniSetActivator()
#endif #endif
ulogsys << myname << "(run): wait done OK." << endl; ulogsys << myname << "(~UniSetActivator): wait done OK." << endl;
} }
} }
// ------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------
...@@ -381,7 +385,8 @@ void UniSetActivator::uaDestroy(int signo) ...@@ -381,7 +385,8 @@ void UniSetActivator::uaDestroy(int signo)
try try
{ {
ulogsys << myname << "(uaDestroy): shutdown orb... " << endl; ulogsys << myname << "(uaDestroy): shutdown orb... " << endl;
orb->shutdown(true); if( orb )
orb->shutdown(true);
ulogsys << myname << "(uaDestroy): shutdown ok." << endl; ulogsys << myname << "(uaDestroy): shutdown ok." << endl;
} }
catch( const omniORB::fatalException& fe ) catch( const omniORB::fatalException& fe )
...@@ -391,12 +396,12 @@ void UniSetActivator::uaDestroy(int signo) ...@@ -391,12 +396,12 @@ void UniSetActivator::uaDestroy(int signo)
ucrit << myname << "(uaDestroy): line: " << fe.line() << endl; ucrit << myname << "(uaDestroy): line: " << fe.line() << endl;
ucrit << myname << "(uaDestroy): mesg: " << fe.errmsg() << endl; ucrit << myname << "(uaDestroy): mesg: " << fe.errmsg() << endl;
} }
catch(...) catch( const std::exception& ex )
{ {
ulogsys << myname << "(uaDestroy): orb shutdown: catch... " << endl; ucrit << myname << "(uaDestroy): " << ex.what() << endl;
} }
ulogsys << myname << "(stop): shutdown ok." << endl; ulogsys << myname << "(uaDestroy): begin..." << endl;
} }
// ------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------
...@@ -522,8 +527,10 @@ void UniSetActivator::work() ...@@ -522,8 +527,10 @@ void UniSetActivator::work()
if( orbthr ) if( orbthr )
{ {
// HACK: почему-то мы должны тут застрять, // HACK: почему-то мы должны тут застрять,
// где-то что-то некорректно с уничтожением потока.. // иначе "где-то" возникает "гонка" с потоком завершения
pause(); // и мы получаем SIGABRT уже на самом завершении
// (помоему как-то связано с завершением потоков)
msleep(THREAD_TERMINATE_PAUSE); // pause();
} }
} }
// ------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------
...@@ -618,6 +625,7 @@ void UniSetActivator::terminated( int signo ) ...@@ -618,6 +625,7 @@ void UniSetActivator::terminated( int signo )
ulogsys << "(terminated): " << ex.what() << endl; ulogsys << "(terminated): " << ex.what() << endl;
} }
g_term = true;
ulogsys << "terminated ok.." << endl; ulogsys << "terminated ok.." << endl;
} }
// ------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------
......
...@@ -117,43 +117,6 @@ UniSetManager::UniSetManager(const string& name, const string& section): ...@@ -117,43 +117,6 @@ UniSetManager::UniSetManager(const string& name, const string& section):
// ------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------
UniSetManager::~UniSetManager() UniSetManager::~UniSetManager()
{ {
try
{
objects(deactiv);
}
catch(...) {}
try
{
managers(deactiv);
}
catch(...) {}
#if 0
/*
# НЕ МЫ СОЗДАВАЛИ.. НЕ НАМ И УНИЧТОЖАТЬ!
# нужно перейти на shared_ptr<>..
*/
for( auto& i : olist )
{
try
{
delete i;
}
catch(...) {}
}
for( auto& i : mlist )
{
try
{
delete i;
}
catch(...) {}
}
#endif
olist.clear(); olist.clear();
mlist.clear(); mlist.clear();
} }
......
...@@ -132,6 +132,7 @@ UniSetObject::UniSetObject( const string& name, const string& section ): ...@@ -132,6 +132,7 @@ UniSetObject::UniSetObject( const string& name, const string& section ):
// ------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------
UniSetObject::~UniSetObject() UniSetObject::~UniSetObject()
{ {
#if 0
try try
{ {
deactivate(); deactivate();
...@@ -155,6 +156,7 @@ UniSetObject::~UniSetObject() ...@@ -155,6 +156,7 @@ UniSetObject::~UniSetObject()
} }
catch(...) {} catch(...) {}
} }
#endif
} }
// ------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------
void UniSetObject::init_object() void UniSetObject::init_object()
...@@ -638,7 +640,10 @@ bool UniSetObject::deactivate() ...@@ -638,7 +640,10 @@ bool UniSetObject::deactivate()
{ {
deactivateObject(); deactivateObject();
} }
catch(...) {} catch( std::exception& ex )
{
uwarn << myname << "(deactivate): " << ex.what() << endl;
}
return true; return true;
} }
...@@ -685,7 +690,10 @@ bool UniSetObject::deactivate() ...@@ -685,7 +690,10 @@ bool UniSetObject::deactivate()
{ {
deactivateObject(); deactivateObject();
} }
catch(...) {} catch( std::exception& ex )
{
uwarn << myname << "(deactivate): " << ex.what() << endl;
}
unregister(); unregister();
PortableServer::ObjectId_var oid = poamngr->servant_to_id(static_cast<PortableServer::ServantBase*>(this)); PortableServer::ObjectId_var oid = poamngr->servant_to_id(static_cast<PortableServer::ServantBase*>(this));
...@@ -713,11 +721,12 @@ bool UniSetObject::deactivate() ...@@ -713,11 +721,12 @@ bool UniSetObject::deactivate()
{ {
uwarn << myname << "(deactivate): " << ex << endl; uwarn << myname << "(deactivate): " << ex << endl;
} }
catch(...) catch( std::exception& ex )
{ {
uwarn << myname << "(deactivate): " << " catch ..." << endl; uwarn << myname << "(deactivate): " << ex.what() << endl;
} }
return false; return false;
} }
......
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