Deleted Added
full compact
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}