Skip to content

Commit 0e5c7b9

Browse files
authored
Redirect isolate Log to main thread (#30)
* Redirect isolate Log to main thread * Use specific logger
1 parent 36f77b5 commit 0e5c7b9

File tree

2 files changed

+48
-2
lines changed

2 files changed

+48
-2
lines changed

Diff for: packages/sane/lib/src/extensions.dart

+13
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import 'package:logging/logging.dart';
12
import 'package:sane/src/bindings.g.dart';
23
import 'package:sane/src/exceptions.dart';
34

@@ -10,3 +11,15 @@ extension SaneStatusExtension on SANE_Status {
1011
}
1112
}
1213
}
14+
15+
extension LoggerExtension on Logger {
16+
void redirect(LogRecord record) {
17+
log(
18+
record.level,
19+
record.message,
20+
record.error,
21+
record.stackTrace,
22+
record.zone,
23+
);
24+
}
25+
}

Diff for: packages/sane/lib/src/sane_isolate.dart

+35-2
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
1+
import 'dart:async';
12
import 'dart:isolate';
23
import 'dart:typed_data';
34

5+
import 'package:logging/logging.dart';
46
import 'package:sane/sane.dart';
7+
import 'package:sane/src/extensions.dart';
58
import 'package:sane/src/isolate_messages/cancel.dart';
69
import 'package:sane/src/isolate_messages/close.dart';
710
import 'package:sane/src/isolate_messages/control_button_option.dart';
@@ -19,6 +22,8 @@ import 'package:sane/src/isolate_messages/read.dart';
1922
import 'package:sane/src/isolate_messages/set_io_mode.dart';
2023
import 'package:sane/src/isolate_messages/start.dart';
2124

25+
final _logger = Logger('sane.isolate');
26+
2227
class SaneIsolate implements Sane {
2328
SaneIsolate({
2429
required Sane sane,
@@ -38,7 +43,16 @@ class SaneIsolate implements Sane {
3843
sane: _sane,
3944
),
4045
);
41-
_sendPort = await receivePort.first as SendPort;
46+
47+
final sendPortCompleter = Completer<SendPort>();
48+
receivePort.listen((message) {
49+
if (message is _SendPortMessage) {
50+
sendPortCompleter.complete(message.sendPort);
51+
} else if (message is _LogRecordMessage) {
52+
_logger.redirect(message.record);
53+
}
54+
});
55+
_sendPort = await sendPortCompleter.future;
4256
}
4357

4458
void kill() {
@@ -292,7 +306,16 @@ class _IsolateEntryPointArgs {
292306

293307
void _isolateEntryPoint(_IsolateEntryPointArgs args) {
294308
final isolateReceivePort = ReceivePort();
295-
args.mainSendPort.send(isolateReceivePort.sendPort);
309+
args.mainSendPort.send(
310+
_SendPortMessage(isolateReceivePort.sendPort),
311+
);
312+
313+
Logger.root.level = Level.ALL;
314+
Logger.root.onRecord.listen((record) {
315+
args.mainSendPort.send(
316+
_LogRecordMessage(record),
317+
);
318+
});
296319

297320
final sane = args.sane;
298321
isolateReceivePort.cast<_IsolateMessageEnvelope>().listen((envelope) async {
@@ -320,3 +343,13 @@ class _IsolateMessageEnvelope {
320343
final SendPort replyPort;
321344
final IsolateMessage message;
322345
}
346+
347+
class _SendPortMessage {
348+
_SendPortMessage(this.sendPort);
349+
final SendPort sendPort;
350+
}
351+
352+
class _LogRecordMessage {
353+
_LogRecordMessage(this.record);
354+
final LogRecord record;
355+
}

0 commit comments

Comments
 (0)