/* kern_time.c 5.6 82/09/08 */
#include "../h/dir.h" /* XXX */
* Time of day and interval timer support.
} *uap
= (struct a
*)u
.u_ap
;
s
= spl7(); atv
= time
; splx(s
);
if (copyout((caddr_t
)&atv
, (caddr_t
)uap
->tp
, sizeof (atv
))) {
/* SHOULD HAVE PER-PROCESS TIMEZONE */
if (copyout((caddr_t
)&tz
, uap
->tzp
, sizeof (tz
))) {
} *uap
= (struct a
*)u
.u_ap
;
if (copyin((caddr_t
)uap
->tv
, (caddr_t
)&atv
, sizeof (struct timeval
))) {
if (uap
->tzp
&& suser()) {
if (copyin((caddr_t
)uap
->tzp
, (caddr_t
)&atz
, sizeof (atz
))) {
boottime
.tv_sec
+= tv
->tv_sec
- time
.tv_sec
;
s
= spl7(); time
= *tv
; splx(s
);
t1
->tv_sec
+= t2
->tv_sec
;
t1
->tv_usec
+= t2
->tv_usec
;
t1
->tv_sec
-= t2
->tv_sec
;
t1
->tv_usec
-= t2
->tv_usec
;
if (t1
->tv_usec
>= 1000000) {
} *uap
= (struct a
*)u
.u_ap
;
if (uap
->which
== ITIMER_REAL
) {
aitv
= u
.u_procp
->p_realtimer
;
if (timerisset(&aitv
.it_value
))
if (timercmp(&aitv
.it_value
, &time
, <))
timerclear(&aitv
.it_value
);
timevalsub(&aitv
.it_value
, &time
);
aitv
= u
.u_timer
[uap
->which
];
if (copyout((caddr_t
)&aitv
, uap
->itv
, sizeof (struct itimerval
)))
struct itimerval
*itv
, *oitv
;
} *uap
= (struct a
*)u
.u_ap
;
register struct proc
*p
= u
.u_procp
;
if (copyin((caddr_t
)uap
->itv
, (caddr_t
)&aitv
,
sizeof (struct itimerval
))) {
if (itimerfix(&aitv
.it_value
) || itimerfix(&aitv
.it_interval
)) {
if (uap
->which
== ITIMER_REAL
) {
if (timerisset(&aitv
.it_value
)) {
timevaladd(&aitv
.it_value
, &time
);
timeout(unrto
, p
, hzto(&aitv
.it_value
));
u
.u_timer
[uap
->which
] = aitv
;
if (!timerisset(&p
->p_realtimer
.it_interval
)) {
timerclear(&p
->p_realtimer
.it_value
);
timevaladd(&p
->p_realtimer
.it_value
,
&p
->p_realtimer
.it_interval
);
if (timercmp(&p
->p_realtimer
.it_value
, &time
, >)) {
timeout(unrto
, p
, hzto(&p
->p_realtimer
.it_value
));
if (tv
->tv_sec
< 0 || tv
->tv_sec
> 100000000 ||
tv
->tv_usec
< 0 || tv
->tv_usec
>= 1000000)
if (tv
->tv_sec
== 0 && tv
->tv_usec
< tick
)
register struct itimerval
*itp
;
if (itp
->it_value
.tv_usec
< usec
) {
if (itp
->it_value
.tv_sec
== 0) {
usec
-= itp
->it_value
.tv_usec
;
itp
->it_value
.tv_usec
+= 1000000;
itp
->it_value
.tv_usec
-= usec
;
if (timerisset(&itp
->it_value
))
if (timerisset(&itp
->it_interval
)) {
itp
->it_value
= itp
->it_interval
;
itp
->it_value
.tv_usec
-= usec
;
if (itp
->it_value
.tv_usec
< 0) {
itp
->it_value
.tv_usec
+= 1000000;
itp
->it_value
.tv_usec
= 0;
u
.u_r
.r_time
= time
.tv_sec
;
} *uap
= (struct a
*)u
.u_ap
;
uap
= (struct a
*)u
.u_ap
;
t
.millitm
= time
.tv_usec
/ 1000;
t
.timezone
= tz
.tz_minuteswest
;
t
.dstflag
= tz
.tz_dsttime
;
if (copyout((caddr_t
)&t
, (caddr_t
)uap
->tp
, sizeof(t
)) < 0)
} *uap
= (struct a
*)u
.u_ap
;
register struct proc
*p
= u
.u_procp
;
timerclear(&p
->p_realtimer
.it_interval
);
if (timerisset(&p
->p_realtimer
.it_value
) &&
timercmp(&p
->p_realtimer
.it_value
, &time
, >))
u
.u_r
.r_val1
= p
->p_realtimer
.it_value
.tv_sec
- time
.tv_sec
;
p
->p_realtimer
.it_value
= time
;
p
->p_realtimer
.it_value
.tv_sec
+= uap
->deltat
;
timeout(unrto
, p
, hzto(&p
->p_realtimer
.it_value
));