diff options
Diffstat (limited to 'cpp/src')
-rw-r--r-- | cpp/src/Ice/ConnectionFactory.cpp | 9 | ||||
-rw-r--r-- | cpp/src/Ice/ConnectionFactory.h | 2 | ||||
-rw-r--r-- | cpp/src/Ice/Network.cpp | 10 | ||||
-rw-r--r-- | cpp/src/Ice/Network.h | 1 |
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); |