blob: 2564fbc67f02a5287f321a9d1db6055650f75cb3 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
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();
}
}
|