Пример #1
0
 public function ensureActive()
 {
     $isOwner = false;
     if (!$this->hasFaulted && count($this->queue) > 0) {
         $isOwner = !$this->isAcquired;
         $this->isAcquired = true;
     }
     if (!$isOwner) {
         return;
     }
     $this->disposable->setDisposable($this->scheduler->scheduleRecursive(function ($recurse) {
         $parent = $this;
         if (count($parent->queue) > 0) {
             $work = array_shift($parent->queue);
         } else {
             $parent->isAcquired = false;
             return;
         }
         try {
             if (!is_callable($work)) {
                 throw new Exception("work is not callable");
             }
             $res = $work();
         } catch (Exception $e) {
             $res = $e;
         }
         if ($res instanceof Exception) {
             $parent->queue = [];
             $parent->hasFaulted = true;
             throw $res;
         }
         $recurse($parent);
     }));
 }