< 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 >