Skip to content

Commit a27fa37

Browse files
authored
Add files via upload
1 parent 0e03338 commit a27fa37

File tree

2 files changed

+45
-44
lines changed

2 files changed

+45
-44
lines changed

src/vennv/vapm/EventLoop.php

Lines changed: 30 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323

2424
namespace vennv\vapm;
2525

26+
use Generator;
2627
use SplObjectStorage;
2728
use Throwable;
2829
use function count;
@@ -44,9 +45,9 @@ public static function isQueue(int $id): bool;
4445
public static function getQueue(int $id): ?Promise;
4546

4647
/**
47-
* @return SplObjectStorage
48+
* @return Generator
4849
*/
49-
public static function getQueues(): SplObjectStorage;
50+
public static function getQueues(): Generator;
5051

5152
public static function addReturn(Promise $promise): void;
5253

@@ -57,9 +58,9 @@ public static function isReturn(int $id): bool;
5758
public static function getReturn(int $id): ?Promise;
5859

5960
/**
60-
* @return SplObjectStorage
61+
* @return Generator
6162
*/
62-
public static function getReturns(): SplObjectStorage;
63+
public static function getReturns(): Generator;
6364

6465
}
6566

@@ -74,14 +75,14 @@ class EventLoop implements EventLoopInterface
7475
protected static SplObjectStorage $queues;
7576

7677
/**
77-
* @var SplObjectStorage
78+
* @var array<int, Promise>
7879
*/
79-
protected static SplObjectStorage $returns;
80+
protected static array $returns = [];
81+
protected static bool $isCleaningGarbage = false;
8082

8183
public static function init(): void
8284
{
8385
if (!isset(self::$queues)) self::$queues = new SplObjectStorage();
84-
if (!isset(self::$returns)) self::$returns = new SplObjectStorage();
8586
}
8687

8788
public static function generateId(): int
@@ -97,11 +98,8 @@ public static function addQueue(Promise $promise): void
9798

9899
public static function removeQueue(int $id): void
99100
{
100-
/**
101-
* @var Promise $promise
102-
*/
103101
foreach (self::$queues as $promise) {
104-
if ($promise->getId() === $id) {
102+
if ($promise instanceof Promise && $promise->getId() === $id) {
105103
self::$queues->offsetUnset($promise);
106104
break;
107105
}
@@ -123,57 +121,51 @@ public static function getQueue(int $id): ?Promise
123121
}
124122

125123
/**
126-
* @return SplObjectStorage
124+
* @return Generator
127125
*/
128-
public static function getQueues(): SplObjectStorage
126+
public static function getQueues(): Generator
129127
{
130-
return self::$queues;
128+
foreach (self::$queues as $promise) {
129+
yield $promise;
130+
}
131131
}
132132

133133
public static function addReturn(Promise $promise): void
134134
{
135-
if (!self::getReturn($promise->getId())) self::$returns->offsetSet($promise);
135+
if (!isset(self::$returns[$promise->getId()])) self::$returns[$promise->getId()] = $promise;
136136
}
137137

138138
public static function isReturn(int $id): bool
139139
{
140-
/* @var Promise $promise */
141-
foreach (self::$returns as $promise) if ($promise instanceof Promise && $promise->getId() === $id) return true;
142-
return false;
140+
return isset(self::$returns[$id]);
143141
}
144142

145143
public static function removeReturn(int $id): void
146144
{
147-
/**
148-
* @var Promise $promise
149-
*/
150-
foreach (self::$returns as $promise) {
151-
if ($promise->getId() === $id) {
152-
self::$returns->offsetUnset($promise);
153-
break;
154-
}
155-
}
145+
if (self::isReturn($id)) unset(self::$returns[$id]);
156146
}
157147

158148
public static function getReturn(int $id): ?Promise
159149
{
160-
/* @var Promise $promise */
161-
foreach (self::$returns as $promise) if ($promise instanceof Promise && $promise->getId() === $id) return $promise;
162-
return null;
150+
return self::$returns[$id] ?? null;
163151
}
164152

165153
/**
166-
* @return SplObjectStorage
154+
* @return Generator
167155
*/
168-
public static function getReturns(): SplObjectStorage
156+
public static function getReturns(): Generator
169157
{
170-
return self::$returns;
158+
foreach (self::$returns as $id => $promise) {
159+
yield $id => $promise;
160+
}
171161
}
172162

163+
/**
164+
* @throws Throwable
165+
*/
173166
private static function clearGarbage(): void
174167
{
175-
/* @var Promise $promise */
176-
foreach (self::$returns as $promise) if ($promise instanceof Promise && $promise->canDrop()) self::removeReturn($promise->getId());
168+
foreach (self::getReturns() as $id => $promise) if ($promise instanceof Promise && $promise->canDrop()) unset(self::$returns[$id]);
177169
}
178170

179171
/**
@@ -186,7 +178,7 @@ protected static function run(): void
186178
/**
187179
* @var Promise $promise
188180
*/
189-
foreach (self::$queues as $promise) {
181+
foreach (self::getQueues() as $promise) {
190182
$id = $promise->getId();
191183
$fiber = $promise->getFiber();
192184

@@ -203,7 +195,7 @@ protected static function run(): void
203195
echo $e->getMessage();
204196
}
205197
MicroTask::addTask($id, $promise);
206-
self::removeQueue($id);
198+
self::$queues->offsetUnset($promise); // Remove from queue
207199
}
208200
}
209201

@@ -221,4 +213,4 @@ protected static function runSingle(): void
221213
while (count(self::$queues) > 0 || count(MicroTask::getTasks()) > 0 || count(MacroTask::getTasks()) > 0 || count(GreenThread::getFibers()) > 0) self::run();
222214
}
223215

224-
}
216+
}

src/vennv/vapm/Promise.php

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -391,7 +391,7 @@ public function finally(callable $callback): Promise
391391
return $this;
392392
}
393393

394-
/**
394+
/**
395395
* @throws Throwable
396396
*/
397397
public function useCallbacks(): void
@@ -402,11 +402,12 @@ public function useCallbacks(): void
402402
$callbacks = $this->callbacksResolve;
403403

404404
/** @var callable $master */
405-
$master = $callbacks["master"];
406-
407-
$this->result = call_user_func($master, $result);
405+
$master = $callbacks["master"] ?? null;
408406

409-
unset($callbacks["master"]);
407+
if (is_callable($master)) {
408+
$this->result = call_user_func($master, $result);
409+
unset($callbacks["master"]);
410+
}
410411

411412
if (count($callbacks) > 0) {
412413
/** @var callable $callback */
@@ -497,6 +498,7 @@ public static function all(array $promises): Promise
497498
if ($return?->isRejected() === true) {
498499
$reject($return->getResult());
499500
$isSolved = true;
501+
break;
500502
}
501503

502504
if ($return?->isResolved() === true) {
@@ -509,6 +511,7 @@ public static function all(array $promises): Promise
509511
$resolve($results);
510512
$isSolved = true;
511513
}
514+
FiberManager::wait();
512515
}
513516

514517
if (!$isSolved) FiberManager::wait();
@@ -549,6 +552,7 @@ public static function allSettled(array $promises): Promise
549552
$resolve($results);
550553
$isSolved = true;
551554
}
555+
FiberManager::wait();
552556
}
553557

554558
if (!$isSolved === false) FiberManager::wait();
@@ -587,13 +591,15 @@ public static function any(array $promises): Promise
587591
if ($return?->isResolved() === true) {
588592
$resolve($return->getResult());
589593
$isSolved = true;
594+
break;
590595
}
591596
}
592597

593598
if (count($results) === $count) {
594599
$reject($results);
595600
$isSolved = true;
596601
}
602+
FiberManager::wait();
597603
}
598604

599605
if ($isSolved === false) FiberManager::wait();
@@ -624,13 +630,16 @@ public static function race(array $promises): Promise
624630
if ($return?->isRejected() === true) {
625631
$reject($return->getResult());
626632
$isSolved = true;
633+
break;
627634
}
628635

629636
if ($return?->isResolved() === true) {
630637
$resolve($return->getResult());
631638
$isSolved = true;
639+
break;
632640
}
633641
}
642+
FiberManager::wait();
634643
}
635644

636645
if ($isSolved === false) FiberManager::wait();
@@ -642,4 +651,4 @@ public static function race(array $promises): Promise
642651
return $promise;
643652
}
644653

645-
}
654+
}

0 commit comments

Comments
 (0)