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

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

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