diff --git a/mobile/lib/domain/services/background_worker.service.dart b/mobile/lib/domain/services/background_worker.service.dart index 12c87e0e15..61b88e3ba2 100644 --- a/mobile/lib/domain/services/background_worker.service.dart +++ b/mobile/lib/domain/services/background_worker.service.dart @@ -35,7 +35,6 @@ import 'package:immich_mobile/utils/http_ssl_options.dart'; import 'package:immich_mobile/wm_executor.dart'; import 'package:isar/isar.dart'; import 'package:logging/logging.dart'; -import 'package:worker_manager/worker_manager.dart'; class BackgroundWorkerFgService { final BackgroundWorkerFgHostApi _foregroundHostApi; @@ -94,7 +93,7 @@ class BackgroundWorkerBgService extends BackgroundWorkerFlutterApi { await Future.wait( [ loadTranslations(), - workerManagerForIos.init(dynamicSpawning: true), + workerManagerPatch.init(dynamicSpawning: true), _ref?.read(authServiceProvider).setOpenApiServiceEndpoint(), // Initialize the file downloader FileDownloader().configure( @@ -199,7 +198,7 @@ class BackgroundWorkerBgService extends BackgroundWorkerFlutterApi { _cancellationToken.cancel(); _logger.info("Cleaning up background worker"); final cleanupFutures = [ - workerManagerForIos.dispose().catchError((_) async { + workerManagerPatch.dispose().catchError((_) async { // Discard any errors on the dispose call return; }), diff --git a/mobile/lib/main.dart b/mobile/lib/main.dart index bc71d93137..d3372ac5a0 100644 --- a/mobile/lib/main.dart +++ b/mobile/lib/main.dart @@ -1,5 +1,6 @@ import 'dart:async'; import 'dart:io'; +import 'dart:math'; import 'package:auto_route/auto_route.dart'; import 'package:background_downloader/background_downloader.dart'; @@ -38,10 +39,10 @@ import 'package:immich_mobile/utils/debug_print.dart'; import 'package:immich_mobile/utils/http_ssl_options.dart'; import 'package:immich_mobile/utils/licenses.dart'; import 'package:immich_mobile/utils/migration.dart'; +import 'package:immich_mobile/wm_executor.dart'; import 'package:intl/date_symbol_data_local.dart'; import 'package:logging/logging.dart'; import 'package:timezone/data/latest.dart'; -import 'package:immich_mobile/wm_executor.dart'; void main() async { ImmichWidgetsBinding(); @@ -50,7 +51,7 @@ void main() async { await Bootstrap.initDomain(isar, drift, logDb); await initApp(); // Warm-up isolate pool for worker manager - await workerManagerForIos.init(dynamicSpawning: true, isolatesCount: 6); + await workerManagerPatch.init(dynamicSpawning: true, isolatesCount: max(Platform.numberOfProcessors - 1, 5)); await migrateDatabaseIfNeeded(isar, drift); HttpSSLOptions.apply(); diff --git a/mobile/lib/utils/isolate.dart b/mobile/lib/utils/isolate.dart index 1d7a47665d..491e1bf107 100644 --- a/mobile/lib/utils/isolate.dart +++ b/mobile/lib/utils/isolate.dart @@ -32,7 +32,7 @@ Cancelable runInIsolateGentle({ throw const InvalidIsolateUsageException(); } - return workerManagerForIos.executeGentle((cancelledChecker) async { + return workerManagerPatch.executeGentle((cancelledChecker) async { T? result; await runZonedGuarded( () async { diff --git a/mobile/lib/wm_executor.dart b/mobile/lib/wm_executor.dart index 1887deef90..73e882e8e6 100644 --- a/mobile/lib/wm_executor.dart +++ b/mobile/lib/wm_executor.dart @@ -1,13 +1,16 @@ // part of 'package:worker_manager/worker_manager.dart'; +// ignore_for_file: implementation_imports, avoid_print + import 'dart:async'; import 'dart:math'; import 'package:collection/collection.dart'; import 'package:flutter/foundation.dart'; -import 'package:worker_manager/worker_manager.dart'; +import 'package:worker_manager/src/number_of_processors/processors_io.dart'; import 'package:worker_manager/src/worker/worker.dart'; +import 'package:worker_manager/worker_manager.dart'; -final workerManagerForIos = _Executor(); +final workerManagerPatch = _Executor(); // [-2^54; 2^53] is compatible with dart2js, see core.int doc const _minId = -9007199254740992; @@ -49,7 +52,7 @@ class _Executor extends Mixinable<_Executor> with _ExecutorLogger { final _pool = []; var _nextTaskId = _minId; var _dynamicSpawning = false; - var _isolatesCount = 5; + var _isolatesCount = numberOfProcessors; @override Future init({int? isolatesCount, bool? dynamicSpawning}) async {