Note:
        Ideally, we'd like to maintain FIFO order. The place to do that 
        would be the isAvailable() function. However, this function is 
        called by builds/steps both for the first time, and after waking 
        them up by self from the self.waiting queue. There is currently no way 
        of distinguishing between them.
      
 
    | 
       
     | 
      
      
     | 
  
    | 
       
     | 
      
      
     | 
  
    | 
       
     | 
      
        
          isAvailable(self,
        access) 
      Return a boolean whether the lock is available for claiming | 
          
            source code
            
           | 
         
       
      
     | 
  
    | 
       
     | 
      
        
          claim(self,
        owner,
        access) 
      Claim the lock (lock must be available) | 
          
            source code
            
           | 
         
       
      
     | 
  
    | 
       
     | 
      
        
          release(self,
        owner,
        access) 
      Release the lock | 
          
            source code
            
           | 
         
       
      
     | 
  
    | 
       
     | 
      
      
     | 
  
    | 
       
     | 
      
        
          | stopWaitingUntilAvailable(self,
        owner,
        access,
        d) | 
          
            source code
            
           | 
         
       
      
     | 
  
    | 
       
     | 
      
      
     |