This commit is contained in:
Daniil Gentili 2020-07-10 14:50:00 +02:00
parent bd07a2b4b9
commit 7d29bd84bc
Signed by: danog
GPG Key ID: 8C1BE3B34B230CA7
3 changed files with 16 additions and 6 deletions

View File

@ -91,6 +91,13 @@ class API extends InternalDoc
*/ */
private $wrapper; private $wrapper;
/**
* Global session unlock callback
*
* @var callback
*/
private $unlock;
/** /**
* Magic constructor function. * Magic constructor function.
@ -127,7 +134,8 @@ class API extends InternalDoc
{ {
Logger::constructorFromSettings($settings); Logger::constructorFromSettings($settings);
$this->session = $session = Tools::absolute($session); $this->session = $session = Tools::absolute($session);
if ($unserialized = yield from Serialization::legacyUnserialize($session)) { [$unserialized, $this->unlock] = yield from Serialization::legacyUnserialize($session);
if ($unserialized) {
$unserialized->storage = $unserialized->storage ?? []; $unserialized->storage = $unserialized->storage ?? [];
$unserialized->session = $session; $unserialized->session = $session;
APIWrapper::link($this, $unserialized); APIWrapper::link($this, $unserialized);
@ -185,6 +193,7 @@ class API extends InternalDoc
} }
$this->destructing = true; $this->destructing = true;
Tools::wait($this->wrapper->serialize()); Tools::wait($this->wrapper->serialize());
if ($this->unlock) ($this->unlock)();
} else { } else {
$this->logger->logger('Shutting down MadelineProto (old deserialized instance of API)'); $this->logger->logger('Shutting down MadelineProto (old deserialized instance of API)');
} }

View File

@ -161,7 +161,7 @@ final class APIWrapper
} }
/** /**
* Serialie session. * Serialize session.
* *
* @return Promise * @return Promise
*/ */

View File

@ -68,11 +68,11 @@ class Serialization
Loop::unreference($warningId); Loop::unreference($warningId);
}); });
Loop::unreference($warningId); Loop::unreference($warningId);
$unlock = yield Tools::flock($realpaths['session_lockfile'], LOCK_EX, 1); $unlockGlobal = yield Tools::flock($realpaths['session_lockfile'], LOCK_EX, 1);
Loop::cancel($warningId); Loop::cancel($warningId);
Shutdown::addCallback(static function () use ($unlock) { $tempId = Shutdown::addCallback($unlockGlobal = static function () use ($unlockGlobal) {
Logger::log("Unlocking exclusive session lock!"); Logger::log("Unlocking exclusive session lock!");
$unlock(); $unlockGlobal();
Logger::log("Unlocked exclusive session lock!"); Logger::log("Unlocked exclusive session lock!");
}); });
Logger::log("Got exclusive session lock!"); Logger::log("Got exclusive session lock!");
@ -146,7 +146,8 @@ class Serialization
if ($unserialized === false) { if ($unserialized === false) {
throw new Exception(\danog\MadelineProto\Lang::$current_lang['deserialization_error']); throw new Exception(\danog\MadelineProto\Lang::$current_lang['deserialization_error']);
} }
return $unserialized; Shutdown::removeCallback($tempId);
return [$unserialized, $unlockGlobal];
} }
} }
} }