Commit 115f617f authored by Pavel Vainerman's avatar Pavel Vainerman

(MBExchange): сделал завершение работы не через abort(), а через SIGTERM,

а так де мелкие правки оформления кода.
parent 54b685e2
...@@ -618,8 +618,7 @@ end_private(false) ...@@ -618,8 +618,7 @@ end_private(false)
throw SystemError( err.str() ); throw SystemError( err.str() );
} }
mylog.setLogName(myname);
<xsl:for-each select="//smap/item"> <xsl:for-each select="//smap/item">
<xsl:if test="normalize-space(@no_check_id)!='1'"> <xsl:if test="normalize-space(@no_check_id)!='1'">
...@@ -943,6 +942,8 @@ askPause(uniset_conf()->getPIntProp(cnode,"askPause",2000)) ...@@ -943,6 +942,8 @@ askPause(uniset_conf()->getPIntProp(cnode,"askPause",2000))
throw SystemError( err.str() ); throw SystemError( err.str() );
} }
mylog.setLogName(myname);
si.node = conf->getLocalNode(); si.node = conf->getLocalNode();
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
USERID=0 USERID=0
BASEOMNIPORT=2809 BASEOMNIPORT=2809
UNISET_SCRIPT_VERBOSE= [ -z "$UNISET_SCRIPT_VERBOSE" ] && UNISET_SCRIPT_VERBOSE=
# Получаем наш внутренний номер пользователя # Получаем наш внутренний номер пользователя
function get_userid() function get_userid()
......
...@@ -41,9 +41,9 @@ class MBExchange: ...@@ -41,9 +41,9 @@ class MBExchange:
enum ExchangeMode enum ExchangeMode
{ {
emNone=0, /*!< нормальная работа (по умолчанию) */ emNone=0, /*!< нормальная работа (по умолчанию) */
emWriteOnly=1, /*!< "только посылка данных" (работают только write-функции) */ emWriteOnly=1, /*!< "только посылка данных" (работают только write-функции) */
emReadOnly=2, /*!< "только чтение" (работают только read-функции) */ emReadOnly=2, /*!< "только чтение" (работают только read-функции) */
emSkipSaveToSM=3, /*!< не писать данные в SM (при этом работают и read и write функции */ emSkipSaveToSM=3, /*!< не писать данные в SM (при этом работают и read и write функции) */
emSkipExchange=4 /*!< отключить обмен */ emSkipExchange=4 /*!< отключить обмен */
}; };
...@@ -51,9 +51,9 @@ class MBExchange: ...@@ -51,9 +51,9 @@ class MBExchange:
enum DeviceType enum DeviceType
{ {
dtUnknown, /*!< неизвестный */ dtUnknown, /*!< неизвестный */
dtRTU, /*!< RTU (default) */ dtRTU, /*!< RTU (default) */
dtMTR, /*!< MTR (DEIF) */ dtMTR, /*!< MTR (DEIF) */
dtRTU188 /*!< RTU188 (Fastwell) */ dtRTU188 /*!< RTU188 (Fastwell) */
}; };
...@@ -67,9 +67,9 @@ class MBExchange: ...@@ -67,9 +67,9 @@ class MBExchange:
public IOBase public IOBase
{ {
// only for RTU // only for RTU
short nbit; /*!< bit number) */ short nbit; /*!< bit number) */
VTypes::VType vType; /*!< type of value */ VTypes::VType vType; /*!< type of value */
short rnum; /*!< count of registers */ short rnum; /*!< count of registers */
short nbyte; /*!< byte number (1-2) */ short nbyte; /*!< byte number (1-2) */
RSProperty(): RSProperty():
......
...@@ -392,7 +392,7 @@ void MBSlave::waitSMReady() ...@@ -392,7 +392,7 @@ void MBSlave::waitSMReady()
// throw SystemError(err.str()); // throw SystemError(err.str());
raise(SIGTERM); raise(SIGTERM);
terminate(); terminate();
// abort(); // abort();
} }
} }
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
......
...@@ -21,24 +21,24 @@ ...@@ -21,24 +21,24 @@
#include "DebugStream.h" #include "DebugStream.h"
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
class UObject_SK: class UObject_SK:
public UniSetObject, public UniSetObject,
public LT_Object public LT_Object
{ {
public: public:
UObject_SK( UniSetTypes::ObjectId id, xmlNode* node=UniSetTypes::uniset_conf()->getNode("UObject"), const std::string& argprefix="" ); UObject_SK( UniSetTypes::ObjectId id, xmlNode* node=UniSetTypes::uniset_conf()->getNode("UObject"), const std::string& argprefix="" );
UObject_SK(); UObject_SK();
virtual ~UObject_SK(); virtual ~UObject_SK();
bool alarm( UniSetTypes::ObjectId sid, bool state ); bool alarm( UniSetTypes::ObjectId sid, bool state );
long getValue( UniSetTypes::ObjectId sid ); long getValue( UniSetTypes::ObjectId sid );
void setValue( UniSetTypes::ObjectId sid, long value ); void setValue( UniSetTypes::ObjectId sid, long value );
void askSensor( UniSetTypes::ObjectId sid, UniversalIO::UIOCommand, UniSetTypes::ObjectId node = UniSetTypes::uniset_conf()->getLocalNode() ); void askSensor( UniSetTypes::ObjectId sid, UniversalIO::UIOCommand, UniSetTypes::ObjectId node = UniSetTypes::uniset_conf()->getLocalNode() );
void updateValues(); void updateValues();
void setMsg( UniSetTypes::ObjectId code, bool state ); void setMsg( UniSetTypes::ObjectId code, bool state );
DebugStream mylog; DebugStream mylog;
void init_dlog( DebugStream& d ); void init_dlog( DebugStream& d );
// "синтаксический сахар"..для логов // "синтаксический сахар"..для логов
#define myinfo if( mylog.debugging(Debug::INFO) ) mylog #define myinfo if( mylog.debugging(Debug::INFO) ) mylog
...@@ -55,91 +55,91 @@ class UObject_SK: ...@@ -55,91 +55,91 @@ class UObject_SK:
#define mylog9 if( mylog.debugging(Debug::LEVEL9) ) mylog #define mylog9 if( mylog.debugging(Debug::LEVEL9) ) mylog
// Используемые идентификаторы // Используемые идентификаторы
// Используемые идентификаторы сообщений // Используемые идентификаторы сообщений
// Текущее значение // Текущее значение
// --- public variables --- // --- public variables ---
// --- end of public variables --- // --- end of public variables ---
protected: protected:
// --- protected variables --- // --- protected variables ---
// ---- end of protected variables ---- // ---- end of protected variables ----
virtual void callback() override; virtual void callback() override;
virtual void processingMessage( UniSetTypes::VoidMessage* msg ) override; virtual void processingMessage( UniSetTypes::VoidMessage* msg ) override;
virtual void sysCommand( const UniSetTypes::SystemMessage* sm ) override; virtual void sysCommand( const UniSetTypes::SystemMessage* sm ) override;
virtual void askSensors( UniversalIO::UIOCommand cmd ){} virtual void askSensors( UniversalIO::UIOCommand cmd ){}
virtual void sensorInfo( const UniSetTypes::SensorMessage* sm ) override{} virtual void sensorInfo( const UniSetTypes::SensorMessage* sm ) override{}
virtual void timerInfo( const UniSetTypes::TimerMessage* tm ) override{} virtual void timerInfo( const UniSetTypes::TimerMessage* tm ) override{}
virtual void sigterm( int signo ) override; virtual void sigterm( int signo ) override;
virtual bool activateObject() override; virtual bool activateObject() override;
virtual void testMode( bool state ); virtual void testMode( bool state );
void updatePreviousValues(); void updatePreviousValues();
void checkSensors(); void checkSensors();
void updateOutputs( bool force ); void updateOutputs( bool force );
void preAskSensors( UniversalIO::UIOCommand cmd ); void preAskSensors( UniversalIO::UIOCommand cmd );
void preSensorInfo( const UniSetTypes::SensorMessage* sm ); void preSensorInfo( const UniSetTypes::SensorMessage* sm );
void preTimerInfo( const UniSetTypes::TimerMessage* tm ); void preTimerInfo( const UniSetTypes::TimerMessage* tm );
void waitSM( int wait_msec, UniSetTypes::ObjectId testID = UniSetTypes::DefaultObjectId ); void waitSM( int wait_msec, UniSetTypes::ObjectId testID = UniSetTypes::DefaultObjectId );
void resetMsg(); void resetMsg();
Trigger trResetMsg; Trigger trResetMsg;
PassiveTimer ptResetMsg; PassiveTimer ptResetMsg;
int resetMsgTime; int resetMsgTime;
// Выполнение очередного шага программы // Выполнение очередного шага программы
virtual void step(){} virtual void step(){}
int sleep_msec; /*!< пауза между итерациями */ int sleep_msec; /*!< пауза между итерациями */
bool active; bool active;
UniSetTypes::ObjectId smTestID; /*!< идентификатор датчика для тестирования готовности SM */ UniSetTypes::ObjectId smTestID; /*!< идентификатор датчика для тестирования готовности SM */
// управление датчиком "сердцебиения" // управление датчиком "сердцебиения"
PassiveTimer ptHeartBeat; /*! < период "сердцебиения" */ PassiveTimer ptHeartBeat; /*! < период "сердцебиения" */
UniSetTypes::ObjectId idHeartBeat; /*! < идентификатор датчика (AI) "сердцебиения" */ UniSetTypes::ObjectId idHeartBeat; /*! < идентификатор датчика (AI) "сердцебиения" */
int maxHeartBeat; /*! < сохраняемое значение */ int maxHeartBeat; /*! < сохраняемое значение */
xmlNode* confnode; xmlNode* confnode;
/*! получить числовое свойство из конф. файла по привязанной confnode */ /*! получить числовое свойство из конф. файла по привязанной confnode */
int getIntProp(const std::string& name) { return UniSetTypes::uniset_conf()->getIntProp(confnode, name); } int getIntProp(const std::string& name) { return UniSetTypes::uniset_conf()->getIntProp(confnode, name); }
/*! получить текстовое свойство из конф. файла по привязанной confnode */ /*! получить текстовое свойство из конф. файла по привязанной confnode */
inline const std::string getProp(const std::string& name) { return UniSetTypes::uniset_conf()->getProp(confnode, name); } inline const std::string getProp(const std::string& name) { return UniSetTypes::uniset_conf()->getProp(confnode, name); }
int smReadyTimeout; /*!< время ожидания готовности SM */ int smReadyTimeout; /*!< время ожидания готовности SM */
std::atomic_bool activated; std::atomic_bool activated;
int activateTimeout; /*!< время ожидания готовности UniSetObject к работе */ int activateTimeout; /*!< время ожидания готовности UniSetObject к работе */
PassiveTimer ptStartUpTimeout; /*!< время на блокировку обработки WatchDog, если недавно был StartUp */ PassiveTimer ptStartUpTimeout; /*!< время на блокировку обработки WatchDog, если недавно был StartUp */
int askPause; /*!< пауза между неудачными попытками заказать датчики */ int askPause; /*!< пауза между неудачными попытками заказать датчики */
IOController_i::SensorInfo si; IOController_i::SensorInfo si;
bool forceOut; /*!< флаг принудительного обноления "выходов" */ bool forceOut; /*!< флаг принудительного обноления "выходов" */
private: private:
// --- private variables --- // --- private variables ---
// --- end of private variables --- // --- end of private variables ---
// предыдущее значение (для работы UpdateValue()) // предыдущее значение (для работы UpdateValue())
// Используемые идентификаторы сообщений // Используемые идентификаторы сообщений
bool end_private; // вспомогательное поле (для внутреннего использования при генерировании кода) bool end_private; // вспомогательное поле (для внутреннего использования при генерировании кода)
}; };
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
......
...@@ -33,8 +33,6 @@ ...@@ -33,8 +33,6 @@
#include "UniSetObject.h" #include "UniSetObject.h"
#include "UniSetManager.h" #include "UniSetManager.h"
#include "OmniThreadCreator.h" #include "OmniThreadCreator.h"
//#include "OmniThreadCreator.h"
//---------------------------------------------------------------------------------------- //----------------------------------------------------------------------------------------
class UniSetActivator; class UniSetActivator;
typedef std::shared_ptr<UniSetActivator> UniSetActivatorPtr; typedef std::shared_ptr<UniSetActivator> UniSetActivatorPtr;
...@@ -46,7 +44,7 @@ typedef std::shared_ptr<UniSetActivator> UniSetActivatorPtr; ...@@ -46,7 +44,7 @@ typedef std::shared_ptr<UniSetActivator> UniSetActivatorPtr;
* \warning Авктиватор может быть создан только один. Для его создания используйте код: * \warning Авктиватор может быть создан только один. Для его создания используйте код:
\code \code
... ...
UniSetActivator* act = UniSetActivator::Instance() auto act = UniSetActivator::Instance()
... ...
\endcode \endcode
* Активатор в свою очередь сам является менеджером(и объектом) и обладает всеми его свойствами * Активатор в свою очередь сам является менеджером(и объектом) и обладает всеми его свойствами
...@@ -75,24 +73,6 @@ class UniSetActivator: ...@@ -75,24 +73,6 @@ class UniSetActivator:
protected: protected:
/*! Команды доступные при заказе сигналов
* см. askSignal()
*/
enum AskSigCommand {
Ask, /*!< заказать получение сигнала */
Denial /*!< отказаться от получения сигнала */
};
/*! заказ на обработку сигнала signo
* Для обработки предназначена функция signal().
* \warning Сообщение о приходе сигналов SITERM, SIGINT, SIGABRT приходит
* вне зависимости от заказа. От этих сообщений нельзя отказаться...
* \warning Заказ других сигналов пока не работает..
* \warning функция временно недоступна (private). Ведуться работы...
* \todo сделать возможность заказа других сигналов
*/
// void askSignal(int signo, AskSigCommand cmd=Ask);
virtual void work(); virtual void work();
inline CORBA::ORB_ptr getORB() inline CORBA::ORB_ptr getORB()
...@@ -102,11 +82,9 @@ class UniSetActivator: ...@@ -102,11 +82,9 @@ class UniSetActivator:
virtual void sysCommand( const UniSetTypes::SystemMessage *sm ) override; virtual void sysCommand( const UniSetTypes::SystemMessage *sm ) override;
// уносим в protected, т.к. Activator должен быть только один.. // уносим в protected, т.к. Activator должен быть только один..
UniSetActivator(); UniSetActivator();
UniSetActivator( const UniSetTypes::ObjectId id ); UniSetActivator( const UniSetTypes::ObjectId id );
static std::shared_ptr<UniSetActivator> inst; static std::shared_ptr<UniSetActivator> inst;
private: private:
...@@ -125,23 +103,10 @@ class UniSetActivator: ...@@ -125,23 +103,10 @@ class UniSetActivator:
CORBA::ORB_var orb; CORBA::ORB_var orb;
TerminateEvent_Signal s_term; TerminateEvent_Signal s_term;
ost::AtomicCounter orbthrIsFinished;
bool omDestroy; std::atomic_bool omDestroy;
bool sig;
pid_t thpid; // pid orb потока pid_t thpid; // pid orb потока
}; };
//----------------------------------------------------------------------------------------
/*
template<class TClass>
int UniSetActivator::attach(TClass* p, void(TClass:: *f)(void*) )
{
if( next >= MAX_CHILD_THREAD )
return -1;
callpull[next] = new OmniThreadCreator<TClass>( p, f);
next++;
return 0;
}
*/
#endif #endif
//----------------------------------------------------------------------------------------
...@@ -268,16 +268,14 @@ void UniSetActivator::Destroy() ...@@ -268,16 +268,14 @@ void UniSetActivator::Destroy()
// --------------------------------------------------------------------------- // ---------------------------------------------------------------------------
UniSetActivator::UniSetActivator( const ObjectId id ): UniSetActivator::UniSetActivator( const ObjectId id ):
UniSetManager(id), UniSetManager(id),
omDestroy(false), omDestroy(false)
sig(false)
{ {
UniSetActivator::init(); UniSetActivator::init();
} }
// ------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------
UniSetActivator::UniSetActivator(): UniSetActivator::UniSetActivator():
UniSetManager(UniSetTypes::DefaultObjectId), UniSetManager(UniSetTypes::DefaultObjectId),
omDestroy(false), omDestroy(false)
sig(false)
{ {
// thread(false); // отключаем поток (раз не задан id) // thread(false); // отключаем поток (раз не задан id)
UniSetActivator::init(); UniSetActivator::init();
...@@ -301,7 +299,7 @@ void UniSetActivator::init() ...@@ -301,7 +299,7 @@ void UniSetActivator::init()
ucrit << myname << "(init): init poa failed!!!" << endl; ucrit << myname << "(init): init poa failed!!!" << endl;
// Чтобы подключиться к функциям завершения как можно раньше (раньше создания объектов) // Чтобы подключиться к функциям завершения как можно раньше (раньше создания объектов)
// этот код перенесён в Configuration::uniset_init (в надежде, что uniset_init всегда вызывается одной из первых). // этот код перенесён в Configuration::uniset_init (в надежде, что uniset_init всегда вызывается одной из первых).
// atexit( UniSetActivator::normalexit ); // atexit( UniSetActivator::normalexit );
// set_terminate( UniSetActivator::normalterminate ); // ловушка для неизвестных исключений // set_terminate( UniSetActivator::normalterminate ); // ловушка для неизвестных исключений
} }
...@@ -403,8 +401,7 @@ void UniSetActivator::run( bool thread ) ...@@ -403,8 +401,7 @@ void UniSetActivator::run( bool thread )
offThread(); // отключение потока обработки сообщений, раз не задан ObjectId offThread(); // отключение потока обработки сообщений, раз не задан ObjectId
UniSetManager::activate(); // а там вызывается активация всех подчиненных объектов и менеджеров UniSetManager::activate(); // а там вызывается активация всех подчиненных объектов и менеджеров
active = true;
active=true;
ulogsys << myname << "(run): активизируем менеджер"<<endl; ulogsys << myname << "(run): активизируем менеджер"<<endl;
pman->activate(); pman->activate();
...@@ -431,38 +428,37 @@ void UniSetActivator::run( bool thread ) ...@@ -431,38 +428,37 @@ void UniSetActivator::run( bool thread )
*/ */
void UniSetActivator::stop() void UniSetActivator::stop()
{ {
// uniset_mutex_lock l(deactivateMutex, 500); if( !active )
if( active ) return;
{
active=false;
ulogsys << myname << "(stop): deactivate... "<< endl; active = false;
deactivate(); ulogsys << myname << "(stop): deactivate... "<< endl;
try deactivate();
{
deactivateObject(); try
} {
catch(omniORB::fatalException& fe) deactivateObject();
{ }
ucrit << myname << "(stop): : поймали omniORB::fatalException:" << endl; catch(omniORB::fatalException& fe)
ucrit << myname << "(stop): file: " << fe.file() << endl; {
ucrit << myname << "(stop): line: " << fe.line() << endl; ucrit << myname << "(stop): : поймали omniORB::fatalException:" << endl;
ucrit << myname << "(stop): mesg: " << fe.errmsg() << endl; ucrit << myname << "(stop): file: " << fe.file() << endl;
} ucrit << myname << "(stop): line: " << fe.line() << endl;
catch( std::exception& ex ) ucrit << myname << "(stop): mesg: " << fe.errmsg() << endl;
{ }
ucrit << myname << "(stop): " << ex.what() << endl; catch( std::exception& ex )
} {
ucrit << myname << "(stop): " << ex.what() << endl;
}
ulogsys << myname << "(stop): deactivate ok. "<<endl; ulogsys << myname << "(stop): deactivate ok. "<<endl;
ulogsys << myname << "(stop): discard request..."<< endl; ulogsys << myname << "(stop): discard request..."<< endl;
pman->discard_requests(true); pman->discard_requests(true);
ulogsys << myname << "(stop): discard request ok."<< endl; ulogsys << myname << "(stop): discard request ok."<< endl;
}
} }
// ------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------
...@@ -517,17 +513,17 @@ void UniSetActivator::sysCommand( const UniSetTypes::SystemMessage *sm ) ...@@ -517,17 +513,17 @@ void UniSetActivator::sysCommand( const UniSetTypes::SystemMessage *sm )
{ {
switch(sm->command) switch(sm->command)
{ {
case SystemMessage::LogRotate: case SystemMessage::LogRotate:
{
ulogsys << myname << "(sysCommand): logRotate" << endl;
// переоткрываем логи
string fname = ulog.getLogFile();
if( !fname.empty() )
{ {
ulog.logFile(fname.c_str(),true); ulogsys << myname << "(sysCommand): logRotate" << endl;
ulog << myname << "(sysCommand): ***************** ulog LOG ROTATE *****************" << endl; // переоткрываем логи
string fname = ulog.getLogFile();
if( !fname.empty() )
{
ulog.logFile(fname.c_str(),true);
ulog << myname << "(sysCommand): ***************** ulog LOG ROTATE *****************" << endl;
}
} }
}
break; break;
} }
} }
...@@ -602,69 +598,69 @@ void UniSetActivator::terminated( int signo ) ...@@ -602,69 +598,69 @@ void UniSetActivator::terminated( int signo )
// ------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------
void UniSetActivator::normalexit() void UniSetActivator::normalexit()
{ {
if( g_act ) if( !g_act )
return;
ulogsys << g_act->getName() << "(default exit): ..begin..."<< endl << flush;
if( g_term == false )
{ {
ulogsys << g_act->getName() << "(default exit): ..begin..."<< endl << flush; // прежде чем вызывать notify_one(), мы должны освободить mutex!
if( g_term == false )
{ {
// прежде чем вызывать notify_one(), мы должны освободить mutex! std::unique_lock<std::mutex> locker(g_termmutex);
{ g_term = true;
std::unique_lock<std::mutex> locker(g_termmutex); g_signo = 0;
g_term = true;
g_signo = 0;
}
ulogsys << "(default exit): notify terminate.." << endl << flush;
g_termevent.notify_one();
} }
ulogsys << "(default exit): notify terminate.." << endl << flush;
g_termevent.notify_one();
}
ulogsys << "(default exit): wait done.." << endl << flush; ulogsys << "(default exit): wait done.." << endl << flush;
#if 1 #if 1
if( g_term_thread && g_term_thread->joinable() ) if( g_term_thread && g_term_thread->joinable() )
g_term_thread->join(); g_term_thread->join();
#else #else
if( g_doneevent ) if( g_doneevent )
{ {
std::unique_lock<std::mutex> locker(g_donemutex); std::unique_lock<std::mutex> locker(g_donemutex);
while( !g_done ) while( !g_done )
g_doneevent.wait(locker); g_doneevent.wait(locker);
} }
#endif #endif
ulogsys << "(default exit): wait done OK (good bye)" << endl << flush; ulogsys << "(default exit): wait done OK (good bye)" << endl << flush;
}
} }
// ------------------------------------------------------------------------------------------
void UniSetActivator::normalterminate() void UniSetActivator::normalterminate()
{ {
if( g_act ) if( !g_act )
return;
ulogsys << g_act->getName() << "(default terminate): ..begin..."<< endl << flush;
if( g_term == false )
{ {
ulogsys << g_act->getName() << "(default terminate): ..begin..."<< endl << flush; // прежде чем вызывать notify_one(), мы должны освободить mutex!
if( g_term == false )
{ {
// прежде чем вызывать notify_one(), мы должны освободить mutex! std::unique_lock<std::mutex> locker(g_termmutex);
{ g_term = true;
std::unique_lock<std::mutex> locker(g_termmutex); g_signo = 0;
g_term = true;
g_signo = 0;
}
ulogsys << "(default terminate): notify terminate.." << endl << flush;
g_termevent.notify_one();
} }
ulogsys << "(default terminate): notify terminate.." << endl << flush;
g_termevent.notify_one();
}
ulogsys << "(default terminate): wait done.." << endl << flush; ulogsys << "(default terminate): wait done.." << endl << flush;
#if 1 #if 1
if( g_term_thread && g_term_thread->joinable() ) if( g_term_thread && g_term_thread->joinable() )
g_term_thread->join(); g_term_thread->join();
#else #else
if( g_doneevent ) if( g_doneevent )
{ {
std::unique_lock<std::mutex> locker(g_donemutex); std::unique_lock<std::mutex> locker(g_donemutex);
while( !g_done ) while( !g_done )
g_doneevent.wait(locker); g_doneevent.wait(locker);
}
#endif
ulogsys << "(default terminate): wait done OK (good bye)" << endl << flush;
} }
#endif
ulogsys << "(default terminate): wait done OK (good bye)" << endl << flush;
} }
// ------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------
void UniSetActivator::term( int signo ) void UniSetActivator::term( int signo )
...@@ -677,9 +673,6 @@ void UniSetActivator::term( int signo ) ...@@ -677,9 +673,6 @@ void UniSetActivator::term( int signo )
return; return;
} }
if( signo )
sig = true;
try try
{ {
ulogsys << myname << "(term): вызываем sigterm()" << endl; ulogsys << myname << "(term): вызываем sigterm()" << endl;
......
// ADD PREDEFINED MACROS HERE!
This diff is collapsed. Click to expand it.
.
extensions/DBServer-MySQL
extensions/DBServer-SQLite
extensions/include
extensions/IOControl
extensions/LogicProcessor
extensions/ModbusMaster
extensions/ModbusMaster/tests
extensions/ModbusSlave
extensions/RRDServer
extensions/SharedMemory
extensions/SMDBServer
extensions/SMViewer
extensions/tests
extensions/tests/SMemoryTest
extensions/UNetUDP
extensions/UniNetwork
include
include/modbus
python/lib/pyUniSet
src/Log
Utilities/codegen
Utilities/codegen/tests
Utilities/MBTester
Utilities/NullController
\ No newline at end of file
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