[PATCH 2/2] proto, server: Add internal server error message. (v2)
Christopher James Halse Rogers
raof at ubuntu.com
Tue Jan 22 02:42:17 UTC 2019
On 20 November 2018 8:02:50 pm NZDT, Christopher James Halse Rogers <christopher.halse.rogers at canonical.com> wrote:
>Many languages such as C++ or Rust have an unwinding error-reporting
>mechanism. Code in these languages can (and must!) wrap request
>handling
>callbacks in unwind guards to avoid undefined behaviour.
>
>As a consequence such code will detect internal server errors, but have
>no way to communicate such failures to the client.
>
>This adds a WL_DISPLAY_ERROR_IMPLEMENTATION error to wl_display so that
>such code can notify (and disconnect) clients which hit internal bugs.
>While servers can currently abuse other wl_display errors for the same
>effect, adding an explicit error code allows clients to tell the
>difference between errors which are their fault and errors which are
>the
>server's fault. This is particularly interesting for automated bug
>reporting.
>
>v2: Rename error from "internal" to "implementation", in sympathy with
> X11's BadImplementation error.
> Add more justification in the commit message.
>
>Signed-off-by: Christopher James Halse Rogers
><christopher.halse.rogers at canonical.com>
>Acked-by: Pekka Paalanen <pekka.paalanen at collabora.co.uk>
>---
> protocol/wayland.xml | 2 ++
> src/wayland-client.c | 3 +++
> src/wayland-server-core.h | 4 ++++
> src/wayland-server.c | 24 +++++++++++++++++++++++
> tests/display-test.c | 40 +++++++++++++++++++++++++++++++++++++++
> 5 files changed, 73 insertions(+)
>
>diff --git a/protocol/wayland.xml b/protocol/wayland.xml
>index 141038b..754b789 100644
>--- a/protocol/wayland.xml
>+++ b/protocol/wayland.xml
>@@ -94,6 +94,8 @@
> summary="method doesn't exist on the specified interface"/>
> <entry name="no_memory" value="2"
> summary="server is out of memory"/>
>+ <entry name="implementation" value="3"
>+ summary="implementation error in compositor"/>
> </enum>
>
> <event name="delete_id">
>diff --git a/src/wayland-client.c b/src/wayland-client.c
>index 0ccfc66..b0805f1 100644
>--- a/src/wayland-client.c
>+++ b/src/wayland-client.c
>@@ -185,6 +185,9 @@ display_protocol_error(struct wl_display *display,
>uint32_t code,
> case WL_DISPLAY_ERROR_NO_MEMORY:
> err = ENOMEM;
> break;
>+ case WL_DISPLAY_ERROR_IMPLEMENTATION:
>+ err = EPROTO;
>+ break;
> default:
> err = EFAULT;
> }
>diff --git a/src/wayland-server-core.h b/src/wayland-server-core.h
>index 2e725d9..3e0272b 100644
>--- a/src/wayland-server-core.h
>+++ b/src/wayland-server-core.h
>@@ -324,6 +324,10 @@ wl_client_get_object(struct wl_client *client,
>uint32_t id);
> void
> wl_client_post_no_memory(struct wl_client *client);
>
>+void
>+wl_client_post_implementation_error(struct wl_client *client,
>+ const char* msg, ...)
>WL_PRINTF(2,3);
>+
> void
> wl_client_add_resource_created_listener(struct wl_client *client,
> struct wl_listener *listener);
>diff --git a/src/wayland-server.c b/src/wayland-server.c
>index c0ad229..19f6a76 100644
>--- a/src/wayland-server.c
>+++ b/src/wayland-server.c
>@@ -650,6 +650,30 @@ wl_client_post_no_memory(struct wl_client *client)
> WL_DISPLAY_ERROR_NO_MEMORY, "no memory");
> }
>
>+/** Report an internal server error
>+ *
>+ * \param client The client object
>+ * \param msg A printf-style format string
>+ * \param ... Format string arguments
>+ *
>+ * Report an unspecified internal implementation error and disconnect
>+ * the client.
>+ *
>+ * \memberof wl_client
>+ */
>+WL_EXPORT void
>+wl_client_post_implementation_error(struct wl_client *client,
>+ char const *msg, ...)
>+{
>+ va_list ap;
>+
>+ va_start(ap, msg);
>+ wl_resource_post_error_vargs(client->display_resource,
>+ WL_DISPLAY_ERROR_IMPLEMENTATION,
>+ msg, ap);
>+ va_end(ap);
>+}
>+
> WL_EXPORT void
> wl_resource_post_no_memory(struct wl_resource *resource)
> {
>diff --git a/tests/display-test.c b/tests/display-test.c
>index 9b49a0e..6d98cc7 100644
>--- a/tests/display-test.c
>+++ b/tests/display-test.c
>@@ -419,6 +419,46 @@ TEST(post_nomem_tst)
> display_destroy(d);
> }
>
>+static void
>+post_implementation_error_main(void)
>+{
>+ struct client *c = client_connect();
>+ struct wl_seat *seat = client_get_seat(c);
>+ uint32_t object_id, protocol_error;
>+ const struct wl_interface *interface;
>+
>+ assert(stop_display(c, 1) == -1);
>+ int err = wl_display_get_error(c->wl_display);
>+ fprintf(stderr, "Err is %i\n", err);
>+ assert(err == EPROTO);
>+ protocol_error = wl_display_get_protocol_error(c->wl_display,
>+ &interface,
>+ &object_id);
>+ assert(protocol_error == WL_DISPLAY_ERROR_IMPLEMENTATION);
>+ assert(interface == &wl_display_interface);
>+
>+ wl_proxy_destroy((struct wl_proxy *) seat);
>+ client_disconnect_nocheck(c);
>+}
>+
>+TEST(post_internal_error_tst)
>+{
>+ struct display *d = display_create();
>+ struct client_info *cl;
>+
>+ wl_global_create(d->wl_display, &wl_seat_interface,
>+ 1, d, bind_seat);
>+
>+ cl = client_create_noarg(d, post_implementation_error_main);
>+ display_run(d);
>+
>+ wl_client_post_implementation_error(cl->wl_client, "Error %i", 20);
>+
>+ display_resume(d);
>+
>+ display_destroy(d);
>+}
>+
> static void
> register_reading(struct wl_display *display)
> {
>--
>2.19.1
>
>_______________________________________________
>wayland-devel mailing list
>wayland-devel at lists.freedesktop.org
>https://lists.freedesktop.org/mailman/listinfo/wayland-devel
Ping!
Is there anything I can do to make these patches more appealing?
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.freedesktop.org/archives/wayland-devel/attachments/20190122/8a9afcd2/attachment.html>
More information about the wayland-devel
mailing list