Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 20 Oct 2008 02:37:53 +0000 (UTC)
From:      David Xu <davidxu@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r184067 - head/sys/kern
Message-ID:  <200810200237.m9K2brwF058086@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: davidxu
Date: Mon Oct 20 02:37:53 2008
New Revision: 184067
URL: http://svn.freebsd.org/changeset/base/184067

Log:
  In realtimer_delete(), clear timer's value and interval to tell
  realtimer_expire() to not rearm the timer, otherwise there is a chance
  that a callout will be left there and be tiggered in future unexpectly.
  
  Bug reported by: tegge@

Modified:
  head/sys/kern/kern_time.c

Modified: head/sys/kern/kern_time.c
==============================================================================
--- head/sys/kern/kern_time.c	Mon Oct 20 01:46:54 2008	(r184066)
+++ head/sys/kern/kern_time.c	Mon Oct 20 02:37:53 2008	(r184067)
@@ -1242,6 +1242,12 @@ realtimer_delete(struct itimer *it)
 {
 	mtx_assert(&it->it_mtx, MA_OWNED);
 	
+	/*
+	 * clear timer's value and interval to tell realtimer_expire
+	 * to not rearm the timer.
+	 */
+	timespecclear(&it->it_time.it_value);
+	timespecclear(&it->it_time.it_interval);
 	ITIMER_UNLOCK(it);
 	callout_drain(&it->it_callout);
 	ITIMER_LOCK(it);
@@ -1391,9 +1397,11 @@ realtimer_expire(void *arg)
 			callout_reset(&it->it_callout, tvtohz(&tv),
 				 realtimer_expire, it);
 		}
+		itimer_enter(it);
 		ITIMER_UNLOCK(it);
 		itimer_fire(it);
 		ITIMER_LOCK(it);
+		itimer_leave(it);
 	} else if (timespecisset(&it->it_time.it_value)) {
 		ts = it->it_time.it_value;
 		timespecsub(&ts, &cts);



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