summaryrefslogtreecommitdiff
path: root/cpp/src
diff options
context:
space:
mode:
authorBenoit Foucher <benoit@zeroc.com>2008-03-10 20:37:20 +0100
committerBenoit Foucher <benoit@zeroc.com>2008-03-10 20:37:20 +0100
commitf01293d8f1e1dc0b77a1ebe20a2a55cb7cc7e41c (patch)
tree58a8e381c3266facc8e707b13cd0aa29757757cb /cpp/src
parentMerge branch 'master' of ssh://git/home/git/ice (diff)
downloadice-f01293d8f1e1dc0b77a1ebe20a2a55cb7cc7e41c.tar.bz2
ice-f01293d8f1e1dc0b77a1ebe20a2a55cb7cc7e41c.tar.xz
ice-f01293d8f1e1dc0b77a1ebe20a2a55cb7cc7e41c.zip
Fix for bug 2721
Diffstat (limited to 'cpp/src')
-rw-r--r--cpp/src/Ice/ConnectionFactory.cpp9
-rw-r--r--cpp/src/Ice/ConnectionFactory.h2
-rw-r--r--cpp/src/Ice/Network.cpp10
-rw-r--r--cpp/src/Ice/Network.h1
4 files changed, 20 insertions, 2 deletions
diff --git a/cpp/src/Ice/ConnectionFactory.cpp b/cpp/src/Ice/ConnectionFactory.cpp
index 9ee0e53b924..ce807c91269 100644
--- a/cpp/src/Ice/ConnectionFactory.cpp
+++ b/cpp/src/Ice/ConnectionFactory.cpp
@@ -1276,8 +1276,15 @@ IceInternal::IncomingConnectionFactory::message(BasicStream&, const ThreadPoolPt
{
transceiver = _acceptor->accept();
}
- catch(const SocketException&)
+ catch(const SocketException& ex)
{
+ if(noMoreFds(ex.error))
+ {
+ Error out(_instance->initializationData().logger);
+ out << "fatal error: can't accept more connections:\n" << ex << '\n' << _acceptor->toString();
+ abort();
+ }
+
// Ignore socket exceptions.
return;
}
diff --git a/cpp/src/Ice/ConnectionFactory.h b/cpp/src/Ice/ConnectionFactory.h
index 1a046c24af2..674c8058cca 100644
--- a/cpp/src/Ice/ConnectionFactory.h
+++ b/cpp/src/Ice/ConnectionFactory.h
@@ -168,7 +168,7 @@ public:
virtual void connectionStartCompleted(const Ice::ConnectionIPtr&);
virtual void connectionStartFailed(const Ice::ConnectionIPtr&, const Ice::LocalException&);
-
+
private:
IncomingConnectionFactory(const InstancePtr&, const EndpointIPtr&, const Ice::ObjectAdapterPtr&,
diff --git a/cpp/src/Ice/Network.cpp b/cpp/src/Ice/Network.cpp
index 0d958143901..77ededcd7cf 100644
--- a/cpp/src/Ice/Network.cpp
+++ b/cpp/src/Ice/Network.cpp
@@ -631,6 +631,16 @@ IceInternal::recvTruncated()
#endif
}
+bool
+IceInternal::noMoreFds(int error)
+{
+#ifdef _WIN32
+ return error == WSAEMFILE;
+#else
+ return error == EMFILE || error == ENFILE;
+#endif
+}
+
SOCKET
IceInternal::createSocket(bool udp, int family)
{
diff --git a/cpp/src/Ice/Network.h b/cpp/src/Ice/Network.h
index f1bf968d0c5..077efbec5c8 100644
--- a/cpp/src/Ice/Network.h
+++ b/cpp/src/Ice/Network.h
@@ -77,6 +77,7 @@ ICE_API bool connectInProgress();
ICE_API bool connectionLost();
ICE_API bool notConnected();
ICE_API bool recvTruncated();
+ICE_API bool noMoreFds(int);
ICE_API SOCKET createSocket(bool, int);
ICE_API void closeSocket(SOCKET);