531 assertTrue(Thread.holdsLock(sel.selectedKeys())); 532 }); 533 } finally { 534 closePipe(p); 535 } 536 } 537 538 /** 539 * Test that selection operations remove cancelled keys from the selector's 540 * key and selected-key sets. 541 */ 542 public void testCancel() throws Exception { 543 Pipe p = Pipe.open(); 544 try (Selector sel = Selector.open()) { 545 Pipe.SinkChannel sink = p.sink(); 546 Pipe.SourceChannel source = p.source(); 547 548 // write to sink to ensure that the source is readable 549 sink.write(messageBuffer()); 550 551 sink.configureBlocking(false); 552 source.configureBlocking(false); 553 SelectionKey key1 = sink.register(sel, SelectionKey.OP_WRITE); 554 SelectionKey key2 = source.register(sel, SelectionKey.OP_READ); 555 556 sel.selectNow(); 557 assertTrue(sel.keys().contains(key1)); 558 assertTrue(sel.keys().contains(key2)); 559 assertTrue(sel.selectedKeys().contains(key1)); 560 assertTrue(sel.selectedKeys().contains(key2)); 561 562 // cancel key1 563 key1.cancel(); 564 int n = sel.selectNow(k -> assertTrue(k == key2)); 565 assertTrue(n == 1); 566 assertFalse(sel.keys().contains(key1)); 567 assertTrue(sel.keys().contains(key2)); 568 assertFalse(sel.selectedKeys().contains(key1)); 569 assertTrue(sel.selectedKeys().contains(key2)); 570 571 // cancel key2 572 key2.cancel(); 573 n = sel.selectNow(k -> assertTrue(false)); 574 assertTrue(n == 0); 575 assertFalse(sel.keys().contains(key1)); 576 assertFalse(sel.keys().contains(key2)); | 531 assertTrue(Thread.holdsLock(sel.selectedKeys())); 532 }); 533 } finally { 534 closePipe(p); 535 } 536 } 537 538 /** 539 * Test that selection operations remove cancelled keys from the selector's 540 * key and selected-key sets. 541 */ 542 public void testCancel() throws Exception { 543 Pipe p = Pipe.open(); 544 try (Selector sel = Selector.open()) { 545 Pipe.SinkChannel sink = p.sink(); 546 Pipe.SourceChannel source = p.source(); 547 548 // write to sink to ensure that the source is readable 549 sink.write(messageBuffer()); 550 551 source.configureBlocking(false); 552 SelectionKey key1 = source.register(sel, SelectionKey.OP_READ); 553 // make sure pipe source is readable before we do following checks. 554 // this is sometime necessary on windows where pipe is implemented 555 // as a pair of connected socket, so there is no guarantee that written 556 // bytes on sink side is immediately available on source side. 557 sel.select(); 558 559 sink.configureBlocking(false); 560 SelectionKey key2 = sink.register(sel, SelectionKey.OP_WRITE); 561 sel.selectNow(); 562 563 assertTrue(sel.keys().contains(key1)); 564 assertTrue(sel.keys().contains(key2)); 565 assertTrue(sel.selectedKeys().contains(key1)); 566 assertTrue(sel.selectedKeys().contains(key2)); 567 568 // cancel key1 569 key1.cancel(); 570 int n = sel.selectNow(k -> assertTrue(k == key2)); 571 assertTrue(n == 1); 572 assertFalse(sel.keys().contains(key1)); 573 assertTrue(sel.keys().contains(key2)); 574 assertFalse(sel.selectedKeys().contains(key1)); 575 assertTrue(sel.selectedKeys().contains(key2)); 576 577 // cancel key2 578 key2.cancel(); 579 n = sel.selectNow(k -> assertTrue(false)); 580 assertTrue(n == 0); 581 assertFalse(sel.keys().contains(key1)); 582 assertFalse(sel.keys().contains(key2)); |