[TASK] Remove XCLASS definitions from cache classes
[Packages/TYPO3.CMS.git] / t3lib / class.t3lib_lock.php
index bd34786..6bd61d9 100644 (file)
@@ -1,51 +1,35 @@
 <?php
 /***************************************************************
-*  Copyright notice
-*
-*  (c) 2008 Michael Stucki (michael@typo3.org)
-*  All rights reserved
-*
-*  This script is part of the TYPO3 project. The TYPO3 project is
-*  free software; you can redistribute it and/or modify
-*  it under the terms of the GNU General Public License as published by
-*  the Free Software Foundation; either version 2 of the License, or
-*  (at your option) any later version.
-*
-*  The GNU General Public License can be found at
-*  http://www.gnu.org/copyleft/gpl.html.
-*  A copy is found in the textfile GPL.txt and important notices to the license
-*  from the author is found in LICENSE.txt distributed with these scripts.
-*
-*
-*  This script is distributed in the hope that it will be useful,
-*  but WITHOUT ANY WARRANTY; without even the implied warranty of
-*  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-*  GNU General Public License for more details.
-*
-*  This copyright notice MUST APPEAR in all copies of the script!
-***************************************************************/
+ *  Copyright notice
+ *
+ *  (c) 2008-2011 Michael Stucki (michael@typo3.org)
+ *  All rights reserved
+ *
+ *  This script is part of the TYPO3 project. The TYPO3 project is
+ *  free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  The GNU General Public License can be found at
+ *  http://www.gnu.org/copyleft/gpl.html.
+ *  A copy is found in the textfile GPL.txt and important notices to the license
+ *  from the author is found in LICENSE.txt distributed with these scripts.
+ *
+ *
+ *  This script is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  This copyright notice MUST APPEAR in all copies of the script!
+ ***************************************************************/
 /**
  * Class for providing locking features in TYPO3
  *
- * $Id$
- *
  * @author     Michael Stucki <michael@typo3.org>
  */
 
-require_once(PATH_t3lib.'class.t3lib_div.php');
-
-
-
-
-
-
-
-
-
-
-
-
-
 
 /**
  * TYPO3 locking class
@@ -60,17 +44,16 @@ require_once(PATH_t3lib.'class.t3lib_div.php');
  * @see        class.t3lib_tstemplate.php, class.tslib_fe.php
  */
 class t3lib_lock {
-       private $method;
-       private $id;            // Identifier used for this lock
-       private $resource;      // Resource used for this lock (can be a file or a semaphore resource)
-       private $filepointer;
-       private $isAcquired = false;
-
-       private $loops = 150;   // Number of times a locked resource is tried to be acquired. This is only used by manual locks like the "simple" method.
-       private $step = 200;    // Milliseconds after lock acquire is retried. $loops * $step results in the maximum delay of a lock. Only used by manual locks like the "simple" method.
-
-
+       protected $method;
+       protected $id; // Identifier used for this lock
+       protected $resource; // Resource used for this lock (can be a file or a semaphore resource)
+       protected $filepointer;
+       protected $isAcquired = FALSE;
 
+       protected $loops = 150; // Number of times a locked resource is tried to be acquired. This is only used by manual locks like the "simple" method.
+       protected $step = 200; // Milliseconds after lock acquire is retried. $loops * $step results in the maximum delay of a lock. Only used by manual locks like the "simple" method.
+       protected $syslogFacility = 'cms';
+       protected $isLoggingEnabled = TRUE;
 
 
        /**
@@ -81,12 +64,12 @@ class t3lib_lock {
         * @param       string          Define which locking method to use. Defaults to "simple".
         * @param       integer         Number of times a locked resource is tried to be acquired. This is only used by manual locks like the "simple" method.
         * @param       integer         Milliseconds after lock acquire is retried. $loops * $step results in the maximum delay of a lock. Only used by manual locks like the "simple" method.
-        * @return      boolean         Returns true unless something went wrong
+        * @return      boolean         Returns TRUE unless something went wrong
         */
-       public function __construct($id, $method='', $loops=0, $steps=0)        {
+       public function __construct($id, $method = '', $loops = 0, $step = 0) {
 
                        // Input checks
-               $id = (string)$id;      // Force ID to be string
+               $id = (string) $id; // Force ID to be string
                if (intval($loops)) {
                        $this->loops = intval($loops);
                }
@@ -98,29 +81,29 @@ class t3lib_lock {
                if (in_array($method, array('disable', 'simple', 'flock', 'semaphore'))) {
                        $this->method = $method;
                } else {
-                       throw new Exception('No such method "'.$method.'"');
+                       throw new InvalidArgumentException('No such method "' . $method . '"', 1294586097);
                }
 
-               $success = false;
+               $success = FALSE;
                switch ($this->method) {
                        case 'simple':
                        case 'flock':
-                               $path = PATH_site.'typo3temp/locks/';
+                               $path = PATH_site . 'typo3temp/locks/';
                                if (!is_dir($path)) {
                                        t3lib_div::mkdir($path);
                                }
                                $this->id = md5($id);
-                               $this->resource = $path.$this->id;
-                               $success = true;
+                               $this->resource = $path . $this->id;
+                               $success = TRUE;
                        break;
                        case 'semaphore':
                                $this->id = abs(crc32($id));
-                               if (($this->resource = sem_get($this->id, 1))==true) {
-                                       $success = true;
+                               if (($this->resource = sem_get($this->id, 1)) == TRUE) {
+                                       $success = TRUE;
                                }
                        break;
                        case 'disable':
-                               return false;
+                               return FALSE;
                        break;
                }
 
@@ -142,57 +125,65 @@ class t3lib_lock {
         *
         * It is important to know that the lock will be acquired in any case, even if the request was blocked first. Therefore, the lock needs to be released in every situation.
         *
-        * @return      boolean         Returns true if lock could be acquired without waiting, false otherwise.
+        * @return      boolean         Returns TRUE if lock could be acquired without waiting, FALSE otherwise.
         */
-       public function acquire()       {
-               $noWait = true; // Default is true, which means continue without caring for other clients. In the case of TYPO3s cache management, this has no negative effect except some resource overhead.
-               $isAcquired = true;
+       public function acquire() {
+               $noWait = TRUE; // Default is TRUE, which means continue without caring for other clients. In the case of TYPO3s cache management, this has no negative effect except some resource overhead.
+               $isAcquired = TRUE;
 
                switch ($this->method) {
                        case 'simple':
                                if (is_file($this->resource)) {
                                        $this->sysLog('Waiting for a different process to release the lock');
-                                       $i = 0;
-                                       while ($i<$this->loops) {
-                                               $i++;
-                                               usleep($this->step*1000);
-                                               clearstatcache();
-                                               if (!is_file($this->resource)) {        // Lock became free, leave the loop
-                                                       $this->sysLog('Different process released the lock');
-                                                       $noWait = false;
-                                                       break;
-                                               }
+                                       $maxExecutionTime = ini_get('max_execution_time');
+                                       $maxAge = time() - ($maxExecutionTime ? $maxExecutionTime : 120);
+                                       if (@filectime($this->resource) < $maxAge) {
+                                               @unlink($this->resource);
+                                               $this->sysLog('Unlink stale lockfile');
                                        }
-                               } else {
-                                       $noWait = true;
                                }
 
-                               if (($this->filepointer = touch($this->resource)) == false) {
-                                       throw new Exception('Lock file could not be created');
+                               $isAcquired = FALSE;
+                               for ($i = 0; $i < $this->loops; $i++) {
+                                       $filepointer = @fopen($this->resource, 'x');
+                                       if ($filepointer !== FALSE) {
+                                               fclose($filepointer);
+                                               $this->sysLog('Lock aquired');
+                                               $noWait = ($i === 0);
+                                               $isAcquired = TRUE;
+                                               break;
+                                       }
+                                       usleep($this->step * 1000);
+                               }
+
+                               if (!$isAcquired) {
+                                       throw new RuntimeException('Lock file could not be created', 1294586098);
                                }
+
+                               t3lib_div::fixPermissions($this->resource);
                        break;
                        case 'flock':
-                               if (($this->filepointer = fopen($this->resource, 'w+')) == false) {
-                                       throw new Exception('Lock file could not be opened');
+                               if (($this->filepointer = fopen($this->resource, 'w+')) == FALSE) {
+                                       throw new RuntimeException('Lock file could not be opened', 1294586099);
                                }
 
-                               if (flock($this->filepointer, LOCK_EX|LOCK_NB) == true) {       // Lock without blocking
-                                       $noWait = true;
-                               } elseif (flock($this->filepointer, LOCK_EX) == true) {         // Lock with blocking (waiting for similar locks to become released)
-                                       $noWait = false;
+                               if (flock($this->filepointer, LOCK_EX | LOCK_NB) == TRUE) { // Lock without blocking
+                                       $noWait = TRUE;
+                               } elseif (flock($this->filepointer, LOCK_EX) == TRUE) { // Lock with blocking (waiting for similar locks to become released)
+                                       $noWait = FALSE;
                                } else {
-                                       throw new Exception('Could not lock file "'.$this->resource.'"');
+                                       throw new RuntimeException('Could not lock file "' . $this->resource . '"', 1294586100);
                                }
                        break;
                        case 'semaphore':
                                if (sem_acquire($this->resource)) {
-                                               // Unfortunately it seems not possible to find out if the request was blocked, so we return false in any case to make sure the operation is tried again.
-                                       $noWait = false;
+                                               // Unfortunately it seems not possible to find out if the request was blocked, so we return FALSE in any case to make sure the operation is tried again.
+                                       $noWait = FALSE;
                                }
                        break;
                        case 'disable':
-                               $noWait = false;
-                               $isAcquired = false;
+                               $noWait = FALSE;
+                               $isAcquired = FALSE;
                        break;
                }
 
@@ -203,23 +194,23 @@ class t3lib_lock {
        /**
         * Release the lock
         *
-        * @return      boolean         Returns true on success or false on failure
+        * @return      boolean         Returns TRUE on success or FALSE on failure
         */
-       public function release()       {
+       public function release() {
                if (!$this->isAcquired) {
-                       return true;
+                       return TRUE;
                }
 
-               $success = true;
+               $success = TRUE;
                switch ($this->method) {
                        case 'simple':
-                               if (unlink($this->resource) == false) {
-                                       $success = false;
+                               if (unlink($this->resource) == FALSE) {
+                                       $success = FALSE;
                                }
                        break;
                        case 'flock':
-                               if (flock($this->filepointer, LOCK_UN) == false) {
-                                       $success = false;
+                               if (flock($this->filepointer, LOCK_UN) == FALSE) {
+                                       $success = FALSE;
                                }
                                fclose($this->filepointer);
                                unlink($this->resource);
@@ -228,15 +219,15 @@ class t3lib_lock {
                                if (@sem_release($this->resource)) {
                                        sem_remove($this->resource);
                                } else {
-                                       $success = false;
+                                       $success = FALSE;
                                }
                        break;
                        case 'disable':
-                               $success = false;
+                               $success = FALSE;
                        break;
                }
 
-               $this->isAcquired = false;
+               $this->isAcquired = FALSE;
                return $success;
        }
 
@@ -245,7 +236,7 @@ class t3lib_lock {
         *
         * @return      string          Locking method
         */
-       public function getMethod()     {
+       public function getMethod() {
                return $this->method;
        }
 
@@ -254,7 +245,7 @@ class t3lib_lock {
         *
         * @return      string          Locking ID
         */
-       public function getId() {
+       public function getId() {
                return $this->id;
        }
 
@@ -264,20 +255,38 @@ class t3lib_lock {
         *
         * @return      mixed           Locking resource (filename as string or semaphore as resource)
         */
-       public function getResource()   {
+       public function getResource() {
                return $this->resource;
        }
 
        /**
         * Return the status of a lock
         *
-        * @return      string          Returns true if lock is acquired, false otherwise
+        * @return      string          Returns TRUE if lock is acquired, FALSE otherwise
         */
-       public function getLockStatus() {
+       public function getLockStatus() {
                return $this->isAcquired;
        }
 
        /**
+        * Sets the facility (extension name) for the syslog entry.
+        *
+        * @param string $syslogFacility
+        */
+       public function setSyslogFacility($syslogFacility) {
+               $this->syslogFacility = $syslogFacility;
+       }
+
+       /**
+        * Enable/ disable logging
+        *
+        * @param boolean $isLoggingEnabled
+        */
+       public function setEnableLogging($isLoggingEnabled) {
+               $this->isLoggingEnabled = $isLoggingEnabled;
+       }
+
+       /**
         * Adds a common log entry for this locking API using t3lib_div::sysLog().
         * Example: 25-02-08 17:58 - cms: Locking [simple::0aeafd2a67a6bb8b9543fb9ea25ecbe2]: Acquired
         *
@@ -285,13 +294,15 @@ class t3lib_lock {
         * @param       integer         $severity: Severity - 0 is info (default), 1 is notice, 2 is warning, 3 is error, 4 is fatal error
         * @return      void
         */
-       public function sysLog($message, $severity=0) {
-               t3lib_div::sysLog('Locking ['.$this->method.'::'.$this->id.']: '.trim($message), 'cms', $severity);
+       public function sysLog($message, $severity = 0) {
+               if ($this->isLoggingEnabled) {
+                       t3lib_div::sysLog('Locking [' . $this->method . '::' . $this->id . ']: ' . trim($message), $this->syslogFacility, $severity);
+               }
        }
 }
 
 
-if (defined('TYPO3_MODE') && $TYPO3_CONF_VARS[TYPO3_MODE]['XCLASS']['t3lib/class.t3lib_lock.php'])     {
-       include_once($TYPO3_CONF_VARS[TYPO3_MODE]['XCLASS']['t3lib/class.t3lib_lock.php']);
+if (defined('TYPO3_MODE') && isset($GLOBALS['TYPO3_CONF_VARS'][TYPO3_MODE]['XCLASS']['t3lib/class.t3lib_lock.php'])) {
+       include_once($GLOBALS['TYPO3_CONF_VARS'][TYPO3_MODE]['XCLASS']['t3lib/class.t3lib_lock.php']);
 }
 ?>
\ No newline at end of file