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

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

Попытка сделать "прозрачное" и надёжное завершение работы многопоточной программы
parent f1235b09
......@@ -329,11 +329,14 @@ void MBExchange::sigterm( int 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::clog <<(p ? p.__cxa_exception_type()->name() : "null") << std::endl;
}
// }
}
// ------------------------------------------------------------------------------------------
void MBExchange::readConfiguration()
......
......@@ -343,13 +343,19 @@ void MBTCPMultiMaster::poll_thread()
if( sidExchangeMode != DefaultObjectId && force )
exchangeMode = shm->localGetValue(itExchangeMode, sidExchangeMode);
}
catch(...) {}
catch( std::exception& ex )
{
mbwarn << myname << "(poll_thread): " << ex.what() << endl;
}
try
{
poll();
}
catch(...) {}
catch( std::exception& ex)
{
mbwarn << myname << "(poll_thread): " << ex.what() << endl;
}
if( !checkProcActive() )
break;
......@@ -443,13 +449,13 @@ void MBTCPMultiMaster::sigterm( int signo )
}
catch( const std::exception& ex )
{
cerr << "catch: " << ex.what() << endl;
}
catch( ... )
{
std::exception_ptr p = std::current_exception();
std::clog << (p ? p.__cxa_exception_type()->name() : "null") << std::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;
// }
}
// -----------------------------------------------------------------------------
......
......@@ -904,7 +904,10 @@ bool MBSlave::deactivateObject()
if( mbslot )
mbslot->sigterm(SIGTERM);
}
catch(...) {}
catch( std::exception& ex)
{
mbwarn << myname << "(deactivateObject): " << ex.what() << endl;
}
return UniSetObject_LT::deactivateObject();
}
......@@ -920,7 +923,10 @@ void MBSlave::sigterm( int signo )
if( mbslot )
mbslot->sigterm(signo);
}
catch(...) {}
catch( std::exception& ex)
{
mbwarn << myname << "SIGTERM(" << signo << "): " << ex.what() << endl;
}
UniSetObject_LT::sigterm(signo);
}
......
......@@ -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;
......
......@@ -10,4 +10,5 @@ cd ../../Utilities/Admin/
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 ):
// -------------------------------------------------------------------------
ModbusTCPServer::~ModbusTCPServer()
{
terminate();
if( !cancelled )
terminate();
}
// -------------------------------------------------------------------------
void ModbusTCPServer::setMaxSessions( unsigned int num )
......@@ -114,6 +115,11 @@ bool ModbusTCPServer::waitQuery(const std::unordered_set<ModbusAddr>& vmbaddr, t
if( dlog->is_warn() )
dlog->warn() << "(ModbusTCPServer): " << e.what() << endl;
}
catch( std::exception& e )
{
if( dlog->is_warn() )
dlog->warn() << "(ModbusTCPServer): " << e.what() << endl;
}
return false;
}
......
......@@ -116,6 +116,8 @@ void ModbusTCPSession::run()
if( dlog->is_info() )
dlog->info() << peername << "(run): thread stopping..." << endl;
cancelled = true;
}
// -------------------------------------------------------------------------
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;
static std::shared_ptr<std::thread> g_fini_thread;
static std::shared_ptr<std::thread> g_kill_thread;
static const int TERMINATE_TIMEOUT = 3; // время отведенное на завершение процесса [сек]
static const int THREAD_TERMINATE_PAUSE = 500; // [мсек] пауза при завершении потока (см. work())
static const int KILL_TIMEOUT = 8;
// ------------------------------------------------------------------------------------------
static void activator_terminate( int signo )
......@@ -198,15 +199,21 @@ void terminate_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
{
ulogsys << "TERMINATE THREAD: destroy.." << endl;
g_act->orb->shutdown(true);
ulogsys << "TERMINATE THREAD: destroy ok.." << endl;
ulogsys << "TERMINATE THREAD: orb shutdown.." << endl;
if( g_act->orb )
g_act->orb->shutdown(true);
ulogsys << "TERMINATE THREAD: orb shutdown ok.." << endl;
}
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): line: " << fe.line() << endl;
ulogsys << "(TERMINATE THREAD): mesg: " << fe.errmsg() << endl;
......@@ -215,10 +222,7 @@ void terminate_thread()
{
ulogsys << "(TERMINATE THREAD): " << ex.what() << endl;
}
ulogsys << "(TERMINATE THREAD): call terminated.." << endl << flush;
g_act->terminated(g_signo);
#endif
if( g_fini_thread && g_fini_thread->joinable() )
g_fini_thread->join();
......@@ -234,7 +238,7 @@ void terminate_thread()
}
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): line: " << fe.line() << endl;
ulogsys << "(TERMINATE THREAD): mesg: " << fe.errmsg() << endl;
......@@ -329,7 +333,7 @@ UniSetActivator::~UniSetActivator()
}
g_signo = 0;
g_termevent.notify_one();
ulogsys << myname << "(run): wait done.." << endl;
ulogsys << myname << "(~UniSetActivator): wait done.." << endl;
#if 1
// if( g_term_thread->joinable() )
// g_term_thread->join();
......@@ -341,7 +345,7 @@ UniSetActivator::~UniSetActivator()
#endif
ulogsys << myname << "(run): wait done OK." << endl;
ulogsys << myname << "(~UniSetActivator): wait done OK." << endl;
}
}
// ------------------------------------------------------------------------------------------
......@@ -381,7 +385,8 @@ void UniSetActivator::uaDestroy(int signo)
try
{
ulogsys << myname << "(uaDestroy): shutdown orb... " << endl;
orb->shutdown(true);
if( orb )
orb->shutdown(true);
ulogsys << myname << "(uaDestroy): shutdown ok." << endl;
}
catch( const omniORB::fatalException& fe )
......@@ -391,12 +396,12 @@ void UniSetActivator::uaDestroy(int signo)
ucrit << myname << "(uaDestroy): line: " << fe.line() << 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()
if( orbthr )
{
// HACK: почему-то мы должны тут застрять,
// где-то что-то некорректно с уничтожением потока..
pause();
// иначе "где-то" возникает "гонка" с потоком завершения
// и мы получаем SIGABRT уже на самом завершении
// (помоему как-то связано с завершением потоков)
msleep(THREAD_TERMINATE_PAUSE); // pause();
}
}
// ------------------------------------------------------------------------------------------
......@@ -618,6 +625,7 @@ void UniSetActivator::terminated( int signo )
ulogsys << "(terminated): " << ex.what() << endl;
}
g_term = true;
ulogsys << "terminated ok.." << endl;
}
// ------------------------------------------------------------------------------------------
......
......@@ -117,43 +117,6 @@ UniSetManager::UniSetManager(const string& name, const string& section):
// ------------------------------------------------------------------------------------------
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();
mlist.clear();
}
......
......@@ -132,6 +132,7 @@ UniSetObject::UniSetObject( const string& name, const string& section ):
// ------------------------------------------------------------------------------------------
UniSetObject::~UniSetObject()
{
#if 0
try
{
deactivate();
......@@ -155,6 +156,7 @@ UniSetObject::~UniSetObject()
}
catch(...) {}
}
#endif
}
// ------------------------------------------------------------------------------------------
void UniSetObject::init_object()
......@@ -638,7 +640,10 @@ bool UniSetObject::deactivate()
{
deactivateObject();
}
catch(...) {}
catch( std::exception& ex )
{
uwarn << myname << "(deactivate): " << ex.what() << endl;
}
return true;
}
......@@ -685,7 +690,10 @@ bool UniSetObject::deactivate()
{
deactivateObject();
}
catch(...) {}
catch( std::exception& ex )
{
uwarn << myname << "(deactivate): " << ex.what() << endl;
}
unregister();
PortableServer::ObjectId_var oid = poamngr->servant_to_id(static_cast<PortableServer::ServantBase*>(this));
......@@ -713,11 +721,12 @@ bool UniSetObject::deactivate()
{
uwarn << myname << "(deactivate): " << ex << endl;
}
catch(...)
catch( std::exception& ex )
{
uwarn << myname << "(deactivate): " << " catch ..." << endl;
uwarn << myname << "(deactivate): " << ex.what() << endl;
}
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