Date: Sat, 14 Jul 2012 19:39:53 +0000 (UTC) From: Davide Italiano <davide@FreeBSD.org> To: src-committers@freebsd.org, svn-src-projects@freebsd.org Subject: svn commit: r238453 - in projects/calloutng/sys: kern sys Message-ID: <201207141939.q6EJdrAI003601@svn.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: davide Date: Sat Jul 14 19:39:53 2012 New Revision: 238453 URL: http://svn.freebsd.org/changeset/base/238453 Log: Change the sleepqueue(9) and condvar(9) KPI so that functions which take a timeout as argument have variants that take an additional 'flags' argument that can be used to specify precision interval. Modify a couple of comments that aren't valid anymore after changes. Now sleepq_set_timeout_bt() and cv_timedwait_bt_sig() takes as time argument a pointer to struct bintime rather than a struct bintime. Reviewed by: mav Modified: projects/calloutng/sys/kern/kern_condvar.c projects/calloutng/sys/kern/kern_synch.c projects/calloutng/sys/kern/kern_time.c projects/calloutng/sys/kern/subr_sleepqueue.c projects/calloutng/sys/kern/sys_generic.c projects/calloutng/sys/sys/condvar.h projects/calloutng/sys/sys/mutex.h projects/calloutng/sys/sys/sleepqueue.h projects/calloutng/sys/sys/sx.h projects/calloutng/sys/sys/systm.h Modified: projects/calloutng/sys/kern/kern_condvar.c ============================================================================== --- projects/calloutng/sys/kern/kern_condvar.c Sat Jul 14 18:10:44 2012 (r238452) +++ projects/calloutng/sys/kern/kern_condvar.c Sat Jul 14 19:39:53 2012 (r238453) @@ -270,12 +270,12 @@ _cv_wait_sig(struct cv *cvp, struct lock } /* - * Wait on a condition variable for at most timo/hz seconds. Returns 0 if the - * process was resumed by cv_signal or cv_broadcast, EWOULDBLOCK if the timeout - * expires. + * Wait on a condition variable. Returns 0 if the process was resumed by + * cv_signal or cv_broadcast, EWOULDBLOCK if the timeout expires. */ int -_cv_timedwait(struct cv *cvp, struct lock_object *lock, int timo) +_cv_timedwait(struct cv *cvp, struct lock_object *lock, struct bintime *bt, + int timo, int flags) { WITNESS_SAVE_DECL(lock_witness); struct lock_class *class; @@ -311,7 +311,10 @@ _cv_timedwait(struct cv *cvp, struct loc DROP_GIANT(); sleepq_add(cvp, lock, cvp->cv_description, SLEEPQ_CONDVAR, 0); - sleepq_set_timeout(cvp, timo); + if (bt == NULL) + sleepq_set_timeout_flags(cvp, timo, flags); + else + sleepq_set_timeout_bt(cvp, bt, flags); if (lock != &Giant.lock_object) { if (class->lc_flags & LC_SLEEPABLE) sleepq_release(cvp); @@ -336,14 +339,14 @@ _cv_timedwait(struct cv *cvp, struct loc } /* - * Wait on a condition variable for at most timo/hz seconds, allowing - * interruption by signals. Returns 0 if the thread was resumed by cv_signal - * or cv_broadcast, EWOULDBLOCK if the timeout expires, and EINTR or ERESTART if - * a signal was caught. + * Wait on a condition variable allowing interruption by signals. + * Returns 0 if the thread was resumed by cv_signal or cv_broadcast, + * or cv_broadcast, EWOULDBLOCK if the timeout expires, and EINTR + * or ERESTART if a signal was caught. */ int _cv_timedwait_sig(struct cv *cvp, struct lock_object *lock, - struct bintime *bt, int timo) + struct bintime *bt, int timo, int flags) { WITNESS_SAVE_DECL(lock_witness); struct lock_class *class; @@ -381,9 +384,9 @@ _cv_timedwait_sig(struct cv *cvp, struct sleepq_add(cvp, lock, cvp->cv_description, SLEEPQ_CONDVAR | SLEEPQ_INTERRUPTIBLE, 0); if (bt == NULL) - sleepq_set_timeout(cvp, timo); + sleepq_set_timeout_flags(cvp, timo, flags); else - sleepq_set_timeout_bt(cvp, *bt); + sleepq_set_timeout_bt(cvp, bt, flags); if (lock != &Giant.lock_object) { if (class->lc_flags & LC_SLEEPABLE) sleepq_release(cvp); Modified: projects/calloutng/sys/kern/kern_synch.c ============================================================================== --- projects/calloutng/sys/kern/kern_synch.c Sat Jul 14 18:10:44 2012 (r238452) +++ projects/calloutng/sys/kern/kern_synch.c Sat Jul 14 19:39:53 2012 (r238453) @@ -146,12 +146,12 @@ sleepinit(void) */ int _sleep(void *ident, struct lock_object *lock, int priority, - const char *wmesg, int timo) + const char *wmesg, int timo, struct bintime *bt, int flags) { struct thread *td; struct proc *p; struct lock_class *class; - int catch, flags, lock_state, pri, rval; + int catch, sleepq_flags, lock_state, pri, rval; WITNESS_SAVE_DECL(lock_witness); td = curthread; @@ -199,13 +199,13 @@ _sleep(void *ident, struct lock_object * sleepq_remove(td, td->td_wchan); if (ident == &pause_wchan) - flags = SLEEPQ_PAUSE; + sleepq_flags = SLEEPQ_PAUSE; else - flags = SLEEPQ_SLEEP; + sleepq_flags = SLEEPQ_SLEEP; if (catch) - flags |= SLEEPQ_INTERRUPTIBLE; + sleepq_flags |= SLEEPQ_INTERRUPTIBLE; if (priority & PBDRY) - flags |= SLEEPQ_STOP_ON_BDRY; + sleepq_flags |= SLEEPQ_STOP_ON_BDRY; sleepq_lock(ident); CTR5(KTR_PROC, "sleep: thread %ld (pid %ld, %s) on %s (%p)", @@ -231,18 +231,20 @@ _sleep(void *ident, struct lock_object * * stopped, then td will no longer be on a sleep queue upon * return from cursig(). */ - sleepq_add(ident, lock, wmesg, flags, 0); - if (timo) - sleepq_set_timeout(ident, timo); + sleepq_add(ident, lock, wmesg, sleepq_flags, 0); + if (bt) + sleepq_set_timeout_bt(ident, bt, flags); + else if (timo) + sleepq_set_timeout_flags(ident, timo, flags); if (lock != NULL && class->lc_flags & LC_SLEEPABLE) { sleepq_release(ident); WITNESS_SAVE(lock, lock_witness); lock_state = class->lc_unlock(lock); sleepq_lock(ident); } - if (timo && catch) + if ((timo || bt) && catch) rval = sleepq_timedwait_sig(ident, pri); - else if (timo) + else if (timo || bt) rval = sleepq_timedwait(ident, pri); else if (catch) rval = sleepq_wait_sig(ident, pri); Modified: projects/calloutng/sys/kern/kern_time.c ============================================================================== --- projects/calloutng/sys/kern/kern_time.c Sat Jul 14 18:10:44 2012 (r238452) +++ projects/calloutng/sys/kern/kern_time.c Sat Jul 14 19:39:53 2012 (r238453) @@ -367,7 +367,7 @@ kern_nanosleep(struct thread *td, struct for (;;) { sleepq_lock(&nanowait); sleepq_add(&nanowait, NULL, "nanslp", PWAIT | PCATCH, 0); - sleepq_set_timeout_bt(&nanowait,bt); + sleepq_set_timeout_bt(&nanowait, &bt, 0); error = sleepq_timedwait_sig(&nanowait, PWAIT | PCATCH); binuptime(&bt2); if (error != EWOULDBLOCK) { Modified: projects/calloutng/sys/kern/subr_sleepqueue.c ============================================================================== --- projects/calloutng/sys/kern/subr_sleepqueue.c Sat Jul 14 18:10:44 2012 (r238452) +++ projects/calloutng/sys/kern/subr_sleepqueue.c Sat Jul 14 19:39:53 2012 (r238453) @@ -362,7 +362,7 @@ sleepq_add(void *wchan, struct lock_obje * sleep queue after timo ticks if the thread has not already been awakened. */ void -_sleepq_set_timeout(void *wchan, struct bintime *bt, int timo) +_sleepq_set_timeout(void *wchan, struct bintime *bt, int timo, int flags) { struct sleepqueue_chain *sc; @@ -375,11 +375,11 @@ _sleepq_set_timeout(void *wchan, struct MPASS(td->td_sleepqueue == NULL); MPASS(wchan != NULL); if (bt == NULL) - callout_reset_curcpu(&td->td_slpcallout, timo, - sleepq_timeout, td); + callout_reset_flags_on(&td->td_slpcallout, timo, + sleepq_timeout, td, PCPU_GET(cpuid), flags); else callout_reset_bt_on(&td->td_slpcallout, bt, - sleepq_timeout, td, PCPU_GET(cpuid), 0); + sleepq_timeout, td, PCPU_GET(cpuid), flags); } /* Modified: projects/calloutng/sys/kern/sys_generic.c ============================================================================== --- projects/calloutng/sys/kern/sys_generic.c Sat Jul 14 18:10:44 2012 (r238452) +++ projects/calloutng/sys/kern/sys_generic.c Sat Jul 14 19:39:53 2012 (r238453) @@ -1722,7 +1722,8 @@ seltdwait(struct thread *td, struct bint if (bt == NULL && timo > 0) error = cv_timedwait_sig(&stp->st_wait, &stp->st_mtx, timo); else if (bt != NULL) - error = cv_timedwait_bt_sig(&stp->st_wait, &stp->st_mtx, *bt); + error = cv_timedwait_bt_sig(&stp->st_wait, &stp->st_mtx, + bt, 0); else error = cv_wait_sig(&stp->st_wait, &stp->st_mtx); mtx_unlock(&stp->st_mtx); Modified: projects/calloutng/sys/sys/condvar.h ============================================================================== --- projects/calloutng/sys/sys/condvar.h Sat Jul 14 18:10:44 2012 (r238452) +++ projects/calloutng/sys/sys/condvar.h Sat Jul 14 19:39:53 2012 (r238453) @@ -55,9 +55,10 @@ void cv_destroy(struct cv *cvp); void _cv_wait(struct cv *cvp, struct lock_object *lock); void _cv_wait_unlock(struct cv *cvp, struct lock_object *lock); int _cv_wait_sig(struct cv *cvp, struct lock_object *lock); -int _cv_timedwait(struct cv *cvp, struct lock_object *lock, int timo); +int _cv_timedwait(struct cv *cvp, struct lock_object *lock, + struct bintime *bt, int timo, int flags); int _cv_timedwait_sig(struct cv *cvp, struct lock_object *lock, - struct bintime *bt, int timo); + struct bintime *bt, int timo, int flags); void cv_signal(struct cv *cvp); void cv_broadcastpri(struct cv *cvp, int pri); @@ -69,11 +70,20 @@ void cv_broadcastpri(struct cv *cvp, int #define cv_wait_sig(cvp, lock) \ _cv_wait_sig((cvp), &(lock)->lock_object) #define cv_timedwait(cvp, lock, timo) \ - _cv_timedwait((cvp), &(lock)->lock_object, (timo)) + _cv_timedwait((cvp), &(lock)->lock_object, NULL, (timo), 0) +#define cv_timedwait_bt(cvp, lock, bt, flags) \ + _cv_timedwait_sig((cvp), &(lock)->lock_object, (bt), 0, 0) +#define cv_timedwait_bt_sig(cvp, lock, bt, flags) \ + _cv_timedwait_sig((cvp), &(lock)->lock_object, (bt), 0, \ + (flags)) +#define cv_timedwait_flags(cvp, lock, timo, flags) \ + _cv_timedwait((cvp), &(lock)->lock_object, NULL, (timo), \ + (flags)) #define cv_timedwait_sig(cvp, lock, timo) \ - _cv_timedwait_sig((cvp), &(lock)->lock_object, (NULL), (timo)) -#define cv_timedwait_bt_sig(cvp, lock, bt) \ - _cv_timedwait_sig((cvp), &(lock)->lock_object, (&bt), (0)) + _cv_timedwait_sig((cvp), &(lock)->lock_object, NULL, (timo), 0) +#define cv_timedwait_sig_flags(cvp, lock, timo, flags) \ + _cv_timedwait_sig((cvp), &(lock)->lock_object, NULL, (timo), \ + (flags)) #define cv_broadcast(cvp) cv_broadcastpri(cvp, 0) Modified: projects/calloutng/sys/sys/mutex.h ============================================================================== --- projects/calloutng/sys/sys/mutex.h Sat Jul 14 18:10:44 2012 (r238452) +++ projects/calloutng/sys/sys/mutex.h Sat Jul 14 19:39:53 2012 (r238453) @@ -339,7 +339,8 @@ extern struct mtx_pool *mtxpool_sleep; mtx_assert_((m), (what), __FILE__, __LINE__) #define mtx_sleep(chan, mtx, pri, wmesg, timo) \ - _sleep((chan), &(mtx)->lock_object, (pri), (wmesg), (timo)) + _sleep((chan), &(mtx)->lock_object, (pri), (wmesg), (timo), \ + NULL, 0) #define mtx_initialized(m) lock_initalized(&(m)->lock_object) Modified: projects/calloutng/sys/sys/sleepqueue.h ============================================================================== --- projects/calloutng/sys/sys/sleepqueue.h Sat Jul 14 18:10:44 2012 (r238452) +++ projects/calloutng/sys/sys/sleepqueue.h Sat Jul 14 19:39:53 2012 (r238453) @@ -108,11 +108,14 @@ struct sleepqueue *sleepq_lookup(void *w void sleepq_release(void *wchan); void sleepq_remove(struct thread *td, void *wchan); int sleepq_signal(void *wchan, int flags, int pri, int queue); -void _sleepq_set_timeout(void *wchan, struct bintime *bt, int timo); +void _sleepq_set_timeout(void *wchan, struct bintime *bt, int timo, + int flags); #define sleepq_set_timeout(wchan, timo) \ - _sleepq_set_timeout((wchan), (NULL), (timo)) -#define sleepq_set_timeout_bt(wchan, bt) \ - _sleepq_set_timeout((wchan), (&bt), (0)) + _sleepq_set_timeout((wchan), NULL, (timo), 0) +#define sleepq_set_timeout_flags(wchan, timo, flags) \ + _sleepq_set_timeout((wchan), NULL, (timo), (flags)) +#define sleepq_set_timeout_bt(wchan, bt, flags) \ + _sleepq_set_timeout((wchan), (bt), 0, (flags)) u_int sleepq_sleepcnt(void *wchan, int queue); int sleepq_timedwait(void *wchan, int pri); int sleepq_timedwait_sig(void *wchan, int pri); Modified: projects/calloutng/sys/sys/sx.h ============================================================================== --- projects/calloutng/sys/sys/sx.h Sat Jul 14 18:10:44 2012 (r238452) +++ projects/calloutng/sys/sys/sx.h Sat Jul 14 19:39:53 2012 (r238453) @@ -275,8 +275,9 @@ __sx_sunlock(struct sx *sx, const char * #define sx_unlock(sx) sx_unlock_((sx), LOCK_FILE, LOCK_LINE) #define sx_sleep(chan, sx, pri, wmesg, timo) \ - _sleep((chan), &(sx)->lock_object, (pri), (wmesg), (timo)) - + _sleep((chan), &(sx)->lock_object, (pri), (wmesg), (timo), \ + NULL, 0) + /* * Options passed to sx_init_flags(). */ Modified: projects/calloutng/sys/sys/systm.h ============================================================================== --- projects/calloutng/sys/sys/systm.h Sat Jul 14 18:10:44 2012 (r238452) +++ projects/calloutng/sys/sys/systm.h Sat Jul 14 19:39:53 2012 (r238453) @@ -341,14 +341,21 @@ static __inline void splx(intrmask_t ip * less often. */ int _sleep(void *chan, struct lock_object *lock, int pri, const char *wmesg, - int timo) __nonnull(1); + int timo, struct bintime *bt, int flags) __nonnull(1); #define msleep(chan, mtx, pri, wmesg, timo) \ - _sleep((chan), &(mtx)->lock_object, (pri), (wmesg), (timo)) + _sleep((chan), &(mtx)->lock_object, (pri), (wmesg), (timo), \ + NULL, 0) +#define msleep_flags(chan, mtx, pri, wmesg, timo, flags) \ + _sleep((chan), &(mtx)->lock_object, (pri), (wmesg), (timo), \ + NULL, (flags)) +#define msleep_bt(chan, mtx, pri, wmesg, bt, flags) \ + _sleep((chan), &(mtx)->lock_object, (pri), (wmesg) 0, (bt), \ + (flags)) int msleep_spin(void *chan, struct mtx *mtx, const char *wmesg, int timo) __nonnull(1); int pause(const char *wmesg, int timo); #define tsleep(chan, pri, wmesg, timo) \ - _sleep((chan), NULL, (pri), (wmesg), (timo)) + _sleep((chan), NULL, (pri), (wmesg), (timo), NULL, 0) void wakeup(void *chan) __nonnull(1); void wakeup_one(void *chan) __nonnull(1);
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201207141939.q6EJdrAI003601>