summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDwight <dmerriman@gmail.com>2008-07-01 20:01:28 -0400
committerDwight <dmerriman@gmail.com>2008-07-01 20:01:28 -0400
commitb3f5a1f27fa034302efe813fc9f650ae875728b8 (patch)
treeda8ca1f4015a2372f3d39edb574d358f468f63d8
parentfc0e91f68eed24a29f621604004dece18ee54875 (diff)
downloadmongo-b3f5a1f27fa034302efe813fc9f650ae875728b8.tar.gz
close sockets on shutdownr0.0.7_rc2
-rw-r--r--db/db.cpp7
-rw-r--r--grid/message.cpp13
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)