Properly dispose event sources and event loops

Signed-off-by: Jonas Ådahl <jadahl@gmail.com>
diff --git a/src/compositor-drm.c b/src/compositor-drm.c
index 91f4bcd..39b7a1b 100644
--- a/src/compositor-drm.c
+++ b/src/compositor-drm.c
@@ -1424,15 +1424,19 @@
 	struct drm_compositor *d = (struct drm_compositor *) ec;
 	struct weston_input_device *input, *next;
 
+	wl_list_for_each_safe(input, next, &ec->input_device_list, link)
+		evdev_input_destroy(input);
+
+	wl_event_source_remove(d->udev_drm_source);
+	wl_event_source_remove(d->drm_source);
+
 	weston_compositor_shutdown(ec);
+
 	gbm_device_destroy(d->gbm);
 	destroy_sprites(d);
 	drmDropMaster(d->drm.fd);
 	tty_destroy(d->tty);
 
-	wl_list_for_each_safe(input, next, &ec->input_device_list, link)
-		evdev_input_destroy(input);
-
 	free(d);
 }