summaryrefslogtreecommitdiff
path: root/includes/PoolCounter.php
diff options
context:
space:
mode:
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();
+ }
+}
+
+