Mercurial > emacs
changeset 2592:2e57e16282f0
(notify): Bug fix. Treat the body of this function as a critical region.
author | Eric S. Raymond <esr@snark.thyrsus.com> |
---|---|
date | Tue, 27 Apr 1993 21:59:39 +0000 |
parents | a53b4a566cb6 |
children | 5457416cd817 |
files | lib-src/=timer.c |
diffstat | 1 files changed, 16 insertions(+), 4 deletions(-) [+] |
line wrap: on
line diff
--- a/lib-src/=timer.c Mon Apr 26 21:54:00 1993 +0000 +++ b/lib-src/=timer.c Tue Apr 27 21:59:39 1993 +0000 @@ -9,7 +9,7 @@ This program is intended to be used with the lisp package called timer.el. It was written anonymously in 1990. This version was - documented and rewritten for portability by esr@snark,thyrsus.com, + documented and rewritten for portability by esr@snark.thyrsus.com, Aug 7 1992. */ #include <stdio.h> @@ -124,6 +124,13 @@ time_t now, tdiff, waitfor = -1; register struct event *ep; + /* If an alarm timer runs out while this function is executing, + it could get called recursively. This would be bad, because + it's not re-entrant. So we must try to suspend the signal. */ +#ifdef sigmask + sighold(SIGIO); +#endif + now = time ((time_t *) NULL); for (ep = events; ep < events + num_events; ep++) @@ -137,8 +144,8 @@ /* We now have a hole in the event array; fill it with the last event. */ - ep->token = events[num_events].token; - ep->reply_at = events[num_events].reply_at; + ep->token = events[num_events - 1].token; + ep->reply_at = events[num_events - 1].reply_at; num_events--; /* We ought to scan this event again. */ @@ -154,6 +161,10 @@ /* If there are no more events, we needn't bother setting an alarm. */ if (num_events > 0) alarm (waitfor); + +#ifdef sigmask + sigrelse(SIGIO); +#endif } void @@ -276,7 +287,8 @@ } #endif /* USG */ - while (1) pause (); + for (;;) + pause (); } /* timer.c ends here */