Added a destroy signal to the wl_display object.
authorJason Ekstrand <jason@jlekstrand.net>
Fri, 11 Jan 2013 20:29:32 +0000 (14:29 -0600)
committerKristian Høgsberg <krh@bitplanet.net>
Fri, 11 Jan 2013 20:53:12 +0000 (15:53 -0500)
Added a destroy signal to the wl_display object.

src/wayland-server.c
src/wayland-server.h
tests/Makefile.am
tests/display-test.c [new file with mode: 0644]

index f7f4c14..dae7177 100644 (file)
@@ -90,6 +90,8 @@ struct wl_display {
        struct wl_list global_list;
        struct wl_list socket_list;
        struct wl_list client_list;
+
+       struct wl_signal destroy_signal;
 };
 
 struct wl_global {
@@ -1096,6 +1098,8 @@ wl_display_create(void)
        wl_list_init(&display->client_list);
        wl_list_init(&display->registry_resource_list);
 
+       wl_signal_init(&display->destroy_signal);
+
        display->id = 1;
        display->serial = 0;
 
@@ -1115,6 +1119,8 @@ wl_display_destroy(struct wl_display *display)
        struct wl_socket *s, *next;
        struct wl_global *global, *gnext;
 
+       wl_signal_emit(&display->destroy_signal, display);
+
        wl_list_for_each_safe(s, next, &display->socket_list, link) {
                wl_event_source_remove(s->source);
                unlink(s->addr.sun_path);
@@ -1381,6 +1387,20 @@ wl_display_add_socket(struct wl_display *display, const char *name)
        return 0;
 }
 
+WL_EXPORT void
+wl_display_add_destroy_listener(struct wl_display *display,
+                               struct wl_listener *listener)
+{
+       wl_signal_add(&display->destroy_signal, listener);
+}
+
+WL_EXPORT struct wl_listener *
+wl_display_get_destroy_listener(struct wl_display *display,
+                               wl_notify_func_t notify)
+{
+       return wl_signal_get(&display->destroy_signal, notify);
+}
+
 WL_EXPORT struct wl_resource *
 wl_client_add_object(struct wl_client *client,
                     const struct wl_interface *interface,
index 3357105..576304f 100644 (file)
@@ -106,6 +106,11 @@ void wl_display_remove_global(struct wl_display *display,
 uint32_t wl_display_get_serial(struct wl_display *display);
 uint32_t wl_display_next_serial(struct wl_display *display);
 
+void wl_display_add_destroy_listener(struct wl_display *display,
+                                    struct wl_listener *listener);
+struct wl_listener *wl_display_get_destroy_listener(struct wl_display *display,
+                                                   wl_notify_func_t notify);
+
 struct wl_client *wl_client_create(struct wl_display *display, int fd);
 void wl_client_destroy(struct wl_client *client);
 void wl_client_flush(struct wl_client *client);
index cf821c0..54157bc 100644 (file)
@@ -1,6 +1,7 @@
 TESTS =                                                \
        array-test                              \
        client-test                             \
+       display-test                            \
        connection-test                         \
        event-loop-test                         \
        fixed-test                              \
@@ -22,6 +23,7 @@ test_runner_src = test-runner.c test-runner.h test-helpers.c
 
 array_test_SOURCES = array-test.c $(test_runner_src)
 client_test_SOURCES = client-test.c $(test_runner_src)
+display_test_SOURCES = display-test.c $(test_runner_src)
 connection_test_SOURCES = connection-test.c $(test_runner_src)
 event_loop_test_SOURCES = event-loop-test.c $(test_runner_src)
 fixed_test_SOURCES = fixed-test.c $(test_runner_src)
diff --git a/tests/display-test.c b/tests/display-test.c
new file mode 100644 (file)
index 0000000..95b939e
--- /dev/null
@@ -0,0 +1,79 @@
+/*
+ * Copyright © 2012 Intel Corporation
+ * Copyright © 2013 Jason Ekstrand
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that copyright
+ * notice and this permission notice appear in supporting documentation, and
+ * that the name of the copyright holders not be used in advertising or
+ * publicity pertaining to distribution of the software without specific,
+ * written prior permission.  The copyright holders make no representations
+ * about the suitability of this software for any purpose.  It is provided "as
+ * is" without express or implied warranty.
+ *
+ * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+ * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
+ * EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY SPECIAL, INDIRECT OR
+ * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
+ * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
+ * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
+ * OF THIS SOFTWARE.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdarg.h>
+#include <string.h>
+#include <assert.h>
+#include <sys/socket.h>
+#include <unistd.h>
+#include <errno.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+
+#include "wayland-server.h"
+#include "wayland-private.h"
+#include "test-runner.h"
+
+struct display_destroy_listener {
+       struct wl_listener listener;
+       int done;
+};
+
+static void
+display_destroy_notify(struct wl_listener *l, void *data)
+{
+       struct display_destroy_listener *listener;
+
+       listener = container_of(l, struct display_destroy_listener, listener);
+       listener->done = 1;
+}
+
+TEST(display_destroy_listener)
+{
+       struct wl_display *display;
+       struct display_destroy_listener a, b;
+
+       display = wl_display_create();
+       assert(display);
+
+       a.listener.notify = &display_destroy_notify;
+       a.done = 0;
+       wl_display_add_destroy_listener(display, &a.listener);
+
+       assert(wl_display_get_destroy_listener(display, display_destroy_notify) ==
+              &a.listener);
+
+       b.listener.notify = display_destroy_notify;
+       b.done = 0;
+       wl_display_add_destroy_listener(display, &b.listener);
+
+       wl_list_remove(&a.listener.link);
+
+       wl_display_destroy(display);
+
+       assert(!a.done);
+       assert(b.done);
+}
+