From 60af986f38e98fde3e17005e49d175c061a1a29a Mon Sep 17 00:00:00 2001 From: Po Lu Date: Wed, 29 Jun 2022 15:09:17 +0800 Subject: [PATCH] Clean up failable requests in more places * lisp/term/haiku-win.el (haiku-get-numeric-enum): Fix build. * src/xterm.c (x_clean_failable_requests): Avoid redundant memcpy if first == last. (x_ignore_errors_for_next_request): Fix check for last request. (x_check_errors, x_had_errors_p): Clean up failable requests here. --- lisp/term/haiku-win.el | 39 ++++++++++++++++++++------------------- src/xterm.c | 22 +++++++++++++++++++--- 2 files changed, 39 insertions(+), 22 deletions(-) diff --git a/lisp/term/haiku-win.el b/lisp/term/haiku-win.el index f73c8b71252..f6e4829cad4 100644 --- a/lisp/term/haiku-win.el +++ b/lisp/term/haiku-win.el @@ -174,25 +174,26 @@ VALUE as a unibyte string, or nil if VALUE was not a string." (insert "\n"))) (buffer-string)))))) -(defun haiku-get-numeric-enum (name) - "Return the numeric value of the system enumerator NAME." - (or (get name 'haiku-numeric-enum) - (let ((value 0) - (offset 0) - (string (symbol-name name))) - (cl-loop for octet across string - do (progn - (when (or (< octet 0) - (> octet 255)) - (error "Out of range octet: %d" octet)) - (setq value - (logior value - (lsh octet - (- (* (1- (length string)) 8) - offset)))) - (setq offset (+ offset 8)))) - (prog1 value - (put name 'haiku-enumerator-id value))))) +(eval-and-compile + (defun haiku-get-numeric-enum (name) + "Return the numeric value of the system enumerator NAME." + (or (get name 'haiku-numeric-enum) + (let ((value 0) + (offset 0) + (string (symbol-name name))) + (cl-loop for octet across string + do (progn + (when (or (< octet 0) + (> octet 255)) + (error "Out of range octet: %d" octet)) + (setq value + (logior value + (lsh octet + (- (* (1- (length string)) 8) + offset)))) + (setq offset (+ offset 8)))) + (prog1 value + (put name 'haiku-enumerator-id value)))))) (defmacro haiku-numeric-enum (name) "Expand to the numeric value NAME as a system identifier." diff --git a/src/xterm.c b/src/xterm.c index 7298feb43a1..33c8d4199e5 100644 --- a/src/xterm.c +++ b/src/xterm.c @@ -23010,8 +23010,9 @@ x_clean_failable_requests (struct x_display_info *dpyinfo) break; } - memmove (&dpyinfo->failable_requests, first, - sizeof *first * (last - first)); + if (first != last) + memmove (&dpyinfo->failable_requests, first, + sizeof *first * (last - first)); dpyinfo->next_failable_request = (dpyinfo->failable_requests + (last - first)); @@ -23025,7 +23026,7 @@ x_ignore_errors_for_next_request (struct x_display_info *dpyinfo) request = dpyinfo->next_failable_request; max = dpyinfo->failable_requests + N_FAILABLE_REQUESTS; - if (request > max) + if (request >= max) { /* There is no point in making this extra sync if all requests are known to have been fully processed. */ @@ -23119,6 +23120,7 @@ x_uncatch_errors (void) void x_check_errors (Display *dpy, const char *format) { + struct x_display_info *dpyinfo; char *string; /* This shouldn't happen, since x_check_errors should be called @@ -23134,6 +23136,12 @@ x_check_errors (Display *dpy, const char *format) > x_error_message->first_request)) XSync (dpy, False); + dpyinfo = x_display_info_for_display (dpy); + + /* Clean the array of failable requests, since a sync happened. */ + if (dpyinfo) + x_clean_failable_requests (dpyinfo); + if (x_error_message->string) { string = alloca (strlen (x_error_message->string) + 1); @@ -23149,6 +23157,8 @@ x_check_errors (Display *dpy, const char *format) bool x_had_errors_p (Display *dpy) { + struct x_display_info *dpyinfo; + /* This shouldn't happen, since x_check_errors should be called immediately inside an x_catch_errors block. */ if (dpy != x_error_message->dpy) @@ -23161,6 +23171,12 @@ x_had_errors_p (Display *dpy) > x_error_message->first_request)) XSync (dpy, False); + dpyinfo = x_display_info_for_display (dpy); + + /* Clean the array of failable requests, since a sync happened. */ + if (dpyinfo) + x_clean_failable_requests (dpyinfo); + return !!x_error_message->string; } -- 2.39.2