diff options
author | Benoit Foucher <benoit@zeroc.com> | 2008-03-10 20:37:20 +0100 |
---|---|---|
committer | Benoit Foucher <benoit@zeroc.com> | 2008-03-10 20:37:20 +0100 |
commit | f01293d8f1e1dc0b77a1ebe20a2a55cb7cc7e41c (patch) | |
tree | 58a8e381c3266facc8e707b13cd0aa29757757cb /java/src/IceInternal/Network.java | |
parent | Merge branch 'master' of ssh://git/home/git/ice (diff) | |
download | ice-f01293d8f1e1dc0b77a1ebe20a2a55cb7cc7e41c.tar.bz2 ice-f01293d8f1e1dc0b77a1ebe20a2a55cb7cc7e41c.tar.xz ice-f01293d8f1e1dc0b77a1ebe20a2a55cb7cc7e41c.zip |
Fix for bug 2721
Diffstat (limited to 'java/src/IceInternal/Network.java')
-rw-r--r-- | java/src/IceInternal/Network.java | 88 |
1 files changed, 66 insertions, 22 deletions
diff --git a/java/src/IceInternal/Network.java b/java/src/IceInternal/Network.java index 1bdd30b54e4..e181b51a714 100644 --- a/java/src/IceInternal/Network.java +++ b/java/src/IceInternal/Network.java @@ -87,28 +87,32 @@ public final class Network return false; } - // - // This method is not used anymore. See comments in - // TcpTransceiverI.java. - // -// public static boolean -// notConnected(java.net.SocketException ex) -// { -// String msg = ex.getMessage().toLowerCase(); -// if(msg.indexOf("transport endpoint is not connected") != -1) -// { -// return true; -// } -// // -// // BUGFIX: We check for EINVAL because shutdown() under Mac OS -// // X returns EINVAL if the server side is gone. -// // -// else if(msg.indexOf("invalid argument") != -1) -// { -// return true; -// } -// return false; -// } + public static boolean + noMoreFds(java.lang.Throwable ex) + { + String msg = ex.getMessage(); + if(msg != null) + { + msg = msg.toLowerCase(); + + final String[] msgs = + { + "too many open files", // EMFILE + "file table overflow", // ENFILE + "too many open files in system" // ENFILE + }; + + for(int i = 0; i < msgs.length; i++) + { + if(msg.indexOf(msgs[i]) != -1) + { + return true; + } + } + } + + return false; + } public static java.nio.channels.SocketChannel createTcpSocket() @@ -279,6 +283,46 @@ public final class Network } } + public static java.nio.channels.SocketChannel + doAccept(java.nio.channels.ServerSocketChannel afd) + { + java.nio.channels.SocketChannel fd = null; + while(true) + { + try + { + fd = afd.accept(); + break; + } + catch(java.io.IOException ex) + { + if(interrupted(ex)) + { + continue; + } + + Ice.SocketException se = new Ice.SocketException(); + se.initCause(ex); + throw se; + } + } + + try + { + java.net.Socket socket = fd.socket(); + socket.setTcpNoDelay(true); + socket.setKeepAlive(true); + } + catch(java.io.IOException ex) + { + Ice.SocketException se = new Ice.SocketException(); + se.initCause(ex); + throw se; + } + + return fd; + } + public static boolean doConnect(java.nio.channels.SocketChannel fd, java.net.InetSocketAddress addr) { |