/* not using log() herein in case we are already locked */ NOINLINE_DECL void dbexit( ExitCode rc, const char *why, bool tryToGetLock ) { auto_ptr<writelocktry> wlt; if ( tryToGetLock ) { wlt.reset( new writelocktry( "" , 2 * 60 * 1000 ) ); uassert( 13455 , "dbexit timed out getting lock" , wlt->got() ); } Client * c = currentClient.get(); { scoped_lock lk( exitMutex ); if ( numExitCalls++ > 0 ) { if ( numExitCalls > 5 ) { // this means something horrible has happened ::_exit( rc ); } stringstream ss; ss << "dbexit: " << why << "; exiting immediately"; tryToOutputFatal( ss.str() ); if ( c ) c->shutdown(); ::exit( rc ); } } { stringstream ss; ss << "dbexit: " << why; tryToOutputFatal( ss.str() ); } try { shutdownServer(); // gracefully shutdown instance } catch ( ... ) { tryToOutputFatal( "shutdown failed with exception" ); } #if defined(_DEBUG) try { mutexDebugger.programEnding(); } catch (...) { } #endif #ifdef _WIN32 // Windows Service Controller wants to be told when we are down, // so don't call ::exit() yet, or say "really exiting now" // if ( rc == EXIT_WINDOWS_SERVICE_STOP ) { if ( c ) c->shutdown(); return; } #endif tryToOutputFatal( "dbexit: really exiting now" ); if ( c ) c->shutdown(); ::exit(rc); }
/* not using log() herein in case we are already locked */ NOINLINE_DECL void dbexit( ExitCode rc, const char *why ) { Client * c = currentClient.get(); { scoped_lock lk( exitMutex ); if ( numExitCalls++ > 0 ) { if ( numExitCalls > 5 ) { // this means something horrible has happened ::_exit( rc ); } stringstream ss; ss << "dbexit: " << why << "; exiting immediately"; tryToOutputFatal( ss.str() ); if ( c ) c->shutdown(); ::_exit( rc ); } } { stringstream ss; ss << "dbexit: " << why; tryToOutputFatal( ss.str() ); } try { shutdownServer(); // gracefully shutdown instance } catch ( ... ) { tryToOutputFatal( "shutdown failed with exception" ); } #if defined(_DEBUG) try { mutexDebugger.programEnding(); } catch (...) { } #endif // block the dur thread from doing any work for the rest of the run LOG(2) << "shutdown: groupCommitMutex" << endl; SimpleMutex::scoped_lock lk(dur::commitJob.groupCommitMutex); #ifdef _WIN32 // Windows Service Controller wants to be told when we are down, // so don't call ::_exit() yet, or say "really exiting now" // if ( rc == EXIT_WINDOWS_SERVICE_STOP ) { if ( c ) c->shutdown(); return; } #endif tryToOutputFatal( "dbexit: really exiting now" ); if ( c ) c->shutdown(); ::_exit(rc); }