mirror of
https://gitlab.freedesktop.org/wayland/wayland.git
synced 2025-10-29 05:40:16 -04:00
proto, server: Add internal server error message. (v2)
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@canonical.com>
Acked-by: Pekka Paalanen <pekka.paalanen@collabora.co.uk>
Reviewed-by: Pekka Paalanen <pekka.paalanen@collabora.com>
This commit is contained in:
parent
10c1f37a7c
commit
d325140289
5 changed files with 73 additions and 0 deletions
|
|
@ -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)
|
||||
{
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue