kms-device: Handle impl device creation failure
Properly free kms-device in case of invalid initialization https://gitlab.gnome.org/GNOME/mutter/merge_requests/772
This commit is contained in:
parent
6922f0e16a
commit
d13cea6ccb
@ -211,6 +211,7 @@ meta_kms_device_new (MetaKms *kms,
|
|||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
device = g_object_new (META_TYPE_KMS_DEVICE, NULL);
|
device = g_object_new (META_TYPE_KMS_DEVICE, NULL);
|
||||||
|
device->kms = kms;
|
||||||
|
|
||||||
data = (CreateImplDeviceData) {
|
data = (CreateImplDeviceData) {
|
||||||
.device = device,
|
.device = device,
|
||||||
@ -224,7 +225,6 @@ meta_kms_device_new (MetaKms *kms,
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
device->kms = kms;
|
|
||||||
device->impl_device = data.out_impl_device;
|
device->impl_device = data.out_impl_device;
|
||||||
device->flags = flags;
|
device->flags = flags;
|
||||||
device->path = g_strdup (path);
|
device->path = g_strdup (path);
|
||||||
@ -266,27 +266,30 @@ meta_kms_device_finalize (GObject *object)
|
|||||||
MetaBackend *backend = meta_kms_get_backend (device->kms);
|
MetaBackend *backend = meta_kms_get_backend (device->kms);
|
||||||
MetaBackendNative *backend_native = META_BACKEND_NATIVE (backend);
|
MetaBackendNative *backend_native = META_BACKEND_NATIVE (backend);
|
||||||
MetaLauncher *launcher = meta_backend_native_get_launcher (backend_native);
|
MetaLauncher *launcher = meta_backend_native_get_launcher (backend_native);
|
||||||
FreeImplDeviceData data;
|
|
||||||
GError *error = NULL;
|
|
||||||
|
|
||||||
g_list_free (device->crtcs);
|
g_list_free (device->crtcs);
|
||||||
g_list_free (device->connectors);
|
g_list_free (device->connectors);
|
||||||
g_list_free (device->planes);
|
g_list_free (device->planes);
|
||||||
|
|
||||||
data = (FreeImplDeviceData) {
|
if (device->impl_device)
|
||||||
.impl_device = device->impl_device,
|
|
||||||
};
|
|
||||||
if (!meta_kms_run_impl_task_sync (device->kms, free_impl_device_in_impl, &data,
|
|
||||||
&error))
|
|
||||||
{
|
{
|
||||||
g_warning ("Failed to close KMS impl device: %s", error->message);
|
FreeImplDeviceData data;
|
||||||
g_error_free (error);
|
GError *error = NULL;
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
meta_launcher_close_restricted (launcher, data.out_fd);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
data = (FreeImplDeviceData) {
|
||||||
|
.impl_device = device->impl_device,
|
||||||
|
};
|
||||||
|
if (!meta_kms_run_impl_task_sync (device->kms, free_impl_device_in_impl, &data,
|
||||||
|
&error))
|
||||||
|
{
|
||||||
|
g_warning ("Failed to close KMS impl device: %s", error->message);
|
||||||
|
g_error_free (error);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
meta_launcher_close_restricted (launcher, data.out_fd);
|
||||||
|
}
|
||||||
|
}
|
||||||
G_OBJECT_CLASS (meta_kms_device_parent_class)->finalize (object);
|
G_OBJECT_CLASS (meta_kms_device_parent_class)->finalize (object);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user