Check double-lock in Mutex. Update book keeping on unlock.
This commit is contained in:
		
							parent
							
								
									44d1e79a10
								
							
						
					
					
						commit
						b4b869e074
					
				| 
						 | 
				
			
			@ -20,6 +20,10 @@ module ProcessShared
 | 
			
		|||
 | 
			
		||||
    # @return [Mutex]
 | 
			
		||||
    def lock
 | 
			
		||||
      if locked_by == ::Process.pid
 | 
			
		||||
        raise ProcessError, "already locked by this process #{::Process.pid}"
 | 
			
		||||
      end
 | 
			
		||||
 | 
			
		||||
      @sem.wait
 | 
			
		||||
      self.locked_by = ::Process.pid
 | 
			
		||||
      self
 | 
			
		||||
| 
						 | 
				
			
			@ -37,7 +41,7 @@ module ProcessShared
 | 
			
		|||
    def sleep(timeout = nil)
 | 
			
		||||
      unlock
 | 
			
		||||
      begin
 | 
			
		||||
        timeout ? sleep(timeout) : sleep
 | 
			
		||||
        timeout ? Kernel.sleep(timeout) : Kernel.sleep
 | 
			
		||||
      ensure
 | 
			
		||||
        lock
 | 
			
		||||
      end
 | 
			
		||||
| 
						 | 
				
			
			@ -62,6 +66,7 @@ module ProcessShared
 | 
			
		|||
        raise ProcessError, "lock is held by #{p} not #{::Process.pid}"
 | 
			
		||||
      end
 | 
			
		||||
 | 
			
		||||
      self.locked_by = 0
 | 
			
		||||
      @sem.post
 | 
			
		||||
      self
 | 
			
		||||
    end
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -70,5 +70,13 @@ module ProcessShared
 | 
			
		|||
 | 
			
		||||
      ::Process.wait(pid)
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    it 'raises exception when locked twice by same process' do
 | 
			
		||||
      mutex = Mutex.new
 | 
			
		||||
 | 
			
		||||
      mutex.lock
 | 
			
		||||
      proc { mutex.lock }.must_raise(ProcessError)
 | 
			
		||||
      mutex.unlock
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
end
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue