summaryrefslogtreecommitdiff
path: root/includes/PoolCounter.php
diff options
context:
space:
mode:
authorPierre Schmitz <pierre@archlinux.de>2010-07-28 11:52:48 +0200
committerPierre Schmitz <pierre@archlinux.de>2010-07-28 11:52:48 +0200
commit222b01f5169f1c7e69762e0e8904c24f78f71882 (patch)
tree8e932e12546bb991357ec48eb1638d1770be7a35 /includes/PoolCounter.php
parent00ab76a6b686e98a914afc1975812d2b1aaa7016 (diff)
update to MediaWiki 1.16.0
Diffstat (limited to 'includes/PoolCounter.php')
-rw-r--r--includes/PoolCounter.php64
1 files changed, 64 insertions, 0 deletions
diff --git a/includes/PoolCounter.php b/includes/PoolCounter.php
new file mode 100644
index 00000000..2564fbc6
--- /dev/null
+++ b/includes/PoolCounter.php
@@ -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();
+ }
+}
+
+