151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski/* 246805d66f32e857c885434b4fa8cb6b32dcc4bf7Shubham Ajmera * Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved. 351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * This code is free software; you can redistribute it and/or modify it 651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * under the terms of the GNU General Public License version 2 only, as 751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * published by the Free Software Foundation. Oracle designates this 851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * particular file as subject to the "Classpath" exception as provided 951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * by Oracle in the LICENSE file that accompanied this code. 1051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 1151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * This code is distributed in the hope that it will be useful, but WITHOUT 1251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 1351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 1451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * version 2 for more details (a copy is included in the LICENSE file that 1551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * accompanied this code). 1651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 1751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * You should have received a copy of the GNU General Public License version 1851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 2 along with this work; if not, write to the Free Software Foundation, 1951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 2051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 2151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 2251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * or visit www.oracle.com if you need additional information or have any 2351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * questions. 2451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 2551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 2651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskipackage java.nio.channels.spi; 2751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 2851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport java.io.IOException; 2951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport java.nio.channels.SelectionKey; 3051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport java.nio.channels.Selector; 3151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport java.util.HashSet; 3251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport java.util.Set; 3351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport sun.nio.ch.Interruptible; 3451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport java.util.concurrent.atomic.AtomicBoolean; 3551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 3651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 3751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski/** 3851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Base implementation class for selectors. 3951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 4051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <p> This class encapsulates the low-level machinery required to implement 4151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * the interruption of selection operations. A concrete selector class must 4251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * invoke the {@link #begin begin} and {@link #end end} methods before and 4351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * after, respectively, invoking an I/O operation that might block 4451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * indefinitely. In order to ensure that the {@link #end end} method is always 4551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * invoked, these methods should be used within a 4646805d66f32e857c885434b4fa8cb6b32dcc4bf7Shubham Ajmera * <tt>try</tt> ... <tt>finally</tt> block: 4751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 4851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <blockquote><pre> 4951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * try { 5051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * begin(); 5151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * // Perform blocking I/O operation here 5251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * ... 5351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * } finally { 5451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * end(); 5551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * }</pre></blockquote> 5651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 5751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <p> This class also defines methods for maintaining a selector's 5851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * cancelled-key set and for removing a key from its channel's key set, and 5951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * declares the abstract {@link #register register} method that is invoked by a 6051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * selectable channel's {@link AbstractSelectableChannel#register register} 6151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * method in order to perform the actual work of registering a channel. </p> 6251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 6351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 6451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @author Mark Reinhold 6551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @author JSR-51 Expert Group 6651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @since 1.4 6751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 6851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 6951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskipublic abstract class AbstractSelector 7051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski extends Selector 7151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski{ 7251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 7351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski private AtomicBoolean selectorOpen = new AtomicBoolean(true); 7451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 7551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // The provider that created this selector 7651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski private final SelectorProvider provider; 7751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 7851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 7946805d66f32e857c885434b4fa8cb6b32dcc4bf7Shubham Ajmera * Initializes a new instance of this class. 8046805d66f32e857c885434b4fa8cb6b32dcc4bf7Shubham Ajmera * 8146805d66f32e857c885434b4fa8cb6b32dcc4bf7Shubham Ajmera * @param provider 8246805d66f32e857c885434b4fa8cb6b32dcc4bf7Shubham Ajmera * The provider that created this selector 8351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 8451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski protected AbstractSelector(SelectorProvider provider) { 8551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski this.provider = provider; 8651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 8751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 8851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski private final Set<SelectionKey> cancelledKeys = new HashSet<SelectionKey>(); 8951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 9051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski void cancel(SelectionKey k) { // package-private 9151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski synchronized (cancelledKeys) { 9251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski cancelledKeys.add(k); 9351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 9451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 9551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 9651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 9751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Closes this selector. 9851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 9951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <p> If the selector has already been closed then this method returns 10051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * immediately. Otherwise it marks the selector as closed and then invokes 10151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * the {@link #implCloseSelector implCloseSelector} method in order to 10251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * complete the close operation. </p> 10351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 10451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @throws IOException 10551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * If an I/O error occurs 10651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 10751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public final void close() throws IOException { 10851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski boolean open = selectorOpen.getAndSet(false); 10951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (!open) 11051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return; 11151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski implCloseSelector(); 11251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 11351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 11451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 11551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Closes this selector. 11651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 11751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <p> This method is invoked by the {@link #close close} method in order 11851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * to perform the actual work of closing the selector. This method is only 11951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * invoked if the selector has not yet been closed, and it is never invoked 12051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * more than once. 12151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 12251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <p> An implementation of this method must arrange for any other thread 12351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * that is blocked in a selection operation upon this selector to return 12451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * immediately as if by invoking the {@link 12551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * java.nio.channels.Selector#wakeup wakeup} method. </p> 12651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 12751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @throws IOException 12851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * If an I/O error occurs while closing the selector 12951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 13051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski protected abstract void implCloseSelector() throws IOException; 13151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 13251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public final boolean isOpen() { 13351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return selectorOpen.get(); 13451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 13551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 13651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 13751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Returns the provider that created this channel. 13851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 13951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @return The provider that created this channel 14051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 14151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public final SelectorProvider provider() { 14251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return provider; 14351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 14451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 14551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 14651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Retrieves this selector's cancelled-key set. 14751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 14851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <p> This set should only be used while synchronized upon it. </p> 14951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 15051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @return The cancelled-key set 15151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 15251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski protected final Set<SelectionKey> cancelledKeys() { 15351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return cancelledKeys; 15451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 15551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 15651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 15751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Registers the given channel with this selector. 15851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 15951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <p> This method is invoked by a channel's {@link 16051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * AbstractSelectableChannel#register register} method in order to perform 16151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * the actual work of registering the channel with this selector. </p> 16251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 16351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param ch 16451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * The channel to be registered 16551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 16651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param ops 16751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * The initial interest set, which must be valid 16851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 16951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param att 17051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * The initial attachment for the resulting key 17151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 17251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @return A new key representing the registration of the given channel 17351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * with this selector 17451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 17551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski protected abstract SelectionKey register(AbstractSelectableChannel ch, 17651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski int ops, Object att); 17751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 17851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 17951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Removes the given key from its channel's key set. 18051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 18151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <p> This method must be invoked by the selector for each channel that it 18251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * deregisters. </p> 18351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 18451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param key 18551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * The selection key to be removed 18651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 18751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski protected final void deregister(AbstractSelectionKey key) { 18851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski ((AbstractSelectableChannel)key.channel()).removeKey(key); 18951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 19051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 19151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 19251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // -- Interruption machinery -- 19351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 19451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski private Interruptible interruptor = null; 19551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 19651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 19751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Marks the beginning of an I/O operation that might block indefinitely. 19851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 19951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <p> This method should be invoked in tandem with the {@link #end end} 20051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * method, using a <tt>try</tt> ... <tt>finally</tt> block as 20151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * shown <a href="#be">above</a>, in order to implement interruption for 20251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * this selector. 20351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 20451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <p> Invoking this method arranges for the selector's {@link 20551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Selector#wakeup wakeup} method to be invoked if a thread's {@link 20651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Thread#interrupt interrupt} method is invoked while the thread is 20751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * blocked in an I/O operation upon the selector. </p> 20851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 20951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski protected final void begin() { 21051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (interruptor == null) { 21151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski interruptor = new Interruptible() { 21251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public void interrupt(Thread ignore) { 21351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski AbstractSelector.this.wakeup(); 21451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski }}; 21551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 21651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski AbstractInterruptibleChannel.blockedOn(interruptor); 21751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski Thread me = Thread.currentThread(); 21851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (me.isInterrupted()) 21951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski interruptor.interrupt(me); 22051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 22151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 22251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 22351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Marks the end of an I/O operation that might block indefinitely. 22451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 22551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <p> This method should be invoked in tandem with the {@link #begin begin} 22651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * method, using a <tt>try</tt> ... <tt>finally</tt> block as 22751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * shown <a href="#be">above</a>, in order to implement interruption for 22851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * this selector. </p> 22951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 23051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski protected final void end() { 23151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski AbstractInterruptibleChannel.blockedOn(null); 23251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 23351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 23451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski} 235