@@ -75,7 +75,10 @@ namespace ThreadedTests {
7575#endif
7676 ProgressMeter pm;
7777 public:
78- MongoMutexTest () : pm(N * nthreads) {}
78+ int upgradeWorked, upgradeFailed;
79+ MongoMutexTest () : pm(N * nthreads) {
80+ upgradeWorked = upgradeFailed = 0 ;
81+ }
7982 void run () {
8083 DEV {
8184 // in _DEBUG builds on linux we mprotect each time a writelock
@@ -93,11 +96,12 @@ namespace ThreadedTests {
9396 private:
9497 virtual void setup () {
9598 }
96- virtual void subthread (int ) {
99+ virtual void subthread (int tnumber ) {
97100 Client::initThread (" mongomutextest" );
98101 sleepmillis (0 );
99102 for ( int i = 0 ; i < N; i++ ) {
100- bool sometimes = std::rand () % 16 == 0 ;
103+ int x = std::rand ();
104+ bool sometimes = (x % 15 == 0 );
101105 if ( i % 7 == 0 ) {
102106 Lock::GlobalRead r; // nested test
103107 Lock::GlobalRead r2;
@@ -113,17 +117,20 @@ namespace ThreadedTests {
113117 Lock::TempRelease t;
114118 }
115119 }
116- else if ( i == 2 ) {
120+ else if ( i % 7 == 4 &&
121+ tnumber == 1 /* only one upgrader legal*/ ) {
117122 Lock::GlobalWrite w;
118123 ASSERT ( d.dbMutex .isWriteLocked () );
119124 ASSERT ( Lock::isW () );
120- if ( sometimes ) {
125+ if ( i % 7 == 2 ) {
121126 Lock::TempRelease t;
122127 }
123128 if ( sometimes ) {
124129 w.downgrade ();
125130 sleepmillis (0 );
126- w.upgrade ();
131+ bool worked = w.upgrade ();
132+ if ( worked) upgradeWorked++;
133+ else upgradeFailed++;
127134 }
128135 }
129136 else if ( i % 7 == 2 ) {
@@ -146,8 +153,6 @@ namespace ThreadedTests {
146153 Lock::TempRelease t;
147154 }
148155 }
149- // _try
150- // _temprelrease
151156 else if ( i % 7 == 5 ) {
152157 {
153158 Lock::DBRead r (" foo" );
@@ -158,9 +163,6 @@ namespace ThreadedTests {
158163 {
159164 Lock::DBRead r (" bar" );
160165 }
161- /* if( mm->lock_try(1) ) {
162- mm->unlock();
163- }*/
164166 }
165167 else if ( i % 7 == 6 ) {
166168 if ( i > N/2 ) {
@@ -189,9 +191,6 @@ namespace ThreadedTests {
189191 Lock::DBRead r2 (" foo" );
190192 Lock::DBRead r3 (" local" );
191193 }
192- /* if( mm->lock_shared_try(0) ) {
193- mm->unlock_shared();
194- }*/
195194 }
196195 else {
197196 Lock::ThreadSpanningOp::setWLockedNongreedy ();
@@ -206,6 +205,8 @@ namespace ThreadedTests {
206205 }
207206 virtual void validate () {
208207 ASSERT ( !d.dbMutex .atLeastReadLocked () );
208+ ASSERT ( upgradeWorked > upgradeFailed );
209+ ASSERT ( upgradeWorked > 4 );
209210 {
210211 Lock::GlobalWrite w;
211212 }
0 commit comments