summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorOlivier Fourdan <ofourdan@redhat.com>2015-01-08 15:40:29 +0100
committerBryce Harrington <bryce@osg.samsung.com>2015-01-20 20:53:46 -0800
commit2e710e51bbd317ccf38fc7bca8ffeda3d025dc34 (patch)
tree1d9f384365aa1b4da733abfa8a37dc52a1399944
parentb73c58e6d7b804a7d1b840bda40db0e5c64202bb (diff)
downloadweston-2e710e51bbd317ccf38fc7bca8ffeda3d025dc34.tar.gz
Fix mutex hang in colord on output removal
Using the x11 output (maybe with others as well), weston would hang when closing the output if the colord plugin is enabled. The hang occurs in mutex lock in the output notifier handler because the given GMutex value is incorrect. This is because of a cast error, the type of container should be "cms_output" and not "cms_colord". Signed-off-by: Olivier Fourdan <ofourdan@redhat.com> Reviewed-by: Richard Hughes <richard@hughsie.com> Reviewed-by: Bryce Harrington <bryce@osg.samsung.com>
-rw-r--r--src/cms-colord.c12
1 files changed, 4 insertions, 8 deletions
diff --git a/src/cms-colord.c b/src/cms-colord.c
index c541a34b..a6b105ce 100644
--- a/src/cms-colord.c
+++ b/src/cms-colord.c
@@ -212,10 +212,11 @@ colord_device_changed_cb(CdDevice *device, struct cms_output *ocms)
static void
colord_notifier_output_destroy(struct wl_listener *listener, void *data)
{
- struct cms_colord *cms =
- container_of(listener, struct cms_colord, destroy_listener);
+ struct cms_output *ocms =
+ container_of(listener, struct cms_output, destroy_listener);
struct weston_output *o = (struct weston_output *) data;
- struct cms_output *ocms;
+ struct cms_colord *cms = ocms->cms;
+
gboolean ret;
gchar *device_id;
GError *error = NULL;
@@ -223,11 +224,6 @@ colord_notifier_output_destroy(struct wl_listener *listener, void *data)
colord_idle_cancel_for_output(cms, o);
device_id = get_output_id(cms, o);
weston_log("colord: output removed %s\n", device_id);
- ocms = g_hash_table_lookup(cms->devices, device_id);
- if (!ocms) {
- weston_log("colord: failed to delete device\n");
- goto out;
- }
g_signal_handlers_disconnect_by_data(ocms->device, ocms);
ret = cd_client_delete_device_sync (cms->client,
ocms->device,