From 060659dc92aad011fcc439663aaf83f40491b5a2 Mon Sep 17 00:00:00 2001 From: Daniil Gentili Date: Thu, 30 May 2019 17:22:28 +0200 Subject: [PATCH] Improved update signaling --- .../MadelineProto/Loop/Update/FeedLoop.php | 10 +------ .../MadelineProto/Loop/Update/UpdateLoop.php | 10 +------ src/danog/MadelineProto/MTProto.php | 1 - .../MTProtoTools/UpdateHandler.php | 27 ++++++++++++++++++- src/danog/MadelineProto/Wrappers/Loop.php | 3 +-- 5 files changed, 29 insertions(+), 22 deletions(-) diff --git a/src/danog/MadelineProto/Loop/Update/FeedLoop.php b/src/danog/MadelineProto/Loop/Update/FeedLoop.php index 9d6dd3b1..7688dc4d 100644 --- a/src/danog/MadelineProto/Loop/Update/FeedLoop.php +++ b/src/danog/MadelineProto/Loop/Update/FeedLoop.php @@ -96,15 +96,7 @@ class FeedLoop extends ResumableSignalLoop yield $API->save_update_async($update); } $this->parsedUpdates = []; - if ($API->update_deferred) { - Loop::defer(function () use ($API) { - if ($API->update_deferred) { - $API->logger->logger("Resuming deferred in $this", Logger::VERBOSE); - $API->update_deferred->resolve(); - $API->logger->logger("Done resuming deferred in $this", Logger::VERBOSE); - } - }); - } + $this->API->signalUpdate(); } } diff --git a/src/danog/MadelineProto/Loop/Update/UpdateLoop.php b/src/danog/MadelineProto/Loop/Update/UpdateLoop.php index 8bb01d53..5cefa46c 100644 --- a/src/danog/MadelineProto/Loop/Update/UpdateLoop.php +++ b/src/danog/MadelineProto/Loop/Update/UpdateLoop.php @@ -164,15 +164,7 @@ class UpdateLoop extends ResumableSignalLoop foreach ($result as $channelId => $boh) { $this->API->feeders[$channelId]->resumeDefer(); } - if ($API->update_deferred) { - Loop::defer(function () use ($API) { - if ($API->update_deferred) { - $API->logger->logger("Resuming deferred in $this", Logger::VERBOSE); - $API->update_deferred->resolve(); - $API->logger->logger("Done resuming deferred in $this", Logger::VERBOSE); - } - }); - } + $this->API->signalUpdate(); if (yield $this->waitSignal($this->pause($timeout))) { $API->logger->logger("Exiting $this"); diff --git a/src/danog/MadelineProto/MTProto.php b/src/danog/MadelineProto/MTProto.php index 31b79795..97d02bc6 100644 --- a/src/danog/MadelineProto/MTProto.php +++ b/src/danog/MadelineProto/MTProto.php @@ -148,7 +148,6 @@ class MTProto extends AsyncConstruct implements TLCallback private $postpone_updates = false; private $supportUser = 0; public $referenceDatabase; - public $update_deferred; public $phoneConfigWatcherId; public $feeders = []; public $updaters = []; diff --git a/src/danog/MadelineProto/MTProtoTools/UpdateHandler.php b/src/danog/MadelineProto/MTProtoTools/UpdateHandler.php index b8ba9d49..74bd56b5 100644 --- a/src/danog/MadelineProto/MTProtoTools/UpdateHandler.php +++ b/src/danog/MadelineProto/MTProtoTools/UpdateHandler.php @@ -25,6 +25,7 @@ use Amp\Delayed; use function Amp\Promise\any; use danog\MadelineProto\Loop\Update\FeedLoop; use danog\MadelineProto\Loop\Update\UpdateLoop; +use Amp\Loop; /** * Manages updates. @@ -80,7 +81,7 @@ trait UpdateHandler if (!$params['timeout']) { $params['timeout'] = 0.001; } - yield any([$this->update_deferred->promise(), new Delayed($params['timeout'] * 1000)]); + yield any([$this->waitUpdate(), new Delayed($params['timeout'] * 1000)]); } if (empty($this->updates)) { @@ -101,6 +102,30 @@ trait UpdateHandler return $updates; } + public $update_resolved = false; + public $update_deferred; + + public function waitUpdate() + { + if (!$this->update_deferred) { + $this->update_deferred = new Deferred; + } + yield $this->update_deferred->promise(); + $this->update_resolved = false; + $this->update_deferred = new Deferred; + } + public function signalUpdate() + { + if (!$this->update_deferred) { + $this->update_deferred = new Deferred; + } + Loop::defer(function () { + if (!$this->update_resolved) { + $this->update_resolved = true; + $this->update_deferred->resolve(); + } + }); + } public function check_msg_id($message) { diff --git a/src/danog/MadelineProto/Wrappers/Loop.php b/src/danog/MadelineProto/Wrappers/Loop.php index e1095b28..f3933d11 100644 --- a/src/danog/MadelineProto/Wrappers/Loop.php +++ b/src/danog/MadelineProto/Wrappers/Loop.php @@ -123,8 +123,7 @@ trait Loop $controller->discard(); } }); - $this->update_deferred = new Deferred(); - yield $this->update_deferred->promise(); + yield $this->waitUpdate(); } } public function closeConnection($message = 'OK!')