backends: Improve MetaCrtcMode lifetime management
The same MetaCrtcMode objects can be reached via the MetaOutputInfo::modes array & MetaMonitorMode::crtc_modes arrays and via the MetaGpuPrivate::modes list, so all of them need to hold their own references. In turn, those references need to dropped in meta_output_info_unref and meta_monitor_mode_free. (meta_gpu_finalize is already dropping the MetaGpuPrivate::modes list references) Fixes leak: ==4092== 123 (32 direct, 91 indirect) bytes in 1 blocks are definitely lost in loss record 11,396 of 13,056 ==4092== at 0x4F81D57: g_type_create_instance (gtype.c:1929) ==4092== by 0x4F64ABF: g_object_new_internal.part.0 (gobject.c:2606) ==4092== by 0x4F676BA: g_object_new_internal (gobject.c:2923) ==4092== by 0x4F676BA: g_object_new_valist (gobject.c:2945) ==4092== by 0x4F67A0C: g_object_new (gobject.c:2418) ==4092== by 0x4AB578B: meta_crtc_mode_virtual_new (meta-crtc-mode-virtual.c:51) ==4092== by 0x4B081BB: meta_virtual_monitor_native_new (meta-virtual-monitor-native.c:83) ==4092== by 0x4AC58CC: meta_monitor_manager_native_create_virtual_monitor (meta-monitor-manager-native.c:603) ==4092== by 0x496803B: meta_monitor_manager_create_virtual_monitor (meta-monitor-manager.c:621) ==4092== by 0x4A4A204: create_virtual_monitor (meta-screen-cast-virtual-stream-src.c:625) ==4092== by 0x4A4A39D: ensure_virtual_monitor (meta-screen-cast-virtual-stream-src.c:663) ==4092== by 0x4A4A461: meta_screen_cast_virtual_stream_src_notify_params_updated (meta-screen-cast-virtual-stream-src.c:684) ==4092== by 0x4A568C5: on_stream_param_changed (meta-screen-cast-stream-src.c:1565) Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/4149>
This commit is contained in:
@ -194,13 +194,13 @@ add_common_modes (MetaOutputInfo *output_info,
|
||||
crtc_mode = meta_gpu_kms_get_mode_from_kms_mode (gpu_kms,
|
||||
fallback_mode,
|
||||
META_CRTC_REFRESH_RATE_MODE_VARIABLE);
|
||||
g_ptr_array_add (array, crtc_mode);
|
||||
g_ptr_array_add (array, g_object_ref (crtc_mode));
|
||||
}
|
||||
|
||||
crtc_mode = meta_gpu_kms_get_mode_from_kms_mode (gpu_kms,
|
||||
fallback_mode,
|
||||
META_CRTC_REFRESH_RATE_MODE_FIXED);
|
||||
g_ptr_array_add (array, crtc_mode);
|
||||
g_ptr_array_add (array, g_object_ref (crtc_mode));
|
||||
}
|
||||
|
||||
output_info->modes = g_renew (MetaCrtcMode *, output_info->modes,
|
||||
@ -318,7 +318,7 @@ init_output_modes (MetaOutputInfo *output_info,
|
||||
meta_gpu_kms_get_mode_from_kms_mode (gpu_kms,
|
||||
kms_mode,
|
||||
META_CRTC_REFRESH_RATE_MODE_VARIABLE);
|
||||
output_info->modes[i++] = crtc_mode;
|
||||
output_info->modes[i++] = g_object_ref (crtc_mode);
|
||||
if (!output_info->preferred_mode && kms_mode == kms_preferred_mode)
|
||||
output_info->preferred_mode = crtc_mode;
|
||||
}
|
||||
@ -326,7 +326,7 @@ init_output_modes (MetaOutputInfo *output_info,
|
||||
crtc_mode = meta_gpu_kms_get_mode_from_kms_mode (gpu_kms,
|
||||
kms_mode,
|
||||
META_CRTC_REFRESH_RATE_MODE_FIXED);
|
||||
output_info->modes[i++] = crtc_mode;
|
||||
output_info->modes[i++] = g_object_ref (crtc_mode);
|
||||
if (!output_info->preferred_mode && kms_mode == kms_preferred_mode)
|
||||
output_info->preferred_mode = crtc_mode;
|
||||
}
|
||||
|
Reference in New Issue
Block a user