@@ -33,7 +33,7 @@ G_DEFINE_INTERFACE(FlBinaryMessenger, fl_binary_messenger, G_TYPE_OBJECT)
3333struct _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-
157146static 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
180169static 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.
223210static 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
297287static 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.
346336G_MODULE_EXPORT gboolean fl_binary_messenger_send_response (
347337 FlBinaryMessenger* self,
348338 FlBinaryMessengerResponseHandle* response_handle,
0 commit comments