Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 05 Apr 1998 13:31:35 +0200
From:      Poul-Henning Kamp <phk@critter.freebsd.dk>
To:        =?koi8-r?B?4c7E0sXKIP7F0s7P1w==?= <ache@nagual.pp.ru>
Cc:        current@FreeBSD.ORG
Subject:   Re: dead hang after ppp started (with workaround) 
Message-ID:  <7186.891775895@critter.freebsd.dk>
In-Reply-To: Your message of "Sun, 05 Apr 1998 14:54:27 %2B0400." <19980405145427.14961@nagual.pp.ru> 

next in thread | previous in thread | raw e-mail | index | archive | help

Try this patch...  I overlooked something in the itimer handling...

Index: kern_time.c
===================================================================
RCS file: /home/ncvs/src/sys/kern/kern_time.c,v
retrieving revision 1.48
diff -u -r1.48 kern_time.c
--- kern_time.c	1998/04/05 10:28:01	1.48
+++ kern_time.c	1998/04/05 11:30:46
@@ -102,10 +102,6 @@
 	ts.tv_nsec = tv->tv_usec * 1000;
 	set_timecounter(&ts);
 	(void) splsoftclock();
-	for (p = allproc.lh_first; p != 0; p = p->p_list.le_next) {
-		if (timerisset(&p->p_realtimer.it_value))
-			timevaladd(&p->p_realtimer.it_value, &delta);
-	}
 	lease_updatetime(delta.tv_sec);
 	splx(s);
 	resettodr();
@@ -479,7 +475,7 @@
 		 */
 		aitv = p->p_realtimer;
 		if (timerisset(&aitv.it_value)) {
-			getmicrotime(&ctv);
+			getmicroruntime(&ctv);
 			if (timercmp(&aitv.it_value, &ctv, <))
 				timerclear(&aitv.it_value);
 			else
@@ -533,6 +529,8 @@
 		if (timerisset(&aitv.it_value)) 
 			p->p_ithandle = timeout(realitexpire, (caddr_t)p,
 						tvtohz(&aitv.it_value));
+		getmicroruntime(&ctv);
+		timevaladd(&aitv.it_value, &ctv);
 		p->p_realtimer = aitv;
 	} else
 		p->p_stats->p_timer[uap->which] = aitv;
@@ -557,7 +555,7 @@
 	void *arg;
 {
 	register struct proc *p;
-	struct timeval ctv;
+	struct timeval ctv, ntv;
 	int s;
 
 	p = (struct proc *)arg;
@@ -570,11 +568,12 @@
 		s = splclock(); /* XXX: still neeeded ? */
 		timevaladd(&p->p_realtimer.it_value,
 		    &p->p_realtimer.it_interval);
-		getmicrotime(&ctv);
+		getmicroruntime(&ctv);
 		if (timercmp(&p->p_realtimer.it_value, &ctv, >)) {
+			ntv = p->p_realtimer.it_value;
+			timevalsub(&ntv, &ctv);
 			p->p_ithandle =
-			    timeout(realitexpire, (caddr_t)p,
-				    hzto(&p->p_realtimer.it_value) - 1);
+			    timeout(realitexpire, (caddr_t)p, tvtohz(&ntv));
 			splx(s);
 			return;
 		}
--
Poul-Henning Kamp             FreeBSD coreteam member
phk@FreeBSD.ORG               "Real hackers run -current on their laptop."
"Drink MONO-tonic, it goes down but it will NEVER come back up!"

To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-current" in the body of the message



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?7186.891775895>