Skip to content

Commit 2ce934b

Browse files
authored
Clean up ffi callback memory management (#106)
1 parent 4eca6fe commit 2ce934b

File tree

2 files changed

+59
-80
lines changed

2 files changed

+59
-80
lines changed

ffi/native/callbackmanager.hpp

Lines changed: 30 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,10 @@ DLLEXPORT void RegisterDartCallbackPort(Dart_Port callback_port) {
103103
g_callback_port = callback_port;
104104
}
105105

106+
#ifdef __cplusplus
107+
}
108+
#endif
109+
106110
void CallbackInt32(int32_t value) {
107111
Dart_CObject dart_object;
108112
dart_object.type = Dart_CObject_kInt32;
@@ -111,22 +115,41 @@ void CallbackInt32(int32_t value) {
111115
}
112116

113117
void CallbackStringArray(int32_t length, char** values) {
114-
Dart_CObject** value_objects = new Dart_CObject*[length];
118+
auto value_objects = std::unique_ptr<Dart_CObject[]>(new Dart_CObject[length]);
119+
auto value_object_refs =
120+
std::unique_ptr<Dart_CObject*[]>(new Dart_CObject*[length]);
121+
115122
for (int32_t i = 0; i < length; i++) {
116-
Dart_CObject* value_object = new Dart_CObject;
123+
Dart_CObject* value_object = &value_objects[i];
117124
value_object->type = Dart_CObject_kString;
118125
value_object->value.as_string = values[i];
119-
value_objects[i] = value_object;
126+
value_object_refs[i] = value_object;
120127
}
121128
Dart_CObject dart_object;
122129
dart_object.type = Dart_CObject_kArray;
123130
dart_object.value.as_array.length = length;
124-
dart_object.value.as_array.values = value_objects;
131+
dart_object.value.as_array.values = value_object_refs.get();
125132
g_dart_post_C_object(g_callback_port, &dart_object);
133+
}
134+
135+
void CallbackStringArray(const std::vector<std::string>& values) {
136+
auto length = values.size();
137+
auto value_objects = std::unique_ptr<Dart_CObject[]>(new Dart_CObject[length]);
138+
auto value_object_refs =
139+
std::unique_ptr<Dart_CObject*[]>(new Dart_CObject*[length]);
140+
126141
for (int32_t i = 0; i < length; i++) {
127-
delete value_objects[i];
142+
Dart_CObject* value_object = &value_objects[i];
143+
value_object->type = Dart_CObject_kString;
144+
value_object->value.as_string = const_cast<char*>(values[i].c_str());
145+
value_object_refs[i] = value_object;
128146
}
129-
delete[] value_objects;
147+
Dart_CObject dart_object;
148+
dart_object.type = Dart_CObject_kArray;
149+
dart_object.value.as_array.length = length;
150+
dart_object.value.as_array.values = value_object_refs.get();
151+
g_dart_post_C_object(g_callback_port, &dart_object);
152+
130153
}
131154

132155
void CallbackFrame(int32_t id, int32_t length, uint8_t* frame) {
@@ -138,19 +161,12 @@ void CallbackFrame(int32_t id, int32_t length, uint8_t* frame) {
138161
frame_object.value.as_typed_data.type = Dart_TypedData_kUint8;
139162
frame_object.value.as_typed_data.values = frame;
140163
frame_object.value.as_typed_data.length = length;
141-
Dart_CObject** values = new Dart_CObject*[2];
142-
values[0] = &idObject;
143-
values[1] = &frame_object;
164+
Dart_CObject* values[2] = {&idObject, &frame_object};
144165
Dart_CObject value_object;
145166
value_object.type = Dart_CObject_kArray;
146167
value_object.value.as_array.length = 2;
147168
value_object.value.as_array.values = values;
148169
g_dart_post_C_object(g_callback_port, &value_object);
149-
delete[] values;
150170
}
151171

152-
#ifdef __cplusplus
153-
}
154172
#endif
155-
156-
#endif

ffi/native/eventmanager.hpp

Lines changed: 29 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -17,95 +17,58 @@ extern "C" {
1717
#endif
1818

1919
inline void OnPlayPauseStop(int32_t id, PlayerState* state) {
20-
std::vector<std::string> event{};
21-
event.emplace_back(std::to_string(id));
22-
event.emplace_back("playbackEvent");
23-
event.emplace_back(std::to_string(state->is_playing()));
24-
event.emplace_back(std::to_string(state->is_seekable()));
25-
size_t size = event.size();
26-
char** event_data = new char*[size];
27-
for (int index = 0; index < size; index++)
28-
event_data[index] = const_cast<char*>(event[index].c_str());
29-
CallbackStringArray(static_cast<int>(size), event_data);
20+
std::vector<std::string> event{std::to_string(id), "playbackEvent",
21+
std::to_string(state->is_playing()),
22+
std::to_string(state->is_seekable())};
3023

31-
delete[] event_data;
24+
CallbackStringArray(event);
3225
}
3326

3427
inline void OnPosition(int32_t id, PlayerState* state) {
35-
std::vector<std::string> event{};
36-
event.emplace_back(std::to_string(id));
37-
event.emplace_back("positionEvent");
38-
event.emplace_back(std::to_string(state->index()));
39-
event.emplace_back(std::to_string(state->position()));
40-
event.emplace_back(std::to_string(state->duration()));
41-
size_t size = event.size();
42-
char** event_data = new char*[size];
43-
for (int index = 0; index < size; index++)
44-
event_data[index] = const_cast<char*>(event[index].c_str());
45-
CallbackStringArray(static_cast<int>(size), event_data);
46-
47-
delete[] event_data;
28+
std::vector<std::string> event{
29+
std::to_string(id), "positionEvent", std::to_string(state->index()),
30+
std::to_string(state->position()), std::to_string(state->duration())};
31+
CallbackStringArray(event);
4832
}
4933

5034
inline void OnComplete(int32_t id, PlayerState* state) {
51-
std::vector<std::string> event{};
52-
event.emplace_back(std::to_string(id));
53-
event.emplace_back("completeEvent");
54-
event.emplace_back(std::to_string(state->is_completed()));
55-
size_t size = event.size();
56-
char** event_data = new char*[size];
57-
for (int index = 0; index < size; index++)
58-
event_data[index] = const_cast<char*>(event[index].c_str());
59-
CallbackStringArray(static_cast<int>(size), event_data);
60-
61-
delete[] event_data;
35+
std::vector<std::string> event{
36+
std::to_string(id),
37+
"completeEvent",
38+
std::to_string(state->is_completed()),
39+
};
40+
CallbackStringArray(event);
6241
}
6342

6443
inline void OnVolume(int32_t id, PlayerState* state) {
65-
std::vector<std::string> event{};
66-
event.emplace_back(std::to_string(id));
67-
event.emplace_back("volumeEvent");
68-
event.emplace_back(std::to_string(state->volume()));
69-
size_t size = event.size();
70-
char** event_data = new char*[size];
71-
for (int index = 0; index < size; index++)
72-
event_data[index] = const_cast<char*>(event[index].c_str());
73-
CallbackStringArray(static_cast<int>(size), event_data);
74-
75-
delete[] event_data;
44+
std::vector<std::string> event{std::to_string(id), "volumeEvent",
45+
std::to_string(state->volume())};
46+
CallbackStringArray(event);
7647
}
7748

7849
inline void OnRate(int32_t id, PlayerState* state) {
79-
std::vector<std::string> event{};
80-
event.emplace_back(std::to_string(id));
81-
event.emplace_back("rateEvent");
82-
event.emplace_back(std::to_string(state->rate()));
83-
size_t size = event.size();
84-
char** event_data = new char*[size];
85-
for (int index = 0; index < size; index++)
86-
event_data[index] = const_cast<char*>(event[index].c_str());
87-
CallbackStringArray(static_cast<int>(size), event_data);
88-
89-
delete[] event_data;
50+
std::vector<std::string> event{std::to_string(id), "rateEvent",
51+
std::to_string(state->rate())};
52+
CallbackStringArray(event);
9053
}
9154

9255
inline void OnOpen(int32_t id, PlayerState* state) {
93-
std::vector<std::string> event{};
56+
const auto& media_items = state->medias()->medias();
57+
58+
std::vector<std::string> event;
59+
event.reserve(4 + media_items.size() * 2);
60+
9461
event.emplace_back(std::to_string(id));
9562
event.emplace_back("openEvent");
9663
event.emplace_back(std::to_string(state->index()));
9764
event.emplace_back(std::to_string(state->is_playlist()));
98-
for (std::shared_ptr<Media> media : state->medias()->medias()) {
65+
66+
for (const auto& media : media_items) {
9967
event.emplace_back(media->media_type());
10068
event.emplace_back(media->resource());
10169
}
102-
size_t size = event.size();
103-
char** event_data = new char*[size];
104-
for (int index = 0; index < size; index++)
105-
event_data[index] = const_cast<char*>(event[index].c_str());
106-
CallbackStringArray(static_cast<int>(size), event_data);
10770

108-
delete[] event_data;
71+
CallbackStringArray(event);
10972
}
11073

11174
inline void OnVideo(int32_t id, int size, PlayerState* state, uint8_t* frame) {
@@ -114,4 +77,4 @@ inline void OnVideo(int32_t id, int size, PlayerState* state, uint8_t* frame) {
11477

11578
#ifdef __cplusplus
11679
}
117-
#endif
80+
#endif

0 commit comments

Comments
 (0)