From: Ander Conselvan de Oliveira <[email protected]>
Previously the insertion was done by the backends, with a potential crash in the error path. Calls to weston_output_destroy() would try to remove the output from the compositor list before it was actually inserted. This patch moves the insertion to weston_output_init(). Signed-off-by: Ander Conselvan de Oliveira <[email protected]> --- src/compositor-drm.c | 2 -- src/compositor-fbdev.c | 2 -- src/compositor-headless.c | 2 -- src/compositor-rdp.c | 1 - src/compositor-rpi.c | 2 -- src/compositor-wayland.c | 2 -- src/compositor-x11.c | 12 +++++++----- src/compositor.c | 2 ++ 8 files changed, 9 insertions(+), 16 deletions(-) diff --git a/src/compositor-drm.c b/src/compositor-drm.c index 57064ec..6109cec 100644 --- a/src/compositor-drm.c +++ b/src/compositor-drm.c @@ -2049,8 +2049,6 @@ create_output_for_connector(struct drm_compositor *ec, weston_log("Failed to initialize backlight\n"); } - wl_list_insert(ec->base.output_list.prev, &output->base.link); - find_and_parse_output_edid(ec, output, connector); if (connector->connector_type == DRM_MODE_CONNECTOR_LVDS) output->base.connection_internal = 1; diff --git a/src/compositor-fbdev.c b/src/compositor-fbdev.c index 076a9a8..3eaa57b 100644 --- a/src/compositor-fbdev.c +++ b/src/compositor-fbdev.c @@ -639,8 +639,6 @@ fbdev_output_create(struct fbdev_compositor *compositor, output->finish_frame_timer = wl_event_loop_add_timer(loop, finish_frame_handler, output); - wl_list_insert(compositor->base.output_list.prev, &output->base.link); - weston_log("fbdev output %d×%d px\n", output->mode.width, output->mode.height); weston_log_continue(STAMP_SPACE "guessing %d Hz and 96 dpi\n", diff --git a/src/compositor-headless.c b/src/compositor-headless.c index 326c11b..a07fd49 100644 --- a/src/compositor-headless.c +++ b/src/compositor-headless.c @@ -126,8 +126,6 @@ headless_compositor_create_output(struct headless_compositor *c, output->base.set_dpms = NULL; output->base.switch_mode = NULL; - wl_list_insert(c->base.output_list.prev, &output->base.link); - return 0; } diff --git a/src/compositor-rdp.c b/src/compositor-rdp.c index e8e4a8d..a6c192b 100644 --- a/src/compositor-rdp.c +++ b/src/compositor-rdp.c @@ -506,7 +506,6 @@ rdp_compositor_create_output(struct rdp_compositor *c, int width, int height, output->base.switch_mode = rdp_switch_mode; c->output = output; - wl_list_insert(c->base.output_list.prev, &output->base.link); return 0; out_shadow_surface: diff --git a/src/compositor-rpi.c b/src/compositor-rpi.c index 7312822..8dc12d1 100644 --- a/src/compositor-rpi.c +++ b/src/compositor-rpi.c @@ -387,8 +387,6 @@ rpi_output_create(struct rpi_compositor *compositor, uint32_t transform) if (rpi_renderer_output_create(&output->base, output->display) < 0) goto out_output; - wl_list_insert(compositor->base.output_list.prev, &output->base.link); - weston_log("Raspberry Pi HDMI output %dx%d px\n", output->mode.width, output->mode.height); weston_log_continue(STAMP_SPACE "guessing %d Hz and 96 dpi\n", diff --git a/src/compositor-wayland.c b/src/compositor-wayland.c index 9e94a7b..a850dab 100644 --- a/src/compositor-wayland.c +++ b/src/compositor-wayland.c @@ -826,8 +826,6 @@ wayland_output_create(struct wayland_compositor *c, output->base.set_dpms = NULL; output->base.switch_mode = NULL; - wl_list_insert(c->base.output_list.prev, &output->base.link); - return output; err_output: diff --git a/src/compositor-x11.c b/src/compositor-x11.c index 01af835..6c3eb15 100644 --- a/src/compositor-x11.c +++ b/src/compositor-x11.c @@ -882,28 +882,30 @@ x11_compositor_create_output(struct x11_compositor *c, if (x11_output_init_shm(c, output, output->mode.width, output->mode.height) < 0) - return NULL; + goto err_output; if (pixman_renderer_output_create(&output->base) < 0) { x11_output_deinit_shm(c, output); - return NULL; + goto err_output; } } else { ret = gl_renderer->output_create(&output->base, (EGLNativeWindowType) output->window); if (ret < 0) - return NULL; + goto err_output; } loop = wl_display_get_event_loop(c->base.wl_display); output->finish_frame_timer = wl_event_loop_add_timer(loop, finish_frame_handler, output); - wl_list_insert(c->base.output_list.prev, &output->base.link); - weston_log("x11 output %dx%d, window id %d\n", width, height, output->window); return output; + +err_output: + weston_output_destroy(&output->base); + return NULL; } static struct x11_output * diff --git a/src/compositor.c b/src/compositor.c index 51f2fae..524e24a 100644 --- a/src/compositor.c +++ b/src/compositor.c @@ -3296,6 +3296,8 @@ weston_output_init(struct weston_output *output, struct weston_compositor *c, output->id = ffs(~output->compositor->output_id_pool) - 1; output->compositor->output_id_pool |= 1 << output->id; + wl_list_insert(c->output_list.prev, &output->link); + output->global = wl_global_create(c->wl_display, &wl_output_interface, 2, output, bind_output); -- 1.8.3.2 _______________________________________________ wayland-devel mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/wayland-devel
