Date: Fri, 10 May 1996 10:31:37 +0900 From: =?ISO-2022-JP?B?GyRCRURDZkh+SmY7UhsoQg==?= <mihoko@pa.yokogawa.co.jp> To: freebsd-hackers@freebsd.org Cc: taketomi@pa.yokogawa.co.jp Subject: a problem of setitimer() Message-ID: <199605100131.KAA01256@sapphire.pa.yokogawa.co.jp>
next in thread | raw e-mail | index | archive | help
Hi all,
I'm running FreeBSD-2.1.0R.
I found the problem of realitexpire() [sys/kern/kern_time.c].
If the time is late, the process which uses the system call
setitimer() can't get SIGALARM until the next timeout has come.
For example, the current time is 7:30 and the next timeout is 7:32,
then the time is changed to 7:15.
The process gets SIGALARM at 7:32, not at 7:17.
I suggest following coding.
How about?
void
realitexpire(arg)
	void *arg;
{
	register struct proc *p;
	int s;
	p = (struct proc *)arg;
	psignal(p, SIGALRM);
	if (!timerisset(&p->p_realtimer.it_interval)) {
		timerclear(&p->p_realtimer.it_value);
		return;
	}
	/* vvv The following added vvv */
	if (timercmp(&p->p_realtimer.it_value, &time, >)) {
		for (;;) {
			s = splclock();
			timevalsub(&p->p_realtimer.it_value,
			    &p->p_realtimer.it_interval);
			if (timercmp(&p->p_realtimer.it_value, &time, <)) {
				splx(s);
				break;
			}
			splx(s);
		}
	}
	/* ^^^ The above added ^^^ */
	for (;;) {
		s = splclock();
		timevaladd(&p->p_realtimer.it_value,
		    &p->p_realtimer.it_interval);
		if (timercmp(&p->p_realtimer.it_value, &time, >)) {
			timeout(realitexpire, (caddr_t)p,
			    hzto(&p->p_realtimer.it_value) - 1);
			splx(s);
			return;
		}
		splx(s);
	}
}
Thank you in advance.
--
Mihoko Tanaka
<mihoko@pa.yokogawa.co.jp>
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?199605100131.KAA01256>
