docs: def isAvailable(self, requester, access):
          """ Return a boolean whether the lock is available for claiming """
          debuglog("%s isAvailable(%s, %s): self.owners=%r"
                   % (self, requester, access, self.owners))
          num_excl, num_counting = self._claimed_excl, self._claimed_counting
  
          # Find all waiters ahead of the requester in the wait queue
          for idx, waiter in enumerate(self.waiting):
              if waiter[0] is requester:
                  w_index = idx
                  break
          else:
              w_index = len(self.waiting)
          ahead = self.waiting[:w_index]
  
          if access.mode == 'counting':
              # Wants counting access
              return num_excl == 0 and num_counting + len(ahead) < self.maxCount \
                  and all([w[1].mode == 'counting' for w in ahead])
          # else Wants exclusive access
          return num_excl == 0 and num_counting == 0 and not ahead