Skip to content

Commit caec35f

Browse files
committed
Handle cancellable disconnect callback handler
1 parent 910261d commit caec35f

File tree

3 files changed

+49
-36
lines changed

3 files changed

+49
-36
lines changed

lib/backend/fs.dart

Lines changed: 14 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -22,15 +22,20 @@ enum OperationStatus {
2222
}
2323

2424
class Cancellable extends ChangeNotifier {
25-
Cancellable([VoidCallback? onCancel]) {
26-
_cancelCallable = onCancel != null
27-
? NativeCallable<Void Function()>.isolateLocal(notifyListeners)
28-
: null;
29-
_handle = cancellable_new(_cancelCallable?.nativeFunction ?? nullptr);
25+
Cancellable() {
26+
_cancelCallable = NativeCallable<Void Function()>.isolateLocal(
27+
notifyListeners,
28+
);
29+
_handle = cancellable_new();
30+
_cancelCallbackHandlerId = cancellable_connect(
31+
_handle,
32+
_cancelCallable.nativeFunction,
33+
);
3034
}
3135

3236
late final Pointer<GCancellable> _handle;
33-
late final NativeCallable<Void Function()>? _cancelCallable;
37+
late final NativeCallable<Void Function()> _cancelCallable;
38+
late final int _cancelCallbackHandlerId;
3439

3540
bool get isCancelled => cancellable_is_cancelled(_handle);
3641

@@ -39,8 +44,8 @@ class Cancellable extends ChangeNotifier {
3944
}
4045

4146
void destroy() {
42-
cancellable_destroy(_handle);
43-
_cancelCallable?.close();
47+
cancellable_destroy(_handle, _cancelCallbackHandlerId);
48+
_cancelCallable.close();
4449
}
4550
}
4651

@@ -359,11 +364,7 @@ extension type FileInfo._(Pointer<GFileInfo> _handle) {
359364
final name = fileinfo_get_name(_handle);
360365
if (name == nullptr) return null;
361366

362-
try {
363-
return name.cast<Utf8>().toDartString();
364-
} finally {
365-
calloc.free(name);
366-
}
367+
return name.cast<Utf8>().toDartString();
367368
}
368369

369370
int getFileType() => fileinfo_get_file_type(_handle);

lib/backend/fs_native.dart

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -33,10 +33,17 @@ final class GList extends Struct {
3333
external final Pointer<GList> previous;
3434
}
3535

36+
@Native<Pointer<GCancellable> Function()>()
37+
external Pointer<GCancellable> cancellable_new();
38+
3639
@Native<
37-
Pointer<GCancellable> Function(Pointer<NativeFunction<Void Function()>>)
40+
UnsignedLong Function(
41+
Pointer<GCancellable>,
42+
Pointer<NativeFunction<Void Function()>>,
43+
)
3844
>()
39-
external Pointer<GCancellable> cancellable_new(
45+
external int cancellable_connect(
46+
Pointer<GCancellable> cancellable,
4047
Pointer<NativeFunction<Void Function()>> onCancel,
4148
);
4249

@@ -46,8 +53,11 @@ external void cancellable_cancel(Pointer<GCancellable> cancellable);
4653
@Native<Bool Function(Pointer<GCancellable>)>()
4754
external bool cancellable_is_cancelled(Pointer<GCancellable> cancellable);
4855

49-
@Native<Void Function(Pointer<GCancellable>)>()
50-
external void cancellable_destroy(Pointer<GCancellable> cancellable);
56+
@Native<Void Function(Pointer<GCancellable>, UnsignedLong)>()
57+
external void cancellable_destroy(
58+
Pointer<GCancellable> cancellable,
59+
int cancelCallbackHandlerId,
60+
);
5161

5262
@Native<Pointer<Pointer<GError>> Function()>()
5363
external Pointer<Pointer<GError>> error_new();

src/src/lib.zig

Lines changed: 21 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -434,31 +434,33 @@ fn onCancel(_: [*c]c.GCancellable, user_data: ?*anyopaque) callconv(.c) void {
434434
callback();
435435
}
436436

437-
pub export fn cancellable_new(
438-
on_cancel: ?*fn () void,
439-
) *c.GCancellable {
440-
const cancellable = c.g_cancellable_new();
441-
if (on_cancel) |callback| {
442-
_ = c.g_cancellable_connect(
443-
cancellable,
444-
c.G_CALLBACK(onCancel),
445-
@ptrCast(callback),
446-
null,
447-
);
448-
}
449-
return cancellable;
437+
pub export fn cancellable_new() ?*c.GCancellable {
438+
return c.g_cancellable_new();
439+
}
440+
441+
pub export fn cancellable_connect(
442+
cancellable: *c.GCancellable,
443+
on_cancel: *const fn () callconv(.c) void,
444+
) c.ulong {
445+
return c.g_cancellable_connect(
446+
cancellable,
447+
c.G_CALLBACK(onCancel),
448+
@ptrCast(@constCast(on_cancel)),
449+
null,
450+
);
450451
}
451452

452-
pub export fn cancellable_cancel(cancellable: *c.GCancellable) void {
453-
c.g_cancellable_cancel(cancellable);
453+
pub export fn cancellable_cancel(fs_cancellable: *c.GCancellable) void {
454+
c.g_cancellable_cancel(fs_cancellable);
454455
}
455456

456-
pub export fn cancellable_is_cancelled(cancellable: *c.GCancellable) bool {
457-
return c.g_cancellable_is_cancelled(cancellable) == 1;
457+
pub export fn cancellable_is_cancelled(fs_cancellable: *c.GCancellable) bool {
458+
return c.g_cancellable_is_cancelled(fs_cancellable) == 1;
458459
}
459460

460-
pub export fn cancellable_destroy(cancellable: *c.GCancellable) void {
461-
c.g_object_unref(cancellable);
461+
pub export fn cancellable_destroy(fs_cancellable: *c.GCancellable, cancel_callback_handler_id: c.ulong) void {
462+
c.g_cancellable_disconnect(fs_cancellable, cancel_callback_handler_id);
463+
c.g_object_unref(fs_cancellable);
462464
}
463465

464466
// -------- ERROR -------- //

0 commit comments

Comments
 (0)