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

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

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