kms/connector: Keep a ref to the KmsImplDevice instead of KmsDevice
The KmsImplDevice always exists as long as a KmsConnector exists. The KmsDevice doesn't exist yet as long as the KmsImplDevice is not fully initiallized. Going through the KmsImplDevice makes sure we always have a valid reference and can release the device fd correctly when the initialization fails. Closes: https://gitlab.gnome.org/GNOME/mutter/-/issues/3243 Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/3518>
This commit is contained in:
parent
7b232d9f65
commit
399ffdfc88
@ -62,7 +62,7 @@ struct _MetaKmsConnector
|
|||||||
{
|
{
|
||||||
GObject parent;
|
GObject parent;
|
||||||
|
|
||||||
MetaKmsDevice *device;
|
MetaKmsImplDevice *impl_device;
|
||||||
|
|
||||||
uint32_t id;
|
uint32_t id;
|
||||||
uint32_t type;
|
uint32_t type;
|
||||||
@ -93,7 +93,7 @@ typedef enum _MetaKmsPrivacyScreenHwState
|
|||||||
MetaKmsDevice *
|
MetaKmsDevice *
|
||||||
meta_kms_connector_get_device (MetaKmsConnector *connector)
|
meta_kms_connector_get_device (MetaKmsConnector *connector)
|
||||||
{
|
{
|
||||||
return connector->device;
|
return meta_kms_impl_device_get_device (connector->impl_device);
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32_t
|
uint32_t
|
||||||
@ -1122,15 +1122,10 @@ meta_kms_connector_update_state_in_impl (MetaKmsConnector *connector,
|
|||||||
drmModeRes *drm_resources,
|
drmModeRes *drm_resources,
|
||||||
drmModeConnector *drm_connector)
|
drmModeConnector *drm_connector)
|
||||||
{
|
{
|
||||||
MetaKmsImplDevice *impl_device;
|
return meta_kms_connector_read_state (connector,
|
||||||
MetaKmsResourceChanges changes;
|
connector->impl_device,
|
||||||
|
|
||||||
impl_device = meta_kms_device_get_impl_device (connector->device);
|
|
||||||
changes = meta_kms_connector_read_state (connector, impl_device,
|
|
||||||
drm_connector,
|
drm_connector,
|
||||||
drm_resources);
|
drm_resources);
|
||||||
|
|
||||||
return changes;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
@ -1149,7 +1144,6 @@ MetaKmsResourceChanges
|
|||||||
meta_kms_connector_predict_state_in_impl (MetaKmsConnector *connector,
|
meta_kms_connector_predict_state_in_impl (MetaKmsConnector *connector,
|
||||||
MetaKmsUpdate *update)
|
MetaKmsUpdate *update)
|
||||||
{
|
{
|
||||||
MetaKmsImplDevice *impl_device;
|
|
||||||
MetaKmsConnectorState *current_state;
|
MetaKmsConnectorState *current_state;
|
||||||
GList *mode_sets;
|
GList *mode_sets;
|
||||||
GList *l;
|
GList *l;
|
||||||
@ -1232,8 +1226,7 @@ meta_kms_connector_predict_state_in_impl (MetaKmsConnector *connector,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl_device = meta_kms_device_get_impl_device (connector->device);
|
sync_fd_held (connector, connector->impl_device);
|
||||||
sync_fd_held (connector, impl_device);
|
|
||||||
|
|
||||||
return changes;
|
return changes;
|
||||||
}
|
}
|
||||||
@ -1582,7 +1575,7 @@ meta_kms_connector_new (MetaKmsImplDevice *impl_device,
|
|||||||
|
|
||||||
g_assert (drm_connector);
|
g_assert (drm_connector);
|
||||||
connector = g_object_new (META_TYPE_KMS_CONNECTOR, NULL);
|
connector = g_object_new (META_TYPE_KMS_CONNECTOR, NULL);
|
||||||
connector->device = meta_kms_impl_device_get_device (impl_device);
|
connector->impl_device = impl_device;
|
||||||
connector->id = drm_connector->connector_id;
|
connector->id = drm_connector->connector_id;
|
||||||
connector->type = drm_connector->connector_type;
|
connector->type = drm_connector->connector_type;
|
||||||
connector->type_id = drm_connector->connector_type_id;
|
connector->type_id = drm_connector->connector_type_id;
|
||||||
@ -1603,12 +1596,7 @@ meta_kms_connector_finalize (GObject *object)
|
|||||||
MetaKmsConnector *connector = META_KMS_CONNECTOR (object);
|
MetaKmsConnector *connector = META_KMS_CONNECTOR (object);
|
||||||
|
|
||||||
if (connector->fd_held)
|
if (connector->fd_held)
|
||||||
{
|
meta_kms_impl_device_unhold_fd (connector->impl_device);
|
||||||
MetaKmsImplDevice *impl_device;
|
|
||||||
|
|
||||||
impl_device = meta_kms_device_get_impl_device (connector->device);
|
|
||||||
meta_kms_impl_device_unhold_fd (impl_device);
|
|
||||||
}
|
|
||||||
|
|
||||||
g_clear_pointer (&connector->current_state, meta_kms_connector_state_free);
|
g_clear_pointer (&connector->current_state, meta_kms_connector_state_free);
|
||||||
g_free (connector->name);
|
g_free (connector->name);
|
||||||
|
Loading…
Reference in New Issue
Block a user