< prev index next > src/jdk.sctp/unix/classes/sun/nio/ch/sctp/SctpMultiChannelImpl.java
Print this page
private final FileDescriptor fd;
private final int fdVal;
/* IDs of native threads doing send and receives, for signalling */
! private volatile long receiverThread;
! private volatile long senderThread;
/* Lock held by current receiving thread */
private final Object receiveLock = new Object();
/* Lock held by current sending thread */
private final FileDescriptor fd;
private final int fdVal;
/* IDs of native threads doing send and receives, for signalling */
! private volatile NativeThread receiverThread;
! private volatile NativeThread senderThread;
/* Lock held by current receiving thread */
private final Object receiveLock = new Object();
/* Lock held by current sending thread */
}
}
private void receiverCleanup() throws IOException {
synchronized (stateLock) {
! receiverThread = 0;
if (state == ChannelState.KILLPENDING)
kill();
}
}
private void senderCleanup() throws IOException {
synchronized (stateLock) {
! senderThread = 0;
if (state == ChannelState.KILLPENDING)
kill();
}
}
}
}
private void receiverCleanup() throws IOException {
synchronized (stateLock) {
! receiverThread = null;
if (state == ChannelState.KILLPENDING)
kill();
}
}
private void senderCleanup() throws IOException {
synchronized (stateLock) {
! senderThread = null;
if (state == ChannelState.KILLPENDING)
kill();
}
}
public void implCloseSelectableChannel() throws IOException {
synchronized (stateLock) {
if (state != ChannelState.KILLED)
SctpNet.preClose(fdVal);
! if (receiverThread != 0)
! NativeThread.signal(receiverThread);
! if (senderThread != 0)
! NativeThread.signal(senderThread);
if (!isRegistered())
kill();
}
}
public void implCloseSelectableChannel() throws IOException {
synchronized (stateLock) {
if (state != ChannelState.KILLED)
SctpNet.preClose(fdVal);
! if (NativeThread.isNativeThread(receiverThread))
! receiverThread.signal();
! if (NativeThread.isNativeThread(senderThread))
! senderThread.signal();
if (!isRegistered())
kill();
}
}
return;
}
assert !isOpen() && !isRegistered();
/* Postpone the kill if there is a thread sending or receiving. */
! if (receiverThread == 0 && senderThread == 0) {
state = ChannelState.KILLED;
SctpNet.close(fdVal);
} else {
state = ChannelState.KILLPENDING;
}
return;
}
assert !isOpen() && !isRegistered();
/* Postpone the kill if there is a thread sending or receiving. */
! if (receiverThread == null && senderThread == null) {
state = ChannelState.KILLED;
SctpNet.close(fdVal);
} else {
state = ChannelState.KILLPENDING;
}
< prev index next >