diff --git a/example/.gitignore b/example/.gitignore index c86ef62..c31f049 100644 --- a/example/.gitignore +++ b/example/.gitignore @@ -8,4 +8,9 @@ build/ # Directory created by dartdoc doc/api/ +# Directory created by Flutter Version Manager +.fvm/ + .vscode/ +.idea/ + diff --git a/lib/src/compute_api/task.dart b/lib/src/compute_api/task.dart index 4afedc8..9ff3319 100644 --- a/lib/src/compute_api/task.dart +++ b/lib/src/compute_api/task.dart @@ -3,7 +3,6 @@ import 'dart:isolate'; class Task { final Function task; final dynamic param; - final Capability capability; Task({ @@ -13,6 +12,10 @@ class Task { }); } +class WorkerCleanUpTask extends Task { + WorkerCleanUpTask() : super(task: (){}, capability: Capability()); +} + class TaskResult { final dynamic result; final Capability capability; @@ -22,3 +25,7 @@ class TaskResult { required this.capability, }); } + +class WorkerCleanUpTaskResult extends TaskResult { + WorkerCleanUpTaskResult() : super(result: null, capability: Capability()); +} diff --git a/lib/src/compute_api/worker.dart b/lib/src/compute_api/worker.dart index bfc1a23..5f695d0 100644 --- a/lib/src/compute_api/worker.dart +++ b/lib/src/compute_api/worker.dart @@ -55,11 +55,16 @@ class Worker { _sendPort = await _broadcastReceivePort.first as SendPort; - _broadcastPortSubscription = _broadcastReceivePort.listen((dynamic res) { + _broadcastPortSubscription = _broadcastReceivePort.listen((dynamic res) async { status = WorkerStatus.idle; if (res is RemoteExecutionError) { onError(res, this); return; + } else if(res is WorkerCleanUpTaskResult) { + await _broadcastPortSubscription.cancel(); + _isolate.kill(); + _receivePort.close(); + return; } onResult(res as TaskResult, this); }); @@ -71,9 +76,7 @@ class Worker { } Future dispose() async { - await _broadcastPortSubscription.cancel(); - _isolate.kill(); - _receivePort.close(); + _sendPort.send(WorkerCleanUpTask()); } } @@ -85,16 +88,22 @@ Future isolateEntryPoint(IsolateInitParams params) async { await for (final Task task in receivePort.cast()) { try { - final shouldPassParam = task.param != null; - - final dynamic computationResult = - shouldPassParam ? await task.task(task.param) : await task.task(); - - final result = TaskResult( - result: computationResult, - capability: task.capability, - ); - sendPort.send(result); + if(task is WorkerCleanUpTask) { + receivePort.close(); + final result = WorkerCleanUpTaskResult(); + sendPort.send(result); + } else { + final shouldPassParam = task.param != null; + + final dynamic computationResult = + shouldPassParam ? await task.task(task.param) : await task.task(); + + final result = TaskResult( + result: computationResult, + capability: task.capability, + ); + sendPort.send(result); + } } catch (error) { sendPort.send(RemoteExecutionError(error.toString(), task.capability)); }