< prev index next >

src/java.base/solaris/classes/sun/nio/ch/DevPollSelectorImpl.java

Print this page
rev 49242 : [mq]: selector-cleanup

*** 1,7 **** /* ! * Copyright (c) 2001, 2015, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. Oracle designates this --- 1,7 ---- /* ! * Copyright (c) 2001, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. Oracle designates this
*** 35,64 **** * An implementation of Selector for Solaris. */ class DevPollSelectorImpl extends SelectorImpl { - // File descriptors used for interrupt ! protected int fd0; ! protected int fd1; // The poll object ! DevPollArrayWrapper pollWrapper; // Maps from file descriptors to keys ! private Map<Integer,SelectionKeyImpl> fdToKey; // True if this Selector has been closed ! private boolean closed = false; // Lock for close/cleanup ! private Object closeLock = new Object(); // Lock for interrupt triggering and clearing ! private Object interruptLock = new Object(); ! private boolean interruptTriggered = false; /** * Package private constructor called by factory method in * the abstract superclass Selector. */ --- 35,63 ---- * An implementation of Selector for Solaris. */ class DevPollSelectorImpl extends SelectorImpl { // File descriptors used for interrupt ! private final int fd0; ! private final int fd1; // The poll object ! private final DevPollArrayWrapper pollWrapper; // Maps from file descriptors to keys ! private final Map<Integer, SelectionKeyImpl> fdToKey; // True if this Selector has been closed ! private boolean closed; // Lock for close/cleanup ! private final Object closeLock = new Object(); // Lock for interrupt triggering and clearing ! private final Object interruptLock = new Object(); ! private boolean interruptTriggered; /** * Package private constructor called by factory method in * the abstract superclass Selector. */
*** 84,98 **** } throw t; } } protected int doSelect(long timeout) throws IOException { ! if (closed) ! throw new ClosedSelectorException(); processDeregisterQueue(); try { begin(); pollWrapper.poll(timeout); } finally { --- 83,102 ---- } throw t; } } + private void ensureOpen() { + if (closed) + throw new ClosedSelectorException(); + } + + @Override protected int doSelect(long timeout) throws IOException { ! ensureOpen(); processDeregisterQueue(); try { begin(); pollWrapper.poll(timeout); } finally {
*** 139,185 **** } } return numKeysUpdated; } protected void implClose() throws IOException { if (closed) return; closed = true; // prevent further wakeup synchronized (interruptLock) { interruptTriggered = true; } FileDispatcherImpl.closeIntFD(fd0); FileDispatcherImpl.closeIntFD(fd1); - pollWrapper.release(fd0); - pollWrapper.closeDevPollFD(); - selectedKeys = null; - // Deregister channels Iterator<SelectionKey> i = keys.iterator(); while (i.hasNext()) { SelectionKeyImpl ski = (SelectionKeyImpl)i.next(); deregister(ski); SelectableChannel selch = ski.channel(); if (!selch.isOpen() && !selch.isRegistered()) ((SelChImpl)selch).kill(); i.remove(); } - fd0 = -1; - fd1 = -1; } protected void implRegister(SelectionKeyImpl ski) { int fd = IOUtil.fdVal(ski.channel.getFD()); fdToKey.put(Integer.valueOf(fd), ski); keys.add(ski); } protected void implDereg(SelectionKeyImpl ski) throws IOException { int i = ski.getIndex(); assert (i >= 0); int fd = ski.channel.getFDVal(); fdToKey.remove(Integer.valueOf(fd)); --- 143,187 ---- } } return numKeysUpdated; } + @Override protected void implClose() throws IOException { if (closed) return; closed = true; // prevent further wakeup synchronized (interruptLock) { interruptTriggered = true; } + pollWrapper.close(); FileDispatcherImpl.closeIntFD(fd0); FileDispatcherImpl.closeIntFD(fd1); // Deregister channels Iterator<SelectionKey> i = keys.iterator(); while (i.hasNext()) { SelectionKeyImpl ski = (SelectionKeyImpl)i.next(); deregister(ski); SelectableChannel selch = ski.channel(); if (!selch.isOpen() && !selch.isRegistered()) ((SelChImpl)selch).kill(); i.remove(); } } + @Override protected void implRegister(SelectionKeyImpl ski) { int fd = IOUtil.fdVal(ski.channel.getFD()); fdToKey.put(Integer.valueOf(fd), ski); keys.add(ski); } + @Override protected void implDereg(SelectionKeyImpl ski) throws IOException { int i = ski.getIndex(); assert (i >= 0); int fd = ski.channel.getFDVal(); fdToKey.remove(Integer.valueOf(fd));
*** 191,207 **** SelectableChannel selch = ski.channel(); if (!selch.isOpen() && !selch.isRegistered()) ((SelChImpl)selch).kill(); } public void putEventOps(SelectionKeyImpl sk, int ops) { ! if (closed) ! throw new ClosedSelectorException(); int fd = IOUtil.fdVal(sk.channel.getFD()); pollWrapper.setInterest(fd, ops); } public Selector wakeup() { synchronized (interruptLock) { if (!interruptTriggered) { pollWrapper.interrupt(); interruptTriggered = true; --- 193,210 ---- SelectableChannel selch = ski.channel(); if (!selch.isOpen() && !selch.isRegistered()) ((SelChImpl)selch).kill(); } + @Override public void putEventOps(SelectionKeyImpl sk, int ops) { ! ensureOpen(); int fd = IOUtil.fdVal(sk.channel.getFD()); pollWrapper.setInterest(fd, ops); } + @Override public Selector wakeup() { synchronized (interruptLock) { if (!interruptTriggered) { pollWrapper.interrupt(); interruptTriggered = true;
< prev index next >