From 3692879cc82e12c56c011d2bf97d1c02bd3d66c5 Mon Sep 17 00:00:00 2001 From: phk Date: Mon, 3 Feb 2003 19:49:35 +0000 Subject: Split the global timezone structure into two integer fields to prevent the compiler from optimizing assignments into byte-copy operations which might make access to the individual fields non-atomic. Use the individual fields throughout, and don't bother locking them with Giant: it is no longer needed. Inspired by: tjr --- sys/amd64/amd64/tsc.c | 4 ++-- sys/amd64/isa/clock.c | 4 ++-- sys/fs/msdosfs/msdosfs_conv.c | 4 ++-- sys/fs/nwfs/nwfs_subr.c | 4 ++-- sys/fs/smbfs/smbfs_subr.c | 4 ++-- sys/i386/i386/tsc.c | 4 ++-- sys/i386/ibcs2/ibcs2_xenix.c | 4 ++-- sys/i386/isa/clock.c | 4 ++-- sys/isa/atrtc.c | 4 ++-- sys/kern/kern_time.c | 13 ++++++------- sys/kern/subr_clock.c | 4 ++-- sys/kern/subr_rtc.c | 4 ++-- sys/pc98/cbus/clock.c | 6 +++--- sys/pc98/cbus/pcrtc.c | 6 +++--- sys/pc98/pc98/clock.c | 6 +++--- sys/sys/kernel.h | 5 +++-- 16 files changed, 40 insertions(+), 40 deletions(-) diff --git a/sys/amd64/amd64/tsc.c b/sys/amd64/amd64/tsc.c index 8e812a1..ec9b23a 100644 --- a/sys/amd64/amd64/tsc.c +++ b/sys/amd64/amd64/tsc.c @@ -908,7 +908,7 @@ inittodr(time_t base) /* sec now contains the number of seconds, since Jan 1 1970, in the local time zone */ - sec += tz.tz_minuteswest * 60 + (wall_cmos_clock ? adjkerntz : 0); + sec += tz_minuteswest * 60 + (wall_cmos_clock ? adjkerntz : 0); y = time_second - sec; if (y <= -2 || y >= 2) { @@ -946,7 +946,7 @@ resettodr() /* Calculate local time to put in RTC */ - tm -= tz.tz_minuteswest * 60 + (wall_cmos_clock ? adjkerntz : 0); + tm -= tz_minuteswest * 60 + (wall_cmos_clock ? adjkerntz : 0); writertc(RTC_SEC, bin2bcd(tm%60)); tm /= 60; /* Write back Seconds */ writertc(RTC_MIN, bin2bcd(tm%60)); tm /= 60; /* Write back Minutes */ diff --git a/sys/amd64/isa/clock.c b/sys/amd64/isa/clock.c index 8e812a1..ec9b23a 100644 --- a/sys/amd64/isa/clock.c +++ b/sys/amd64/isa/clock.c @@ -908,7 +908,7 @@ inittodr(time_t base) /* sec now contains the number of seconds, since Jan 1 1970, in the local time zone */ - sec += tz.tz_minuteswest * 60 + (wall_cmos_clock ? adjkerntz : 0); + sec += tz_minuteswest * 60 + (wall_cmos_clock ? adjkerntz : 0); y = time_second - sec; if (y <= -2 || y >= 2) { @@ -946,7 +946,7 @@ resettodr() /* Calculate local time to put in RTC */ - tm -= tz.tz_minuteswest * 60 + (wall_cmos_clock ? adjkerntz : 0); + tm -= tz_minuteswest * 60 + (wall_cmos_clock ? adjkerntz : 0); writertc(RTC_SEC, bin2bcd(tm%60)); tm /= 60; /* Write back Seconds */ writertc(RTC_MIN, bin2bcd(tm%60)); tm /= 60; /* Write back Minutes */ diff --git a/sys/fs/msdosfs/msdosfs_conv.c b/sys/fs/msdosfs/msdosfs_conv.c index 7b3591e..d135bfa 100644 --- a/sys/fs/msdosfs/msdosfs_conv.c +++ b/sys/fs/msdosfs/msdosfs_conv.c @@ -112,7 +112,7 @@ unix2dostime(tsp, ddp, dtp, dhp) * If the time from the last conversion is the same as now, then * skip the computations and use the saved result. */ - t = tsp->tv_sec - (tz.tz_minuteswest * 60) + t = tsp->tv_sec - (tz_minuteswest * 60) - (wall_cmos_clock ? adjkerntz : 0); /* - daylight savings time correction */ t &= ~1; @@ -224,7 +224,7 @@ dos2unixtime(dd, dt, dh, tsp) days += ((dd & DD_DAY_MASK) >> DD_DAY_SHIFT) - 1; lastseconds = (days * 24 * 60 * 60) + SECONDSTO1980; } - tsp->tv_sec = seconds + lastseconds + (tz.tz_minuteswest * 60) + tsp->tv_sec = seconds + lastseconds + (tz_minuteswest * 60) + adjkerntz; /* + daylight savings time correction */ tsp->tv_nsec = (dh % 100) * 10000000; diff --git a/sys/fs/nwfs/nwfs_subr.c b/sys/fs/nwfs/nwfs_subr.c index ad6009c..10d9647 100644 --- a/sys/fs/nwfs/nwfs_subr.c +++ b/sys/fs/nwfs/nwfs_subr.c @@ -596,7 +596,7 @@ ncp_unix2dostime(tsp, tzoff, ddp, dtp, dhp) * If the time from the last conversion is the same as now, then * skip the computations and use the saved result. */ - t = tsp->tv_sec - tzoff * 60 - tz.tz_minuteswest * 60 - + t = tsp->tv_sec - tzoff * 60 - tz_minuteswest * 60 - (wall_cmos_clock ? adjkerntz : 0); t &= ~1; if (lasttime != t) { @@ -706,7 +706,7 @@ ncp_dos2unixtime(dd, dt, dh, tzoff, tsp) days += ((dd & DD_DAY_MASK) >> DD_DAY_SHIFT) - 1; lastseconds = (days * 24 * 60 * 60) + SECONDSTO1980; } - tsp->tv_sec = seconds + lastseconds + tz.tz_minuteswest * 60 + + tsp->tv_sec = seconds + lastseconds + tz_minuteswest * 60 + tzoff * 60 + (wall_cmos_clock ? adjkerntz : 0); tsp->tv_nsec = (dh % 100) * 10000000; } diff --git a/sys/fs/smbfs/smbfs_subr.c b/sys/fs/smbfs/smbfs_subr.c index 16e4bf2..f8d2eec 100644 --- a/sys/fs/smbfs/smbfs_subr.c +++ b/sys/fs/smbfs/smbfs_subr.c @@ -108,7 +108,7 @@ static u_short lastdtime; void smb_time_local2server(struct timespec *tsp, int tzoff, u_long *seconds) { - *seconds = tsp->tv_sec - tzoff * 60 /*- tz.tz_minuteswest * 60 - + *seconds = tsp->tv_sec - tzoff * 60 /*- tz_minuteswest * 60 - (wall_cmos_clock ? adjkerntz : 0)*/; } @@ -116,7 +116,7 @@ void smb_time_server2local(u_long seconds, int tzoff, struct timespec *tsp) { tsp->tv_sec = seconds + tzoff * 60; - /*+ tz.tz_minuteswest * 60 + (wall_cmos_clock ? adjkerntz : 0)*/; + /*+ tz_minuteswest * 60 + (wall_cmos_clock ? adjkerntz : 0)*/; } /* diff --git a/sys/i386/i386/tsc.c b/sys/i386/i386/tsc.c index 8e812a1..ec9b23a 100644 --- a/sys/i386/i386/tsc.c +++ b/sys/i386/i386/tsc.c @@ -908,7 +908,7 @@ inittodr(time_t base) /* sec now contains the number of seconds, since Jan 1 1970, in the local time zone */ - sec += tz.tz_minuteswest * 60 + (wall_cmos_clock ? adjkerntz : 0); + sec += tz_minuteswest * 60 + (wall_cmos_clock ? adjkerntz : 0); y = time_second - sec; if (y <= -2 || y >= 2) { @@ -946,7 +946,7 @@ resettodr() /* Calculate local time to put in RTC */ - tm -= tz.tz_minuteswest * 60 + (wall_cmos_clock ? adjkerntz : 0); + tm -= tz_minuteswest * 60 + (wall_cmos_clock ? adjkerntz : 0); writertc(RTC_SEC, bin2bcd(tm%60)); tm /= 60; /* Write back Seconds */ writertc(RTC_MIN, bin2bcd(tm%60)); tm /= 60; /* Write back Minutes */ diff --git a/sys/i386/ibcs2/ibcs2_xenix.c b/sys/i386/ibcs2/ibcs2_xenix.c index 9aea547..da4f085 100644 --- a/sys/i386/ibcs2/ibcs2_xenix.c +++ b/sys/i386/ibcs2/ibcs2_xenix.c @@ -120,8 +120,8 @@ xenix_ftime(td, uap) microtime(&tv); itb.time = tv.tv_sec; itb.millitm = (tv.tv_usec / 1000); - itb.timezone = tz.tz_minuteswest; - itb.dstflag = tz.tz_dsttime != DST_NONE; + itb.timezone = tz_minuteswest; + itb.dstflag = tz_dsttime != DST_NONE; return copyout((caddr_t)&itb, (caddr_t)uap->tp, sizeof(struct ibcs2_timeb)); diff --git a/sys/i386/isa/clock.c b/sys/i386/isa/clock.c index 8e812a1..ec9b23a 100644 --- a/sys/i386/isa/clock.c +++ b/sys/i386/isa/clock.c @@ -908,7 +908,7 @@ inittodr(time_t base) /* sec now contains the number of seconds, since Jan 1 1970, in the local time zone */ - sec += tz.tz_minuteswest * 60 + (wall_cmos_clock ? adjkerntz : 0); + sec += tz_minuteswest * 60 + (wall_cmos_clock ? adjkerntz : 0); y = time_second - sec; if (y <= -2 || y >= 2) { @@ -946,7 +946,7 @@ resettodr() /* Calculate local time to put in RTC */ - tm -= tz.tz_minuteswest * 60 + (wall_cmos_clock ? adjkerntz : 0); + tm -= tz_minuteswest * 60 + (wall_cmos_clock ? adjkerntz : 0); writertc(RTC_SEC, bin2bcd(tm%60)); tm /= 60; /* Write back Seconds */ writertc(RTC_MIN, bin2bcd(tm%60)); tm /= 60; /* Write back Minutes */ diff --git a/sys/isa/atrtc.c b/sys/isa/atrtc.c index 8e812a1..ec9b23a 100644 --- a/sys/isa/atrtc.c +++ b/sys/isa/atrtc.c @@ -908,7 +908,7 @@ inittodr(time_t base) /* sec now contains the number of seconds, since Jan 1 1970, in the local time zone */ - sec += tz.tz_minuteswest * 60 + (wall_cmos_clock ? adjkerntz : 0); + sec += tz_minuteswest * 60 + (wall_cmos_clock ? adjkerntz : 0); y = time_second - sec; if (y <= -2 || y >= 2) { @@ -946,7 +946,7 @@ resettodr() /* Calculate local time to put in RTC */ - tm -= tz.tz_minuteswest * 60 + (wall_cmos_clock ? adjkerntz : 0); + tm -= tz_minuteswest * 60 + (wall_cmos_clock ? adjkerntz : 0); writertc(RTC_SEC, bin2bcd(tm%60)); tm /= 60; /* Write back Seconds */ writertc(RTC_MIN, bin2bcd(tm%60)); tm /= 60; /* Write back Minutes */ diff --git a/sys/kern/kern_time.c b/sys/kern/kern_time.c index 325ecec..405e930 100644 --- a/sys/kern/kern_time.c +++ b/sys/kern/kern_time.c @@ -55,7 +55,8 @@ #include #include -struct timezone tz; +int tz_minuteswest; +int tz_dsttime; /* * Time of day and interval timer support. @@ -327,9 +328,8 @@ gettimeofday(struct thread *td, struct gettimeofday_args *uap) error = copyout(&atv, uap->tp, sizeof (atv)); } if (error == 0 && uap->tzp != NULL) { - mtx_lock(&Giant); - rtz = tz; - mtx_unlock(&Giant); + rtz.tz_minuteswest = tz_minuteswest; + rtz.tz_dsttime = tz_dsttime; error = copyout(&rtz, uap->tzp, sizeof (rtz)); } return (error); @@ -373,9 +373,8 @@ settimeofday(struct thread *td, struct settimeofday_args *uap) if (uap->tv && (error = settime(td, &atv))) return (error); if (uap->tzp) { - mtx_lock(&Giant); - tz = atz; - mtx_unlock(&Giant); + tz_minuteswest = atz.tz_minuteswest; + tz_dsttime = atz.tz_dsttime; } return (error); } diff --git a/sys/kern/subr_clock.c b/sys/kern/subr_clock.c index e573463..19df90d 100644 --- a/sys/kern/subr_clock.c +++ b/sys/kern/subr_clock.c @@ -281,7 +281,7 @@ inittodr(time_t base) printf("Check and reset the date immediately!\n"); } - ts.tv_sec += tz.tz_minuteswest * 60 + + ts.tv_sec += tz_minuteswest * 60 + (wall_cmos_clock ? adjkerntz : 0); if (timespeccmp(&ref, &ts, >)) { @@ -310,7 +310,7 @@ resettodr() return; getnanotime(&ts); - ts.tv_sec -= tz.tz_minuteswest * 60 + (wall_cmos_clock ? adjkerntz : 0); + ts.tv_sec -= tz_minuteswest * 60 + (wall_cmos_clock ? adjkerntz : 0); if ((error = CLOCK_SETTIME(clock_dev, &ts)) != 0) { printf("warning: clock_settime failed (%d), time-of-day clock " "not adjusted to system time\n", error); diff --git a/sys/kern/subr_rtc.c b/sys/kern/subr_rtc.c index e573463..19df90d 100644 --- a/sys/kern/subr_rtc.c +++ b/sys/kern/subr_rtc.c @@ -281,7 +281,7 @@ inittodr(time_t base) printf("Check and reset the date immediately!\n"); } - ts.tv_sec += tz.tz_minuteswest * 60 + + ts.tv_sec += tz_minuteswest * 60 + (wall_cmos_clock ? adjkerntz : 0); if (timespeccmp(&ref, &ts, >)) { @@ -310,7 +310,7 @@ resettodr() return; getnanotime(&ts); - ts.tv_sec -= tz.tz_minuteswest * 60 + (wall_cmos_clock ? adjkerntz : 0); + ts.tv_sec -= tz_minuteswest * 60 + (wall_cmos_clock ? adjkerntz : 0); if ((error = CLOCK_SETTIME(clock_dev, &ts)) != 0) { printf("warning: clock_settime failed (%d), time-of-day clock " "not adjusted to system time\n", error); diff --git a/sys/pc98/cbus/clock.c b/sys/pc98/cbus/clock.c index 8e2dc97..9a247a9 100644 --- a/sys/pc98/cbus/clock.c +++ b/sys/pc98/cbus/clock.c @@ -1200,7 +1200,7 @@ inittodr(time_t base) in the local time zone */ #endif - sec += tz.tz_minuteswest * 60 + (wall_cmos_clock ? adjkerntz : 0); + sec += tz_minuteswest * 60 + (wall_cmos_clock ? adjkerntz : 0); y = time_second - sec; if (y <= -2 || y >= 2) { @@ -1241,7 +1241,7 @@ resettodr() /* Calculate local time to put in RTC */ - tm -= tz.tz_minuteswest * 60 + (wall_cmos_clock ? adjkerntz : 0); + tm -= tz_minuteswest * 60 + (wall_cmos_clock ? adjkerntz : 0); rtc_outb(bin2bcd(tm%60)); tm /= 60; /* Write back Seconds */ rtc_outb(bin2bcd(tm%60)); tm /= 60; /* Write back Minutes */ @@ -1279,7 +1279,7 @@ resettodr() /* Calculate local time to put in RTC */ - tm -= tz.tz_minuteswest * 60 + (wall_cmos_clock ? adjkerntz : 0); + tm -= tz_minuteswest * 60 + (wall_cmos_clock ? adjkerntz : 0); writertc(RTC_SEC, bin2bcd(tm%60)); tm /= 60; /* Write back Seconds */ writertc(RTC_MIN, bin2bcd(tm%60)); tm /= 60; /* Write back Minutes */ diff --git a/sys/pc98/cbus/pcrtc.c b/sys/pc98/cbus/pcrtc.c index 8e2dc97..9a247a9 100644 --- a/sys/pc98/cbus/pcrtc.c +++ b/sys/pc98/cbus/pcrtc.c @@ -1200,7 +1200,7 @@ inittodr(time_t base) in the local time zone */ #endif - sec += tz.tz_minuteswest * 60 + (wall_cmos_clock ? adjkerntz : 0); + sec += tz_minuteswest * 60 + (wall_cmos_clock ? adjkerntz : 0); y = time_second - sec; if (y <= -2 || y >= 2) { @@ -1241,7 +1241,7 @@ resettodr() /* Calculate local time to put in RTC */ - tm -= tz.tz_minuteswest * 60 + (wall_cmos_clock ? adjkerntz : 0); + tm -= tz_minuteswest * 60 + (wall_cmos_clock ? adjkerntz : 0); rtc_outb(bin2bcd(tm%60)); tm /= 60; /* Write back Seconds */ rtc_outb(bin2bcd(tm%60)); tm /= 60; /* Write back Minutes */ @@ -1279,7 +1279,7 @@ resettodr() /* Calculate local time to put in RTC */ - tm -= tz.tz_minuteswest * 60 + (wall_cmos_clock ? adjkerntz : 0); + tm -= tz_minuteswest * 60 + (wall_cmos_clock ? adjkerntz : 0); writertc(RTC_SEC, bin2bcd(tm%60)); tm /= 60; /* Write back Seconds */ writertc(RTC_MIN, bin2bcd(tm%60)); tm /= 60; /* Write back Minutes */ diff --git a/sys/pc98/pc98/clock.c b/sys/pc98/pc98/clock.c index 8e2dc97..9a247a9 100644 --- a/sys/pc98/pc98/clock.c +++ b/sys/pc98/pc98/clock.c @@ -1200,7 +1200,7 @@ inittodr(time_t base) in the local time zone */ #endif - sec += tz.tz_minuteswest * 60 + (wall_cmos_clock ? adjkerntz : 0); + sec += tz_minuteswest * 60 + (wall_cmos_clock ? adjkerntz : 0); y = time_second - sec; if (y <= -2 || y >= 2) { @@ -1241,7 +1241,7 @@ resettodr() /* Calculate local time to put in RTC */ - tm -= tz.tz_minuteswest * 60 + (wall_cmos_clock ? adjkerntz : 0); + tm -= tz_minuteswest * 60 + (wall_cmos_clock ? adjkerntz : 0); rtc_outb(bin2bcd(tm%60)); tm /= 60; /* Write back Seconds */ rtc_outb(bin2bcd(tm%60)); tm /= 60; /* Write back Minutes */ @@ -1279,7 +1279,7 @@ resettodr() /* Calculate local time to put in RTC */ - tm -= tz.tz_minuteswest * 60 + (wall_cmos_clock ? adjkerntz : 0); + tm -= tz_minuteswest * 60 + (wall_cmos_clock ? adjkerntz : 0); writertc(RTC_SEC, bin2bcd(tm%60)); tm /= 60; /* Write back Seconds */ writertc(RTC_MIN, bin2bcd(tm%60)); tm /= 60; /* Write back Minutes */ diff --git a/sys/sys/kernel.h b/sys/sys/kernel.h index ba486a9..0d3b7b2 100644 --- a/sys/sys/kernel.h +++ b/sys/sys/kernel.h @@ -68,8 +68,6 @@ extern char kernelname[MAXPATHLEN]; /* 1.2 */ extern struct timeval boottime; -extern struct timezone tz; /* XXX */ - extern int tick; /* usec per tick (1000000 / hz) */ extern int hz; /* system clock's frequency */ extern int psratio; /* ratio: prof / stat */ @@ -79,6 +77,9 @@ extern int profprocs; /* number of process's profiling */ extern int ticks; extern int lbolt; /* once a second sleep address */ +extern int tz_minuteswest; +extern int tz_dsttime; + #endif /* _KERNEL */ /* -- cgit v1.1