< prev index next > src/jdk.sctp/unix/classes/sun/nio/ch/sctp/SctpChannelImpl.java
Print this page
private final FileDescriptor fd;
private final int fdVal;
! /* IDs of native threads doing send and receive, for signalling */
! private volatile long receiverThread;
! private volatile long senderThread;
/* Lock held by current receiving or connecting thread */
private final Object receiveLock = new Object();
/* Lock held by current sending or connecting thread */
private final FileDescriptor fd;
private final int fdVal;
! /* Threads doing send and receive, for signalling */
! private volatile Thread receiverThread;
! private volatile Thread senderThread;
/* Lock held by current receiving or connecting thread */
private final Object receiveLock = new Object();
/* Lock held by current sending or connecting 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();
}
}
begin();
synchronized (stateLock) {
if (!isOpen()) {
return false;
}
! receiverThread = NativeThread.current();
}
for (;;) {
InetAddress ia = isa.getAddress();
if (ia.isAnyLocalAddress())
ia = InetAddress.getLocalHost();
begin();
synchronized (stateLock) {
if (!isOpen()) {
return false;
}
! receiverThread = NativeThread.threadToSignal();
}
for (;;) {
InetAddress ia = isa.getAddress();
if (ia.isAnyLocalAddress())
ia = InetAddress.getLocalHost();
synchronized (blockingLock()) {
synchronized (stateLock) {
if (!isOpen()) {
return false;
}
! receiverThread = NativeThread.current();
}
if (!isBlocking()) {
connected = Net.pollConnect(fd, 0);
} else {
do {
synchronized (blockingLock()) {
synchronized (stateLock) {
if (!isOpen()) {
return false;
}
! receiverThread = NativeThread.threadToSignal();
}
if (!isBlocking()) {
connected = Net.pollConnect(fd, 0);
} else {
do {
} while (!connected && isOpen());
}
}
} finally {
synchronized (stateLock) {
! receiverThread = 0;
if (state == ChannelState.KILLPENDING) {
kill();
connected = false;
}
}
} while (!connected && isOpen());
}
}
} finally {
synchronized (stateLock) {
! receiverThread = null;
if (state == ChannelState.KILLPENDING) {
kill();
connected = false;
}
}
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 (receiverThread != null)
NativeThread.signal(receiverThread);
! if (senderThread != null)
NativeThread.signal(senderThread);
if (!isRegistered())
kill();
}
}
assert !isOpen() && !isRegistered();
/* Postpone the kill if there is a waiting reader
* or writer thread. */
! if (receiverThread == 0 && senderThread == 0) {
state = ChannelState.KILLED;
SctpNet.close(fdVal);
} else {
state = ChannelState.KILLPENDING;
}
}
assert !isOpen() && !isRegistered();
/* Postpone the kill if there is a waiting reader
* or writer thread. */
! if (receiverThread == null && senderThread == null) {
state = ChannelState.KILLED;
SctpNet.close(fdVal);
} else {
state = ChannelState.KILLPENDING;
}
begin();
synchronized (stateLock) {
if(!isOpen())
return null;
! receiverThread = NativeThread.current();
}
do {
n = receive(fdVal, buffer, resultContainer, fromConnect);
} while ((n == IOStatus.INTERRUPTED) && isOpen());
begin();
synchronized (stateLock) {
if(!isOpen())
return null;
! receiverThread = NativeThread.threadToSignal();
}
do {
n = receive(fdVal, buffer, resultContainer, fromConnect);
} while ((n == IOStatus.INTERRUPTED) && isOpen());
begin();
synchronized (stateLock) {
if(!isOpen())
return 0;
! senderThread = NativeThread.current();
}
do {
n = send(fdVal, buffer, messageInfo);
} while ((n == IOStatus.INTERRUPTED) && isOpen());
begin();
synchronized (stateLock) {
if(!isOpen())
return 0;
! senderThread = NativeThread.threadToSignal();
}
do {
n = send(fdVal, buffer, messageInfo);
} while ((n == IOStatus.INTERRUPTED) && isOpen());
if (isShutdown)
return this;
ensureSendOpen();
SctpNet.shutdown(fdVal, -1);
! if (senderThread != 0)
NativeThread.signal(senderThread);
isShutdown = true;
}
return this;
}
if (isShutdown)
return this;
ensureSendOpen();
SctpNet.shutdown(fdVal, -1);
! if (senderThread != null)
NativeThread.signal(senderThread);
isShutdown = true;
}
return this;
}
< prev index next >