summaryrefslogtreecommitdiff
path: root/src/drmmode_display.c
diff options
context:
space:
mode:
authorMaarten Lankhorst <maarten.lankhorst@canonical.com>2013-03-25 13:55:37 +0100
committerMaarten Lankhorst <maarten.lankhorst@canonical.com>2013-03-25 13:55:37 +0100
commit84998320162a74a0861b7be1fcc230e50f08424a (patch)
tree1817ac3bf4d276369f6bb9f93b05ac61cd5d9e6c /src/drmmode_display.c
parenta80785f79268ed3701fc69cbd9194ad12822c82c (diff)
Clean up some errors on closing.
If forced close happens, all ioctl's will fail. Some of the handlers also need to be unregistered before the module is unloaded entirely.
Diffstat (limited to 'src/drmmode_display.c')
-rw-r--r--src/drmmode_display.c16
1 files changed, 16 insertions, 0 deletions
diff --git a/src/drmmode_display.c b/src/drmmode_display.c
index 9eca60f..6033a6d 100644
--- a/src/drmmode_display.c
+++ b/src/drmmode_display.c
@@ -627,6 +627,9 @@ drmmode_output_detect(xf86OutputPtr output)
drmmode_output->mode_output =
drmModeGetConnector(drmmode->fd, drmmode_output->output_id);
+ if (!drmmode_output->mode_output)
+ return XF86OutputStatusDisconnected;
+
switch (drmmode_output->mode_output->connection) {
case DRM_MODE_CONNECTED:
status = XF86OutputStatusConnected;
@@ -663,6 +666,9 @@ drmmode_output_get_modes(xf86OutputPtr output)
drmModePropertyPtr props;
xf86MonPtr ddc_mon = NULL;
+ if (!koutput)
+ return NULL;
+
/* look for an EDID property */
for (i = 0; i < koutput->count_props; i++) {
props = drmModeGetProperty(drmmode->fd, koutput->props[i]);
@@ -927,6 +933,9 @@ drmmode_output_get_property(xf86OutputPtr output, Atom property)
drmModeGetConnector(drmmode->fd, drmmode_output->output_id);
}
+ if (!drmmode_output->mode_output)
+ return FALSE;
+
for (i = 0; i < drmmode_output->num_props; i++) {
drmmode_prop_ptr p = &drmmode_output->props[i];
if (p->atoms[0] != property)
@@ -1437,6 +1446,7 @@ drmmode_uevent_fini(ScrnInfoPtr scrn)
if (drmmode->uevent_monitor) {
struct udev *u = udev_monitor_get_udev(drmmode->uevent_monitor);
+ RemoveGeneralSocket(udev_monitor_get_fd(drmmode->uevent_monitor));
udev_monitor_unref(drmmode->uevent_monitor);
udev_unref(u);
}
@@ -1524,6 +1534,12 @@ void
drmmode_screen_fini(ScreenPtr pScreen)
{
ScrnInfoPtr scrn = xf86ScreenToScrn(pScreen);
+ drmmode_ptr drmmode = drmmode_from_scrn(scrn);
drmmode_uevent_fini(scrn);
+
+ /* Register a wakeup handler to get informed on DRM events */
+ RemoveBlockAndWakeupHandlers((BlockHandlerProcPtr)NoopDDA,
+ drmmode_wakeup_handler, scrn);
+ RemoveGeneralSocket(drmmode->fd);
}