Uploaded image for project: 'JDK'
  1. JDK
  2. JDK-8204472

(se) SelectionKey.interestOps variants to atomically update interest ops

XMLWordPrintable

    • Icon: CSR CSR
    • Resolution: Approved
    • Icon: P4 P4
    • 11
    • core-libs
    • None
    • minimal
    • New methods on class that is unlikely to be extended, except maybe for mocking
    • Java API
    • SE

      Summary

      Add two methods to java.nio.channels.SelectionKey to atomically update the key's interest set. The methods are interestOpsOr(int) and interestOpsAnd(int) and complement the existing interestOps(int) that is used to set the key's interest set.

      Problem

      Selectable channels that support an operation set (identifying this channel's supported operations) of more than one operation will often require coordination when several threads are updating its interest set at the same time. The proposed methods simplify the coordination and avoid explicit synchronization.

      Solution

      The proposed solution is to add two methods to java.nio.channels.SelectionKey.

      SelectionKey is an abstract class so the new methods specify default implementations in case there are implementations outside of the JDK (mocking or just alternative SelectorProvider implementations).

      Specification

          /**
           * Atomically sets this key's interest set to the bitwise union ("or") of
           * the existing interest set and the given value. This method is guaranteed
           * to be atomic with respect to other concurrent calls to this method or to
           * {@link #interestOpsAnd(int)}.
           *
           * <p> This method may be invoked at any time.  If this method is invoked
           * while a selection operation is in progress then it has no effect upon
           * that operation; the change to the key's interest set will be seen by the
           * next selection operation.
           *
           * @implSpec The default implementation synchronizes on this key and invokes
           * {@code interestOps()} and {@code interestOps(int)} to retrieve and set
           * this key's interest set.
           *
           * @param  ops  The interest set to apply
           *
           * @return  The previous interest set
           *
           * @throws  IllegalArgumentException
           *          If a bit in the set does not correspond to an operation that
           *          is supported by this key's channel, that is, if
           *          {@code (ops & ~channel().validOps()) != 0}
           *
           * @throws  CancelledKeyException
           *          If this key has been cancelled
           *
           * @since 11
           */
          public int interestOpsOr(int ops) 
      
          /**
           * Atomically sets this key's interest set to the bitwise intersection ("and")
           * of the existing interest set and the given value. This method is guaranteed
           * to be atomic with respect to other concurrent calls to this method or to
           * {@link #interestOpsOr(int)}.
           *
           * <p> This method may be invoked at any time.  If this method is invoked
           * while a selection operation is in progress then it has no effect upon
           * that operation; the change to the key's interest set will be seen by the
           * next selection operation.
           *
           * @apiNote Unlike the {@code interestOps(int)} and {@code interestOpsOr(int)}
           * methods, this method does not throw {@code IllegalArgumentException} when
           * invoked with bits in the interest set that do not correspond to an
           * operation that is supported by this key's channel. This is to allow
           * operation bits in the interest set to be cleared using bitwise complement
           * values, e.g., {@code interestOpsAnd(~SelectionKey.OP_READ)} will remove the
           * {@code OP_READ} from the interest set without affecting other bits.
           *
           * @implSpec The default implementation synchronizes on this key and invokes
           * {@code interestOps()} and {@code interestOps(int)} to retrieve and set
           * this key's interest set.
           *
           * @param  ops  The interest set to apply
           *
           * @return  The previous interest set
           *
           * @throws  CancelledKeyException
           *          If this key has been cancelled
           *
           * @since 11
           */
          public int interestOpsAnd(int ops)

            alanb Alan Bateman
            gmanwanisunw Girish Manwani (Inactive)
            Brian Burkhalter
            Votes:
            0 Vote for this issue
            Watchers:
            1 Start watching this issue

              Created:
              Updated:
              Resolved: