Commit 77c0bc37 authored by Pavel Vainerman's avatar Pavel Vainerman

(Mutex): убрал паузу при блокировке mutex-а..

parent 55985b08
......@@ -73,11 +73,6 @@ SharedMemory::SharedMemory( ObjectId id, string datafile, std::string confname )
string t_field = conf->getArgParam("--t-filter-field");
string t_fvalue = conf->getArgParam("--t-filter-value");
int lock_msec = conf->getArgPInt("--lock-rvalue-pause-msec",5);
if( lock_msec < 0 )
lock_msec = 0;
setCheckLockValuePause(lock_msec);
heartbeat_node = conf->getArgParam("--heartbeat-node");
if( heartbeat_node.empty() )
dlog[Debug::WARN] << myname << "(init): --heartbeat-node NULL ===> heartbeat NOT USED..." << endl;
......
......@@ -368,9 +368,6 @@ class IOController:
void updateDepends( IOController::DependsList& lst, bool undefined, bool& lock );
void updateBlockDepends( IOController::DependsList& lst, bool blk_state, bool& lock );
void setCheckLockValuePause( int msec );
inline int getCheckLockValuePause(){ return checkLockValuePause; }
private:
friend class AskDumper;
......@@ -387,7 +384,6 @@ class IOController:
DependsSlot dslot; /*!< undefined depends slot */
DependsSlot bslot; /*!< block depends slot */
int checkLockValuePause;
UniSetTypes::uniset_rwmutex loggingMutex; /*!< logging info mutex */
};
......
......@@ -100,11 +100,14 @@ namespace UniSetTypes
uniset_rwmutex();
~uniset_rwmutex();
void lock( int check_pause_msec=1 );
void lock();
void unlock();
void wrlock( int check_pause_msec=1 );
void rlock( int check_pause_msec=1 );
void wrlock();
void rlock();
bool tryrlock();
bool trywrlock();
uniset_rwmutex (const uniset_rwmutex& r);
const uniset_rwmutex &operator=(const uniset_rwmutex& r);
......@@ -123,7 +126,7 @@ namespace UniSetTypes
class uniset_rwmutex_wrlock
{
public:
uniset_rwmutex_wrlock( uniset_rwmutex& m, int check_pause_msec=1 );
uniset_rwmutex_wrlock( uniset_rwmutex& m );
~uniset_rwmutex_wrlock();
private:
......@@ -135,7 +138,7 @@ namespace UniSetTypes
class uniset_rwmutex_rlock
{
public:
uniset_rwmutex_rlock( uniset_rwmutex& m, int check_pause_msec=5 );
uniset_rwmutex_rlock( uniset_rwmutex& m );
~uniset_rwmutex_rlock();
private:
......
......@@ -44,8 +44,7 @@ IOController::IOController(const string name, const string section):
ObjectsManager(name, section),
dioMutex(name+"_dioMutex"),
aioMutex(name+"_aioMutex"),
isPingDBServer(true),
checkLockValuePause(5)
isPingDBServer(true)
{
}
......@@ -53,8 +52,7 @@ IOController::IOController(ObjectId id):
ObjectsManager(id),
dioMutex(string(conf->oind->getMapName(id))+"_dioMutex"),
aioMutex(string(conf->oind->getMapName(id))+"_aioMutex"),
isPingDBServer(true),
checkLockValuePause(5)
isPingDBServer(true)
{
}
......@@ -151,7 +149,7 @@ bool IOController::localGetState( IOController::DIOStateList::iterator& li,
if( li->second.undefined )
throw IOController_i::Undefined();
uniset_rwmutex_rlock lock(li->second.val_lock,checkLockValuePause);
uniset_rwmutex_rlock lock(li->second.val_lock);
return li->second.state;
}
......@@ -176,7 +174,7 @@ long IOController::localGetValue( IOController::AIOStateList::iterator& li,
if( li->second.undefined )
throw IOController_i::Undefined();
uniset_rwmutex_rlock lock(li->second.val_lock,checkLockValuePause);
uniset_rwmutex_rlock lock(li->second.val_lock);
return li->second.value;
}
......@@ -812,7 +810,7 @@ void IOController::dumpToDB()
// uniset_mutex_lock lock(dioMutex, 100);
for( DIOStateList::iterator li = dioList.begin(); li!=dioList.end(); ++li )
{
uniset_rwmutex_rlock lock(li->second.val_lock,checkLockValuePause);
uniset_rwmutex_rlock lock(li->second.val_lock);
SensorMessage sm;
sm.id = li->second.si.id;
sm.node = li->second.si.node;
......@@ -833,7 +831,7 @@ void IOController::dumpToDB()
// uniset_mutex_lock lock(aioMutex, 100);
for( AIOStateList::iterator li = aioList.begin(); li!=aioList.end(); ++li )
{
uniset_rwmutex_rlock lock(li->second.val_lock,checkLockValuePause);
uniset_rwmutex_rlock lock(li->second.val_lock);
SensorMessage sm;
sm.id = li->second.si.id;
sm.node = li->second.si.node;
......@@ -863,7 +861,7 @@ IOController_i::ASensorInfoSeq* IOController::getAnalogSensorsMap()
int i=0;
for( AIOStateList::iterator it=aioList.begin(); it!=aioList.end(); ++it)
{
uniset_rwmutex_rlock lock(it->second.val_lock,checkLockValuePause);
uniset_rwmutex_rlock lock(it->second.val_lock);
(*res)[i] = it->second;
i++;
}
......@@ -884,7 +882,7 @@ IOController_i::DSensorInfoSeq* IOController::getDigitalSensorsMap()
int i=0;
for( DIOStateList::iterator it= dioList.begin(); it!=dioList.end(); ++it)
{
uniset_rwmutex_rlock lock(it->second.val_lock,checkLockValuePause);
uniset_rwmutex_rlock lock(it->second.val_lock);
(*res)[i].si = it->second.si;
(*res)[i].type = it->second.type;
(*res)[i].state = it->second.state;
......@@ -941,7 +939,7 @@ IOController_i::DigitalIOInfo IOController::getDInfo(const IOController_i::Senso
DIOStateList::iterator it = dioList.find( key(si.id, si.node) );
if( it!=dioList.end() )
{
uniset_rwmutex_rlock lock(it->second.val_lock,checkLockValuePause);
uniset_rwmutex_rlock lock(it->second.val_lock);
return it->second;
}
......@@ -961,7 +959,7 @@ IOController_i::AnalogIOInfo IOController::getAInfo(const IOController_i::Sensor
AIOStateList::iterator it = aioList.find( key(si.id, si.node) );
if( it!=aioList.end() )
{
uniset_rwmutex_rlock lock(it->second.val_lock,checkLockValuePause);
uniset_rwmutex_rlock lock(it->second.val_lock);
return it->second;
}
......@@ -1322,11 +1320,6 @@ void IOController::setBlockDependsSlot( DependsSlot sl )
bslot = sl;
}
// -----------------------------------------------------------------------------
void IOController::setCheckLockValuePause( int msec )
{
checkLockValuePause = msec;
}
// -----------------------------------------------------------------------------
IOController_i::ASensorInfoSeq* IOController::getSensorSeq( const IDSeq& lst )
{
int size = lst.length();
......@@ -1340,7 +1333,7 @@ IOController_i::ASensorInfoSeq* IOController::getSensorSeq( const IDSeq& lst )
DIOStateList::iterator it = dioList.find( UniSetTypes::key(lst[i],conf->getLocalNode()) );
if( it!=dioList.end() )
{
uniset_rwmutex_rlock lock(it->second.val_lock,checkLockValuePause);
uniset_rwmutex_rlock lock(it->second.val_lock);
(*res)[i].si = it->second.si;
(*res)[i].type = it->second.type;
(*res)[i].real_value= it->second.real_state ? 1 : 0;
......@@ -1360,7 +1353,7 @@ IOController_i::ASensorInfoSeq* IOController::getSensorSeq( const IDSeq& lst )
AIOStateList::iterator it = aioList.find( UniSetTypes::key(lst[i],conf->getLocalNode()) );
if( it!=aioList.end() )
{
uniset_rwmutex_rlock lock(it->second.val_lock,checkLockValuePause);
uniset_rwmutex_rlock lock(it->second.val_lock);
(*res)[i] = it->second;
continue;
}
......@@ -1421,7 +1414,7 @@ IOController_i::ShortIOInfo IOController::getChangedTime( const IOController_i::
if( dit!=dioList.end() )
{
IOController_i::ShortIOInfo i;
uniset_rwmutex_rlock lock(dit->second.val_lock,checkLockValuePause);
uniset_rwmutex_rlock lock(dit->second.val_lock);
i.value = dit->second.state ? 1 : 0;
i.tv_sec = dit->second.tv_sec;
i.tv_usec = dit->second.tv_usec;
......@@ -1432,7 +1425,7 @@ IOController_i::ShortIOInfo IOController::getChangedTime( const IOController_i::
if( ait!=aioList.end() )
{
IOController_i::ShortIOInfo i;
uniset_rwmutex_rlock lock(ait->second.val_lock,checkLockValuePause);
uniset_rwmutex_rlock lock(ait->second.val_lock);
i.value = ait->second.value;
i.tv_sec = ait->second.tv_sec;
i.tv_usec = ait->second.tv_usec;
......@@ -1459,7 +1452,7 @@ IOController_i::ShortMapSeq* IOController::getSensors()
{
IOController_i::ShortMap m;
{
uniset_rwmutex_rlock lock(it->second.val_lock,checkLockValuePause);
uniset_rwmutex_rlock lock(it->second.val_lock);
m.id = it->second.si.id;
m.value = it->second.value;
m.type = it->second.type;
......@@ -1470,7 +1463,7 @@ IOController_i::ShortMapSeq* IOController::getSensors()
{
IOController_i::ShortMap m;
{
uniset_rwmutex_rlock lock(it->second.val_lock,checkLockValuePause);
uniset_rwmutex_rlock lock(it->second.val_lock);
m.id = it->second.si.id;
m.value = it->second.state ? 1 : 0;
m.type = it->second.type;
......
......@@ -242,7 +242,7 @@ void IONotifyController::askState( const IOController_i::SensorInfo& si,
smsg.priority = (Message::Priority)li->second.priority;
smsg.supplier = getId();
{
uniset_rwmutex_rlock lock(li->second.val_lock,getCheckLockValuePause());
uniset_rwmutex_rlock lock(li->second.val_lock);
smsg.state = li->second.state;
smsg.value = li->second.state ? 1:0;
smsg.undefined = li->second.undefined;
......@@ -324,7 +324,7 @@ void IONotifyController::askValue(const IOController_i::SensorInfo& si,
smsg.sm_tv_usec = li->second.tv_usec;
smsg.ci = li->second.ci;
{
uniset_rwmutex_rlock lock(li->second.val_lock,getCheckLockValuePause());
uniset_rwmutex_rlock lock(li->second.val_lock);
smsg.value = li->second.value;
smsg.state = li->second.value ? true:false;
smsg.undefined = li->second.undefined;
......@@ -475,7 +475,7 @@ void IONotifyController::localSaveState( IOController::DIOStateList::iterator& i
// фильтрами или блокировками..
SensorMessage sm(si.id, state);
{ // lock
uniset_rwmutex_rlock lock(it->second.val_lock,getCheckLockValuePause());
uniset_rwmutex_rlock lock(it->second.val_lock);
if( prevState == it->second.state )
return;
......@@ -539,7 +539,7 @@ void IONotifyController::localSaveValue( IOController::AIOStateList::iterator& l
// фильтрами или блокировками..
SensorMessage sm(si.id,li->second.value);
{ // lock
uniset_rwmutex_rlock lock(li->second.val_lock,getCheckLockValuePause());
uniset_rwmutex_rlock lock(li->second.val_lock);
if( prevValue == li->second.value )
return;
......@@ -975,7 +975,7 @@ void IONotifyController::checkThreshold( AIOStateList::iterator& li,
sm.priority = (Message::Priority)li->second.priority;
sm.ci = li->second.ci;
{
uniset_rwmutex_rlock lock(li->second.val_lock,getCheckLockValuePause());
uniset_rwmutex_rlock lock(li->second.val_lock);
sm.value = li->second.value;
sm.state = li->second.value!=0 ? true:false;
sm.undefined = li->second.undefined;
......@@ -1191,7 +1191,7 @@ void IONotifyController::localSetState( IOController::DIOStateList::iterator& it
// Рассылаем уведомления только если значение изменилось...
SensorMessage sm(si.id, state);
{ // lock
uniset_rwmutex_rlock lock(it->second.val_lock,getCheckLockValuePause());
uniset_rwmutex_rlock lock(it->second.val_lock);
if( prevState == it->second.state )
return;
sm.id = si.id;
......@@ -1247,7 +1247,7 @@ void IONotifyController::localSetValue( IOController::AIOStateList::iterator& li
// Рассылаем уведомления только если значение изменилось...
SensorMessage sm;
{ // lock
uniset_rwmutex_rlock lock(li->second.val_lock,getCheckLockValuePause());
uniset_rwmutex_rlock lock(li->second.val_lock);
if( prevValue == li->second.value )
return;
......
......@@ -33,6 +33,7 @@ using namespace UniSetTypes;
// -----------------------------------------------------------------------------
LT_Object::LT_Object():
lstMutex("LT_Object::lstMutex"),
sleepTime(UniSetTimer::WaitUpTime)
{
tmLast.setTiming(UniSetTimer::WaitUpTime);
......@@ -48,7 +49,7 @@ timeout_t LT_Object::checkTimers( UniSetObject* obj )
try
{
{ // lock
uniset_mutex_lock lock(lstMutex, 5000);
uniset_rwmutex_rlock lock(lstMutex);
if( tlst.empty() )
{
......@@ -70,7 +71,7 @@ timeout_t LT_Object::checkTimers( UniSetObject* obj )
}
{ // lock
uniset_mutex_lock lock(lstMutex, 5000);
uniset_rwmutex_wrlock lock(lstMutex);
sleepTime = UniSetTimer::WaitUpTime;
for( TimersList::iterator li=tlst.begin();li!=tlst.end();++li)
{
......@@ -130,10 +131,7 @@ timeout_t LT_Object::askTimer( UniSetTypes::TimerId timerid, timeout_t timeMS, c
}
{ // lock
if( unideb.debugging(Debug::INFO) && !lstMutex.isRelease() )
unideb[Debug::INFO] << "(LT_askTimer): придется подождать освобождения lstMutex-а" << endl;
uniset_mutex_lock lock(lstMutex, 2000);
uniset_rwmutex_wrlock lock(lstMutex);
// поищем а может уж такой есть
if( !tlst.empty() )
{
......@@ -166,20 +164,13 @@ timeout_t LT_Object::askTimer( UniSetTypes::TimerId timerid, timeout_t timeMS, c
if( unideb.debugging(Debug::INFO) )
unideb[Debug::INFO] << "(LT_askTimer): поступил отказ по таймеру id="<< timerid << endl;
{ // lock
if( unideb.debugging(Debug::INFO) && !lstMutex.isRelease() )
unideb[Debug::INFO] << "(LT_askTimer): придется подождать освобождения lstMutex-а\n";
uniset_mutex_lock lock(lstMutex, 2000);
uniset_rwmutex_wrlock lock(lstMutex);
tlst.remove_if(Timer_eq(timerid)); // STL - способ
} // unlock
}
{ // lock
if( unideb.debugging(Debug::INFO) && !lstMutex.isRelease() )
unideb[Debug::INFO] << "(LT_askTimer): придется подождать освобождения lstMutex-а\n";
uniset_mutex_lock lock(lstMutex, 2000);
uniset_rwmutex_rlock lock(lstMutex);
if( tlst.empty() )
sleepTime = UniSetTimer::WaitUpTime;
......
......@@ -183,39 +183,26 @@ uniset_rwmutex::uniset_rwmutex( const uniset_rwmutex& r )
//unlock();
}
void uniset_rwmutex::lock( int check_pause_msec )
void uniset_rwmutex::lock()
{
wr_wait += 1;
while( !m.tryWriteLock() )
{
if( check_pause_msec > 0 )
msleep(check_pause_msec);
}
m.writeLock();
wr_wait -= 1;
MUTEX_DEBUG(cerr << nm << " Locked.." << endl;)
}
void uniset_rwmutex::wrlock( int check_pause_msec )
void uniset_rwmutex::wrlock()
{
wr_wait += 1;
while( !m.tryWriteLock() )
{
if( check_pause_msec > 0 )
msleep(check_pause_msec);
}
m.writeLock();
wr_wait -= 1;
MUTEX_DEBUG(cerr << nm << " WRLocked.." << endl;)
}
void uniset_rwmutex::rlock( int check_pause_msec )
void uniset_rwmutex::rlock()
{
while( wr_wait > 0 )
msleep(check_pause_msec);
while( !m.tryReadLock() )
{
if( check_pause_msec > 0 )
msleep(check_pause_msec);
}
msleep(2);
m.readLock();
MUTEX_DEBUG(cerr << nm << " RLocked.." << endl;)
}
......@@ -224,11 +211,21 @@ void uniset_rwmutex::unlock()
m.unlock();
MUTEX_DEBUG(cerr << nm << " Unlocked.." << endl;)
}
bool uniset_rwmutex::tryrlock()
{
return m.tryReadLock();
}
bool uniset_rwmutex::trywrlock()
{
return m.tryWriteLock();
}
// -------------------------------------------------------------------------------------------
uniset_rwmutex_wrlock::uniset_rwmutex_wrlock( uniset_rwmutex& _m, int check_pause_msec ):
uniset_rwmutex_wrlock::uniset_rwmutex_wrlock( uniset_rwmutex& _m ):
m(_m)
{
m.wrlock(check_pause_msec);
m.wrlock();
}
uniset_rwmutex_wrlock::~uniset_rwmutex_wrlock()
......@@ -250,10 +247,10 @@ uniset_rwmutex_wrlock& uniset_rwmutex_wrlock::operator=(const uniset_rwmutex_wrl
return *this;
}
// -------------------------------------------------------------------------------------------
uniset_rwmutex_rlock::uniset_rwmutex_rlock( uniset_rwmutex& _m, int check_pause_msec ):
uniset_rwmutex_rlock::uniset_rwmutex_rlock( uniset_rwmutex& _m ):
m(_m)
{
m.rlock(check_pause_msec);
m.rlock();
}
uniset_rwmutex_rlock::~uniset_rwmutex_rlock()
......
......@@ -89,7 +89,7 @@ class MyClassSpin
if( !readLock )
{
// cerr << nm << ": before RWlock.." << endl;
uniset_rwmutex_wrlock l(m_spin,5);
uniset_rwmutex_wrlock l(m_spin);
count++;
msleep(30);
// cerr << nm << ": after RWlock.." << endl;
......@@ -246,7 +246,7 @@ int main( int argc, const char **argv )
}
#endif
#if 0
#if 1
typedef std::vector<MyClassSpin*> TSpinVec;
TSpinVec tsvec(max);
for( int i=0; i<max; i++ )
......
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