kern_condvar.c (170294) | kern_condvar.c (177085) |
---|---|
1/*- 2 * Copyright (c) 2000 Jake Burkholder <jake@freebsd.org>. 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright --- 11 unchanged lines hidden (view full) --- 20 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 21 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 22 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 23 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 24 * SUCH DAMAGE. 25 */ 26 27#include <sys/cdefs.h> | 1/*- 2 * Copyright (c) 2000 Jake Burkholder <jake@freebsd.org>. 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright --- 11 unchanged lines hidden (view full) --- 20 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 21 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 22 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 23 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 24 * SUCH DAMAGE. 25 */ 26 27#include <sys/cdefs.h> |
28__FBSDID("$FreeBSD: head/sys/kern/kern_condvar.c 170294 2007-06-04 23:50:56Z jeff $"); | 28__FBSDID("$FreeBSD: head/sys/kern/kern_condvar.c 177085 2008-03-12 06:31:06Z jeff $"); |
29 30#include "opt_ktrace.h" 31 32#include <sys/param.h> 33#include <sys/systm.h> 34#include <sys/lock.h> 35#include <sys/mutex.h> 36#include <sys/proc.h> --- 89 unchanged lines hidden (view full) --- 126 DROP_GIANT(); 127 128 sleepq_add(cvp, lock, cvp->cv_description, SLEEPQ_CONDVAR, 0); 129 if (class->lc_flags & LC_SLEEPABLE) 130 sleepq_release(cvp); 131 lock_state = class->lc_unlock(lock); 132 if (class->lc_flags & LC_SLEEPABLE) 133 sleepq_lock(cvp); | 29 30#include "opt_ktrace.h" 31 32#include <sys/param.h> 33#include <sys/systm.h> 34#include <sys/lock.h> 35#include <sys/mutex.h> 36#include <sys/proc.h> --- 89 unchanged lines hidden (view full) --- 126 DROP_GIANT(); 127 128 sleepq_add(cvp, lock, cvp->cv_description, SLEEPQ_CONDVAR, 0); 129 if (class->lc_flags & LC_SLEEPABLE) 130 sleepq_release(cvp); 131 lock_state = class->lc_unlock(lock); 132 if (class->lc_flags & LC_SLEEPABLE) 133 sleepq_lock(cvp); |
134 sleepq_wait(cvp); | 134 sleepq_wait(cvp, 0); |
135 136#ifdef KTRACE 137 if (KTRPOINT(td, KTR_CSW)) 138 ktrcsw(0, 0); 139#endif 140 PICKUP_GIANT(); 141 class->lc_lock(lock, lock_state); 142 WITNESS_RESTORE(lock, lock_witness); --- 36 unchanged lines hidden (view full) --- 179 DROP_GIANT(); 180 181 sleepq_add(cvp, lock, cvp->cv_description, SLEEPQ_CONDVAR, 0); 182 if (class->lc_flags & LC_SLEEPABLE) 183 sleepq_release(cvp); 184 class->lc_unlock(lock); 185 if (class->lc_flags & LC_SLEEPABLE) 186 sleepq_lock(cvp); | 135 136#ifdef KTRACE 137 if (KTRPOINT(td, KTR_CSW)) 138 ktrcsw(0, 0); 139#endif 140 PICKUP_GIANT(); 141 class->lc_lock(lock, lock_state); 142 WITNESS_RESTORE(lock, lock_witness); --- 36 unchanged lines hidden (view full) --- 179 DROP_GIANT(); 180 181 sleepq_add(cvp, lock, cvp->cv_description, SLEEPQ_CONDVAR, 0); 182 if (class->lc_flags & LC_SLEEPABLE) 183 sleepq_release(cvp); 184 class->lc_unlock(lock); 185 if (class->lc_flags & LC_SLEEPABLE) 186 sleepq_lock(cvp); |
187 sleepq_wait(cvp); | 187 sleepq_wait(cvp, 0); |
188 189#ifdef KTRACE 190 if (KTRPOINT(td, KTR_CSW)) 191 ktrcsw(0, 0); 192#endif 193 PICKUP_GIANT(); 194} 195 --- 41 unchanged lines hidden (view full) --- 237 238 sleepq_add(cvp, lock, cvp->cv_description, SLEEPQ_CONDVAR | 239 SLEEPQ_INTERRUPTIBLE, 0); 240 if (class->lc_flags & LC_SLEEPABLE) 241 sleepq_release(cvp); 242 lock_state = class->lc_unlock(lock); 243 if (class->lc_flags & LC_SLEEPABLE) 244 sleepq_lock(cvp); | 188 189#ifdef KTRACE 190 if (KTRPOINT(td, KTR_CSW)) 191 ktrcsw(0, 0); 192#endif 193 PICKUP_GIANT(); 194} 195 --- 41 unchanged lines hidden (view full) --- 237 238 sleepq_add(cvp, lock, cvp->cv_description, SLEEPQ_CONDVAR | 239 SLEEPQ_INTERRUPTIBLE, 0); 240 if (class->lc_flags & LC_SLEEPABLE) 241 sleepq_release(cvp); 242 lock_state = class->lc_unlock(lock); 243 if (class->lc_flags & LC_SLEEPABLE) 244 sleepq_lock(cvp); |
245 rval = sleepq_wait_sig(cvp); | 245 rval = sleepq_wait_sig(cvp, 0); |
246 247#ifdef KTRACE 248 if (KTRPOINT(td, KTR_CSW)) 249 ktrcsw(0, 0); 250#endif 251 PICKUP_GIANT(); 252 class->lc_lock(lock, lock_state); 253 WITNESS_RESTORE(lock, lock_witness); --- 43 unchanged lines hidden (view full) --- 297 298 sleepq_add(cvp, lock, cvp->cv_description, SLEEPQ_CONDVAR, 0); 299 sleepq_set_timeout(cvp, timo); 300 if (class->lc_flags & LC_SLEEPABLE) 301 sleepq_release(cvp); 302 lock_state = class->lc_unlock(lock); 303 if (class->lc_flags & LC_SLEEPABLE) 304 sleepq_lock(cvp); | 246 247#ifdef KTRACE 248 if (KTRPOINT(td, KTR_CSW)) 249 ktrcsw(0, 0); 250#endif 251 PICKUP_GIANT(); 252 class->lc_lock(lock, lock_state); 253 WITNESS_RESTORE(lock, lock_witness); --- 43 unchanged lines hidden (view full) --- 297 298 sleepq_add(cvp, lock, cvp->cv_description, SLEEPQ_CONDVAR, 0); 299 sleepq_set_timeout(cvp, timo); 300 if (class->lc_flags & LC_SLEEPABLE) 301 sleepq_release(cvp); 302 lock_state = class->lc_unlock(lock); 303 if (class->lc_flags & LC_SLEEPABLE) 304 sleepq_lock(cvp); |
305 rval = sleepq_timedwait(cvp); | 305 rval = sleepq_timedwait(cvp, 0); |
306 307#ifdef KTRACE 308 if (KTRPOINT(td, KTR_CSW)) 309 ktrcsw(0, 0); 310#endif 311 PICKUP_GIANT(); 312 class->lc_lock(lock, lock_state); 313 WITNESS_RESTORE(lock, lock_witness); --- 47 unchanged lines hidden (view full) --- 361 sleepq_add(cvp, lock, cvp->cv_description, SLEEPQ_CONDVAR | 362 SLEEPQ_INTERRUPTIBLE, 0); 363 sleepq_set_timeout(cvp, timo); 364 if (class->lc_flags & LC_SLEEPABLE) 365 sleepq_release(cvp); 366 lock_state = class->lc_unlock(lock); 367 if (class->lc_flags & LC_SLEEPABLE) 368 sleepq_lock(cvp); | 306 307#ifdef KTRACE 308 if (KTRPOINT(td, KTR_CSW)) 309 ktrcsw(0, 0); 310#endif 311 PICKUP_GIANT(); 312 class->lc_lock(lock, lock_state); 313 WITNESS_RESTORE(lock, lock_witness); --- 47 unchanged lines hidden (view full) --- 361 sleepq_add(cvp, lock, cvp->cv_description, SLEEPQ_CONDVAR | 362 SLEEPQ_INTERRUPTIBLE, 0); 363 sleepq_set_timeout(cvp, timo); 364 if (class->lc_flags & LC_SLEEPABLE) 365 sleepq_release(cvp); 366 lock_state = class->lc_unlock(lock); 367 if (class->lc_flags & LC_SLEEPABLE) 368 sleepq_lock(cvp); |
369 rval = sleepq_timedwait_sig(cvp); | 369 rval = sleepq_timedwait_sig(cvp, 0); |
370 371#ifdef KTRACE 372 if (KTRPOINT(td, KTR_CSW)) 373 ktrcsw(0, 0); 374#endif 375 PICKUP_GIANT(); 376 class->lc_lock(lock, lock_state); 377 WITNESS_RESTORE(lock, lock_witness); --- 10 unchanged lines hidden (view full) --- 388 */ 389void 390cv_signal(struct cv *cvp) 391{ 392 393 sleepq_lock(cvp); 394 if (cvp->cv_waiters > 0) { 395 cvp->cv_waiters--; | 370 371#ifdef KTRACE 372 if (KTRPOINT(td, KTR_CSW)) 373 ktrcsw(0, 0); 374#endif 375 PICKUP_GIANT(); 376 class->lc_lock(lock, lock_state); 377 WITNESS_RESTORE(lock, lock_witness); --- 10 unchanged lines hidden (view full) --- 388 */ 389void 390cv_signal(struct cv *cvp) 391{ 392 393 sleepq_lock(cvp); 394 if (cvp->cv_waiters > 0) { 395 cvp->cv_waiters--; |
396 sleepq_signal(cvp, SLEEPQ_CONDVAR, -1, 0); | 396 sleepq_signal(cvp, SLEEPQ_CONDVAR, 0, 0); |
397 } 398 sleepq_release(cvp); 399} 400 401/* 402 * Broadcast a signal to a condition variable. Wakes up all waiting threads. 403 * Should be called with the same mutex as was passed to cv_wait held. 404 */ 405void 406cv_broadcastpri(struct cv *cvp, int pri) 407{ | 397 } 398 sleepq_release(cvp); 399} 400 401/* 402 * Broadcast a signal to a condition variable. Wakes up all waiting threads. 403 * Should be called with the same mutex as was passed to cv_wait held. 404 */ 405void 406cv_broadcastpri(struct cv *cvp, int pri) 407{ |
408 | 408 /* 409 * XXX sleepq_broadcast pri argument changed from -1 meaning 410 * no pri to 0 meaning no pri. 411 */ 412 if (pri == -1) 413 pri = 0; |
409 sleepq_lock(cvp); 410 if (cvp->cv_waiters > 0) { 411 cvp->cv_waiters = 0; 412 sleepq_broadcast(cvp, SLEEPQ_CONDVAR, pri, 0); | 414 sleepq_lock(cvp); 415 if (cvp->cv_waiters > 0) { 416 cvp->cv_waiters = 0; 417 sleepq_broadcast(cvp, SLEEPQ_CONDVAR, pri, 0); |
413 } else 414 sleepq_release(cvp); | 418 } 419 sleepq_release(cvp); |
415} | 420} |