https://www.mediawiki.org/wiki/Special:Code/MediaWiki/106298

Revision: 106298
Author:   aaron
Date:     2011-12-15 01:13:29 +0000 (Thu, 15 Dec 2011)
Log Message:
-----------
Refactored FileBackendScopedLock class into more general ScopedLock class

Modified Paths:
--------------
    branches/FileBackend/phase3/includes/filerepo/backend/FileBackend.php
    branches/FileBackend/phase3/includes/filerepo/backend/LockManager.php

Modified: branches/FileBackend/phase3/includes/filerepo/backend/FileBackend.php
===================================================================
--- branches/FileBackend/phase3/includes/filerepo/backend/FileBackend.php       
2011-12-15 01:02:25 UTC (rev 106297)
+++ branches/FileBackend/phase3/includes/filerepo/backend/FileBackend.php       
2011-12-15 01:13:29 UTC (rev 106298)
@@ -409,7 +409,7 @@
         * @return FileBackendScopedLock|null Returns null on failure
         */
        final public function getScopedFileLocks( array $paths, $type, Status 
$status ) {
-               return FileBackendScopedLock::factory( $this, $paths, $type, 
$status );
+               return ScopedLock::factory( $this->lockManager, $paths, $type, 
$status );
        }
 }
 
@@ -782,65 +782,3 @@
                return $relStoragePath;
        }
 }
-
-/**
- * Class to handle scoped locks, which release when the object is destroyed
- */
-class FileBackendScopedLock {
-       /** @var FileBackendBase */
-       protected $backend;
-       /** @var Status */
-       protected $status;
-       /** @var Array List of storage paths*/
-       protected $paths;
-       protected $type; // integer lock type
-
-       /**
-        * @param $backend FileBackendBase
-        * @param $paths Array List of storage paths
-        * @param $type integer LockManager::LOCK_EX, LockManager::LOCK_SH
-        * @param $status Status
-        */
-       protected function __construct(
-               FileBackendBase $backend, array $paths, $type, Status $status
-       ) {
-          $this->backend = $backend;
-          $this->paths = $paths;
-          $this->status = $status;
-          $this->type = $type;
-       }
-
-       protected function __clone() {}
-
-       /**
-        * Get a status object resulting from an attempt to lock files.
-        * If the attempt is sucessful, the value of the status will be
-        * FileBackendScopedLock object which releases the locks when
-        * it goes out of scope. Otherwise, the value will be null.
-        * 
-        * @param $backend FileBackendBase
-        * @param $files Array List of storage paths
-        * @param $type integer LockManager::LOCK_EX, LockManager::LOCK_SH
-        * @param $status Status
-        * @return FileBackendScopedLock|null 
-        */
-       public static function factory(
-               FileBackendBase $backend, array $files, $type, Status $status
-       ) {
-               $lockStatus = $backend->lockFiles( $files, $type );
-               $status->merge( $lockStatus );
-               if ( $lockStatus->isOK() ) {
-                       return new self( $backend, $files, $type, $status );
-               }
-               return null;
-       }
-
-       function __destruct() {
-               $wasOk = $this->status->isOK();
-               $this->status->merge( $this->backend->unlockFiles( 
$this->paths, $this->type ) );
-               if ( $wasOk ) {
-                       // Make sure status is OK, despite any unlockFiles() 
fatals     
-                       $this->status->setResult( true, $this->status->value );
-               }
-       }
-}

Modified: branches/FileBackend/phase3/includes/filerepo/backend/LockManager.php
===================================================================
--- branches/FileBackend/phase3/includes/filerepo/backend/LockManager.php       
2011-12-15 01:02:25 UTC (rev 106297)
+++ branches/FileBackend/phase3/includes/filerepo/backend/LockManager.php       
2011-12-15 01:13:29 UTC (rev 106298)
@@ -1,6 +1,6 @@
 <?php
 /**
- * FileBackend helper class for handling file locking.
+ * Class for handling resource locking.
  * Locks on resource keys can either be shared or exclusive.
  * 
  * Implementations must keep track of what is locked by this proccess
@@ -76,6 +76,69 @@
 }
 
 /**
+ * LockManager helper class to handle scoped locks, which
+ * release when an object is destroyed or goes out of scope.
+ */
+class ScopedLock {
+       /** @var LockManager */
+       protected $manager;
+       /** @var Status */
+       protected $status;
+       /** @var Array List of resource paths*/
+       protected $paths;
+
+       protected $type; // integer lock type
+
+       /**
+        * @param $manager LockManager
+        * @param $paths Array List of storage paths
+        * @param $type integer LockManager::LOCK_* constant
+        * @param $status Status
+        */
+       protected function __construct(
+               LockManager $manager, array $paths, $type, Status $status
+       ) {
+          $this->manager = $manager;
+          $this->paths = $paths;
+          $this->status = $status;
+          $this->type = $type;
+       }
+
+       protected function __clone() {}
+
+       /**
+        * Get a ScopedLock object representing a lock on resource paths.
+        * Any locks are released once this object goes out of scope.
+        * The status object is updated with any errors or warnings.
+        * 
+        * @param $manager LockManager
+        * @param $paths Array List of storage paths
+        * @param $type integer LockManager::LOCK_* constant
+        * @param $status Status
+        * @return ScopedLock|null Returns null on failure
+        */
+       public static function factory(
+               LockManager $manager, array $paths, $type, Status $status
+       ) {
+               $lockStatus = $manager->lock( $paths, $type );
+               $status->merge( $lockStatus );
+               if ( $lockStatus->isOK() ) {
+                       return new self( $manager, $paths, $type, $status );
+               }
+               return null;
+       }
+
+       function __destruct() {
+               $wasOk = $this->status->isOK();
+               $this->status->merge( $this->manager->unlock( $this->paths, 
$this->type ) );
+               if ( $wasOk ) {
+                       // Make sure status is OK, despite any unlockFiles() 
fatals     
+                       $this->status->setResult( true, $this->status->value );
+               }
+       }
+}
+
+/**
  * Simple version of LockManager based on using FS lock files.
  * All locks are non-blocking, which avoids deadlocks.
  *


_______________________________________________
MediaWiki-CVS mailing list
MediaWiki-CVS@lists.wikimedia.org
https://lists.wikimedia.org/mailman/listinfo/mediawiki-cvs

Reply via email to