diff options
Diffstat (limited to 'phpBB/includes/functions_messenger.php')
| -rw-r--r-- | phpBB/includes/functions_messenger.php | 85 | 
1 files changed, 18 insertions, 67 deletions
| diff --git a/phpBB/includes/functions_messenger.php b/phpBB/includes/functions_messenger.php index 2043e2f7be..a33d7f0aa3 100644 --- a/phpBB/includes/functions_messenger.php +++ b/phpBB/includes/functions_messenger.php @@ -651,64 +651,6 @@ class queue  	}  	/** -	* Obtains exclusive lock on queue cache file. -	* Returns resource representing the lock -	*/ -	function lock() -	{ -		// For systems that can't have two processes opening -		// one file for writing simultaneously -		if (file_exists($this->cache_file . '.lock')) -		{ -			$mode = 'rb'; -		} -		else -		{ -			$mode = 'wb'; -		} - -		$lock_fp = @fopen($this->cache_file . '.lock', $mode); - -		if ($mode == 'wb') -		{ -			if (!$lock_fp) -			{ -				// Two processes may attempt to create lock file at the same time. -				// Have the losing process try opening the lock file again for reading -				// on the assumption that the winning process created it -				$mode = 'rb'; -				$lock_fp = @fopen($this->cache_file . '.lock', $mode); -			} -			else -			{ -				// Only need to set mode when the lock file is written -				@chmod($this->cache_file . '.lock', 0666); -			} -		} - -		if ($lock_fp) -		{ -			@flock($lock_fp, LOCK_EX); -		} - -		return $lock_fp; -	} - -	/** -	* Releases lock on queue cache file, using resource obtained from lock() -	*/ -	function unlock($lock_fp) -	{ -		// lock() will return null if opening lock file, and thus locking, failed. -		// Accept null values here so that client code does not need to check them -		if ($lock_fp) -		{ -			@flock($lock_fp, LOCK_UN); -			fclose($lock_fp); -		} -	} - -	/**  	* Process queue  	* Using lock file  	*/ @@ -716,16 +658,24 @@ class queue  	{  		global $db, $config, $phpEx, $phpbb_root_path, $user; -		$lock_fp = $this->lock(); +		$lock = new phpbb_lock_flock($this->cache_file); +		$lock->acquire(); -		set_config('last_queue_run', time(), true); - -		if (!file_exists($this->cache_file) || filemtime($this->cache_file) > time() - $config['queue_interval']) +		// avoid races, check file existence once +		$have_cache_file = file_exists($this->cache_file); +		if (!$have_cache_file || $config['last_queue_run'] > time() - $config['queue_interval'])  		{ -			$this->unlock($lock_fp); +			if (!$have_cache_file) +			{ +				set_config('last_queue_run', time(), true); +			} + +			$lock->release();  			return;  		} +		set_config('last_queue_run', time(), true); +  		include($this->cache_file);  		foreach ($this->queue_data as $object => $data_ary) @@ -789,7 +739,7 @@ class queue  				break;  				default: -					$this->unlock($lock_fp); +					$lock->release();  					return;  			} @@ -865,7 +815,7 @@ class queue  			}  		} -		$this->unlock($lock_fp); +		$lock->release();  	}  	/** @@ -878,7 +828,8 @@ class queue  			return;  		} -		$lock_fp = $this->lock(); +		$lock = new phpbb_lock_flock($this->cache_file); +		$lock->acquire();  		if (file_exists($this->cache_file))  		{ @@ -905,7 +856,7 @@ class queue  			phpbb_chmod($this->cache_file, CHMOD_READ | CHMOD_WRITE);  		} -		$this->unlock($lock_fp); +		$lock->release();  	}  } | 
