Handle failure to reference a buffer name better
authorKristian Høgsberg <krh@bitplanet.net>
Thu, 5 Aug 2010 21:44:31 +0000 (17:44 -0400)
committerKristian Høgsberg <krh@bitplanet.net>
Thu, 5 Aug 2010 21:44:31 +0000 (17:44 -0400)
compositor.c
connection.c
wayland-client.c
wayland.c
wayland.h

index da1a658..0ce2d09 100644 (file)
@@ -442,6 +442,7 @@ surface_attach(struct wl_client *client,
 {
        struct wlsc_surface *es = (struct wlsc_surface *) surface;
        struct wlsc_compositor *ec = es->compositor;
+       EGLImageKHR image;
        EGLint attribs[] = {
                EGL_WIDTH,              0,
                EGL_HEIGHT,             0,
@@ -450,14 +451,36 @@ surface_attach(struct wl_client *client,
                EGL_NONE
        };
 
+       attribs[1] = width;
+       attribs[3] = height;
+       attribs[5] = stride / 4;
+
+       image = eglCreateImageKHR(ec->display, ec->context,
+                                 EGL_DRM_IMAGE_MESA,
+                                 (EGLClientBuffer) name, attribs);
+       if (image == NULL) {
+               /* FIXME: Define a real exception event instead of
+                * abusing this one */
+               wl_client_post_event(client, ec->wl_display,
+                                    WL_DISPLAY_INVALID_OBJECT, 0);
+               fprintf(stderr, "failed to create image for name %d\n", name);
+               return;
+       }
+
        if (visual == &ec->argb_visual)
                es->visual = &ec->argb_visual;
        else if (visual == &ec->premultiplied_argb_visual)
                es->visual = &ec->premultiplied_argb_visual;
        else if (visual == &ec->rgb_visual)
                es->visual = &ec->rgb_visual;
-       else
-               /* FIXME: Smack client with an exception event */;
+       else {
+               /* FIXME: Define a real exception event instead of
+                * abusing this one */
+               wl_client_post_event(client, ec->display,
+                                    WL_DISPLAY_INVALID_OBJECT, 0);
+               fprintf(stderr, "invalid visual in surface_attach\n");
+               return;
+       }
 
        glBindTexture(GL_TEXTURE_2D, es->texture);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
@@ -468,13 +491,8 @@ surface_attach(struct wl_client *client,
        if (es->image)
                eglDestroyImageKHR(ec->display, es->image);
 
-       attribs[1] = width;
-       attribs[3] = height;
-       attribs[5] = stride / 4;
+       es->image = image;
 
-       es->image = eglCreateImageKHR(ec->display, ec->context,
-                                     EGL_DRM_IMAGE_MESA,
-                                     (EGLClientBuffer) name, attribs);
        glEGLImageTargetTexture2DOES(GL_TEXTURE_2D, es->image);
 }
 
index 577e83c..76d4ce0 100644 (file)
@@ -28,6 +28,7 @@
 #include <sys/uio.h>
 #include <ffi.h>
 #include <assert.h>
+#include <fcntl.h>
 
 #include "wayland-util.h"
 #include "connection.h"
@@ -69,6 +70,7 @@ wl_connection_create(int fd,
 void
 wl_connection_destroy(struct wl_connection *connection)
 {
+       close(connection->fd);
        free(connection);
 }
 
index 561f900..5ac6541 100644 (file)
@@ -308,6 +308,7 @@ display_handle_invalid_object(void *data,
                              struct wl_display *display, uint32_t id)
 {
        fprintf(stderr, "sent request to invalid object\n");
+       abort();
 }
                              
 static void
@@ -316,6 +317,7 @@ display_handle_invalid_method(void *data,
                              uint32_t id, uint32_t opcode)
 {
        fprintf(stderr, "sent invalid request opcode\n");
+       abort();
 }
 
 static void
@@ -323,6 +325,7 @@ display_handle_no_memory(void *data,
                         struct wl_display *display)
 {
        fprintf(stderr, "server out of memory\n");
+       abort();
 }
 
 static void
index de2a5c0..8802c33 100644 (file)
--- a/wayland.c
+++ b/wayland.c
@@ -65,9 +65,6 @@ struct wl_global {
        struct wl_list link;
 };
 
-void
-wl_client_destroy(struct wl_client *client);
-
 WL_EXPORT void
 wl_client_post_event(struct wl_client *client, struct wl_object *sender,
                     uint32_t opcode, ...)
@@ -210,7 +207,7 @@ wl_object_destroy(struct wl_object *object)
        interface->destroy(NULL, (struct wl_surface *) object);
 }
 
-void
+WL_EXPORT void
 wl_client_destroy(struct wl_client *client)
 {
        struct wl_surface *surface;
index 511fdef..96df34f 100644 (file)
--- a/wayland.h
+++ b/wayland.h
@@ -89,6 +89,8 @@ typedef void (*wl_client_connect_func_t)(struct wl_client *client, struct wl_obj
 
 int wl_display_add_global(struct wl_display *display, struct wl_object *object, wl_client_connect_func_t func);
 
+void wl_client_destroy(struct wl_client *client);
+
 struct wl_compositor {
        struct wl_object base;
        const char *device;