 72d10fff0b
			
		
	
	
		72d10fff0b
		
	
	
	
	
		
			
			These definitions are scattered throughout the codebase which makes it hard to refactor them later (my goal is to move them outside of HOMEBREW_LIBRARY). Unify their definitions for clearer code and easier movement later.
		
			
				
	
	
		
			44 lines
		
	
	
		
			797 B
		
	
	
	
		
			Ruby
		
	
	
	
	
	
			
		
		
	
	
			44 lines
		
	
	
		
			797 B
		
	
	
	
		
			Ruby
		
	
	
	
	
	
| require "fcntl"
 | |
| 
 | |
| class FormulaLock
 | |
|   def initialize(name)
 | |
|     @name = name
 | |
|     @path = HOMEBREW_LOCK_DIR/"#{@name}.brewing"
 | |
|     @lockfile = nil
 | |
|   end
 | |
| 
 | |
|   def lock
 | |
|     HOMEBREW_LOCK_DIR.mkpath
 | |
|     @lockfile = get_or_create_lockfile
 | |
|     unless @lockfile.flock(File::LOCK_EX | File::LOCK_NB)
 | |
|       raise OperationInProgressError, @name
 | |
|     end
 | |
|   end
 | |
| 
 | |
|   def unlock
 | |
|     unless @lockfile.nil? || @lockfile.closed?
 | |
|       @lockfile.flock(File::LOCK_UN)
 | |
|       @lockfile.close
 | |
|     end
 | |
|   end
 | |
| 
 | |
|   def with_lock
 | |
|     lock
 | |
|     yield
 | |
|   ensure
 | |
|     unlock
 | |
|   end
 | |
| 
 | |
|   private
 | |
| 
 | |
|   def get_or_create_lockfile
 | |
|     if @lockfile.nil? || @lockfile.closed?
 | |
|       @lockfile = @path.open(File::RDWR | File::CREAT)
 | |
|       @lockfile.fcntl(Fcntl::F_SETFD, Fcntl::FD_CLOEXEC)
 | |
|       @lockfile
 | |
|     else
 | |
|       @lockfile
 | |
|     end
 | |
|   end
 | |
| end
 |