Files
kiri-core/kiri-engine/Pool/PoolItem.php
T

115 lines
1.6 KiB
PHP
Raw Normal View History

2023-04-03 13:45:59 +08:00
<?php
namespace Kiri\Pool;
use Kiri\Annotation\Inject;
use Kiri\Di\Context;
use Swoole\Coroutine\Channel;
class PoolItem
{
/**
* @var PoolQueue
*/
private PoolQueue $_items;
/**
* @var int
*/
private int $created = 0;
/**
* @param int $maxCreated
* @param \Closure $callback
*/
public function __construct(readonly public int $maxCreated, readonly public \Closure $callback)
{
$this->_items = new PoolQueue($this->maxCreated);
}
/**
* @param PoolQueue $items
*/
public function setItems(PoolQueue $items): void
{
$this->_items = $items;
}
/**
* @param mixed $item
* @return void
*/
public function push(mixed $item): void
{
$this->_items->push($item);
}
/**
* @return bool
*/
public function isEmpty(): bool
{
return $this->_items->isEmpty();
}
/**
* @return bool
*/
public function size(): bool
{
return $this->_items->length();
}
/**
* @return bool
*/
public function close(): bool
{
return $this->_items->close();
}
/**
* @param int $min
* @return void
*/
public function tailor(int $min = 0): void
{
while ($this->_items->length() > $min) {
$connection = $this->_items->pop(0.000001);
if ($connection instanceof StopHeartbeatCheck) {
$connection->stopHeartbeatCheck();
}
$connection = null;
$this->created -= 1;
}
}
/**
* @param int $waite
* @return mixed
*/
public function pop(int $waite = 10): mixed
{
2023-04-05 11:32:56 +08:00
if ($this->_items->isEmpty() && $this->created < $this->maxCreated) {
2023-04-05 11:17:55 +08:00
$callback = $this->callback;
2023-04-05 13:54:36 +08:00
$client = call_user_func($callback);
2023-04-05 11:17:55 +08:00
2023-04-03 13:45:59 +08:00
$this->created += 1;
2023-04-05 11:17:55 +08:00
return $client;
2023-04-03 13:45:59 +08:00
}
return $this->_items->pop($waite);
}
}