Skip to content

Commit e9fc31c

Browse files
committed
frees C memory from Dart
1 parent 0873f90 commit e9fc31c

File tree

3 files changed

+37
-1
lines changed

3 files changed

+37
-1
lines changed

packages/mediapipe-core/lib/src/containers.dart

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import 'dart:ffi';
2+
import 'package:ffi/ffi.dart';
23
import 'package:mediapipe_core/mediapipe_core.dart';
34
import 'mediapipe_common_bindings.dart' as bindings;
45

@@ -34,6 +35,17 @@ class Category {
3435
);
3536
}
3637

38+
static void freeStructs(Pointer<bindings.Category> structs, int count) {
39+
int index = 0;
40+
while (index < count) {
41+
bindings.Category obj = structs[index];
42+
calloc.free(obj.category_name);
43+
calloc.free(obj.display_name);
44+
index++;
45+
}
46+
calloc.free(structs);
47+
}
48+
3749
@override
3850
String toString() => 'Category(index=$index, score=$score, '
3951
'categoryName=$categoryName, displayName=$displayName)';
@@ -71,6 +83,20 @@ class Classifications {
7183
);
7284
}
7385

86+
static void freeStructs(
87+
Pointer<bindings.Classifications> structs,
88+
int count,
89+
) {
90+
int index = 0;
91+
while (index < count) {
92+
bindings.Classifications obj = structs[index];
93+
Category.freeStructs(obj.categories, obj.categories_count);
94+
calloc.free(obj.head_name);
95+
index++;
96+
}
97+
calloc.free(structs);
98+
}
99+
74100
Category? get firstCategory =>
75101
categories.isNotEmpty ? categories.first : null;
76102

packages/mediapipe-task-text/lib/src/tasks/text_classification/containers/text_classifier_result.dart

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
import 'dart:ffi';
2+
import 'package:ffi/ffi.dart';
13
import 'package:mediapipe_core/mediapipe_core.dart';
24
import 'package:mediapipe_text/src/mediapipe_text_bindings.dart' as bindings;
35

@@ -32,6 +34,14 @@ class TextClassifierResult {
3234
);
3335
}
3436

37+
static void freeStruct(Pointer<bindings.TextClassifierResult> struct) {
38+
Classifications.freeStructs(
39+
struct.ref.classifications,
40+
struct.ref.classifications_count,
41+
);
42+
calloc.free(struct);
43+
}
44+
3545
Classifications? get firstClassification =>
3646
classifications.isNotEmpty ? classifications.first : null;
3747

packages/mediapipe-task-text/lib/src/tasks/text_classification/ffi_text_classifier.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ class TextClassifier extends BaseTextClassifier {
4040
final result = TextClassifierResult.fromStruct(resultsPtr.ref);
4141
_log.fine('Text classification result: $result');
4242
_bindings.text_classifier_close(classifierPtr);
43-
calloc.free(resultsPtr);
43+
TextClassifierResult.freeStruct(resultsPtr);
4444
return result;
4545
}
4646
}

0 commit comments

Comments
 (0)