]> scripts.mit.edu Git - autoinstallsdev/mediawiki.git/blobdiff - includes/PoolCounter.php
MediaWiki 1.16.0
[autoinstallsdev/mediawiki.git] / includes / PoolCounter.php
diff --git a/includes/PoolCounter.php b/includes/PoolCounter.php
new file mode 100644 (file)
index 0000000..2564fbc
--- /dev/null
@@ -0,0 +1,64 @@
+<?php
+
+abstract class PoolCounter {
+       public static function factory( $type, $key ) {
+               global $wgPoolCounterConf;
+               if ( !isset( $wgPoolCounterConf[$type] ) ) {
+                       return new PoolCounter_Stub;
+               }
+               $conf = $wgPoolCounterConf[$type];
+               $class = $conf['class'];
+               return new $class( $conf, $type, $key );
+       }
+
+       abstract public function acquire();
+       abstract public function release();
+       abstract public function wait();
+
+       public function executeProtected( $mainCallback, $dirtyCallback = false ) {
+               $status = $this->acquire();
+               if ( !$status->isOK() ) {
+                       return $status;
+               }
+               if ( !empty( $status->value['overload'] ) ) {
+                       # Overloaded. Try a dirty cache entry.
+                       if ( $dirtyCallback ) {
+                               if ( call_user_func( $dirtyCallback ) ) {
+                                       $this->release();
+                                       return Status::newGood();
+                               }
+                       }
+
+                       # Wait for a thread
+                       $status = $this->wait();
+                       if ( !$status->isOK() ) {
+                               $this->release();
+                               return $status;
+                       }
+               }
+               # Call the main callback
+               call_user_func( $mainCallback );
+               return $this->release();
+       }
+}
+
+class PoolCounter_Stub extends PoolCounter {
+       public function acquire() {
+               return Status::newGood();
+       }
+
+       public function release() {
+               return Status::newGood();
+       }
+
+       public function wait() {
+               return Status::newGood();
+       }
+
+       public function executeProtected( $mainCallback, $dirtyCallback = false ) {
+               call_user_func( $mainCallback );
+               return Status::newGood();
+       }
+}
+
+