Skip to content
This repository was archived by the owner on Feb 25, 2025. It is now read-only.

Commit 96a4de7

Browse files
committed
Made responses to platform methods threadsafe in linux
1 parent 35ecb2b commit 96a4de7

2 files changed

Lines changed: 20 additions & 29 deletions

File tree

shell/platform/linux/fl_binary_messenger.cc

Lines changed: 19 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ G_DEFINE_INTERFACE(FlBinaryMessenger, fl_binary_messenger, G_TYPE_OBJECT)
3333
struct _FlBinaryMessengerImpl {
3434
GObject parent_instance;
3535

36-
FlEngine* engine;
36+
GWeakRef engine;
3737

3838
// PlatformMessageHandler keyed by channel name.
3939
GHashTable* platform_message_handlers;
@@ -81,7 +81,9 @@ static void fl_binary_messenger_response_handle_impl_dispose(GObject* object) {
8181
FlBinaryMessengerResponseHandleImpl* self =
8282
FL_BINARY_MESSENGER_RESPONSE_HANDLE_IMPL(object);
8383

84-
if (self->response_handle != nullptr && self->messenger->engine != nullptr) {
84+
g_autoptr(FlEngine) engine =
85+
FL_ENGINE(g_weak_ref_get(&self->messenger->engine));
86+
if (self->response_handle != nullptr && engine != nullptr) {
8587
g_critical("FlBinaryMessengerResponseHandle was not responded to");
8688
}
8789

@@ -141,19 +143,6 @@ static void platform_message_handler_free(gpointer data) {
141143
g_free(self);
142144
}
143145

144-
static void engine_weak_notify_cb(gpointer user_data,
145-
GObject* where_the_object_was) {
146-
FlBinaryMessengerImpl* self = FL_BINARY_MESSENGER_IMPL(user_data);
147-
self->engine = nullptr;
148-
149-
// Disconnect any handlers.
150-
// Take the reference in case a handler tries to modify this table.
151-
g_autoptr(GHashTable) handlers = self->platform_message_handlers;
152-
self->platform_message_handlers = g_hash_table_new_full(
153-
g_str_hash, g_str_equal, g_free, platform_message_handler_free);
154-
g_hash_table_remove_all(handlers);
155-
}
156-
157146
static gboolean fl_binary_messenger_platform_message_cb(
158147
FlEngine* engine,
159148
const gchar* channel,
@@ -179,11 +168,7 @@ static gboolean fl_binary_messenger_platform_message_cb(
179168

180169
static void fl_binary_messenger_impl_dispose(GObject* object) {
181170
FlBinaryMessengerImpl* self = FL_BINARY_MESSENGER_IMPL(object);
182-
183-
if (self->engine != nullptr) {
184-
g_object_weak_unref(G_OBJECT(self->engine), engine_weak_notify_cb, self);
185-
self->engine = nullptr;
186-
}
171+
g_weak_ref_clear(&self->engine);
187172

188173
g_clear_pointer(&self->platform_message_handlers, g_hash_table_unref);
189174

@@ -199,7 +184,8 @@ static void set_message_handler_on_channel(
199184
FlBinaryMessengerImpl* self = FL_BINARY_MESSENGER_IMPL(messenger);
200185

201186
// Don't set handlers if engine already gone.
202-
if (self->engine == nullptr) {
187+
g_autoptr(FlEngine) engine = FL_ENGINE(g_weak_ref_get(&self->engine));
188+
if (engine == nullptr) {
203189
if (handler != nullptr) {
204190
g_warning(
205191
"Attempted to set message handler on an FlBinaryMessenger without an "
@@ -220,6 +206,7 @@ static void set_message_handler_on_channel(
220206
}
221207
}
222208

209+
// Note: This function can be called from any thread.
223210
static gboolean send_response(FlBinaryMessenger* messenger,
224211
FlBinaryMessengerResponseHandle* response_handle_,
225212
GBytes* response,
@@ -233,7 +220,8 @@ static gboolean send_response(FlBinaryMessenger* messenger,
233220
g_return_val_if_fail(response_handle->messenger == self, FALSE);
234221
g_return_val_if_fail(response_handle->response_handle != nullptr, FALSE);
235222

236-
if (self->engine == nullptr) {
223+
g_autoptr(FlEngine) engine = FL_ENGINE(g_weak_ref_get(&self->engine));
224+
if (engine == nullptr) {
237225
return TRUE;
238226
}
239227

@@ -246,7 +234,7 @@ static gboolean send_response(FlBinaryMessenger* messenger,
246234
}
247235

248236
gboolean result = fl_engine_send_platform_message_response(
249-
self->engine, response_handle->response_handle, response, error);
237+
engine, response_handle->response_handle, response, error);
250238
response_handle->response_handle = nullptr;
251239

252240
return result;
@@ -267,12 +255,13 @@ static void send_on_channel(FlBinaryMessenger* messenger,
267255
gpointer user_data) {
268256
FlBinaryMessengerImpl* self = FL_BINARY_MESSENGER_IMPL(messenger);
269257

270-
if (self->engine == nullptr) {
258+
g_autoptr(FlEngine) engine = FL_ENGINE(g_weak_ref_get(&self->engine));
259+
if (engine == nullptr) {
271260
return;
272261
}
273262

274263
fl_engine_send_platform_message(
275-
self->engine, channel, message, cancellable,
264+
engine, channel, message, cancellable,
276265
callback != nullptr ? platform_message_ready_cb : nullptr,
277266
callback != nullptr ? g_task_new(self, cancellable, callback, user_data)
278267
: nullptr);
@@ -287,11 +276,12 @@ static GBytes* send_on_channel_finish(FlBinaryMessenger* messenger,
287276
g_autoptr(GTask) task = G_TASK(result);
288277
GAsyncResult* r = G_ASYNC_RESULT(g_task_propagate_pointer(task, nullptr));
289278

290-
if (self->engine == nullptr) {
279+
g_autoptr(FlEngine) engine = FL_ENGINE(g_weak_ref_get(&self->engine));
280+
if (engine == nullptr) {
291281
return nullptr;
292282
}
293283

294-
return fl_engine_send_platform_message_finish(self->engine, r, error);
284+
return fl_engine_send_platform_message_finish(engine, r, error);
295285
}
296286

297287
static void fl_binary_messenger_impl_class_init(
@@ -321,8 +311,7 @@ FlBinaryMessenger* fl_binary_messenger_new(FlEngine* engine) {
321311
// Added to stop compiler complaining about an unused function.
322312
FL_IS_BINARY_MESSENGER_IMPL(self);
323313

324-
self->engine = engine;
325-
g_object_weak_ref(G_OBJECT(engine), engine_weak_notify_cb, self);
314+
g_weak_ref_init(&self->engine, G_OBJECT(engine));
326315

327316
fl_engine_set_platform_message_handler(
328317
engine, fl_binary_messenger_platform_message_cb, self, NULL);
@@ -343,6 +332,7 @@ G_MODULE_EXPORT void fl_binary_messenger_set_message_handler_on_channel(
343332
self, channel, handler, user_data, destroy_notify);
344333
}
345334

335+
// Note: This function can be called from any thread.
346336
G_MODULE_EXPORT gboolean fl_binary_messenger_send_response(
347337
FlBinaryMessenger* self,
348338
FlBinaryMessengerResponseHandle* response_handle,

shell/platform/linux/fl_engine.cc

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -616,6 +616,7 @@ void fl_engine_set_on_pre_engine_restart_handler(
616616
self->on_pre_engine_restart_handler_destroy_notify = destroy_notify;
617617
}
618618

619+
// Note: This function can be called from any thread.
619620
gboolean fl_engine_send_platform_message_response(
620621
FlEngine* self,
621622
const FlutterPlatformMessageResponseHandle* handle,

0 commit comments

Comments
 (0)