You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							95 lines
						
					
					
						
							2.6 KiB
						
					
					
				
			
		
		
	
	
							95 lines
						
					
					
						
							2.6 KiB
						
					
					
				<?php | 
						|
/** | 
						|
 * @link http://www.yiiframework.com/ | 
						|
 * @copyright Copyright (c) 2008 Yii Software LLC | 
						|
 * @license http://www.yiiframework.com/license/ | 
						|
 */ | 
						|
 | 
						|
namespace yii\mutex; | 
						|
 | 
						|
use Yii; | 
						|
use yii\base\Component; | 
						|
 | 
						|
/** | 
						|
 * @author resurtm <resurtm@gmail.com> | 
						|
 * @since 2.0 | 
						|
 */ | 
						|
abstract class Mutex extends Component | 
						|
{ | 
						|
	/** | 
						|
	 * @var boolean whether all locks acquired in this process (i.e. local locks) must be released automagically | 
						|
	 * before finishing script execution. Defaults to true. Setting this property to true means that all locks | 
						|
	 * acquire in this process must be released in any case (regardless any kind of errors or exceptions). | 
						|
	 */ | 
						|
	public $autoRelease = true; | 
						|
	/** | 
						|
	 * @var string[] names of the locks acquired in the current PHP process. | 
						|
	 */ | 
						|
	private $_locks = []; | 
						|
 | 
						|
 | 
						|
	/** | 
						|
	 * Initializes the mutex component. | 
						|
	 */ | 
						|
	public function init() | 
						|
	{ | 
						|
		if ($this->autoRelease) { | 
						|
			$locks = &$this->_locks; | 
						|
			register_shutdown_function(function () use (&$locks) { | 
						|
				foreach ($locks as $lock) { | 
						|
					$this->release($lock); | 
						|
				} | 
						|
			}); | 
						|
		} | 
						|
	} | 
						|
 | 
						|
	/** | 
						|
	 * Acquires lock by given name. | 
						|
	 * @param string $name of the lock to be acquired. Must be unique. | 
						|
	 * @param integer $timeout to wait for lock to be released. Defaults to zero meaning that method will return | 
						|
	 * false immediately in case lock was already acquired. | 
						|
	 * @return boolean lock acquiring result. | 
						|
	 */ | 
						|
	public function acquire($name, $timeout = 0) | 
						|
	{ | 
						|
		if ($this->acquireLock($name, $timeout)) { | 
						|
			$this->_locks[] = $name; | 
						|
			return true; | 
						|
		} else { | 
						|
			return false; | 
						|
		} | 
						|
	} | 
						|
 | 
						|
	/** | 
						|
	 * Release acquired lock. This method will return false in case named lock was not found. | 
						|
	 * @param string $name of the lock to be released. This lock must be already created. | 
						|
	 * @return boolean lock release result: false in case named lock was not found.. | 
						|
	 */ | 
						|
	public function release($name) | 
						|
	{ | 
						|
		if ($this->releaseLock($name)) { | 
						|
			$index = array_search($name, $this->_locks); | 
						|
			if ($index !== false) { | 
						|
				unset($this->_locks[$index]); | 
						|
			} | 
						|
			return true; | 
						|
		} else { | 
						|
			return false; | 
						|
		} | 
						|
	} | 
						|
 | 
						|
	/** | 
						|
	 * This method should be extended by concrete mutex implementations. Acquires lock by given name. | 
						|
	 * @param string $name of the lock to be acquired. | 
						|
	 * @param integer $timeout to wait for lock to become released. | 
						|
	 * @return boolean acquiring result. | 
						|
	 */ | 
						|
	abstract protected function acquireLock($name, $timeout = 0); | 
						|
 | 
						|
	/** | 
						|
	 * This method should be extended by concrete mutex implementations. Releases lock by given name. | 
						|
	 * @param string $name of the lock to be released. | 
						|
	 * @return boolean release result. | 
						|
	 */ | 
						|
	abstract protected function releaseLock($name); | 
						|
}
 | 
						|
 |