/*static*/ int MongoFile::flushAll( bool sync ){ int num = 0; rwlock lk( mmmutex , false ); for ( set<MongoFile*>::iterator i = mmfiles.begin(); i != mmfiles.end(); i++ ){ num++; MongoFile * mmf = *i; if ( ! mmf ) continue; mmf->flush( sync ); } return num; }
/*static*/ int MongoFile::_flushAll( bool sync ){ if ( ! sync ){ int num = 0; rwlock lk( mmmutex , false ); for ( set<MongoFile*>::iterator i = mmfiles.begin(); i != mmfiles.end(); i++ ){ num++; MongoFile * mmf = *i; if ( ! mmf ) continue; mmf->flush( sync ); } return num; } // want to do it sync set<MongoFile*> seen; while ( true ){ auto_ptr<Flushable> f; { rwlock lk( mmmutex , false ); for ( set<MongoFile*>::iterator i = mmfiles.begin(); i != mmfiles.end(); i++ ){ MongoFile * mmf = *i; if ( ! mmf ) continue; if ( seen.count( mmf ) ) continue; f.reset( mmf->prepareFlush() ); seen.insert( mmf ); break; } } if ( ! f.get() ) break; f->flush(); } return seen.size(); }
/*static*/ int MongoFile::_flushAll(bool sync) { if (!sync) { int num = 0; LockMongoFilesShared lk; for (set<MongoFile*>::iterator i = mmfiles.begin(); i != mmfiles.end(); i++) { num++; MongoFile* mmf = *i; if (!mmf) continue; mmf->flush(sync); } return num; } // want to do it sync // get a thread-safe Flushable object for each file first in a single lock // so that we can iterate and flush without doing any locking here OwnedPointerVector<Flushable> thingsToFlushWrapper; vector<Flushable*>& thingsToFlush = thingsToFlushWrapper.mutableVector(); { LockMongoFilesShared lk; for (set<MongoFile*>::iterator i = mmfiles.begin(); i != mmfiles.end(); i++) { MongoFile* mmf = *i; if (!mmf) continue; thingsToFlush.push_back(mmf->prepareFlush()); } } for (size_t i = 0; i < thingsToFlush.size(); i++) { thingsToFlush[i]->flush(); } return thingsToFlush.size(); }