Freigeben über


2.1.4.10 Algorithm for Determining If a Range Access Conflicts with Byte-Range Locks

The inputs for this algorithm are:

  • ByteOffset: A 64-bit unsigned integer specifying the offset of the first byte of the range.

  • Length: A 64-bit unsigned integer specifying the number of bytes in the range.

  • IsExclusive: TRUE if the access to the range has exclusive intent, FALSE otherwise.

  • LockIntent: TRUE if the access to the range has locking intent, FALSE if the intent is performing I/O (reads or writes).

  • Open: The open to the file on which to check for range conflicts.

  • Key: A 32-bit unsigned integer containing an identifier for the open by a specific process.

This algorithm outputs a Boolean value:

  • TRUE if the range conflicts with byte-range locks.

  • FALSE if the range does not conflict.

Pseudocode for the algorithm is as follows:

  • If ((ByteOffset == 0) and (Length == 0)):

    • The {0, 0} range doesn't conflict with any byte-range lock.

    • Return FALSE.

  • EndIf

  • For each ByteRangeLock in Open.Stream.ByteRangeLockList:

    • If ((ByteRangeLock.LockOffset == 0) and (ByteRangeLock.LockLength == 0)):

      • The byte-range lock is over the {0, 0} range so there is no overlap by definition.

    • Else:

      • Initialize LastByteOffset1 = ByteOffset + Length - 1.

      • Initialize LastByteOffset2 = ByteRangeLock.LockOffset + ByteRangeLock.LockLength - 1.

      • If ((ByteOffset <= LastByteOffset2) and (LastByteOffset1 >= ByteRangeLock.LockOffset)):

        • ByteRangeLock and the passed range overlap.

        • If (ByteRangeLock.IsExclusive == TRUE):

          • If (ByteRangeLock.OwnerOpen != Open) or (ByteRangeLock.LockKey != Key):

            • Exclusive byte-range locks block all access to other Opens.

            • Return TRUE.

          • Else If ((IsExclusive == TRUE) and (LockIntent == TRUE)):

            • Overlapping exclusive byte-range locks are not allowed even by the same owner.

            • Return TRUE.

          • EndIf

        • Else If (IsExclusive == TRUE):

          • The ByteRangeLock is shared, shared byte-range locks will block all access with exclusive intent.

          • Return TRUE.

        • EndIf

      • EndIf

    • EndIf

  • EndFor

  • Return FALSE.