1 package org.sapia.ubik.net.nio; 2 3 import java.io.IOException ; 4 import java.nio.channels.SelectionKey ; 5 import java.nio.channels.Selector ; 6 7 import org.sapia.ubik.util.Queue; 8 9 33 public class SelectionQueue extends Queue { 34 35 private Selector _selector; 36 private ChannelManager _manager; 37 38 44 public SelectionQueue(ChannelManager manager, Selector selector) { 45 _selector = selector; 46 _manager = manager; 47 } 48 49 54 public void add(Object o, boolean notifyAll) { 55 super.add(o, notifyAll); 56 _selector.wakeup(); 57 } 58 59 66 public synchronized void register() throws IOException { 67 while(_items.size() > 0) { 68 Cycle cycle = (Cycle) _items.remove(0); 69 if(cycle.state() == Cycle.STATE_READ) { 70 _manager.register(cycle.getChannel(), _selector, SelectionKey.OP_READ, 71 cycle); 72 } else if(cycle.state() == Cycle.STATE_WRITE) { 73 _manager.register(cycle.getChannel(), _selector, SelectionKey.OP_WRITE, 74 cycle); 75 } else { 76 throw new IllegalStateException ( 77 "Cycle state should be STATE_READ or STATE_WRITE; got " 78 + cycle.state()); 79 } 80 } 81 resetAddedFlag(); 82 } 83 84 88 public synchronized void close() { 89 while(_items.size() > 0) { 90 Cycle cycle = (Cycle) _items.remove(0); 91 cycle.destroy(); 92 } 93 } 94 } 95 | Popular Tags |