From 4a9e2f59d0435f6e60494bd48ba5e0306d402cf2 Mon Sep 17 00:00:00 2001 From: Vishesh Handa Date: Sun, 15 Mar 2020 00:26:14 +0100 Subject: [PATCH] MdYamlDocLoader: Avoid starting the isolate multiple times Man, there is a lot of locking that I hadn't even thought of while writing all of this code. --- lib/core/md_yaml_doc_loader.dart | 16 ++++++++++++---- pubspec.lock | 7 +++++++ pubspec.yaml | 1 + 3 files changed, 20 insertions(+), 4 deletions(-) diff --git a/lib/core/md_yaml_doc_loader.dart b/lib/core/md_yaml_doc_loader.dart index 293843c8..e75ad0bf 100644 --- a/lib/core/md_yaml_doc_loader.dart +++ b/lib/core/md_yaml_doc_loader.dart @@ -1,6 +1,8 @@ import 'dart:io'; import 'dart:isolate'; +import 'package:synchronized/synchronized.dart'; + import 'package:gitjournal/core/md_yaml_doc.dart'; import 'package:gitjournal/core/md_yaml_doc_codec.dart'; @@ -9,13 +11,19 @@ class MdYamlDocLoader { ReceivePort _receivePort = ReceivePort(); SendPort _sendPort; + var _loadingLock = Lock(); + Future _initIsolate() async { if (_isolate != null) return; - _isolate = await Isolate.spawn(_isolateMain, _receivePort.sendPort); - var data = await _receivePort.first; - assert(data is SendPort); - _sendPort = data as SendPort; + return await _loadingLock.synchronized(() async { + if (_isolate != null) return; + _isolate = await Isolate.spawn(_isolateMain, _receivePort.sendPort); + + var data = await _receivePort.first; + assert(data is SendPort); + _sendPort = data as SendPort; + }); } Future loadDoc(String filePath) async { diff --git a/pubspec.lock b/pubspec.lock index a7d2dd9d..fa449f28 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -640,6 +640,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.0.5" + synchronized: + dependency: "direct main" + description: + name: synchronized + url: "https://pub.dartlang.org" + source: hosted + version: "2.2.0" term_glyph: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index 031dec6c..201b913f 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -36,6 +36,7 @@ dependencies: connectivity: ^0.4.6+1 flutter_emoji: ">= 2.0.0" git_url_parse2: ^0.0.1 + synchronized: ^2.2.0 dev_dependencies: flutter_launcher_icons: "^0.7.2"