Esempio n. 1
0
  /**
   * Called from the {@link Receiver} to send any pending Status Messages.
   *
   * @return number of work items processed.
   */
  int sendPendingStatusMessage() {
    int workCount = 0;

    if (ACTIVE == status) {
      final long changeNumber = endSmChange;

      if (changeNumber != lastSmChangeNumber) {
        final long smPosition = nextSmPosition;
        final int receiverWindowLength = nextSmReceiverWindowLength;

        UNSAFE.loadFence(); // LoadLoad required so previous loads don't move past version check
        // below.

        if (changeNumber == beginSmChange) {
          final int termId =
              computeTermIdFromPosition(smPosition, positionBitsToShift, initialTermId);
          final int termOffset = (int) smPosition & termLengthMask;

          channelEndpoint.sendStatusMessage(
              controlAddress,
              sessionId,
              streamId,
              termId,
              termOffset,
              receiverWindowLength,
              (byte) 0);

          statusMessagesSent.orderedIncrement();

          lastSmChangeNumber = changeNumber;
          workCount = 1;
        }
      }
    }

    return workCount;
  }