diff options
Diffstat (limited to 'util/mmap.cpp')
| -rw-r--r-- | util/mmap.cpp | 30 |
1 files changed, 18 insertions, 12 deletions
diff --git a/util/mmap.cpp b/util/mmap.cpp index 18edc34..fa9ab73 100644 --- a/util/mmap.cpp +++ b/util/mmap.cpp @@ -20,6 +20,7 @@ #include "processinfo.h" #include "concurrency/rwlock.h" #include "../db/namespace.h" +#include "../db/cmdline.h" namespace mongo { @@ -61,7 +62,7 @@ namespace mongo { this is the administrative stuff */ - RWLock MongoFile::mmmutex("rw:mmmutex"); + RWLockRecursive MongoFile::mmmutex("mmmutex",10*60*1000 /* 10 minutes */); /* subclass must call in destructor (or at close). removes this from pathToFile and other maps @@ -69,7 +70,7 @@ namespace mongo { ideal to call close to the close, if the close is well before object destruction */ void MongoFile::destroyed() { - rwlock lk( mmmutex , true ); + mmmutex.assertExclusivelyLocked(); mmfiles.erase(this); pathToFile.erase( filename() ); } @@ -83,11 +84,12 @@ namespace mongo { } ++closingAllFiles; - rwlock lk( mmmutex , true ); + RWLockRecursive::Exclusive lk(mmmutex); ProgressMeter pm( mmfiles.size() , 2 , 1 ); - for ( set<MongoFile*>::iterator i = mmfiles.begin(); i != mmfiles.end(); i++ ) { - (*i)->close(); + set<MongoFile*> temp = mmfiles; + for ( set<MongoFile*>::iterator i = temp.begin(); i != temp.end(); i++ ) { + (*i)->close(); // close() now removes from mmfiles pm.hit(); } message << "closeAllFiles() finished"; @@ -97,7 +99,7 @@ namespace mongo { /*static*/ long long MongoFile::totalMappedLength() { unsigned long long total = 0; - rwlock lk( mmmutex , false ); + RWLockRecursive::Shared lk(mmmutex); for ( set<MongoFile*>::iterator i = mmfiles.begin(); i != mmfiles.end(); i++ ) total += (*i)->length(); @@ -120,7 +122,7 @@ namespace mongo { /*static*/ int MongoFile::_flushAll( bool sync ) { if ( ! sync ) { int num = 0; - rwlock lk( mmmutex , false ); + RWLockRecursive::Shared lk(mmmutex); for ( set<MongoFile*>::iterator i = mmfiles.begin(); i != mmfiles.end(); i++ ) { num++; MongoFile * mmf = *i; @@ -137,7 +139,7 @@ namespace mongo { while ( true ) { auto_ptr<Flushable> f; { - rwlock lk( mmmutex , false ); + RWLockRecursive::Shared lk(mmmutex); for ( set<MongoFile*>::iterator i = mmfiles.begin(); i != mmfiles.end(); i++ ) { MongoFile * mmf = *i; if ( ! mmf ) @@ -158,12 +160,12 @@ namespace mongo { } void MongoFile::created() { - rwlock lk( mmmutex , true ); + RWLockRecursive::Exclusive lk(mmmutex); mmfiles.insert(this); } void MongoFile::setFilename(string fn) { - rwlock( mmmutex, true ); + RWLockRecursive::Exclusive lk(mmmutex); assert( _filename.empty() ); _filename = fn; MongoFile *&ptf = pathToFile[fn]; @@ -173,7 +175,9 @@ namespace mongo { #if defined(_DEBUG) void MongoFile::markAllWritable() { - rwlock lk( mmmutex , false ); + if( cmdLine.dur ) + return; + RWLockRecursive::Shared lk(mmmutex); for ( set<MongoFile*>::iterator i = mmfiles.begin(); i != mmfiles.end(); i++ ) { MongoFile * mmf = *i; if (mmf) mmf->_lock(); @@ -181,7 +185,9 @@ namespace mongo { } void MongoFile::unmarkAllWritable() { - rwlock lk( mmmutex , false ); + if( cmdLine.dur ) + return; + RWLockRecursive::Shared lk(mmmutex); for ( set<MongoFile*>::iterator i = mmfiles.begin(); i != mmfiles.end(); i++ ) { MongoFile * mmf = *i; if (mmf) mmf->_unlock(); |
