From dc102bd9e81fd4f54bba004ea586c5cd8a441f63 Mon Sep 17 00:00:00 2001
From: John Preston <johnprestonmail@gmail.com>
Date: Sat, 22 Jun 2019 12:36:35 +0200
Subject: [PATCH] Finish working with localstorage before ~AuthSession.

---
 Telegram/SourceFiles/calls/calls_instance.cpp | 2 +-
 Telegram/SourceFiles/core/application.cpp     | 5 ++++-
 Telegram/SourceFiles/storage/localstorage.cpp | 6 +++++-
 3 files changed, 10 insertions(+), 3 deletions(-)

diff --git a/Telegram/SourceFiles/calls/calls_instance.cpp b/Telegram/SourceFiles/calls/calls_instance.cpp
index 0fade207c..24f6f5655 100644
--- a/Telegram/SourceFiles/calls/calls_instance.cpp
+++ b/Telegram/SourceFiles/calls/calls_instance.cpp
@@ -228,7 +228,7 @@ bool Instance::isQuitPrevent() {
 	if (!_currentCall) {
 		return false;
 	}
-	LOG(("Calls::Instance prevents quit, saving drafts..."));
+	LOG(("Calls::Instance prevents quit, hanging up a call..."));
 	return true;
 }
 
diff --git a/Telegram/SourceFiles/core/application.cpp b/Telegram/SourceFiles/core/application.cpp
index eca9579f9..743d20467 100644
--- a/Telegram/SourceFiles/core/application.cpp
+++ b/Telegram/SourceFiles/core/application.cpp
@@ -103,6 +103,10 @@ Application::~Application() {
 	_window.reset();
 	_mediaView.reset();
 
+	// This can call writeMap() that serializes AuthSession.
+	// In case it gets called after authSessionDestroy() we get missing data.
+	Local::finish();
+
 	// Some MTP requests can be cancelled from data clearing.
 	authSessionDestroy();
 
@@ -126,7 +130,6 @@ Application::~Application() {
 	Media::Player::finish(_audio.get());
 	style::stopManager();
 
-	Local::finish();
 	Global::finish();
 	ThirdParty::finish();
 
diff --git a/Telegram/SourceFiles/storage/localstorage.cpp b/Telegram/SourceFiles/storage/localstorage.cpp
index 1fe02b343..09935dff5 100644
--- a/Telegram/SourceFiles/storage/localstorage.cpp
+++ b/Telegram/SourceFiles/storage/localstorage.cpp
@@ -709,6 +709,8 @@ AuthSessionSettings &GetStoredAuthSessionCache() {
 void _writeMap(WriteMapWhen when = WriteMapWhen::Soon);
 
 void _writeLocations(WriteMapWhen when = WriteMapWhen::Soon) {
+	Expects(_manager != nullptr);
+
 	if (when != WriteMapWhen::Now) {
 		_manager->writeLocations(when == WriteMapWhen::Fast);
 		return;
@@ -2398,6 +2400,8 @@ ReadMapState _readMap(const QByteArray &pass) {
 }
 
 void _writeMap(WriteMapWhen when) {
+	Expects(_manager != nullptr);
+
 	if (when != WriteMapWhen::Now) {
 		_manager->writeMap(when == WriteMapWhen::Fast);
 		return;
@@ -2530,7 +2534,7 @@ void finish() {
 		_writeMap(WriteMapWhen::Now);
 		_manager->finish();
 		_manager->deleteLater();
-		_manager = 0;
+		_manager = nullptr;
 		delete base::take(_localLoader);
 	}
 }