diff --git a/cyberwow/lib/controller/process/run.dart b/cyberwow/lib/controller/process/run.dart index 651de52..3b8405e 100644 --- a/cyberwow/lib/controller/process/run.dart +++ b/cyberwow/lib/controller/process/run.dart @@ -30,7 +30,14 @@ import '../helper.dart'; import '../../config.dart' as config; import '../../logging.dart'; -Stream runBinary (final String name, {final Stream input}) async* { +typedef IsExitingFunc = bool Function(); + +Stream runBinary +( + final String name, + final IsExitingFunc isExiting, + {final Stream input} +) async* { final newPath = await getBinaryPath(name); final appDocDir = await getApplicationDocumentsDirectory(); @@ -78,7 +85,10 @@ Stream runBinary (final String name, {final Stream input}) async if (config.isEmu) return; - // the app should never reach here + if (!isExiting()) { + log.warning('process is ded'); + exit(1); + } + log.info('Daemon exited gracefully.'); - // exit(0); } diff --git a/cyberwow/lib/main.dart b/cyberwow/lib/main.dart index 5e338c7..35a8dc1 100644 --- a/cyberwow/lib/main.dart +++ b/cyberwow/lib/main.dart @@ -130,7 +130,7 @@ class _CyberWOW_PageState extends State with WidgetsBindingObserv SyncingState _syncingState = await _loadingState.next(loading, ''); final syncing = process - .runBinary(binName, input: inputStreamController.stream) + .runBinary(binName, _isExiting, input: inputStreamController.stream) .asBroadcastStream(); HookedState _syncedNextState = await _syncingState.next(inputStreamController.sink, syncing); @@ -195,7 +195,7 @@ class _CyberWOW_PageState extends State with WidgetsBindingObserv _exiting = true; inputStreamController.sink.add('exit'); - await Future.delayed(const Duration(seconds: 10), () => null); + await Future.delayed(const Duration(seconds: 5), () => null); // the process controller should call exit(0) for us log.warning('Daemon took too long to shut down!');