From 78c44ab132261ca2df37877c60eb528ead7b38ed Mon Sep 17 00:00:00 2001 From: Ray Strode Date: Wed, 26 Aug 2015 11:13:25 -0400 Subject: [PATCH] kms-winsys: clean up error handling in _cogl_winsys_renderer_connect If cogl fails to open the drm device, initialize gbm, or open the egl display, then it closes the drm fd, uninitializes gbm, closes the display and then calls _cogl_winsys_renderer_disconnect which does most of those things again, on the, now deinitialized, members. This commit removes the explicit failure handling in renderer_connect and defers cleanup to disconnect. https://bugzilla.gnome.org/show_bug.cgi?id=754540 --- cogl/winsys/cogl-winsys-egl-kms.c | 23 +++++++++++------------ 1 file changed, 11 insertions(+), 12 deletions(-) diff --git a/cogl/winsys/cogl-winsys-egl-kms.c b/cogl/winsys/cogl-winsys-egl-kms.c index a5606360b..683bbc886 100644 --- a/cogl/winsys/cogl-winsys-egl-kms.c +++ b/cogl/winsys/cogl-winsys-egl-kms.c @@ -124,7 +124,11 @@ _cogl_winsys_renderer_disconnect (CoglRenderer *renderer) CoglRendererEGL *egl_renderer = renderer->winsys; CoglRendererKMS *kms_renderer = egl_renderer->platform; - eglTerminate (egl_renderer->edpy); + if (egl_renderer->edpy != EGL_NO_DISPLAY) + eglTerminate (egl_renderer->edpy); + + if (kms_renderer->gbm != NULL) + gbm_device_destroy (kms_renderer->gbm); if (kms_renderer->opened_fd >= 0) close (kms_renderer->opened_fd); @@ -308,6 +312,8 @@ _cogl_winsys_renderer_connect (CoglRenderer *renderer, kms_renderer->fd = -1; kms_renderer->opened_fd = -1; + egl_renderer->edpy = EGL_NO_DISPLAY; + if (renderer->kms_fd >= 0) { kms_renderer->fd = renderer->kms_fd; @@ -332,7 +338,7 @@ _cogl_winsys_renderer_connect (CoglRenderer *renderer, _cogl_set_error (error, COGL_WINSYS_ERROR, COGL_WINSYS_ERROR_INIT, "Couldn't create gbm device"); - goto close_fd; + goto fail; } egl_renderer->edpy = eglGetDisplay ((EGLNativeDisplayType)kms_renderer->gbm); @@ -341,11 +347,11 @@ _cogl_winsys_renderer_connect (CoglRenderer *renderer, _cogl_set_error (error, COGL_WINSYS_ERROR, COGL_WINSYS_ERROR_INIT, "Couldn't get eglDisplay"); - goto destroy_gbm_device; + goto fail; } if (!_cogl_winsys_egl_renderer_connect_common (renderer, error)) - goto egl_terminate; + goto fail; _cogl_poll_renderer_add_fd (renderer, kms_renderer->fd, @@ -356,14 +362,7 @@ _cogl_winsys_renderer_connect (CoglRenderer *renderer, return TRUE; -egl_terminate: - eglTerminate (egl_renderer->edpy); -destroy_gbm_device: - gbm_device_destroy (kms_renderer->gbm); -close_fd: - if (kms_renderer->opened_fd >= 0) - close (kms_renderer->opened_fd); - +fail: _cogl_winsys_renderer_disconnect (renderer); return FALSE;