diff options
-rw-r--r-- | db/db.cpp | 7 | ||||
-rw-r--r-- | grid/message.cpp | 13 |
2 files changed, 19 insertions, 1 deletions
diff --git a/db/db.cpp b/db/db.cpp index 904e0061231..8debc342790 100644 --- a/db/db.cpp +++ b/db/db.cpp @@ -18,6 +18,8 @@ extern int curOp; boost::mutex dbMutex; +void closeAllSockets(); + struct MyStartupTests { MyStartupTests() { assert( sizeof(OID) == 12 ); @@ -705,6 +707,7 @@ void segvhandler(int x) { } problem() << "got SIGSEGV " << x << ", terminating :-(" << endl; sayDbContext(); + closeAllSockets(); MemoryMappedFile::closeAllFiles(); flushOpLog(); } @@ -913,6 +916,10 @@ int main(int argc, char* argv[], char *envp[] ) void dbexit(int rc) { cout << " dbexit: flushing op log and files" << endl; flushOpLog(); + + /* must do this before unmapping mem or you may get a seg fault */ + closeAllSockets(); + MemoryMappedFile::closeAllFiles(); cout << " dbexit: really exiting now" << endl; exit(rc); diff --git a/grid/message.cpp b/grid/message.cpp index c9f512064bf..40b6af6f7cc 100644 --- a/grid/message.cpp +++ b/grid/message.cpp @@ -58,9 +58,19 @@ struct MsgStart { } } msgstart; -MessagingPort::MessagingPort(int _sock, SockAddr& _far) : sock(_sock), farEnd(_far) { } +set<MessagingPort*> ports; + +void closeAllSockets() { + for( set<MessagingPort*>::iterator i = ports.begin(); i != ports.end(); i++ ) + (*i)->shutdown(); +} + +MessagingPort::MessagingPort(int _sock, SockAddr& _far) : sock(_sock), farEnd(_far) { + ports.insert(this); +} MessagingPort::MessagingPort() { + ports.insert(this); sock = -1; } @@ -73,6 +83,7 @@ void MessagingPort::shutdown() { MessagingPort::~MessagingPort() { shutdown(); + ports.erase(this); } bool MessagingPort::connect(SockAddr& _far) |