diff --git a/lisp/progmodes/cc-mode.el b/lisp/progmodes/cc-mode.el index 6eed5b53c19..f930d2d34f3 100644 --- a/lisp/progmodes/cc-mode.el +++ b/lisp/progmodes/cc-mode.el @@ -3401,22 +3401,6 @@ Key bindings: (insert (format "Buffer Style: %s\nc-emacs-features: %s\n" style c-features))))))) - -;; Make entries in `major-mode-remap-defaults' to ensure that when CC -;; Mode has been loaded, the symbols `c-mode' etc., will call CC Mode's -;; modes rather than c-ts-mode etc.. -(when (boundp 'major-mode-remap-defaults) - (add-to-list 'major-mode-remap-defaults '(c++-mode . c++-ts-mode)) - (add-to-list 'major-mode-remap-defaults '(c-mode . c-ts-mode)) - (add-to-list 'major-mode-remap-defaults '(c-or-c++-mode . c-or-c++-ts-mode)) - (let (entry) - (dolist (mode '(c-mode c++-mode c-or-c++-mode)) - (if (and (setq entry (assq mode major-mode-remap-defaults)) - (null (cdr entry))) - (setq major-mode-remap-defaults - (delq entry major-mode-remap-defaults))) - (push (cons mode nil) major-mode-remap-defaults)))) - (cc-provide 'cc-mode) diff --git a/src/atimer.c b/src/atimer.c index e59817049f0..ee6957770ed 100644 --- a/src/atimer.c +++ b/src/atimer.c @@ -201,6 +201,9 @@ cancel_atimer (struct atimer *timer) } } + /* We shouldn't be called with timers which aren't on either list. */ + eassert (i != 2); + unblock_atimers (&oldset); } diff --git a/src/eval.c b/src/eval.c index 699dcde2e0b..9d47f04f92a 100644 --- a/src/eval.c +++ b/src/eval.c @@ -1220,17 +1220,34 @@ usage: (while TEST BODY...) */) return Qnil; } +struct funcall_with_delayed_message_data +{ + Lisp_Object *message; + struct atimer *timer; +}; + static void with_delayed_message_display (struct atimer *timer) { - message3 (build_string (timer->client_data)); + struct funcall_with_delayed_message_data *data + = timer->client_data; + if (data->timer) + { + message3 (*data->message); + data->timer = NULL; + } } static void -with_delayed_message_cancel (void *timer) +with_delayed_message_cancel (void *datap) { - xfree (((struct atimer *) timer)->client_data); - cancel_atimer (timer); + struct funcall_with_delayed_message_data *data + = datap; + if (data->timer) + { + cancel_atimer (data->timer); + data->timer = NULL; + } } DEFUN ("funcall-with-delayed-message", @@ -1251,10 +1268,12 @@ is not displayed. */) /* Set up the atimer. */ struct timespec interval = dtotimespec (XFLOATINT (timeout)); - struct atimer *timer = start_atimer (ATIMER_RELATIVE, interval, - with_delayed_message_display, - xstrdup (SSDATA (message))); - record_unwind_protect_ptr (with_delayed_message_cancel, timer); + struct funcall_with_delayed_message_data data + = { .message = &message }; + data.timer = start_atimer (ATIMER_RELATIVE, interval, + with_delayed_message_display, + &data); + record_unwind_protect_ptr (with_delayed_message_cancel, &data); Lisp_Object result = calln (function); diff --git a/src/pgtkselect.c b/src/pgtkselect.c index 7e32252616b..bc0e17f1aec 100644 --- a/src/pgtkselect.c +++ b/src/pgtkselect.c @@ -981,15 +981,22 @@ static void pgtk_display_selection_waiting_message (struct atimer *timer) { Lisp_Object val; + struct atimer **atimerp = timer->client_data; val = build_string ("Waiting for reply from selection owner..."); message3_nolog (val); + *atimerp = NULL; } static void -pgtk_cancel_atimer (void *atimer) +pgtk_cancel_atimer (void *atimerp) { - cancel_atimer (atimer); + struct atimer **atimer = atimerp; + if (*atimer) + { + cancel_atimer (*atimer); + *atimer = NULL; + } } @@ -1044,8 +1051,8 @@ pgtk_get_foreign_selection (Lisp_Object selection_symbol, Lisp_Object target_typ message_interval = make_timespec (1, 0); delayed_message = start_atimer (ATIMER_RELATIVE, message_interval, pgtk_display_selection_waiting_message, - NULL); - record_unwind_protect_ptr (pgtk_cancel_atimer, delayed_message); + &delayed_message); + record_unwind_protect_ptr (pgtk_cancel_atimer, &delayed_message); /* This allows quits. Also, don't wait forever. */ intmax_t timeout = max (0, pgtk_selection_timeout); diff --git a/src/xselect.c b/src/xselect.c index 27b83825b34..e082d664aea 100644 --- a/src/xselect.c +++ b/src/xselect.c @@ -1631,15 +1631,22 @@ static void x_display_selection_waiting_message (struct atimer *timer) { Lisp_Object val; + struct atimer **atimerp = timer->client_data; val = build_string ("Waiting for reply from selection owner..."); message3_nolog (val); + *atimerp = NULL; } static void -x_cancel_atimer (void *atimer) +x_cancel_atimer (void *atimerp) { - cancel_atimer (atimer); + struct atimer **atimer = atimerp; + if (*atimer) + { + cancel_atimer (*atimer); + *atimer = NULL; + } } @@ -1708,8 +1715,8 @@ x_get_foreign_selection (Lisp_Object selection_symbol, Lisp_Object target_type, message_interval = make_timespec (1, 0); delayed_message = start_atimer (ATIMER_RELATIVE, message_interval, x_display_selection_waiting_message, - NULL); - record_unwind_protect_ptr (x_cancel_atimer, delayed_message); + &delayed_message); + record_unwind_protect_ptr (x_cancel_atimer, &delayed_message); /* This allows quits. Also, don't wait forever. */ intmax_t timeout = max (0, x_selection_timeout);