diff options
author | Nathan Guse <nathaniel.guse@gmail.com> | 2012-12-07 21:14:39 -0600 |
---|---|---|
committer | Nathan Guse <nathaniel.guse@gmail.com> | 2012-12-07 21:14:39 -0600 |
commit | 0042f071476b75258f5f8ea0b5b9fcb445ffde23 (patch) | |
tree | 67cbafd7c655ad94809fef5f7dbe3a23525b232b /phpBB/includes/lock | |
parent | c911a34b5b7541b46ee2408da366d2dc7c302090 (diff) | |
parent | b7b8fefdd084b51c93b15dfdfb34d2ef294f4d76 (diff) | |
download | forums-0042f071476b75258f5f8ea0b5b9fcb445ffde23.tar forums-0042f071476b75258f5f8ea0b5b9fcb445ffde23.tar.gz forums-0042f071476b75258f5f8ea0b5b9fcb445ffde23.tar.bz2 forums-0042f071476b75258f5f8ea0b5b9fcb445ffde23.tar.xz forums-0042f071476b75258f5f8ea0b5b9fcb445ffde23.zip |
Merge branch 'develop' of github.com:EXreaction/phpbb3 into ticket/11103
Conflicts:
phpBB/install/database_update.php
phpBB/styles/prosilver/template/ucp_prefs_personal.html
phpBB/styles/subsilver2/template/ucp_prefs_personal.html
Diffstat (limited to 'phpBB/includes/lock')
-rw-r--r-- | phpBB/includes/lock/db.php | 2 | ||||
-rw-r--r-- | phpBB/includes/lock/flock.php | 133 |
2 files changed, 134 insertions, 1 deletions
diff --git a/phpBB/includes/lock/db.php b/phpBB/includes/lock/db.php index fa559d6887..6e94dd5a85 100644 --- a/phpBB/includes/lock/db.php +++ b/phpBB/includes/lock/db.php @@ -125,7 +125,7 @@ class phpbb_lock_db * Note: Attempting to release a lock that is already released, * that is, calling release() multiple times, is harmless. * - * @return void + * @return null */ public function release() { diff --git a/phpBB/includes/lock/flock.php b/phpBB/includes/lock/flock.php new file mode 100644 index 0000000000..97bc7dd2b9 --- /dev/null +++ b/phpBB/includes/lock/flock.php @@ -0,0 +1,133 @@ +<?php +/** +* +* @package phpBB3 +* @copyright (c) 2012 phpBB Group +* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2 +* +*/ + +/** +* @ignore +*/ +if (!defined('IN_PHPBB')) +{ + exit; +} + +/** +* File locking class +* @package phpBB3 +*/ +class phpbb_lock_flock +{ + /** + * Path to the file to which access is controlled + * + * @var string + */ + private $path; + + /** + * File pointer for the lock file + * @var string + */ + private $lock_fp; + + /** + * Constructor. + * + * You have to call acquire() to actually acquire the lock. + * + * @param string $path Path to the file to which access is controlled + */ + public function __construct($path) + { + $this->path = $path; + $this->lock_fp = null; + } + + /** + * Tries to acquire the lock. + * + * If the lock is already held by another process, this call will block + * until the other process releases the lock. If a lock is acquired and + * is not released before script finishes but the process continues to + * live (apache/fastcgi) then subsequent processes trying to acquire + * the same lock will be blocked forever. + * + * If the lock is already held by the same process via another instance + * of this class, this call will block forever. + * + * If flock function is disabled in php or fails to work, lock + * acquisition will fail and false will be returned. + * + * @return bool true if lock was acquired + * false otherwise + */ + public function acquire() + { + if ($this->lock_fp) + { + return false; + } + + // For systems that can't have two processes opening + // one file for writing simultaneously + if (file_exists($this->path . '.lock')) + { + $mode = 'rb'; + } + else + { + $mode = 'wb'; + } + + $this->lock_fp = @fopen($this->path . '.lock', $mode); + + if ($mode == 'wb') + { + if (!$this->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'; + $this->lock_fp = @fopen($this->path . '.lock', $mode); + } + else + { + // Only need to set mode when the lock file is written + @chmod($this->path . '.lock', 0666); + } + } + + if ($this->lock_fp) + { + @flock($this->lock_fp, LOCK_EX); + } + + return (bool) $this->lock_fp; + } + + /** + * Releases the lock. + * + * The lock must have been previously obtained, that is, acquire() call + * was issued and returned true. + * + * Note: Attempting to release a lock that is already released, + * that is, calling release() multiple times, is harmless. + * + * @return null + */ + public function release() + { + if ($this->lock_fp) + { + @flock($this->lock_fp, LOCK_UN); + fclose($this->lock_fp); + $this->lock_fp = null; + } + } +} |