mirror of
git://sourceware.org/git/glibc.git
synced 2024-11-21 01:12:26 +08:00
hurd: Fix implementation of setitimer.
The preemptor sigcode doesn't match since the POSIX sigcode SI_TIMER is used when SIGALRM is sent. In addition, The inline version of hurd_preempt_signals doesn't update _hurdsig_preempted_set. For these reasons, the preemptor would be skipped by post_signal. * sysdeps/mach/hurd/setitimer.c (setitimer_locked): Fix preemptor setup.
This commit is contained in:
parent
4b068090a0
commit
f0e84494b1
@ -2,6 +2,7 @@
|
||||
|
||||
* hurd/hurdselect.c (_hurd_select): Always call __io_select with no
|
||||
timeout.
|
||||
* sysdeps/mach/hurd/setitimer.c (setitimer_locked): Fix preemptor setup.
|
||||
|
||||
2019-08-29 Mihailo Stojanovic <mihailo.stojanovic@rt-rk.com>
|
||||
|
||||
|
@ -128,7 +128,8 @@ timer_thread (void)
|
||||
|
||||
/* Forward declaration. */
|
||||
static int setitimer_locked (const struct itimerval *new,
|
||||
struct itimerval *old, void *crit);
|
||||
struct itimerval *old, void *crit,
|
||||
int hurd_siglocked);
|
||||
|
||||
static sighandler_t
|
||||
restart_itimer (struct hurd_signal_preemptor *preemptor,
|
||||
@ -142,7 +143,7 @@ restart_itimer (struct hurd_signal_preemptor *preemptor,
|
||||
/* Either reload or disable the itimer. */
|
||||
__spin_lock (&_hurd_itimer_lock);
|
||||
it.it_value = it.it_interval = _hurd_itimerval.it_interval;
|
||||
setitimer_locked (&it, NULL, NULL);
|
||||
setitimer_locked (&it, NULL, NULL, 1);
|
||||
|
||||
/* Continue with normal delivery (or hold, etc.) of SIGALRM. */
|
||||
return SIG_ERR;
|
||||
@ -154,7 +155,7 @@ restart_itimer (struct hurd_signal_preemptor *preemptor,
|
||||
|
||||
static int
|
||||
setitimer_locked (const struct itimerval *new, struct itimerval *old,
|
||||
void *crit)
|
||||
void *crit, int hurd_siglocked)
|
||||
{
|
||||
struct itimerval newval;
|
||||
struct timeval now, remaining, elapsed;
|
||||
@ -192,16 +193,19 @@ setitimer_locked (const struct itimerval *new, struct itimerval *old,
|
||||
run `restart_itimer' each time a SIGALRM would arrive. */
|
||||
static struct hurd_signal_preemptor preemptor =
|
||||
{
|
||||
__sigmask (SIGALRM), 0, 0,
|
||||
__sigmask (SIGALRM), SI_TIMER, SI_TIMER,
|
||||
&restart_itimer,
|
||||
};
|
||||
__mutex_lock (&_hurd_siglock);
|
||||
if (!hurd_siglocked)
|
||||
__mutex_lock (&_hurd_siglock);
|
||||
if (! preemptor.next && _hurdsig_preemptors != &preemptor)
|
||||
{
|
||||
preemptor.next = _hurdsig_preemptors;
|
||||
_hurdsig_preemptors = &preemptor;
|
||||
_hurdsig_preempted_set |= preemptor.signals;
|
||||
}
|
||||
__mutex_unlock (&_hurd_siglock);
|
||||
if (!hurd_siglocked)
|
||||
__mutex_unlock (&_hurd_siglock);
|
||||
|
||||
if (_hurd_itimer_port == MACH_PORT_NULL)
|
||||
{
|
||||
@ -349,7 +353,7 @@ __setitimer (enum __itimer_which which, const struct itimerval *new,
|
||||
|
||||
crit = _hurd_critical_section_lock ();
|
||||
__spin_lock (&_hurd_itimer_lock);
|
||||
return setitimer_locked (new, old, crit);
|
||||
return setitimer_locked (new, old, crit, 0);
|
||||
}
|
||||
|
||||
static void
|
||||
@ -364,7 +368,7 @@ fork_itimer (void)
|
||||
it = _hurd_itimerval;
|
||||
it.it_value = it.it_interval;
|
||||
|
||||
setitimer_locked (&it, NULL, NULL);
|
||||
setitimer_locked (&it, NULL, NULL, 0);
|
||||
|
||||
(void) &fork_itimer; /* Avoid gcc optimizing out the function. */
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user