Lines Matching refs:rw
42 __nisdb_rwinit(__nisdb_rwlock_t *rw) { in __nisdb_rwinit() argument
46 if (rw == 0) { in __nisdb_rwinit()
53 if ((ret = mutex_init(&rw->mutex, USYNC_THREAD, 0)) != 0) in __nisdb_rwinit()
55 if ((ret = cond_init(&rw->cv, USYNC_THREAD, 0)) != 0) in __nisdb_rwinit()
57 rw->destroyed = 0; in __nisdb_rwinit()
78 rw->force_write = NISDB_FORCE_WRITE; in __nisdb_rwinit()
80 rw->writer_count = rw->reader_count = rw->reader_blocked = 0; in __nisdb_rwinit()
81 rw->writer.id = rw->reader.id = INV_PTHREAD_ID; in __nisdb_rwinit()
82 rw->writer.count = rw->reader.count = 0; in __nisdb_rwinit()
83 rw->writer.next = rw->reader.next = 0; in __nisdb_rwinit()
90 find_reader(pthread_t id, __nisdb_rwlock_t *rw) { in find_reader() argument
94 for (rr = &rw->reader; rr != 0; rr = rr->next) { in find_reader()
108 __nisdb_rw_readlock_ok(__nisdb_rwlock_t *rw) { in __nisdb_rw_readlock_ok() argument
113 if (rw == 0) in __nisdb_rw_readlock_ok()
116 if (rw->destroyed != 0) in __nisdb_rw_readlock_ok()
119 if ((ret = mutex_lock(&rw->mutex)) != 0) in __nisdb_rw_readlock_ok()
126 if (rw->destroyed == 0 && rw->reader_count == 0) { in __nisdb_rw_readlock_ok()
127 rw->force_write = 0; in __nisdb_rw_readlock_ok()
133 (void) mutex_unlock(&rw->mutex); in __nisdb_rw_readlock_ok()
140 __nisdb_rw_force_writelock(__nisdb_rwlock_t *rw) { in __nisdb_rw_force_writelock() argument
145 if (rw == 0 || rw->destroyed != 0) in __nisdb_rw_force_writelock()
148 if ((ret = mutex_lock(&rw->mutex)) != 0) in __nisdb_rw_force_writelock()
155 if (rw->destroyed == 0 && rw->reader_count == 0) { in __nisdb_rw_force_writelock()
156 rw->force_write = 1; in __nisdb_rw_force_writelock()
162 (void) mutex_unlock(&rw->mutex); in __nisdb_rw_force_writelock()
169 __nisdb_wlock_trylock(__nisdb_rwlock_t *rw, int trylock) { in __nisdb_wlock_trylock() argument
176 if (rw == 0) { in __nisdb_wlock_trylock()
184 if (rw->destroyed != 0) in __nisdb_wlock_trylock()
187 if ((ret = mutex_lock(&rw->mutex)) != 0) in __nisdb_wlock_trylock()
190 if (rw->destroyed != 0) { in __nisdb_wlock_trylock()
191 (void) mutex_unlock(&rw->mutex); in __nisdb_wlock_trylock()
196 if (rw->reader_count == 0 && rw->writer_count == 0) { in __nisdb_wlock_trylock()
197 rw->writer_count = 1; in __nisdb_wlock_trylock()
198 rw->writer.id = myself; in __nisdb_wlock_trylock()
199 rw->writer.count = 1; in __nisdb_wlock_trylock()
200 return (mutex_unlock(&rw->mutex)); in __nisdb_wlock_trylock()
207 if (rw->reader_count > 0) { in __nisdb_wlock_trylock()
208 if ((rr = find_reader(myself, rw)) != 0) { in __nisdb_wlock_trylock()
216 if (rw->reader_count == in __nisdb_wlock_trylock()
217 (rw->reader_blocked + 1)) in __nisdb_wlock_trylock()
226 if (rw->reader_count == rw->reader_blocked) in __nisdb_wlock_trylock()
242 (rw->writer_count == 0 && rw->reader_count == 0) || in __nisdb_wlock_trylock()
243 ((rw->writer_count == 0 || rw->writer.id == myself) && in __nisdb_wlock_trylock()
244 (rw->reader_count == 0) || in __nisdb_wlock_trylock()
245 (rw->reader_count == 1 && in __nisdb_wlock_trylock()
246 rw->reader.id == myself))) { in __nisdb_wlock_trylock()
255 if (rw->writer_count == 0 || rw->writer.id == myself) { in __nisdb_wlock_trylock()
265 (void) mutex_unlock(&rw->mutex); in __nisdb_wlock_trylock()
272 rw->reader_blocked++; in __nisdb_wlock_trylock()
274 if ((ret = cond_wait(&rw->cv, &rw->mutex)) != 0) { in __nisdb_wlock_trylock()
277 if (rw->reader_blocked > 0) in __nisdb_wlock_trylock()
278 rw->reader_blocked--; in __nisdb_wlock_trylock()
284 (void) mutex_unlock(&rw->mutex); in __nisdb_wlock_trylock()
289 if (rw->reader_blocked > 0) in __nisdb_wlock_trylock()
290 rw->reader_blocked--; in __nisdb_wlock_trylock()
299 rw->writer.id = myself; in __nisdb_wlock_trylock()
301 rw->writer.count++; in __nisdb_wlock_trylock()
303 if (rw->writer_count == 0) in __nisdb_wlock_trylock()
304 rw->writer_count = 1; in __nisdb_wlock_trylock()
306 return (mutex_unlock(&rw->mutex)); in __nisdb_wlock_trylock()
310 __nisdb_wlock(__nisdb_rwlock_t *rw) { in __nisdb_wlock() argument
311 return (__nisdb_wlock_trylock(rw, 0)); in __nisdb_wlock()
316 increment_reader(pthread_t id, __nisdb_rwlock_t *rw) { in increment_reader() argument
320 for (rr = &rw->reader; rr != 0; rr = rr->next) { in increment_reader()
324 if (rw->reader_count == 0 && rr == &rw->reader) { in increment_reader()
327 rw->reader_count = 1; in increment_reader()
337 rr->next = rw->reader.next; in increment_reader()
338 rw->reader.next = rr; in increment_reader()
339 rw->reader_count++; in increment_reader()
348 __nisdb_rlock(__nisdb_rwlock_t *rw) { in __nisdb_rlock() argument
354 if (rw == 0) { in __nisdb_rlock()
362 if (rw->destroyed != 0) in __nisdb_rlock()
365 if (rw->force_write) in __nisdb_rlock()
366 return (__nisdb_wlock(rw)); in __nisdb_rlock()
368 if ((ret = mutex_lock(&rw->mutex)) != 0) in __nisdb_rlock()
371 if (rw->destroyed != 0) { in __nisdb_rlock()
372 (void) mutex_unlock(&rw->mutex); in __nisdb_rlock()
376 rr = find_reader(myself, rw); in __nisdb_rlock()
379 while (rw->writer_count > 0 && rw->writer.id != myself) { in __nisdb_rlock()
382 rw->reader_blocked++; in __nisdb_rlock()
384 if ((ret = cond_wait(&rw->cv, &rw->mutex)) != 0) { in __nisdb_rlock()
387 if (rw->reader_blocked > 0) in __nisdb_rlock()
388 rw->reader_blocked--; in __nisdb_rlock()
394 (void) mutex_unlock(&rw->mutex); in __nisdb_rlock()
399 if (rw->reader_blocked > 0) in __nisdb_rlock()
400 rw->reader_blocked--; in __nisdb_rlock()
408 rr = increment_reader(myself, rw); in __nisdb_rlock()
409 ret = mutex_unlock(&rw->mutex); in __nisdb_rlock()
415 __nisdb_wulock(__nisdb_rwlock_t *rw) { in __nisdb_wulock() argument
420 if (rw == 0) { in __nisdb_wulock()
428 if (rw->destroyed != 0) in __nisdb_wulock()
431 if ((ret = mutex_lock(&rw->mutex)) != 0) in __nisdb_wulock()
434 if (rw->destroyed != 0) { in __nisdb_wulock()
435 (void) mutex_unlock(&rw->mutex); in __nisdb_wulock()
440 if (rw->writer_count == 0 || in __nisdb_wulock()
441 rw->writer.id != myself || rw->writer.count == 0) { in __nisdb_wulock()
445 (void) mutex_unlock(&rw->mutex); in __nisdb_wulock()
449 rw->writer.count--; in __nisdb_wulock()
450 if (rw->writer.count == 0) { in __nisdb_wulock()
451 rw->writer.id = INV_PTHREAD_ID; in __nisdb_wulock()
452 rw->writer_count = 0; in __nisdb_wulock()
453 if ((ret = cond_broadcast(&rw->cv)) != 0) { in __nisdb_wulock()
454 (void) mutex_unlock(&rw->mutex); in __nisdb_wulock()
459 return (mutex_unlock(&rw->mutex)); in __nisdb_wulock()
464 __nisdb_rulock(__nisdb_rwlock_t *rw) { in __nisdb_rulock() argument
470 if (rw == 0) { in __nisdb_rulock()
477 if (rw->destroyed != 0) in __nisdb_rulock()
480 if (rw->force_write) in __nisdb_rulock()
481 return (__nisdb_wulock(rw)); in __nisdb_rulock()
483 if ((ret = mutex_lock(&rw->mutex)) != 0) in __nisdb_rulock()
486 if (rw->destroyed != 0) { in __nisdb_rulock()
487 (void) mutex_unlock(&rw->mutex); in __nisdb_rulock()
492 if (rw->reader_count == 0 || in __nisdb_rulock()
493 (rw->writer_count > 0 && rw->writer.id != myself)) { in __nisdb_rulock()
497 (void) mutex_unlock(&rw->mutex); in __nisdb_rulock()
502 for (rr = &rw->reader, prev = 0; rr != 0; prev = rr, rr = rr->next) { in __nisdb_rulock()
511 (void) mutex_unlock(&rw->mutex); in __nisdb_rulock()
517 if (rr != &rw->reader) { in __nisdb_rulock()
528 rw->reader.id = rr->id; in __nisdb_rulock()
529 rw->reader.count = rr->count; in __nisdb_rulock()
530 rw->reader.next = rr->next; in __nisdb_rulock()
537 rw->reader_count--; in __nisdb_rulock()
541 if (rw->reader_count == 0) { in __nisdb_rulock()
542 if ((ret = cond_broadcast(&rw->cv)) != 0) { in __nisdb_rulock()
543 (void) mutex_unlock(&rw->mutex); in __nisdb_rulock()
548 return (mutex_unlock(&rw->mutex)); in __nisdb_rulock()
554 __nisdb_assert_wheld(__nisdb_rwlock_t *rw) { in __nisdb_assert_wheld() argument
559 if (rw == 0) { in __nisdb_assert_wheld()
566 if (rw->destroyed != 0) in __nisdb_assert_wheld()
569 if ((ret = mutex_lock(&rw->mutex)) != 0) in __nisdb_assert_wheld()
572 if (rw->destroyed != 0) { in __nisdb_assert_wheld()
573 (void) mutex_unlock(&rw->mutex); in __nisdb_assert_wheld()
577 if (rw->writer_count == 0 || rw->writer.id != pthread_self()) { in __nisdb_assert_wheld()
578 ret = mutex_unlock(&rw->mutex); in __nisdb_assert_wheld()
587 return (mutex_unlock(&rw->mutex)); in __nisdb_assert_wheld()
593 __nisdb_assert_rheld(__nisdb_rwlock_t *rw) { in __nisdb_assert_rheld() argument
600 if (rw == 0) { in __nisdb_assert_rheld()
607 if (rw->destroyed != 0) in __nisdb_assert_rheld()
610 if (rw->force_write) in __nisdb_assert_rheld()
611 return (__nisdb_assert_wheld(rw)); in __nisdb_assert_rheld()
613 if ((ret = mutex_lock(&rw->mutex)) != 0) in __nisdb_assert_rheld()
616 if (rw->destroyed != 0) { in __nisdb_assert_rheld()
617 (void) mutex_unlock(&rw->mutex); in __nisdb_assert_rheld()
622 if (rw->writer_count > 0 && rw->writer.id == myself) { in __nisdb_assert_rheld()
623 (void) mutex_unlock(&rw->mutex); in __nisdb_assert_rheld()
627 if (rw->reader_count == 0) { in __nisdb_assert_rheld()
628 (void) mutex_unlock(&rw->mutex); in __nisdb_assert_rheld()
632 rr = &rw->reader; in __nisdb_assert_rheld()
635 (void) mutex_unlock(&rw->mutex); in __nisdb_assert_rheld()
641 ret = mutex_unlock(&rw->mutex); in __nisdb_assert_rheld()
647 __nisdb_destroy_lock(__nisdb_rwlock_t *rw) { in __nisdb_destroy_lock() argument
654 if (rw == 0) { in __nisdb_destroy_lock()
661 if (rw->destroyed != 0) in __nisdb_destroy_lock()
664 if ((ret = mutex_lock(&rw->mutex)) != 0) in __nisdb_destroy_lock()
667 if (rw->destroyed != 0) { in __nisdb_destroy_lock()
668 (void) mutex_unlock(&rw->mutex); in __nisdb_destroy_lock()
677 if ((rw->writer_count > 0 && in __nisdb_destroy_lock()
678 (rw->writer.id != myself || rw->writer.count != 1) || in __nisdb_destroy_lock()
679 (rw->reader_count > 0 && in __nisdb_destroy_lock()
680 !(rw->reader_count == 1 && rw->reader.id == myself && in __nisdb_destroy_lock()
681 rw->reader.count == 1))) || in __nisdb_destroy_lock()
682 (rw->writer_count > 0 && rw->reader_count > 0)) { in __nisdb_destroy_lock()
686 (void) mutex_unlock(&rw->mutex); in __nisdb_destroy_lock()
698 rw->destroyed++; in __nisdb_destroy_lock()
700 return (mutex_unlock(&rw->mutex)); in __nisdb_destroy_lock()
704 __nisdb_lock_report(__nisdb_rwlock_t *rw) { in __nisdb_lock_report() argument
707 if (rw == 0) { in __nisdb_lock_report()
712 if (rw->destroyed) in __nisdb_lock_report()
713 printf("0x%x: DESTROYED\n", rw); in __nisdb_lock_report()
716 rw, rw->force_write ? "disallowed" : "allowed"); in __nisdb_lock_report()
718 if (rw->writer_count == 0) in __nisdb_lock_report()
719 printf("0x%x: No writer\n", rw); in __nisdb_lock_report()
720 else if (rw->writer_count == 1) { in __nisdb_lock_report()
722 rw, rw->writer.id, rw->writer.count); in __nisdb_lock_report()
723 if (rw->writer.wait) in __nisdb_lock_report()
724 printf("0x%x:\tWriter blocked\n", rw); in __nisdb_lock_report()
727 rw, rw->writer_count); in __nisdb_lock_report()
729 if (rw->reader_count == 0) in __nisdb_lock_report()
730 printf("0x%x: No readers\n", rw); in __nisdb_lock_report()
735 rw, rw->reader_count, rw->reader_blocked); in __nisdb_lock_report()
736 for (r = &rw->reader; r != 0; r = r->next) { in __nisdb_lock_report()
738 rw, r->id, r->count, in __nisdb_lock_report()