Package: libgcj4
Version: 1:3.3.3-5
Severity: normal

If a ServerSocketChannel has been registered for SelectionKey.OP_ACCEPT
at a Selector, select() will return immediatly with OP_ACCEPT on that
Channel, even when there is no connection waiting.

See example:

Server.java:
-------------------------8<---------------------------------------------
import java.net.InetSocketAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.nio.channels.SelectionKey;
import java.nio.channels.Selector;
import java.nio.channels.ServerSocketChannel;
import java.nio.channels.SocketChannel;
import java.util.Iterator;

public class Server {
  public static void main(String[] args) {
    try {
      Selector serverSelector = Selector.open();

      ServerSocketChannel ssc = ServerSocketChannel.open();
      ssc.configureBlocking(false);
      ssc.socket().bind(new InetSocketAddress(2003));
      ssc.register(serverSelector, SelectionKey.OP_ACCEPT);
      while(true) {
        System.out.println("Before selector");
        while(serverSelector.select() > 0) {
          System.out.println("Something was selected.");
          java.util.Set readyKeys = serverSelector.selectedKeys();
          Iterator iter = readyKeys.iterator();
          while(iter.hasNext()) {
            SelectionKey key = (SelectionKey)iter.next();
            iter.remove();
            if(key.isAcceptable()) {
              ServerSocketChannel ssc2 = (ServerSocketChannel)key.channel();
              System.out.println("Before accept.");
              Socket socket = ssc2.socket().accept();
              System.out.println("After accept.");
              socket.getOutputStream().write("Hello World!\r\n".getBytes());
              socket.close();                                           
            }
          }
        }
      }
    } catch (Exception e) {
      // TODO: handle exception
      e.printStackTrace();
    }
  }
}
-------------------------8<---------------------------------------------
Compile and run it with:
gcj-3.3 --main=Server Server.java && ./a.out

and it will output:
Before selector
Something was selected.
Before accept.

and hang in the ServerSocket.accept() method until a connection
happens.

-- System Information:
Debian Release: testing/unstable
  APT prefers testing
  APT policy: (990, 'testing'), (500, 'unstable')
Architecture: i386 (i686)
Kernel: Linux 2.4.20-xfs
Locale: LANG=sv_SE, LC_CTYPE=sv_SE

Versions of packages libgcj4 depends on:
ii  libc6                       2.3.2.ds1-11 GNU C Library: Shared libraries an
ii  libgcc1                     1:3.3.3-1    GCC support library
ii  libgcj-common               1:3.3.3-1    Java runtime library (common files
ii  libstdc++5                  1:3.3.3-1    The GNU Standard C++ Library v3
ii  xlibs                       4.2.1-12.1   X Window System client libraries
ii  zlib1g                      1:1.2.1-5    compression library - runtime

-- no debconf information


Reply via email to