< prev index next >

src/jdk.sctp/unix/classes/sun/nio/ch/sctp/SctpMultiChannelImpl.java

Print this page
*** 80,12 ***
      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 */
--- 80,12 ---
      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 */

*** 263,19 ***
          }
      }
  
      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();
          }
      }
  
--- 263,19 ---
          }
      }
  
      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();
          }
      }
  

*** 288,15 ***
      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();
          }
      }
--- 288,15 ---
      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();
          }
      }

*** 376,11 ***
                  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;
              }
--- 376,11 ---
                  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 >