diff options
author | Antonin Kral <a.kral@bobek.cz> | 2011-04-07 07:35:46 +0200 |
---|---|---|
committer | Antonin Kral <a.kral@bobek.cz> | 2011-04-07 07:35:46 +0200 |
commit | 8d913e98e8058c6322975a858f884a769735bb43 (patch) | |
tree | 52da0129272024f7132594b8227d81ec72f83af1 /db/db.cpp | |
parent | 582fc32574a3b158c81e49cb00e6ae59205e66ba (diff) | |
download | mongodb-8d913e98e8058c6322975a858f884a769735bb43.tar.gz |
Imported Upstream version 1.8.1
Diffstat (limited to 'db/db.cpp')
-rw-r--r-- | db/db.cpp | 29 |
1 files changed, 25 insertions, 4 deletions
@@ -808,7 +808,7 @@ int main(int argc, char* argv[]) { cmdLine.durOptions = params["durOptions"].as<int>(); } if (params.count("journalOptions")) { - cmdLine.durOptions = params["durOptions"].as<int>(); + cmdLine.durOptions = params["journalOptions"].as<int>(); } if (params.count("objcheck")) { objcheck = true; @@ -1116,6 +1116,19 @@ namespace mongo { dbexit( EXIT_ABRUPT ); } + void abruptQuitWithAddrSignal( int signal, siginfo_t *siginfo, void * ) { + ostringstream oss; + oss << "Invalid"; + if ( signal == SIGSEGV || signal == SIGBUS ) { + oss << " access"; + } else { + oss << " operation"; + } + oss << " at address: " << siginfo->si_addr << endl; + rawOut( oss.str() ); + abruptQuit( signal ); + } + sigset_t asyncSignals; // The above signals will be processed by this thread only, in order to // ensure the db and log mutexes aren't held. @@ -1138,10 +1151,18 @@ namespace mongo { void setupSignals_ignoreHelper( int signal ) {} void setupSignals( bool inFork ) { - assert( signal(SIGSEGV, abruptQuit) != SIG_ERR ); - assert( signal(SIGFPE, abruptQuit) != SIG_ERR ); + struct sigaction addrSignals; + memset( &addrSignals, 0, sizeof( struct sigaction ) ); + addrSignals.sa_sigaction = abruptQuitWithAddrSignal; + sigemptyset( &addrSignals.sa_mask ); + addrSignals.sa_flags = SA_SIGINFO; + + assert( sigaction(SIGSEGV, &addrSignals, 0) == 0 ); + assert( sigaction(SIGBUS, &addrSignals, 0) == 0 ); + assert( sigaction(SIGILL, &addrSignals, 0) == 0 ); + assert( sigaction(SIGFPE, &addrSignals, 0) == 0 ); + assert( signal(SIGABRT, abruptQuit) != SIG_ERR ); - assert( signal(SIGBUS, abruptQuit) != SIG_ERR ); assert( signal(SIGQUIT, abruptQuit) != SIG_ERR ); assert( signal(SIGPIPE, pipeSigHandler) != SIG_ERR ); |