kms/update: Add destroy-notify to result listener user data

No thread guarantees, users need to handle it themselves.

Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/2777>
This commit is contained in:
Jonas Ådahl 2023-04-20 16:32:41 +02:00
parent 27ed069766
commit 3b2f95cb1f
8 changed files with 23 additions and 9 deletions

View File

@ -367,7 +367,8 @@ assign_cursor_plane (MetaCursorRendererNative *native,
meta_kms_update_add_result_listener (kms_update,
&kms_update_listener_vtable,
NULL,
native);
native,
NULL);
crtc_cursor_data->buffer = buffer;

View File

@ -131,6 +131,7 @@ struct _MetaKmsResultListener
GMainContext *main_context;
const MetaKmsResultListenerVtable *vtable;
gpointer user_data;
GDestroyNotify destroy_notify;
MetaKmsFeedback *feedback;
};

View File

@ -624,7 +624,8 @@ void
meta_kms_update_add_result_listener (MetaKmsUpdate *update,
const MetaKmsResultListenerVtable *vtable,
GMainContext *main_context,
gpointer user_data)
gpointer user_data,
GDestroyNotify destroy_notify)
{
MetaKmsResultListener *listener;
@ -633,6 +634,7 @@ meta_kms_update_add_result_listener (MetaKmsUpdate *update,
.main_context = main_context,
.vtable = vtable,
.user_data = user_data,
.destroy_notify = destroy_notify,
};
update->result_listeners = g_list_append (update->result_listeners,
@ -672,6 +674,8 @@ meta_kms_result_listener_notify (MetaKmsResultListener *listener)
void
meta_kms_result_listener_free (MetaKmsResultListener *listener)
{
if (listener->destroy_notify)
listener->destroy_notify (listener->user_data);
g_clear_pointer (&listener->feedback, meta_kms_feedback_unref);
g_free (listener);
}

View File

@ -197,7 +197,8 @@ META_EXPORT_TEST
void meta_kms_update_add_result_listener (MetaKmsUpdate *update,
const MetaKmsResultListenerVtable *vtable,
GMainContext *main_context,
gpointer user_data);
gpointer user_data,
GDestroyNotify destroy_notify);
META_EXPORT_TEST
void meta_kms_update_merge_from (MetaKmsUpdate *update,

View File

@ -1170,7 +1170,8 @@ meta_onscreen_native_swap_buffers_with_damage (CoglOnscreen *onscreen,
meta_kms_update_add_result_listener (kms_update,
&swap_buffer_result_listener_vtable,
NULL,
onscreen_native);
onscreen_native,
NULL);
ensure_crtc_modes (onscreen, kms_update);
meta_onscreen_native_flip_crtc (onscreen,
@ -1391,7 +1392,8 @@ meta_onscreen_native_direct_scanout (CoglOnscreen *onscreen,
meta_kms_update_add_result_listener (kms_update,
&scanout_result_listener_vtable,
NULL,
onscreen_native);
onscreen_native,
NULL);
meta_onscreen_native_flip_crtc (onscreen,
onscreen_native->view,
@ -1570,7 +1572,8 @@ meta_onscreen_native_finish_frame (CoglOnscreen *onscreen,
meta_kms_update_add_result_listener (kms_update,
&finish_frame_result_listener_vtable,
NULL,
onscreen_native);
onscreen_native,
NULL);
meta_kms_update_add_page_flip_listener (kms_update,
kms_crtc,

View File

@ -876,6 +876,7 @@ post_mode_set_updates (MetaRendererNative *renderer_native)
meta_kms_update_add_result_listener (kms_update,
&mode_sets_result_listener_vtable,
NULL,
NULL,
NULL);
feedback =

View File

@ -382,7 +382,8 @@ on_scanout_fallback_before_paint (ClutterStage *stage,
meta_kms_update_add_result_listener (kms_update,
&scanout_fallback_result_listener_vtable,
NULL,
test);
test,
NULL);
test->scanout_fallback.scanout_failed_view = stage_view;
}

View File

@ -830,11 +830,13 @@ meta_test_kms_update_feedback (void)
meta_kms_update_add_result_listener (update,
&main_thread_result_listener_vtable,
NULL,
&data);
&data,
NULL);
meta_kms_update_add_result_listener (update,
&callback_thread_result_listener_vtable,
data.thread_main_context,
&data);
&data,
NULL);
meta_kms_device_post_update (device, update,
META_KMS_UPDATE_FLAG_NONE);