On 7/27/06, Paulex Yang <[EMAIL PROTECTED]> wrote:
Andrew Zhang wrote: > Seems strange. > > Following test fails against RI. > > The spec of SelectableChannel.register() says: "IllegalSelectorExceptoin > -- If this channel was not created by the same provider as the given > selector". Same instance or same SelectorProvider subclass?
I think it's same instance. As you may notice, I use "assertSame( channel.provider(), selector.provider());" in the test. RI passes this assert statement and fails at channel.register(...) because of IllegalSelectorException. That's why I think RI is illogical in this case. Any comments?
> I suggest follow spec for this case. Thanks! > > public void test_channel() throws Exception { > SelectorProvider provider = SelectorProvider.provider(); > Selector selector = Selector.open(); > MockChannel channel = new MockChannel(provider); > channel.configureBlocking(false); > assertSame(channel.provider(), selector.provider()); > // test fails here against RI, IllegalSelectorException is thrown > channel.register(selector, SelectionKey.OP_READ); > selector.select(); > } > > class MockChannel extends SocketChannel { > > protected MockChannel(SelectorProvider arg0) { > super(arg0); > } > > public Socket socket() { > return null; > } > > public boolean isConnected() { > return false; > } > > public boolean isConnectionPending() { > return false; > } > > public boolean connect(SocketAddress arg0) throws IOException { > return false; > } > > public boolean finishConnect() throws IOException { > return false; > } > > public int read(ByteBuffer arg0) throws IOException { > return 0; > } > > public long read(ByteBuffer[] arg0, int arg1, int arg2) throws > IOException { > return 0; > } > > public int write(ByteBuffer arg0) throws IOException { > return 0; > } > > public long write(ByteBuffer[] arg0, int arg1, int arg2) throws > IOException { > return 0; > } > > protected void implCloseSelectableChannel() throws IOException { > > } > > protected void implConfigureBlocking(boolean arg0) throws > IOException { > > } > } > > > > On 7/27/06, Jimmy, Jing Lv <[EMAIL PROTECTED]> wrote: >> >> Hi: >> I find that RI behaves strange in >> java.nio.channels.SelectableChannel.register. in NIO, channels and >> selector must be created by Provider. The doc reads: (Invoking >> register() should throw) "IllegalSelectorException - If this channel was >> not created by the same provider as the given selector". To check if the >> two providers are the same, Harmony use >> "if(selector.provider()==selector.provider)... ", however it seems not >> correct. >> If we mock a channel extends SelectableChannel, put the same >> provider of selector as its provider, and register this channel to >> selector, RI fails with a IllegalSelectorException though two providers >> are the same. I have no idea if how RI do without checking providers are >> the same? >> Another thing is that if a selector has no channels register on it, >> invoke an operation of select() surely has nothing to do. In this way, >> Harmony returns immediately even invoking a block select(), however RI >> wait forever there, for nothing. I think Harmony's behavior is logical, >> but not compatible with RI. It seems a bug of RI, I suggest keep it as >> it is. >> >> -- >> >> Best Regards! >> >> Jimmy, Jing Lv >> China Software Development Lab, IBM >> >> --------------------------------------------------------------------- >> Terms of use : http://incubator.apache.org/harmony/mailing.html >> To unsubscribe, e-mail: [EMAIL PROTECTED] >> For additional commands, e-mail: [EMAIL PROTECTED] >> >> > > -- Paulex Yang China Software Development Lab IBM --------------------------------------------------------------------- Terms of use : http://incubator.apache.org/harmony/mailing.html To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]
-- Andrew Zhang China Software Development Lab, IBM