Commit 54b685e2 authored by Pavel Vainerman's avatar Pavel Vainerman

Очередная версия механизма завершения процессов. Добавлен контрольный поток

(делающий KILL если процессы не завершились), а также проведены некоторые стилистические правки.
parent b1ef89fe
...@@ -96,9 +96,9 @@ void <xsl:value-of select="$CLASSNAME"/>_SK::callback() ...@@ -96,9 +96,9 @@ void <xsl:value-of select="$CLASSNAME"/>_SK::callback()
ucrit &lt;&lt; myname &lt;&lt; "(execute): СORBA::SystemException: " ucrit &lt;&lt; myname &lt;&lt; "(execute): СORBA::SystemException: "
&lt;&lt; ex.NP_minorString() &lt;&lt; endl; &lt;&lt; ex.NP_minorString() &lt;&lt; endl;
} }
catch(...) catch( std::exception&amp;ex )
{ {
ucrit &lt;&lt; myname &lt;&lt; "(execute): catch ..." &lt;&lt; endl; ucrit &lt;&lt; myname &lt;&lt; "(execute): catch " &lt;&lt; ex.what() &lt;&lt; endl;
} }
if( !active ) if( !active )
...@@ -168,9 +168,9 @@ void <xsl:value-of select="$CLASSNAME"/>_SK::preAskSensors( UniversalIO::UIOComm ...@@ -168,9 +168,9 @@ void <xsl:value-of select="$CLASSNAME"/>_SK::preAskSensors( UniversalIO::UIOComm
{ {
ucrit &lt;&lt; myname &lt;&lt; "(preAskSensors): " &lt;&lt; ex &lt;&lt; endl; ucrit &lt;&lt; myname &lt;&lt; "(preAskSensors): " &lt;&lt; ex &lt;&lt; endl;
} }
catch(...) catch( std::exception&amp;ex )
{ {
ucrit &lt;&lt; myname &lt;&lt; "(preAskSensors): catch(...)" &lt;&lt; endl; ucrit &lt;&lt; myname &lt;&lt; "(execute): catch " &lt;&lt; ex.what() &lt;&lt; endl;
} }
msleep(askPause); msleep(askPause);
} }
......
...@@ -101,9 +101,9 @@ void <xsl:value-of select="$CLASSNAME"/>_SK::callback() ...@@ -101,9 +101,9 @@ void <xsl:value-of select="$CLASSNAME"/>_SK::callback()
ucrit &lt;&lt; myname &lt;&lt; "(execute): СORBA::SystemException: " ucrit &lt;&lt; myname &lt;&lt; "(execute): СORBA::SystemException: "
&lt;&lt; ex.NP_minorString() &lt;&lt; endl; &lt;&lt; ex.NP_minorString() &lt;&lt; endl;
} }
catch(...) catch( std::exception&amp;ex )
{ {
ucrit &lt;&lt; myname &lt;&lt; "(execute): catch ..." &lt;&lt; endl; ucrit &lt;&lt; myname &lt;&lt; "(execute): catch " &lt;&lt; ex.what() &lt;&lt; endl;
} }
if( !active ) if( !active )
......
...@@ -95,9 +95,9 @@ void <xsl:value-of select="$CLASSNAME"/>_SK::callback() ...@@ -95,9 +95,9 @@ void <xsl:value-of select="$CLASSNAME"/>_SK::callback()
ucrit &lt;&lt; myname &lt;&lt; "(execute): СORBA::SystemException: " ucrit &lt;&lt; myname &lt;&lt; "(execute): СORBA::SystemException: "
&lt;&lt; ex.NP_minorString() &lt;&lt; endl; &lt;&lt; ex.NP_minorString() &lt;&lt; endl;
} }
catch(...) catch( std::exception&amp;ex )
{ {
ucrit &lt;&lt; myname &lt;&lt; "(execute): catch ..." &lt;&lt; endl; ucrit &lt;&lt; myname &lt;&lt; "(execute): catch " &lt;&lt; ex.what() &lt;&lt; endl;
} }
if( !active ) if( !active )
...@@ -233,10 +233,11 @@ void <xsl:value-of select="$CLASSNAME"/>_SK::preAskSensors( UniversalIO::UIOComm ...@@ -233,10 +233,11 @@ void <xsl:value-of select="$CLASSNAME"/>_SK::preAskSensors( UniversalIO::UIOComm
{ {
ucrit &lt;&lt; myname &lt;&lt; "(preAskSensors): " &lt;&lt; ex &lt;&lt; endl; ucrit &lt;&lt; myname &lt;&lt; "(preAskSensors): " &lt;&lt; ex &lt;&lt; endl;
} }
catch(...) catch( std::exception&amp;ex )
{ {
ucrit &lt;&lt; myname &lt;&lt; "(preAskSensors): catch(...)" &lt;&lt; endl; ucrit &lt;&lt; myname &lt;&lt; "(execute): catch " &lt;&lt; ex.what() &lt;&lt; endl;
} }
msleep(askPause); msleep(askPause);
} }
} }
......
...@@ -99,9 +99,9 @@ void <xsl:value-of select="$CLASSNAME"/>_SK::callback() ...@@ -99,9 +99,9 @@ void <xsl:value-of select="$CLASSNAME"/>_SK::callback()
ucrit &lt;&lt; myname &lt;&lt; "(execute): СORBA::SystemException: " ucrit &lt;&lt; myname &lt;&lt; "(execute): СORBA::SystemException: "
&lt;&lt; ex.NP_minorString() &lt;&lt; endl; &lt;&lt; ex.NP_minorString() &lt;&lt; endl;
} }
catch(...) catch( std::exception&amp;ex )
{ {
ucrit &lt;&lt; myname &lt;&lt; "(execute): catch ..." &lt;&lt; endl; ucrit &lt;&lt; myname &lt;&lt; "(execute): catch " &lt;&lt; ex.what() &lt;&lt; endl;
} }
if( !active ) if( !active )
......
...@@ -115,7 +115,10 @@ ...@@ -115,7 +115,10 @@
ui->setValue( si,(m_<xsl:value-of select="../../@name"/> ? 1:0), getId() ); ui->setValue( si,(m_<xsl:value-of select="../../@name"/> ? 1:0), getId() );
return true; return true;
} }
catch(...){} catch( std::exception&amp;ex )
{
ucrit &lt;&lt; myname &lt;&lt; "(execute): catch " &lt;&lt; ex.what() &lt;&lt; endl;
}
return false; return false;
} }
</xsl:when> </xsl:when>
...@@ -395,10 +398,11 @@ void <xsl:value-of select="$CLASSNAME"/>_SK::waitSM( int wait_msec, ObjectId _te ...@@ -395,10 +398,11 @@ void <xsl:value-of select="$CLASSNAME"/>_SK::waitSM( int wait_msec, ObjectId _te
&lt;&lt; wait_msec &lt;&lt; " мсек"; &lt;&lt; wait_msec &lt;&lt; " мсек";
ucrit &lt;&lt; err.str() &lt;&lt; endl; ucrit &lt;&lt; err.str() &lt;&lt; endl;
// terminate();
// abort();
raise(SIGTERM);
terminate(); terminate();
abort(); // throw SystemError(err.str());
// kill(SIGTERM,getpid()); // прерываем (перезапускаем) процесс...
throw SystemError(err.str());
} }
<xsl:if test="normalize-space($TESTMODE)!=''"> <xsl:if test="normalize-space($TESTMODE)!=''">
...@@ -412,10 +416,10 @@ void <xsl:value-of select="$CLASSNAME"/>_SK::waitSM( int wait_msec, ObjectId _te ...@@ -412,10 +416,10 @@ void <xsl:value-of select="$CLASSNAME"/>_SK::waitSM( int wait_msec, ObjectId _te
&lt;&lt; wait_msec &lt;&lt; " мсек"; &lt;&lt; wait_msec &lt;&lt; " мсек";
ucrit &lt;&lt; err.str() &lt;&lt; endl; ucrit &lt;&lt; err.str() &lt;&lt; endl;
terminate(); // terminate();
abort(); // abort();
// kill(SIGTERM,getpid()); // прерываем (перезапускаем) процесс... raise(SIGTERM);
throw SystemError(err.str()); // throw SystemError(err.str());
} }
} }
</xsl:if> </xsl:if>
...@@ -809,7 +813,11 @@ bool <xsl:value-of select="$CLASSNAME"/>_SK::alarm( UniSetTypes::ObjectId _code, ...@@ -809,7 +813,11 @@ bool <xsl:value-of select="$CLASSNAME"/>_SK::alarm( UniSetTypes::ObjectId _code,
ui->setValue( si,m_<xsl:value-of select="@name"/>,getId() ); ui->setValue( si,m_<xsl:value-of select="@name"/>,getId() );
return true; return true;
} }
catch(...){} catch( std::exception&amp;ex )
{
ucrit &lt;&lt; myname &lt;&lt; "(execute): catch " &lt;&lt; ex.what() &lt;&lt; endl;
}
return false; return false;
} }
</xsl:for-each> </xsl:for-each>
......
...@@ -84,6 +84,10 @@ int main( int argc,char* argv[] ) ...@@ -84,6 +84,10 @@ int main( int argc,char* argv[] )
{ {
cerr &lt;&lt; "(main): " &lt;&lt; ex &lt;&lt; endl; cerr &lt;&lt; "(main): " &lt;&lt; ex &lt;&lt; endl;
} }
catch( std::exception&amp;ex )
{
ucrit &lt;&lt; "(main): catch " &lt;&lt; ex.what() &lt;&lt; endl;
}
catch(...) catch(...)
{ {
cerr &lt;&lt; "(main): catch ..." &lt;&lt; endl; cerr &lt;&lt; "(main): catch ..." &lt;&lt; endl;
......
...@@ -92,6 +92,10 @@ int main( int argc, const char** argv ) ...@@ -92,6 +92,10 @@ int main( int argc, const char** argv )
{ {
cerr &lt;&lt; "(main): " &lt;&lt; ex &lt;&lt; endl; cerr &lt;&lt; "(main): " &lt;&lt; ex &lt;&lt; endl;
} }
catch( std::exception&amp;ex )
{
cerr &lt;&lt; "(main): catch " &lt;&lt; ex.what() &lt;&lt; endl;
}
catch(...) catch(...)
{ {
cerr &lt;&lt; "(main): catch ..." &lt;&lt; endl; cerr &lt;&lt; "(main): catch ..." &lt;&lt; endl;
......
...@@ -13,10 +13,10 @@ GENERATED=TestGen_SK.h TestGen_SK.cc TestGen-main.cc ...@@ -13,10 +13,10 @@ GENERATED=TestGen_SK.h TestGen_SK.cc TestGen-main.cc
GENERATED2=TestGenAlone_SK.h TestGenAlone_SK.cc TestGenAlone-main.cc GENERATED2=TestGenAlone_SK.h TestGenAlone_SK.cc TestGenAlone-main.cc
GENUOBJ=UObject_SK.cc UObject_SK.h GENUOBJ=UObject_SK.cc UObject_SK.h
TestGen_SK.cc: ../@PACKAGE@-codegen testgen.src.xml ../*.xsl TestGen_SK.cc TestGen_SK.h: ../@PACKAGE@-codegen testgen.src.xml ../*.xsl
../@PACKAGE@-codegen -l $(top_builddir)/Utilities/codegen --local-include -n TestGen testgen.src.xml ../@PACKAGE@-codegen -l $(top_builddir)/Utilities/codegen --local-include -n TestGen testgen.src.xml
TestGenAlone_SK.cc: ../@PACKAGE@-codegen testgen-alone.src.xml ../*.xsl TestGenAlone_SK.cc TestGenAlone_SK.h: ../@PACKAGE@-codegen testgen-alone.src.xml ../*.xsl
../@PACKAGE@-codegen -l $(top_builddir)/Utilities/codegen --local-include --alone -n TestGenAlone testgen-alone.src.xml ../@PACKAGE@-codegen -l $(top_builddir)/Utilities/codegen --local-include --alone -n TestGenAlone testgen-alone.src.xml
$(GENUOBJ): ../@PACKAGE@-codegen uobject.src.xml ../*.xsl $(GENUOBJ): ../@PACKAGE@-codegen uobject.src.xml ../*.xsl
......
...@@ -14,6 +14,7 @@ ...@@ -14,6 +14,7 @@
--mbtcp-force-disconnect 1 \ --mbtcp-force-disconnect 1 \
--mbtcp-polltime 3000 \ --mbtcp-polltime 3000 \
--mbtcp-force-out 1 \ --mbtcp-force-out 1 \
--ulog-add-levels system \
$* $*
#--mbtcp-exchange-mode-id MB1_Mode_AS \ #--mbtcp-exchange-mode-id MB1_Mode_AS \
......
...@@ -95,7 +95,7 @@ void MBTCPTestServer::runThread() ...@@ -95,7 +95,7 @@ void MBTCPTestServer::runThread()
void MBTCPTestServer::execute() void MBTCPTestServer::execute()
{ {
isrunning = true; isrunning = true;
cerr << "******************** MBTCPTestServer(" << myname << ") running... " << endl; // cerr << "******************** MBTCPTestServer(" << myname << ") running... " << endl;
// Работа... // Работа...
while(1) while(1)
{ {
......
../../Utilities/scripts/uniset2-start.sh
\ No newline at end of file
../../Utilities/scripts/uniset2-start.sh
\ No newline at end of file
...@@ -389,7 +389,10 @@ void MBSlave::waitSMReady() ...@@ -389,7 +389,10 @@ void MBSlave::waitSMReady()
ostringstream err; ostringstream err;
err << myname << "(waitSMReady): Не дождались готовности SharedMemory к работе в течение " << ready_timeout << " мсек"; err << myname << "(waitSMReady): Не дождались готовности SharedMemory к работе в течение " << ready_timeout << " мсек";
dcrit << err.str() << endl; dcrit << err.str() << endl;
throw SystemError(err.str()); // throw SystemError(err.str());
raise(SIGTERM);
terminate();
// abort();
} }
} }
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
......
...@@ -4,7 +4,7 @@ uniset2-start.sh -f ./uniset2-mbslave --confile test.xml --dlog-add-levels any \ ...@@ -4,7 +4,7 @@ uniset2-start.sh -f ./uniset2-mbslave --confile test.xml --dlog-add-levels any \
--smemory-id SharedMemory \ --smemory-id SharedMemory \
--mbs-name MBSlave1 \ --mbs-name MBSlave1 \
--mbs-type TCP --mbs-inet-addr 127.0.0.1 --mbs-inet-port 2048 --mbs-reg-from-id 1 --mbs-my-addr 0x01 \ --mbs-type TCP --mbs-inet-addr 127.0.0.1 --mbs-inet-port 2048 --mbs-reg-from-id 1 --mbs-my-addr 0x01 \
--mbs-askcount-id SVU_AskCount_AS --mbs-respond-id RespondRTU_S --mbs-respond-invert 1 $* --mbs-askcount-id SVU_AskCount_AS --mbs-respond-id RespondRTU_S --mbs-respond-invert 1 --ulog-add-levels system $*
# --mbs-force 1 # --mbs-force 1
#--mbs-reg-from-id 1 \ #--mbs-reg-from-id 1 \
#--mbs-filter-field CAN2sender --mbs-filter-value SYSTSNode \ #--mbs-filter-field CAN2sender --mbs-filter-value SYSTSNode \
\ No newline at end of file
...@@ -5,6 +5,6 @@ export LD_LIBRARY_PATH="../../lib/.libs;../lib/.libs" ...@@ -5,6 +5,6 @@ export LD_LIBRARY_PATH="../../lib/.libs;../lib/.libs"
ulimit -Sc 10000000000 ulimit -Sc 10000000000
./uniset2-start.sh -f ./uniset2-smemory --smemory-id SharedMemory --pulsar-id DO_C --pulsar-iotype DO --pulsar-msec 100 \ ./uniset2-start.sh -f ./uniset2-smemory --smemory-id SharedMemory --pulsar-id DO_C --pulsar-iotype DO --pulsar-msec 100 \
--confile test.xml --datfile test.xml --db-logging 1 $* \ --confile test.xml --datfile test.xml --db-logging 1 --ulog-add-levels system $* \
#--ulog-add-levels info,crit,warn,level9,system \ #--ulog-add-levels info,crit,warn,level9,system \
#--dlog-add-levels info,crit,warn \ #--dlog-add-levels info,crit,warn \
...@@ -8,7 +8,7 @@ ...@@ -8,7 +8,7 @@
ВСЕ ВАШИ ИЗМЕНЕНИЯ БУДУТ ПОТЕРЯНЫ. ВСЕ ВАШИ ИЗМЕНЕНИЯ БУДУТ ПОТЕРЯНЫ.
*/ */
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
// generate timestamp: 2015-01-17+03:00 // generate timestamp: 2015-01-19+03:00
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
#ifndef UObject_SK_H_ #ifndef UObject_SK_H_
#define UObject_SK_H_ #define UObject_SK_H_
......
...@@ -11,7 +11,7 @@ ...@@ -11,7 +11,7 @@
ВСЕ ВАШИ ИЗМЕНЕНИЯ БУДУТ ПОТЕРЯНЫ. ВСЕ ВАШИ ИЗМЕНЕНИЯ БУДУТ ПОТЕРЯНЫ.
*/ */
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
// generate timestamp: 2015-01-17+03:00 // generate timestamp: 2015-01-19+03:00
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
#include "Configuration.h" #include "Configuration.h"
#include "Exceptions.h" #include "Exceptions.h"
...@@ -342,10 +342,11 @@ void UObject_SK::waitSM( int wait_msec, ObjectId _testID ) ...@@ -342,10 +342,11 @@ void UObject_SK::waitSM( int wait_msec, ObjectId _testID )
<< wait_msec << " мсек"; << wait_msec << " мсек";
ucrit << err.str() << endl; ucrit << err.str() << endl;
// terminate();
// abort();
raise(SIGTERM);
terminate(); terminate();
abort(); // throw SystemError(err.str());
// kill(SIGTERM,getpid()); // прерываем (перезапускаем) процесс...
throw SystemError(err.str());
} }
...@@ -402,9 +403,9 @@ void UObject_SK::callback() ...@@ -402,9 +403,9 @@ void UObject_SK::callback()
ucrit << myname << "(execute): СORBA::SystemException: " ucrit << myname << "(execute): СORBA::SystemException: "
<< ex.NP_minorString() << endl; << ex.NP_minorString() << endl;
} }
catch(...) catch( std::exception&ex )
{ {
ucrit << myname << "(execute): catch ..." << endl; ucrit << myname << "(execute): catch " << ex.what() << endl;
} }
if( !active ) if( !active )
...@@ -483,10 +484,11 @@ void UObject_SK::preAskSensors( UniversalIO::UIOCommand _cmd ) ...@@ -483,10 +484,11 @@ void UObject_SK::preAskSensors( UniversalIO::UIOCommand _cmd )
{ {
ucrit << myname << "(preAskSensors): " << ex << endl; ucrit << myname << "(preAskSensors): " << ex << endl;
} }
catch(...) catch( std::exception&ex )
{ {
ucrit << myname << "(preAskSensors): catch(...)" << endl; ucrit << myname << "(execute): catch " << ex.what() << endl;
} }
msleep(askPause); msleep(askPause);
} }
} }
......
...@@ -10,4 +10,4 @@ cd ../../Utilities/Admin/ ...@@ -10,4 +10,4 @@ cd ../../Utilities/Admin/
cd - cd -
./uniset2-start.sh -f ./tests_with_sm $* -- --confile tests_with_sm.xml --e-startup-pause 10 --ulog-levels warn,crit --dlog-levels warn,crit ./uniset2-start.sh -f ./tests_with_sm $* -- --confile tests_with_sm.xml --e-startup-pause 10 --ulog-add-levels system,warn,crit --dlog-levels warn,crit
...@@ -104,6 +104,8 @@ class OmniThreadCreator: ...@@ -104,6 +104,8 @@ class OmniThreadCreator:
inline void stop(){ exit(0); } inline void stop(){ exit(0); }
inline pid_t getTID(){ return id(); } inline pid_t getTID(){ return id(); }
inline void join(){ omni_thread::join(NULL); }
protected: protected:
void* run_undetached(void *x) void* run_undetached(void *x)
{ {
......
...@@ -27,6 +27,10 @@ ...@@ -27,6 +27,10 @@
#include <signal.h> #include <signal.h>
#include <sys/time.h> #include <sys/time.h>
#include <cc++/socket.h> #include <cc++/socket.h>
#include <condition_variable>
#include <thread>
#include <mutex>
#include <atomic>
#include "Mutex.h" #include "Mutex.h"
//---------------------------------------------------------------------------------------- //----------------------------------------------------------------------------------------
/*! \class UniSetTimer /*! \class UniSetTimer
...@@ -111,53 +115,48 @@ private: ...@@ -111,53 +115,48 @@ private:
}; };
//---------------------------------------------------------------------------------------- //----------------------------------------------------------------------------------------
class omni_mutex; /*! \class PassiveCondTimer
class omni_condition;
/*! \class ThrPassiveTimer
* \brief Пассивный таймер с режимом засыпания (ожидания) * \brief Пассивный таймер с режимом засыпания (ожидания)
* \author Pavel Vainerman * \author Pavel Vainerman
* \par * \par
* Позволяет заснуть на заданное время wait(timeout_t timeMS). * Позволяет заснуть на заданное время wait(timeout_t timeMS).
* Механизм работает на основе взаимных блокировок потоков (mutex и condition). * Механизм работает на основе std::condition_variable
* \note Если таймер запущен в режиме ожидания (WaitUpTime), то он может быть выведен из него * \note Если таймер запущен в режиме ожидания (WaitUpTime), то он может быть выведен из него
* при помощи terminate(). * ТОЛЬКО при помощи terminate().
*/ */
class ThrPassiveTimer: class PassiveCondTimer:
public PassiveTimer public PassiveTimer
{ {
public: public:
ThrPassiveTimer(); PassiveCondTimer();
~ThrPassiveTimer(); ~PassiveCondTimer();
virtual bool wait(timeout_t timeMS); /*!< блокировать вызывающий поток на заданное время */ virtual bool wait(timeout_t timeMS); /*!< блокировать вызывающий поток на заданное время */
virtual void terminate(); /*!< прервать работу таймера */ virtual void terminate(); /*!< прервать работу таймера */
protected: protected:
bool isTerminated();
void setTerminated( bool set );
private: private:
bool terminated; std::atomic_bool terminated;
omni_mutex* tmutex; std::mutex m_working;
omni_condition* tcondx; std::condition_variable cv_working;
UniSetTypes::uniset_mutex term_mutex;
}; };
//---------------------------------------------------------------------------------------- //----------------------------------------------------------------------------------------
/*! \class PassiveSysTimer /*! \class PassiveSigTimer
* \brief Пассивный таймер с режимом засыпания (ожидания) * \brief Пассивный таймер с режимом засыпания (ожидания)
* \author Pavel Vainerman * \author Pavel Vainerman
* \par * \par
* Создан на основе сигнала (SIGALRM). * Создан на основе сигнала (SIGALRM).
*/ */
class PassiveSysTimer: class PassiveSigTimer:
public PassiveTimer public PassiveTimer
{ {
public: public:
PassiveSysTimer(); PassiveSigTimer();
~PassiveSysTimer(); ~PassiveSigTimer();
virtual bool wait(timeout_t timeMS); //throw(UniSetTypes::NotSetSignal); virtual bool wait(timeout_t timeMS); //throw(UniSetTypes::NotSetSignal);
virtual void terminate(); virtual void terminate();
......
...@@ -137,6 +137,8 @@ class ThreadCreator: ...@@ -137,6 +137,8 @@ class ThreadCreator:
{ {
if( finm ) if( finm )
(finm->*finact)(); (finm->*finact)();
//delete this;
} }
virtual void initial() virtual void initial()
......
...@@ -110,12 +110,11 @@ class UniSetActivator: ...@@ -110,12 +110,11 @@ class UniSetActivator:
static std::shared_ptr<UniSetActivator> inst; static std::shared_ptr<UniSetActivator> inst;
private: private:
friend void terminate_thread(); friend void terminate_thread();
friend void finished_thread(); friend void finished_thread();
friend std::shared_ptr<UniSetTypes::Configuration> UniSetTypes::uniset_init( int argc, const char* const* argv, const std::string& xmlfile );
static void terminated(int signo); static void terminated(int signo);
// static void finishterm(int signo);
static void normalexit(); static void normalexit();
static void normalterminate(); static void normalterminate();
static void set_signals(bool ask); static void set_signals(bool ask);
......
...@@ -26,6 +26,10 @@ ...@@ -26,6 +26,10 @@
#ifndef UniSetObject_H_ #ifndef UniSetObject_H_
#define UniSetObject_H_ #define UniSetObject_H_
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
#include <condition_variable>
#include <thread>
#include <mutex>
#include <atomic>
#include <unistd.h> #include <unistd.h>
#include <sys/time.h> #include <sys/time.h>
#include <queue> #include <queue>
...@@ -135,7 +139,7 @@ class UniSetObject: ...@@ -135,7 +139,7 @@ class UniSetObject:
* Например переход в безопасное состояние. * Например переход в безопасное состояние.
* \warning В обработчике сигналов \b ЗАПРЕЩЕНО вызывать функции подобные exit(..), abort()!!!! * \warning В обработчике сигналов \b ЗАПРЕЩЕНО вызывать функции подобные exit(..), abort()!!!!
*/ */
virtual void sigterm( int signo ){}; virtual void sigterm( int signo );
inline void terminate(){ deactivate(); } inline void terminate(){ deactivate(); }
...@@ -249,7 +253,12 @@ class UniSetObject: ...@@ -249,7 +253,12 @@ class UniSetObject:
// статистическая информация // статистическая информация
unsigned long stMaxQueueMessages; /*<! Максимальное число сообщений хранившихся в очереди */ unsigned long stMaxQueueMessages; /*<! Максимальное число сообщений хранившихся в очереди */
unsigned long stCountOfQueueFull; /*! количество переполнений очереди сообщений */ unsigned long stCountOfQueueFull; /*!< количество переполнений очереди сообщений */
std::atomic_bool a_working;
std::mutex m_working;
std::condition_variable cv_working;
// timeout_t workingTerminateTimeout; /*!< время ожидания завершения потока */
}; };
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
#endif #endif
......
...@@ -1929,7 +1929,16 @@ bool UInterface::waitReady( const ObjectId id, int msec, int pmsec, const Object ...@@ -1929,7 +1929,16 @@ bool UInterface::waitReady( const ObjectId id, int msec, int pmsec, const Object
if( ready ) if( ready )
break; break;
} }
catch(...){} catch(CORBA::OBJECT_NOT_EXIST)
{
}
catch(CORBA::COMM_FAILURE& ex)
{
}
catch(...)
{
break;
}
msleep(pmsec); msleep(pmsec);
} }
......
...@@ -27,6 +27,7 @@ ...@@ -27,6 +27,7 @@
#include <pthread.h> #include <pthread.h>
#include <sys/types.h> #include <sys/types.h>
#include <sstream> #include <sstream>
#include <chrono>
#include "Exceptions.h" #include "Exceptions.h"
#include "ORepHelpers.h" #include "ORepHelpers.h"
...@@ -40,7 +41,7 @@ ...@@ -40,7 +41,7 @@
using namespace std; using namespace std;
using namespace UniSetTypes; using namespace UniSetTypes;
#define CREATE_TIMER make_shared<ThrPassiveTimer>(); #define CREATE_TIMER make_shared<PassiveCondTimer>();
// new PassiveSysTimer(); // new PassiveSysTimer();
// ------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------
...@@ -153,6 +154,9 @@ UniSetObject::~UniSetObject() ...@@ -153,6 +154,9 @@ UniSetObject::~UniSetObject()
// ------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------
void UniSetObject::init_object() void UniSetObject::init_object()
{ {
a_working = ATOMIC_VAR_INIT(0);
active = ATOMIC_VAR_INIT(0);
qmutex.setName(myname + "_qmutex"); qmutex.setName(myname + "_qmutex");
refmutex.setName(myname + "_refmutex"); refmutex.setName(myname + "_refmutex");
// mutex_act.setName(myname + "_mutex_act"); // mutex_act.setName(myname + "_mutex_act");
...@@ -160,11 +164,8 @@ void UniSetObject::init_object() ...@@ -160,11 +164,8 @@ void UniSetObject::init_object()
auto conf = uniset_conf(); auto conf = uniset_conf();
SizeOfMessageQueue = conf->getArgPInt("--uniset-object-size-message-queue",conf->getField("SizeOfMessageQueue"), 1000); SizeOfMessageQueue = conf->getArgPInt("--uniset-object-size-message-queue",conf->getField("SizeOfMessageQueue"), 1000);
MaxCountRemoveOfMessage = conf->getArgInt("--uniset-object-maxcount-remove-message",conf->getField("MaxCountRemoveOfMessage")); MaxCountRemoveOfMessage = conf->getArgPInt("--uniset-object-maxcount-remove-message",conf->getField("MaxCountRemoveOfMessage"),SizeOfMessageQueue / 4);
if( MaxCountRemoveOfMessage <= 0 ) // workingTerminateTimeout = conf->getArgPInt("--uniset-object-working-terminate-timeout",conf->getField("WorkingTerminateTimeout"),2000);
MaxCountRemoveOfMessage = SizeOfMessageQueue / 4;
if( MaxCountRemoveOfMessage <= 0 )
MaxCountRemoveOfMessage = 10;
uinfo << myname << "(init): SizeOfMessageQueue=" << SizeOfMessageQueue uinfo << myname << "(init): SizeOfMessageQueue=" << SizeOfMessageQueue
<< " MaxCountRemoveOfMessage=" << MaxCountRemoveOfMessage << " MaxCountRemoveOfMessage=" << MaxCountRemoveOfMessage
...@@ -610,6 +611,10 @@ unsigned int UniSetObject::countMessages() ...@@ -610,6 +611,10 @@ unsigned int UniSetObject::countMessages()
} }
} }
// ------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------
void UniSetObject::sigterm( int signo )
{
}
// ------------------------------------------------------------------------------------------
bool UniSetObject::deactivate() bool UniSetObject::deactivate()
{ {
if( !isActive() ) if( !isActive() )
...@@ -624,7 +629,17 @@ bool UniSetObject::deactivate() ...@@ -624,7 +629,17 @@ bool UniSetObject::deactivate()
setActive(false); // завершаем поток обработки сообщений setActive(false); // завершаем поток обработки сообщений
if( tmr ) if( tmr )
tmr->stop(); tmr->terminate();
if( thr )
{
std::unique_lock<std::mutex> lk(m_working);
// cv_working.wait_for(lk, std::chrono::milliseconds(workingTerminateTimeout), [&](){ return (a_working == false); } );
if( a_working )
cv_working.wait(lk);
if( a_working )
thr->stop();
}
// Очищаем очередь // Очищаем очередь
{ // lock { // lock
...@@ -745,6 +760,10 @@ bool UniSetObject::activate() ...@@ -745,6 +760,10 @@ bool UniSetObject::activate()
if( myid!=UniSetTypes::DefaultObjectId && threadcreate ) if( myid!=UniSetTypes::DefaultObjectId && threadcreate )
{ {
thr = make_shared< ThreadCreator<UniSetObject> >(this, &UniSetObject::work); thr = make_shared< ThreadCreator<UniSetObject> >(this, &UniSetObject::work);
thr->setCancel(ost::Thread::cancelDeferred);
std::unique_lock<std::mutex> locker(m_working);
a_working = true;
thr->start(); thr->start();
} }
else else
...@@ -767,10 +786,22 @@ void UniSetObject::work() ...@@ -767,10 +786,22 @@ void UniSetObject::work()
if( thr ) if( thr )
msgpid = thr->getTID(); msgpid = thr->getTID();
{
std::unique_lock<std::mutex> locker(m_working);
a_working = true;
}
while( isActive() ) while( isActive() )
callback(); callback();
uinfo << myname << ": thread processing messages stopped..." << endl; uinfo << myname << ": thread processing messages stopped..." << endl;
{
std::unique_lock<std::mutex> locker(m_working);
a_working = false;
}
cv_working.notify_all();
} }
// ------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------
void UniSetObject::callback() void UniSetObject::callback()
......
...@@ -2,4 +2,4 @@ ...@@ -2,4 +2,4 @@
# This file is part of the UniSet library # # This file is part of the UniSet library #
############################################################################ ############################################################################
noinst_LTLIBRARIES = libTimers.la noinst_LTLIBRARIES = libTimers.la
libTimers_la_SOURCES=PassiveTimer.cc PassiveSysTimer.cc ThrPassiveTimer.cc libTimers_la_SOURCES=PassiveTimer.cc PassiveSigTimer.cc PassiveCondTimer.cc
...@@ -25,76 +25,45 @@ ...@@ -25,76 +25,45 @@
#include <unistd.h> #include <unistd.h>
#include <sstream> #include <sstream>
#include <time.h> #include <time.h>
#include <omnithread.h>
#include "PassiveTimer.h" #include "PassiveTimer.h"
// ------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------
using namespace std; using namespace std;
// ------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------
ThrPassiveTimer::ThrPassiveTimer(): PassiveCondTimer::PassiveCondTimer():
terminated(1) terminated(ATOMIC_VAR_INIT(1))
{ {
// были сделаны указателями
// чтобы уйти от include в head-файле
tmutex = new omni_mutex();
tcondx = new omni_condition(tmutex);
} }
// ------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------
ThrPassiveTimer::~ThrPassiveTimer() PassiveCondTimer::~PassiveCondTimer()
{ {
terminate(); terminate();
// while( !terminated ){};
delete tcondx;
delete tmutex;
}
// ------------------------------------------------------------------------------------------
bool ThrPassiveTimer::isTerminated()
{
UniSetTypes::uniset_mutex_lock l(term_mutex,100);
return terminated;
}
// ------------------------------------------------------------------------------------------
void ThrPassiveTimer::setTerminated( bool set )
{
UniSetTypes::uniset_mutex_lock l(term_mutex,200);
terminated = set;
} }
// ------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------
void ThrPassiveTimer::terminate() void PassiveCondTimer::terminate()
{ {
if( !isTerminated() )
{ {
setTerminated(true); std::unique_lock<std::mutex> lk(m_working);
tcondx->signal(); terminated = true;
} }
cv_working.notify_all();
} }
// ------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------
bool ThrPassiveTimer::wait( timeout_t time_msec ) bool PassiveCondTimer::wait( timeout_t time_msec )
{ {
setTerminated(false); std::unique_lock<std::mutex> lk(m_working);
{ terminated = false;
tmutex->lock();
timeout_t t_msec = PassiveTimer::setTiming(time_msec); // вызываем для совместимости с обычным PassiveTimer-ом timeout_t t_msec = PassiveTimer::setTiming(time_msec); // вызываем для совместимости с обычным PassiveTimer-ом
if( time_msec == WaitUpTime ) if( time_msec == WaitUpTime )
{ {
while( !isTerminated() ) // на всякий, вдруг проснется по ошибке... while( !terminated )
tcondx->wait(); cv_working.wait(lk);
} }
else else
{ cv_working.wait_for(lk, std::chrono::milliseconds(t_msec), [&](){ return (terminated == true); } );
unsigned long sec, msec;
omni_thread::get_time(&sec,&msec, t_msec/1000, (t_msec%1000)*1000000 );
// cout <<"timer: спим "<< timeMS/1000 << "[сек] и " << (timeMS%1000)*1000000 <<"[мсек]" << endl;
tcondx->timedwait(sec, msec);
}
tmutex->unlock(); terminated = true;
}
setTerminated(true);
return true; return true;
} }
// ------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------
...@@ -34,30 +34,30 @@ ...@@ -34,30 +34,30 @@
using namespace std; using namespace std;
//using namespace UniSetTypes; //using namespace UniSetTypes;
// ------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------
void PassiveSysTimer::call(int signo, siginfo_t *evp, void *ucontext) void PassiveSigTimer::call(int signo, siginfo_t *evp, void *ucontext)
{ {
cout << "PassiveSysTimer: callme time="<< evp->si_value.sival_int<< " ms"<<endl; cout << "PassiveSigTimer: callme time="<< evp->si_value.sival_int<< " ms"<<endl;
} }
void PassiveSysTimer::callalrm(int signo) void PassiveSigTimer::callalrm(int signo)
{ {
// cout << "PassiveSysTimer: callme signo "<< signo <<endl; // cout << "PassiveSigTimer: callme signo "<< signo <<endl;
} }
// ------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------
PassiveSysTimer::PassiveSysTimer(): PassiveSigTimer::PassiveSigTimer():
terminated(1) terminated(1)
{ {
init(); init();
} }
// ------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------
PassiveSysTimer::~PassiveSysTimer() PassiveSigTimer::~PassiveSigTimer()
{ {
terminate(); terminate();
} }
// ------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------
void PassiveSysTimer::init() void PassiveSigTimer::init()
{ {
/* /*
struct itimerval val; struct itimerval val;
...@@ -69,13 +69,13 @@ void PassiveSysTimer::init() ...@@ -69,13 +69,13 @@ void PassiveSysTimer::init()
if( sigaction(SIGALRM, &action, 0) == -1) if( sigaction(SIGALRM, &action, 0) == -1)
{ {
cerr << "PassiveSysTimer: error sigaction" << endl; cerr << "PassiveSigTimer: error sigaction" << endl;
throw NotSetSignal("PassiveTimer: errir sigaction"); throw NotSetSignal("PassiveTimer: errir sigaction");
} }
*/ */
} }
// ------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------
void PassiveSysTimer::terminate() void PassiveSigTimer::terminate()
{ {
if (!terminated) if (!terminated)
{ {
...@@ -86,7 +86,7 @@ void PassiveSysTimer::terminate() ...@@ -86,7 +86,7 @@ void PassiveSysTimer::terminate()
} }
} }
// ------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------
bool PassiveSysTimer::wait(timeout_t timeMS) bool PassiveSigTimer::wait(timeout_t timeMS)
{ {
pid = getpid(); pid = getpid();
...@@ -99,7 +99,7 @@ bool PassiveSysTimer::wait(timeout_t timeMS) ...@@ -99,7 +99,7 @@ bool PassiveSysTimer::wait(timeout_t timeMS)
if( sigaction(SIGALRM, &action, 0) == -1) if( sigaction(SIGALRM, &action, 0) == -1)
{ {
cerr << "PassiveSysTimer: error sigaction" << endl; cerr << "PassiveSigTimer: error sigaction" << endl;
return false; return false;
} }
...@@ -147,7 +147,7 @@ bool PassiveSysTimer::wait(timeout_t timeMS) ...@@ -147,7 +147,7 @@ bool PassiveSysTimer::wait(timeout_t timeMS)
terminated = 1; terminated = 1;
sigprocmask( SIG_UNBLOCK, &mask, NULL ); sigprocmask( SIG_UNBLOCK, &mask, NULL );
// cout << "PassiveSysTimer: time ok"<< endl; // cout << "PassiveSigTimer: time ok"<< endl;
return true; return true;
} }
......
...@@ -37,6 +37,7 @@ ...@@ -37,6 +37,7 @@
#include "ObjectIndex_Array.h" #include "ObjectIndex_Array.h"
#include "ObjectIndex_XML.h" #include "ObjectIndex_XML.h"
#include "ObjectIndex_idXML.h" #include "ObjectIndex_idXML.h"
#include "UniSetActivator.h"
// ------------------------------------------------------------------------- // -------------------------------------------------------------------------
using namespace std; using namespace std;
// ------------------------------------------------------------------------- // -------------------------------------------------------------------------
...@@ -1027,6 +1028,9 @@ std::shared_ptr<Configuration> uniset_init( int argc, const char* const* argv, c ...@@ -1027,6 +1028,9 @@ std::shared_ptr<Configuration> uniset_init( int argc, const char* const* argv, c
return UniSetTypes::uconf; return UniSetTypes::uconf;
} }
atexit( UniSetActivator::normalexit );
set_terminate( UniSetActivator::normalterminate ); // ловушка для неизвестных исключений
string confile = UniSetTypes::getArgParam( "--confile", argc, argv, xmlfile ); string confile = UniSetTypes::getArgParam( "--confile", argc, argv, xmlfile );
ulog.setLogName("ulog"); ulog.setLogName("ulog");
UniSetTypes::uconf = make_shared<Configuration>(argc, argv, confile); UniSetTypes::uconf = make_shared<Configuration>(argc, argv, confile);
......
...@@ -11,6 +11,7 @@ tests_LDADD = $(top_builddir)/lib/libUniSet2.la $(SIGC_LIBS) $(COMCPP_LIBS) $(C ...@@ -11,6 +11,7 @@ tests_LDADD = $(top_builddir)/lib/libUniSet2.la $(SIGC_LIBS) $(COMCPP_LIBS) $(C
tests_CPPFLAGS = -I$(top_builddir)/include $(SIGC_CFLAGS) $(COMCPP_CFLAGS) $(COV_CFLAGS) tests_CPPFLAGS = -I$(top_builddir)/include $(SIGC_CFLAGS) $(COMCPP_CFLAGS) $(COV_CFLAGS)
tests_SOURCES = tests.cc \ tests_SOURCES = tests.cc \
test_passivetimer.cc \ test_passivetimer.cc \
test_passivecondtimer.cc \
test_hourglass.cc \ test_hourglass.cc \
test_delaytimer.cc \ test_delaytimer.cc \
test_unixml.cc \ test_unixml.cc \
......
...@@ -81,7 +81,7 @@ TEST_CASE("HourGlass", "[HourGlass]" ) ...@@ -81,7 +81,7 @@ TEST_CASE("HourGlass", "[HourGlass]" )
REQUIRE( hg.amount() >= 60 ); REQUIRE( hg.amount() >= 60 );
hg.rotate(false); // опять назад.. hg.rotate(false); // опять назад..
msleep(80); // по сути сигнал сбросился..(т.к. оставалось 70.. а прошло 80) msleep(90); // по сути сигнал сбросился..(т.к. оставалось 70.. а прошло 90)
CHECK_FALSE( hg.check() ); CHECK_FALSE( hg.check() );
REQUIRE( hg.amount() == 0 ); REQUIRE( hg.amount() == 0 );
REQUIRE( hg.remain() == 100 ); REQUIRE( hg.remain() == 100 );
......
#include <catch.hpp>
#include "PassiveTimer.h"
#include "UniSetTypes.h"
using namespace std;
// --------------------------------------------------------------------------
static std::atomic_int g_num = ATOMIC_VAR_INIT(0);
static std::mutex g_mutex;
static std::shared_ptr<PassiveCondTimer> tmr;
// --------------------------------------------------------------------------
void thread_function( int msec )
{
try
{
msleep(msec);
/*
std::chrono::milliseconds dura( msec );
mstd::sleep_for( dura );
*/
if( tmr )
tmr->terminate();
}
catch( std::exception& ex )
{
FAIL( ex.what() );
}
}
TEST_CASE("PassiveCondTimer: wait", "[PassiveTimer][PassiveCondTimer]" )
{
tmr = make_shared<PassiveCondTimer>();
PassiveTimer ptTime;
tmr->wait(300);
REQUIRE( ptTime.getCurrent() >= 300 );
REQUIRE( ptTime.getCurrent() <= 340 );
tmr.reset();
}
// --------------------------------------------------------------------------
TEST_CASE("PassiveCondTimer: waitup", "[PassiveTimer][PassiveCondTimer]" )
{
tmr = make_shared<PassiveCondTimer>();
std::thread thr(thread_function,500);
PassiveTimer ptTime;
tmr->wait(UniSetTimer::WaitUpTime);
REQUIRE( ptTime.getCurrent() >= 500 );
REQUIRE( ptTime.getCurrent() <= 540 );
thr.join();
tmr.reset();
}
// --------------------------------------------------------------------------
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