On 7/27/06, Mikhail Fursov <[EMAIL PROTECTED]> wrote:
If API says (from the forst message message): "If this channel was not created by the same provider as the given selector" then the way you create the channel but not provider is important. ?
Do you mean we should focus on the creator of selector? In fact, Selector.open() uses SelectorProvider().provider() to create a new selector. No matter what the logic is, "assertSame(channel.provider(), selector.provider());" clearly shows the channel was created by the same provider as the selector, right? Then the channel can be registered onto the selector. But RI throws exception. Am I missing something? Thanks! On 7/27/06, Andrew Zhang <[EMAIL PROTECTED]> wrote:
> > 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 > > -- Mikhail Fursov
-- Andrew Zhang China Software Development Lab, IBM