1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980 |
- <?php
- declare(strict_types=1);
- /**
- * This file is part of Hyperf.
- *
- * @link https://www.hyperf.io
- * @document https://hyperf.wiki
- * @contact group@hyperf.io
- * @license https://github.com/hyperf/hyperf/blob/master/LICENSE
- */
- namespace Hyperf\Coroutine;
- use BadMethodCallException;
- use Hyperf\Engine\Channel;
- use InvalidArgumentException;
- /**
- * This file mostly code come from `swoole/library`.
- */
- class WaitGroup
- {
- protected Channel $chan;
- protected int $count = 0;
- protected bool $waiting = false;
- public function __construct(int $delta = 0)
- {
- $this->chan = new Channel(1);
- if ($delta > 0) {
- $this->add($delta);
- }
- }
- public function add(int $delta = 1): void
- {
- if ($this->waiting) {
- throw new BadMethodCallException('WaitGroup misuse: add called concurrently with wait');
- }
- $count = $this->count + $delta;
- if ($count < 0) {
- throw new InvalidArgumentException('WaitGroup misuse: negative counter');
- }
- $this->count = $count;
- }
- public function done(): void
- {
- $count = $this->count - 1;
- if ($count < 0) {
- throw new BadMethodCallException('WaitGroup misuse: negative counter');
- }
- $this->count = $count;
- if ($count === 0 && $this->waiting) {
- $this->chan->push(true);
- }
- }
- public function wait(float $timeout = -1): bool
- {
- if ($this->waiting) {
- throw new BadMethodCallException('WaitGroup misuse: reused before previous wait has returned');
- }
- if ($this->count > 0) {
- $this->waiting = true;
- $done = $this->chan->pop($timeout);
- $this->waiting = false;
- return $done;
- }
- return true;
- }
- public function count(): int
- {
- return $this->count;
- }
- }
|