|
|
|
|
@ -31,55 +31,62 @@ Cancelable<T?> runInIsolateGentle<T>({
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return workerManager.executeGentle((cancelledChecker) async {
|
|
|
|
|
BackgroundIsolateBinaryMessenger.ensureInitialized(token);
|
|
|
|
|
DartPluginRegistrant.ensureInitialized();
|
|
|
|
|
await runZonedGuarded(
|
|
|
|
|
() async {
|
|
|
|
|
BackgroundIsolateBinaryMessenger.ensureInitialized(token);
|
|
|
|
|
DartPluginRegistrant.ensureInitialized();
|
|
|
|
|
|
|
|
|
|
final (isar, drift, logDb) = await Bootstrap.initDB();
|
|
|
|
|
await Bootstrap.initDomain(isar, drift, logDb, shouldBufferLogs: false);
|
|
|
|
|
final ref = ProviderContainer(
|
|
|
|
|
overrides: [
|
|
|
|
|
// TODO: Remove once isar is removed
|
|
|
|
|
dbProvider.overrideWithValue(isar),
|
|
|
|
|
isarProvider.overrideWithValue(isar),
|
|
|
|
|
cancellationProvider.overrideWithValue(cancelledChecker),
|
|
|
|
|
driftProvider.overrideWith(driftOverride(drift)),
|
|
|
|
|
],
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
Logger log = Logger("IsolateLogger");
|
|
|
|
|
final (isar, drift, logDb) = await Bootstrap.initDB();
|
|
|
|
|
await Bootstrap.initDomain(isar, drift, logDb, shouldBufferLogs: false);
|
|
|
|
|
final ref = ProviderContainer(
|
|
|
|
|
overrides: [
|
|
|
|
|
// TODO: Remove once isar is removed
|
|
|
|
|
dbProvider.overrideWithValue(isar),
|
|
|
|
|
isarProvider.overrideWithValue(isar),
|
|
|
|
|
cancellationProvider.overrideWithValue(cancelledChecker),
|
|
|
|
|
driftProvider.overrideWith(driftOverride(drift)),
|
|
|
|
|
],
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
try {
|
|
|
|
|
HttpSSLOptions.apply(applyNative: false);
|
|
|
|
|
return await computation(ref);
|
|
|
|
|
} on CanceledError {
|
|
|
|
|
log.warning("Computation cancelled ${debugLabel == null ? '' : ' for $debugLabel'}");
|
|
|
|
|
} catch (error, stack) {
|
|
|
|
|
log.severe("Error in runInIsolateGentle ${debugLabel == null ? '' : ' for $debugLabel'}", error, stack);
|
|
|
|
|
} finally {
|
|
|
|
|
try {
|
|
|
|
|
await LogService.I.dispose();
|
|
|
|
|
await logDb.close();
|
|
|
|
|
await ref.read(driftProvider).close();
|
|
|
|
|
Logger log = Logger("IsolateLogger");
|
|
|
|
|
|
|
|
|
|
// Close Isar safely
|
|
|
|
|
try {
|
|
|
|
|
final isar = ref.read(isarProvider);
|
|
|
|
|
if (isar.isOpen) {
|
|
|
|
|
await isar.close();
|
|
|
|
|
HttpSSLOptions.apply(applyNative: false);
|
|
|
|
|
return await computation(ref);
|
|
|
|
|
} on CanceledError {
|
|
|
|
|
log.warning("Computation cancelled ${debugLabel == null ? '' : ' for $debugLabel'}");
|
|
|
|
|
} catch (error, stack) {
|
|
|
|
|
log.severe("Error in runInIsolateGentle ${debugLabel == null ? '' : ' for $debugLabel'}", error, stack);
|
|
|
|
|
} finally {
|
|
|
|
|
try {
|
|
|
|
|
ref.dispose();
|
|
|
|
|
|
|
|
|
|
await LogService.I.dispose();
|
|
|
|
|
await logDb.close();
|
|
|
|
|
await drift.close();
|
|
|
|
|
|
|
|
|
|
// Close Isar safely
|
|
|
|
|
try {
|
|
|
|
|
if (isar.isOpen) {
|
|
|
|
|
await isar.close();
|
|
|
|
|
}
|
|
|
|
|
} catch (e) {
|
|
|
|
|
debugPrint("Error closing Isar: $e");
|
|
|
|
|
}
|
|
|
|
|
} catch (error, stack) {
|
|
|
|
|
debugPrint("Error closing resources in isolate: $error, $stack");
|
|
|
|
|
} finally {
|
|
|
|
|
ref.dispose();
|
|
|
|
|
// Delay to ensure all resources are released
|
|
|
|
|
await Future.delayed(const Duration(seconds: 2));
|
|
|
|
|
}
|
|
|
|
|
} catch (e) {
|
|
|
|
|
debugPrint("Error closing Isar: $e");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
ref.dispose();
|
|
|
|
|
} catch (error, stack) {
|
|
|
|
|
debugPrint("Error closing resources in isolate: $error, $stack");
|
|
|
|
|
} finally {
|
|
|
|
|
ref.dispose();
|
|
|
|
|
// Delay to ensure all resources are released
|
|
|
|
|
await Future.delayed(const Duration(seconds: 2));
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return null;
|
|
|
|
|
},
|
|
|
|
|
(error, stack) {
|
|
|
|
|
debugPrint("Error in isolate zone: $error, $stack");
|
|
|
|
|
},
|
|
|
|
|
);
|
|
|
|
|
return null;
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|