File tree Expand file tree Collapse file tree 4 files changed +46
-6
lines changed Expand file tree Collapse file tree 4 files changed +46
-6
lines changed Original file line number Diff line number Diff line change @@ -278,11 +278,24 @@ namespace mongo {
278278 void Lock::ParallelBatchWriterMode::iAmABatchParticipant () {
279279 lockState ()._batchWriter = true ;
280280 }
281- Lock::ParallelBatchWriterSupport::ParallelBatchWriterSupport () :
282- _lk ( lockState()._batchWriter ? 0 : new RWLockRecursive::Shared(ParallelBatchWriterMode::_batchLock) )
283- {
281+
282+ Lock::ParallelBatchWriterSupport::ParallelBatchWriterSupport () {
283+ relock ();
284284 }
285285
286+ void Lock::ParallelBatchWriterSupport::tempRelease () {
287+ _lk.reset ( 0 );
288+ }
289+
290+ void Lock::ParallelBatchWriterSupport::relock () {
291+ LockState& ls = lockState ();
292+ if ( ! ls._batchWriter ) {
293+ AcquiringParallelWriter a (ls);
294+ _lk.reset ( new RWLockRecursive::Shared (ParallelBatchWriterMode::_batchLock) );
295+ }
296+ }
297+
298+
286299 Lock::ScopedLock::ScopedLock ( char type )
287300 : _type(type), _stat(0 ) {
288301 LockState& ls = lockState ();
@@ -306,6 +319,7 @@ namespace mongo {
306319 void Lock::ScopedLock::tempRelease () {
307320 long long micros = _timer.micros ();
308321 _tempRelease ();
322+ _pbws_lk.tempRelease ();
309323 _recordTime ( micros ); // might as well do after we unlock
310324 }
311325
@@ -324,6 +338,7 @@ namespace mongo {
324338 }
325339
326340 void Lock::ScopedLock::relock () {
341+ _pbws_lk.relock ();
327342 _relock ();
328343 resetTime ();
329344 }
Original file line number Diff line number Diff line change @@ -78,9 +78,15 @@ namespace mongo {
7878
7979 private:
8080 class ParallelBatchWriterSupport : boost::noncopyable {
81- scoped_ptr<RWLockRecursive::Shared> _lk;
8281 public:
8382 ParallelBatchWriterSupport ();
83+
84+ private:
85+ void tempRelease ();
86+ void relock ();
87+
88+ scoped_ptr<RWLockRecursive::Shared> _lk;
89+ friend class ScopedLock ;
8490 };
8591
8692 public:
Original file line number Diff line number Diff line change @@ -35,7 +35,8 @@ namespace mongo {
3535 _otherCount(0 ),
3636 _otherLock(NULL ),
3737 _scopedLk(NULL ),
38- _lockPending(false )
38+ _lockPending(false ),
39+ _lockPendingParallelWriter(false )
3940 {
4041 }
4142
@@ -241,4 +242,13 @@ namespace mongo {
241242 stat->recordAcquireTimeMicros ( _ls.threadState (), _lock->acquireFinished ( stat ) );
242243 }
243244
245+ AcquiringParallelWriter::AcquiringParallelWriter ( LockState& ls )
246+ : _ls( ls ) {
247+ _ls._lockPendingParallelWriter = true ;
248+ }
249+
250+ AcquiringParallelWriter::~AcquiringParallelWriter () {
251+ _ls._lockPendingParallelWriter = false ;
252+ }
253+
244254}
Original file line number Diff line number Diff line change @@ -50,7 +50,7 @@ namespace mongo {
5050 bool isLocked ( const StringData& ns ); // rwRW
5151
5252 /* * pending means we are currently trying to get a lock */
53- bool hasLockPending () const { return _lockPending; }
53+ bool hasLockPending () const { return _lockPending || _lockPendingParallelWriter ; }
5454
5555 // ----
5656
@@ -105,8 +105,10 @@ namespace mongo {
105105 Lock::ScopedLock* _scopedLk;
106106
107107 bool _lockPending;
108+ bool _lockPendingParallelWriter;
108109
109110 friend class Acquiring ;
111+ friend class AcquiringParallelWriter ;
110112 };
111113
112114 class WrapperForRWLock : boost::noncopyable {
@@ -132,7 +134,14 @@ namespace mongo {
132134 LockState& _ls;
133135 };
134136
137+ class AcquiringParallelWriter {
138+ public:
139+ AcquiringParallelWriter ( LockState& ls );
140+ ~AcquiringParallelWriter ();
135141
142+ private:
143+ LockState& _ls;
144+ };
136145
137146
138147}
You can’t perform that action at this time.
0 commit comments