1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149From be437c6b27a2c6b83b2e60e30e5f0cdcbda28ad0 Mon Sep 17 00:00:00 2001
From: Yannick Gicquel <yannick.gicquel@iot.bzh>
Date: Fri, 6 Nov 2015 09:01:43 +0100
Subject: [PATCH] weston: workaround to avoid segfault on hotplug event
When user unplug/replug a monitor, HDMI link for example,
weston segfault while calling gbm_surface_destroy from
drm_output_destroy function.
This workaround basically disable the output destroy
mechanism on unplug/replug event callbacks. It also force
the compositor to do a pageflip in order to refresh the
output when it is connected back.
All this workaround is under "KEEP_OUTPUTS_ON_HOTPLUG"
compilation flag, which can be disable if required.
Signed-off-by: Yannick Gicquel <yannick.gicquel@iot.bzh>
Signed-off-by: Manuel Bachmann <mbc@iot.bzh>
---
src/compositor-drm.c | 22 ++++++++++++++++++++++
1 file changed, 22 insertions(+)
diff --git a/src/compositor-drm.c b/src/compositor-drm.c
index 2087c93..21b7776 100644
--- a/src/compositor-drm.c
+++ b/src/compositor-drm.c
@@ -56,6 +56,12 @@
#define DRM_CAP_TIMESTAMP_MONOTONIC 0x6
#endif
+/* This allow weston to keep outputs when re-attached after
+ * a previous unplug event. Comment line below to fallback
+ * to initial behavior.
+ */
+#define KEEP_OUTPUTS_ON_HOTPLUG
+
static int option_current_mode = 0;
enum output_config {
@@ -2383,6 +2389,11 @@ create_outputs(struct drm_compositor *ec, uint32_t option_connector,
return 0;
}
+#if defined(KEEP_OUTPUTS_ON_HOTPLUG)
+static void
+drm_compositor_set_modes(struct drm_compositor *compositor);
+#endif
+
static void
update_outputs(struct drm_compositor *ec, struct udev_device *drm_device)
{
@@ -2443,14 +2454,25 @@ update_outputs(struct drm_compositor *ec, struct udev_device *drm_device)
disconnects &= ~(1 << output->connector_id);
weston_log("connector %d disconnected\n",
output->connector_id);
+#if !defined(KEEP_OUTPUTS_ON_HOTPLUG)
drm_output_destroy(&output->base);
+#endif
}
}
}
+#if defined(KEEP_OUTPUTS_ON_HOTPLUG)
+ /* This refresh the display when connector is plugged back */
+ wl_list_for_each_safe(output, next, &ec->base.output_list,
+ base.link) {
+ /* FIXME: following is required only on 'connected' event. */
+ drm_compositor_set_modes(ec);
+ }
+#else
/* FIXME: handle zero outputs, without terminating */
if (ec->connector_allocator == 0)
wl_display_terminate(ec->base.wl_display);
+#endif
}
static int
--
1.9.1
|