diff options
author | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2013-11-06 16:20:21 +0100 |
---|---|---|
committer | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2013-11-11 10:08:08 +0100 |
commit | 66659ff1ad6831b0ea7425fa6ecd8a8687523658 (patch) | |
tree | 48e22b475fa8854128e0861a33fed6f78c8094b5 /freebsd/sys/kern/kern_time.c | |
parent | Define __GLOBL1() and __GLOBL() (diff) | |
download | rtems-libbsd-66659ff1ad6831b0ea7425fa6ecd8a8687523658.tar.bz2 |
Update to FreeBSD 9.2
Diffstat (limited to 'freebsd/sys/kern/kern_time.c')
-rw-r--r-- | freebsd/sys/kern/kern_time.c | 61 |
1 files changed, 26 insertions, 35 deletions
diff --git a/freebsd/sys/kern/kern_time.c b/freebsd/sys/kern/kern_time.c index 344c379e..e113aef6 100644 --- a/freebsd/sys/kern/kern_time.c +++ b/freebsd/sys/kern/kern_time.c @@ -178,7 +178,7 @@ struct clock_gettime_args { #ifndef __rtems__ /* ARGSUSED */ int -clock_gettime(struct thread *td, struct clock_gettime_args *uap) +sys_clock_gettime(struct thread *td, struct clock_gettime_args *uap) { struct timespec ats; int error; @@ -265,7 +265,7 @@ struct clock_settime_args { #ifndef __rtems__ /* ARGSUSED */ int -clock_settime(struct thread *td, struct clock_settime_args *uap) +sys_clock_settime(struct thread *td, struct clock_settime_args *uap) { struct timespec ats; int error; @@ -302,7 +302,7 @@ struct clock_getres_args { #endif #ifndef __rtems__ int -clock_getres(struct thread *td, struct clock_getres_args *uap) +sys_clock_getres(struct thread *td, struct clock_getres_args *uap) { struct timespec ts; int error; @@ -407,7 +407,7 @@ struct nanosleep_args { #endif /* ARGSUSED */ int -nanosleep(struct thread *td, struct nanosleep_args *uap) +sys_nanosleep(struct thread *td, struct nanosleep_args *uap) { struct timespec rmt, rqt; int error; @@ -438,7 +438,7 @@ struct gettimeofday_args { #endif /* ARGSUSED */ int -gettimeofday(struct thread *td, struct gettimeofday_args *uap) +sys_gettimeofday(struct thread *td, struct gettimeofday_args *uap) { struct timeval atv; struct timezone rtz; @@ -464,7 +464,7 @@ struct settimeofday_args { #endif /* ARGSUSED */ int -settimeofday(struct thread *td, struct settimeofday_args *uap) +sys_settimeofday(struct thread *td, struct settimeofday_args *uap) { struct timeval atv, *tvp; struct timezone atz, *tzp; @@ -536,7 +536,7 @@ struct getitimer_args { }; #endif int -getitimer(struct thread *td, struct getitimer_args *uap) +sys_getitimer(struct thread *td, struct getitimer_args *uap) { struct itimerval aitv; int error; @@ -588,14 +588,14 @@ struct setitimer_args { }; #endif int -setitimer(struct thread *td, struct setitimer_args *uap) +sys_setitimer(struct thread *td, struct setitimer_args *uap) { struct itimerval aitv, oitv; int error; if (uap->itv == NULL) { uap->itv = uap->oitv; - return (getitimer(td, (struct getitimer_args *)uap)); + return (sys_getitimer(td, (struct getitimer_args *)uap)); } if ((error = copyin(uap->itv, &aitv, sizeof(struct itimerval)))) @@ -672,13 +672,11 @@ realitexpire(void *arg) struct timeval ctv, ntv; p = (struct proc *)arg; - PROC_LOCK(p); - psignal(p, SIGALRM); + kern_psignal(p, SIGALRM); if (!timevalisset(&p->p_realtimer.it_interval)) { timevalclear(&p->p_realtimer.it_value); if (p->p_flag & P_WEXIT) wakeup(&p->p_itcallout); - PROC_UNLOCK(p); return; } for (;;) { @@ -690,7 +688,6 @@ realitexpire(void *arg) timevalsub(&ntv, &ctv); callout_reset(&p->p_itcallout, tvtohz(&ntv) - 1, realitexpire, p); - PROC_UNLOCK(p); return; } } @@ -940,7 +937,7 @@ struct ktimer_create_args { }; #endif int -ktimer_create(struct thread *td, struct ktimer_create_args *uap) +sys_ktimer_create(struct thread *td, struct ktimer_create_args *uap) { struct sigevent *evp1, ev; int id; @@ -1079,7 +1076,7 @@ struct ktimer_delete_args { }; #endif int -ktimer_delete(struct thread *td, struct ktimer_delete_args *uap) +sys_ktimer_delete(struct thread *td, struct ktimer_delete_args *uap) { return (kern_timer_delete(td, uap->timerid)); } @@ -1144,7 +1141,7 @@ struct ktimer_settime_args { }; #endif int -ktimer_settime(struct thread *td, struct ktimer_settime_args *uap) +sys_ktimer_settime(struct thread *td, struct ktimer_settime_args *uap) { struct proc *p = td->td_proc; struct itimer *it; @@ -1185,7 +1182,7 @@ struct ktimer_gettime_args { }; #endif int -ktimer_gettime(struct thread *td, struct ktimer_gettime_args *uap) +sys_ktimer_gettime(struct thread *td, struct ktimer_gettime_args *uap) { struct proc *p = td->td_proc; struct itimer *it; @@ -1216,7 +1213,7 @@ struct timer_getoverrun_args { }; #endif int -ktimer_getoverrun(struct thread *td, struct ktimer_getoverrun_args *uap) +sys_ktimer_getoverrun(struct thread *td, struct ktimer_getoverrun_args *uap) { struct proc *p = td->td_proc; struct itimer *it; @@ -1419,28 +1416,22 @@ void itimer_fire(struct itimer *it) { struct proc *p = it->it_proc; - int ret; + struct thread *td; if (it->it_sigev.sigev_notify == SIGEV_SIGNAL || it->it_sigev.sigev_notify == SIGEV_THREAD_ID) { - PROC_LOCK(p); + if (sigev_findtd(p, &it->it_sigev, &td) != 0) { + ITIMER_LOCK(it); + timespecclear(&it->it_time.it_value); + timespecclear(&it->it_time.it_interval); + callout_stop(&it->it_callout); + ITIMER_UNLOCK(it); + return; + } if (!KSI_ONQ(&it->it_ksi)) { it->it_ksi.ksi_errno = 0; - ret = psignal_event(p, &it->it_sigev, &it->it_ksi); - if (__predict_false(ret != 0)) { - it->it_overrun++; - /* - * Broken userland code, thread went - * away, disarm the timer. - */ - if (ret == ESRCH) { - ITIMER_LOCK(it); - timespecclear(&it->it_time.it_value); - timespecclear(&it->it_time.it_interval); - callout_stop(&it->it_callout); - ITIMER_UNLOCK(it); - } - } + ksiginfo_set_sigev(&it->it_ksi, &it->it_sigev); + tdsendsignal(p, td, it->it_ksi.ksi_signo, &it->it_ksi); } else { if (it->it_overrun < INT_MAX) it->it_overrun++; |