Commit 2bdf0bf3 authored by Pavel Vainerman's avatar Pavel Vainerman

(2.0): Исправил ошибку в копировании uniset_rwmutex-а

parent 453d55f3
......@@ -106,6 +106,7 @@ namespace UniSetTypes
void wrlock();
void rlock();
bool trylock();
bool tryrlock();
bool trywrlock();
......@@ -120,6 +121,7 @@ namespace UniSetTypes
friend class uniset_rwmutex_lock;
ost::ThreadLock m;
ost::AtomicCounter wr_wait;
static int num;
};
std::ostream& operator<<(std::ostream& os, uniset_rwmutex& m );
// -------------------------------------------------------------------------
......
......@@ -155,7 +155,10 @@ wr_wait(0)
}
int uniset_rwmutex::num = 0;
uniset_rwmutex::uniset_rwmutex():
nm(""),
wr_wait(0)
{
}
......@@ -169,22 +172,28 @@ std::ostream& UniSetTypes::operator<<(std::ostream& os, uniset_rwmutex& m )
return os << m.name();
}
const uniset_rwmutex &uniset_rwmutex::operator=( const uniset_rwmutex& r )
{
if( this != &r )
{
lock();
ostringstream s;
s << r.nm << "." << (++num);
nm = s.str();
unlock();
}
return *this;
}
uniset_rwmutex::uniset_rwmutex( const uniset_rwmutex& r )
uniset_rwmutex::uniset_rwmutex( const uniset_rwmutex& r ):
nm(r.nm)
{
//unlock();
}
void uniset_rwmutex::lock()
{
MUTEX_DEBUG(cerr << nm << " prepare Locked.." << endl;)
wr_wait += 1;
m.writeLock();
wr_wait -= 1;
......@@ -192,6 +201,7 @@ void uniset_rwmutex::lock()
}
void uniset_rwmutex::wrlock()
{
MUTEX_DEBUG(cerr << nm << " prepare WRLocked.." << endl;)
wr_wait += 1;
m.writeLock();
wr_wait -= 1;
......@@ -199,6 +209,8 @@ void uniset_rwmutex::wrlock()
}
void uniset_rwmutex::rlock()
{
MUTEX_DEBUG(cerr << nm << " prepare RLocked.." << endl;)
while( wr_wait > 0 )
msleep(2);
......@@ -221,6 +233,11 @@ bool uniset_rwmutex::trywrlock()
{
return m.tryWriteLock();
}
bool uniset_rwmutex::trylock()
{
return m.tryWriteLock();
}
// -------------------------------------------------------------------------------------------
uniset_rwmutex_wrlock::uniset_rwmutex_wrlock( uniset_rwmutex& _m ):
m(_m)
......
......@@ -140,6 +140,28 @@ int main( int argc, const char **argv )
try
{
{
uniset_rwmutex m1("mutex1");
uniset_rwmutex m2("mutex2");
uniset_rwmutex m3_lcopy("mutex3");
cout << "m1: " << m1.name() << endl;
cout << "m2: " << m2.name() << endl;
cout << "m3: " << m3_lcopy.name() << endl;
m2 = m1;
cout << "copy m1... m2: " << m2.name() << endl;
m1.wrlock();
m3_lcopy = m1;
cout << "copy m1... m3: " << m2.name() << endl;
cout << "m3.lock: ..." << endl;
m3_lcopy.wrlock();
cout << "m3.lock: wrlock OK" << endl;
}
return 0;
#if 0
ost::ThreadLock m;
// cout << "test unlock.." << endl;
......
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