diff options
Diffstat (limited to 'lib')
-rw-r--r-- | lib/iomanager.php | 1 | ||||
-rw-r--r-- | lib/iomaster.php | 25 | ||||
-rw-r--r-- | lib/queuemanager.php | 6 |
3 files changed, 23 insertions, 9 deletions
diff --git a/lib/iomanager.php b/lib/iomanager.php index ee2ff958b..f9d97d6a9 100644 --- a/lib/iomanager.php +++ b/lib/iomanager.php @@ -31,6 +31,7 @@ abstract class IoManager { + const GLOBAL_SINGLE_ONLY = -1; const SINGLE_ONLY = 0; const INSTANCE_PER_SITE = 1; const INSTANCE_PER_PROCESS = 2; diff --git a/lib/iomaster.php b/lib/iomaster.php index ce77b53b2..979f73e75 100644 --- a/lib/iomaster.php +++ b/lib/iomaster.php @@ -32,6 +32,7 @@ class IoMaster public $id; protected $multiSite = false; + protected $includeGlobalSingletons = true; protected $managers = array(); protected $singletons = array(); @@ -47,8 +48,9 @@ class IoMaster $this->monitor = new QueueMonitor(); } - public function init($multiSite=null) + public function init($multiSite=null, $includeGlobalSingletons = true) { + $this->includeGlobalSingletons = $includeGlobalSingletons; if ($multiSite !== null) { $this->multiSite = $multiSite; } @@ -107,7 +109,7 @@ class IoMaster */ protected function instantiate($class) { - if (isset($this->singletons[$class])) { + if (is_string($class) && isset($this->singletons[$class])) { // Already instantiated a multi-site-capable handler. // Just let it know it should listen to this site too! $this->singletons[$class]->addSite(common_config('site', 'server')); @@ -116,25 +118,34 @@ class IoMaster $manager = $this->getManager($class); + $caps = $manager->multiSite(); if ($this->multiSite) { - $caps = $manager->multiSite(); if ($caps == IoManager::SINGLE_ONLY) { throw new Exception("$class can't run with --all; aborting."); } - if ($caps == IoManager::INSTANCE_PER_PROCESS) { + if ($caps == IoManager::INSTANCE_PER_PROCESS || + ( $this->includeGlobalSingletons && $caps == IoManager::GLOBAL_SINGLE_ONLY )) { // Save this guy for later! // We'll only need the one to cover multiple sites. - $this->singletons[$class] = $manager; + if (is_string($class)){ + $this->singletons[$class] = $manager; + } $manager->addSite(common_config('site', 'server')); } } - $this->managers[] = $manager; + if( $this->includeGlobalSingletons || $caps != IoManager::GLOBAL_SINGLE_ONLY ) { + $this->managers[] = $manager; + } } protected function getManager($class) { - return call_user_func(array($class, 'get')); + if(is_object($class)){ + return $class; + }else{ + return call_user_func(array($class, 'get')); + } } /** diff --git a/lib/queuemanager.php b/lib/queuemanager.php index 291174d3c..b20a93468 100644 --- a/lib/queuemanager.php +++ b/lib/queuemanager.php @@ -119,7 +119,9 @@ abstract class QueueManager extends IoManager { if (isset($this->handlers[$queue])) { $class = $this->handlers[$queue]; - if (class_exists($class)) { + if(is_object($class)) { + return $class; + } else if (class_exists($class)) { return new $class(); } else { common_log(LOG_ERR, "Nonexistent handler class '$class' for queue '$queue'"); @@ -182,7 +184,7 @@ abstract class QueueManager extends IoManager * Only registered transports will be reliably picked up! * * @param string $transport - * @param string $class + * @param string $class class name or object instance */ public function connect($transport, $class) { |