Lines Matching refs:rw

41 __nisdb_rwinit(__nisdb_rwlock_t *rw) {  in __nisdb_rwinit()  argument
45 if (rw == 0) { in __nisdb_rwinit()
52 if ((ret = mutex_init(&rw->mutex, USYNC_THREAD, 0)) != 0) in __nisdb_rwinit()
54 if ((ret = cond_init(&rw->cv, USYNC_THREAD, 0)) != 0) in __nisdb_rwinit()
56 rw->destroyed = 0; in __nisdb_rwinit()
77 rw->force_write = NISDB_FORCE_WRITE; in __nisdb_rwinit()
79 rw->writer_count = rw->reader_count = rw->reader_blocked = 0; in __nisdb_rwinit()
80 rw->writer.id = rw->reader.id = INV_PTHREAD_ID; in __nisdb_rwinit()
81 rw->writer.count = rw->reader.count = 0; in __nisdb_rwinit()
82 rw->writer.next = rw->reader.next = 0; in __nisdb_rwinit()
89 find_reader(pthread_t id, __nisdb_rwlock_t *rw) { in find_reader() argument
93 for (rr = &rw->reader; rr != 0; rr = rr->next) { in find_reader()
107 __nisdb_rw_readlock_ok(__nisdb_rwlock_t *rw) { in __nisdb_rw_readlock_ok() argument
110 if (rw == 0) in __nisdb_rw_readlock_ok()
113 if (rw->destroyed != 0) in __nisdb_rw_readlock_ok()
116 if ((ret = mutex_lock(&rw->mutex)) != 0) in __nisdb_rw_readlock_ok()
123 if (rw->destroyed == 0 && rw->reader_count == 0) { in __nisdb_rw_readlock_ok()
124 rw->force_write = 0; in __nisdb_rw_readlock_ok()
130 (void) mutex_unlock(&rw->mutex); in __nisdb_rw_readlock_ok()
137 __nisdb_rw_force_writelock(__nisdb_rwlock_t *rw) { in __nisdb_rw_force_writelock() argument
140 if (rw == 0 || rw->destroyed != 0) in __nisdb_rw_force_writelock()
143 if ((ret = mutex_lock(&rw->mutex)) != 0) in __nisdb_rw_force_writelock()
150 if (rw->destroyed == 0 && rw->reader_count == 0) { in __nisdb_rw_force_writelock()
151 rw->force_write = 1; in __nisdb_rw_force_writelock()
157 (void) mutex_unlock(&rw->mutex); in __nisdb_rw_force_writelock()
164 __nisdb_wlock_trylock(__nisdb_rwlock_t *rw, int trylock) { in __nisdb_wlock_trylock() argument
171 if (rw == 0) { in __nisdb_wlock_trylock()
179 if (rw->destroyed != 0) in __nisdb_wlock_trylock()
182 if ((ret = mutex_lock(&rw->mutex)) != 0) in __nisdb_wlock_trylock()
185 if (rw->destroyed != 0) { in __nisdb_wlock_trylock()
186 (void) mutex_unlock(&rw->mutex); in __nisdb_wlock_trylock()
191 if (rw->reader_count == 0 && rw->writer_count == 0) { in __nisdb_wlock_trylock()
192 rw->writer_count = 1; in __nisdb_wlock_trylock()
193 rw->writer.id = myself; in __nisdb_wlock_trylock()
194 rw->writer.count = 1; in __nisdb_wlock_trylock()
195 return (mutex_unlock(&rw->mutex)); in __nisdb_wlock_trylock()
202 if (rw->reader_count > 0) { in __nisdb_wlock_trylock()
203 if ((rr = find_reader(myself, rw)) != 0) { in __nisdb_wlock_trylock()
211 if (rw->reader_count == in __nisdb_wlock_trylock()
212 (rw->reader_blocked + 1)) in __nisdb_wlock_trylock()
221 if (rw->reader_count == rw->reader_blocked) in __nisdb_wlock_trylock()
238 (rw->writer_count == 0 && rw->reader_count == 0) || in __nisdb_wlock_trylock()
239 (((rw->writer_count == 0 || rw->writer.id == myself) && in __nisdb_wlock_trylock()
240 (rw->reader_count == 0)) || in __nisdb_wlock_trylock()
241 (rw->reader_count == 1 && in __nisdb_wlock_trylock()
242 rw->reader.id == myself))) { in __nisdb_wlock_trylock()
251 if (rw->writer_count == 0 || rw->writer.id == myself) { in __nisdb_wlock_trylock()
261 (void) mutex_unlock(&rw->mutex); in __nisdb_wlock_trylock()
268 rw->reader_blocked++; in __nisdb_wlock_trylock()
270 if ((ret = cond_wait(&rw->cv, &rw->mutex)) != 0) { in __nisdb_wlock_trylock()
273 if (rw->reader_blocked > 0) in __nisdb_wlock_trylock()
274 rw->reader_blocked--; in __nisdb_wlock_trylock()
280 (void) mutex_unlock(&rw->mutex); in __nisdb_wlock_trylock()
285 if (rw->reader_blocked > 0) in __nisdb_wlock_trylock()
286 rw->reader_blocked--; in __nisdb_wlock_trylock()
295 rw->writer.id = myself; in __nisdb_wlock_trylock()
297 rw->writer.count++; in __nisdb_wlock_trylock()
299 if (rw->writer_count == 0) in __nisdb_wlock_trylock()
300 rw->writer_count = 1; in __nisdb_wlock_trylock()
302 return (mutex_unlock(&rw->mutex)); in __nisdb_wlock_trylock()
306 __nisdb_wlock(__nisdb_rwlock_t *rw) { in __nisdb_wlock() argument
307 return (__nisdb_wlock_trylock(rw, 0)); in __nisdb_wlock()
312 increment_reader(pthread_t id, __nisdb_rwlock_t *rw) { in increment_reader() argument
316 for (rr = &rw->reader; rr != 0; rr = rr->next) { in increment_reader()
320 if (rw->reader_count == 0 && rr == &rw->reader) { in increment_reader()
323 rw->reader_count = 1; in increment_reader()
333 rr->next = rw->reader.next; in increment_reader()
334 rw->reader.next = rr; in increment_reader()
335 rw->reader_count++; in increment_reader()
344 __nisdb_rlock(__nisdb_rwlock_t *rw) { in __nisdb_rlock() argument
350 if (rw == 0) { in __nisdb_rlock()
358 if (rw->destroyed != 0) in __nisdb_rlock()
361 if (rw->force_write) in __nisdb_rlock()
362 return (__nisdb_wlock(rw)); in __nisdb_rlock()
364 if ((ret = mutex_lock(&rw->mutex)) != 0) in __nisdb_rlock()
367 if (rw->destroyed != 0) { in __nisdb_rlock()
368 (void) mutex_unlock(&rw->mutex); in __nisdb_rlock()
372 rr = find_reader(myself, rw); in __nisdb_rlock()
375 while (rw->writer_count > 0 && rw->writer.id != myself) { in __nisdb_rlock()
378 rw->reader_blocked++; in __nisdb_rlock()
380 if ((ret = cond_wait(&rw->cv, &rw->mutex)) != 0) { in __nisdb_rlock()
383 if (rw->reader_blocked > 0) in __nisdb_rlock()
384 rw->reader_blocked--; in __nisdb_rlock()
390 (void) mutex_unlock(&rw->mutex); in __nisdb_rlock()
395 if (rw->reader_blocked > 0) in __nisdb_rlock()
396 rw->reader_blocked--; in __nisdb_rlock()
404 rr = increment_reader(myself, rw); in __nisdb_rlock()
405 ret = mutex_unlock(&rw->mutex); in __nisdb_rlock()
411 __nisdb_wulock(__nisdb_rwlock_t *rw) { in __nisdb_wulock() argument
416 if (rw == 0) { in __nisdb_wulock()
424 if (rw->destroyed != 0) in __nisdb_wulock()
427 if ((ret = mutex_lock(&rw->mutex)) != 0) in __nisdb_wulock()
430 if (rw->destroyed != 0) { in __nisdb_wulock()
431 (void) mutex_unlock(&rw->mutex); in __nisdb_wulock()
436 if (rw->writer_count == 0 || in __nisdb_wulock()
437 rw->writer.id != myself || rw->writer.count == 0) { in __nisdb_wulock()
441 (void) mutex_unlock(&rw->mutex); in __nisdb_wulock()
445 rw->writer.count--; in __nisdb_wulock()
446 if (rw->writer.count == 0) { in __nisdb_wulock()
447 rw->writer.id = INV_PTHREAD_ID; in __nisdb_wulock()
448 rw->writer_count = 0; in __nisdb_wulock()
449 if ((ret = cond_broadcast(&rw->cv)) != 0) { in __nisdb_wulock()
450 (void) mutex_unlock(&rw->mutex); in __nisdb_wulock()
455 return (mutex_unlock(&rw->mutex)); in __nisdb_wulock()
460 __nisdb_rulock(__nisdb_rwlock_t *rw) { in __nisdb_rulock() argument
466 if (rw == 0) { in __nisdb_rulock()
473 if (rw->destroyed != 0) in __nisdb_rulock()
476 if (rw->force_write) in __nisdb_rulock()
477 return (__nisdb_wulock(rw)); in __nisdb_rulock()
479 if ((ret = mutex_lock(&rw->mutex)) != 0) in __nisdb_rulock()
482 if (rw->destroyed != 0) { in __nisdb_rulock()
483 (void) mutex_unlock(&rw->mutex); in __nisdb_rulock()
488 if (rw->reader_count == 0 || in __nisdb_rulock()
489 (rw->writer_count > 0 && rw->writer.id != myself)) { in __nisdb_rulock()
493 (void) mutex_unlock(&rw->mutex); in __nisdb_rulock()
498 for (rr = &rw->reader, prev = 0; rr != 0; prev = rr, rr = rr->next) { in __nisdb_rulock()
507 (void) mutex_unlock(&rw->mutex); in __nisdb_rulock()
513 if (rr != &rw->reader) { in __nisdb_rulock()
524 rw->reader.id = rr->id; in __nisdb_rulock()
525 rw->reader.count = rr->count; in __nisdb_rulock()
526 rw->reader.next = rr->next; in __nisdb_rulock()
533 rw->reader_count--; in __nisdb_rulock()
537 if (rw->reader_count == 0) { in __nisdb_rulock()
538 if ((ret = cond_broadcast(&rw->cv)) != 0) { in __nisdb_rulock()
539 (void) mutex_unlock(&rw->mutex); in __nisdb_rulock()
544 return (mutex_unlock(&rw->mutex)); in __nisdb_rulock()
550 __nisdb_assert_wheld(__nisdb_rwlock_t *rw) { in __nisdb_assert_wheld() argument
555 if (rw == 0) { in __nisdb_assert_wheld()
562 if (rw->destroyed != 0) in __nisdb_assert_wheld()
565 if ((ret = mutex_lock(&rw->mutex)) != 0) in __nisdb_assert_wheld()
568 if (rw->destroyed != 0) { in __nisdb_assert_wheld()
569 (void) mutex_unlock(&rw->mutex); in __nisdb_assert_wheld()
573 if (rw->writer_count == 0 || rw->writer.id != pthread_self()) { in __nisdb_assert_wheld()
574 ret = mutex_unlock(&rw->mutex); in __nisdb_assert_wheld()
583 return (mutex_unlock(&rw->mutex)); in __nisdb_assert_wheld()
589 __nisdb_assert_rheld(__nisdb_rwlock_t *rw) { in __nisdb_assert_rheld() argument
596 if (rw == 0) { in __nisdb_assert_rheld()
603 if (rw->destroyed != 0) in __nisdb_assert_rheld()
606 if (rw->force_write) in __nisdb_assert_rheld()
607 return (__nisdb_assert_wheld(rw)); in __nisdb_assert_rheld()
609 if ((ret = mutex_lock(&rw->mutex)) != 0) in __nisdb_assert_rheld()
612 if (rw->destroyed != 0) { in __nisdb_assert_rheld()
613 (void) mutex_unlock(&rw->mutex); in __nisdb_assert_rheld()
618 if (rw->writer_count > 0 && rw->writer.id == myself) { in __nisdb_assert_rheld()
619 (void) mutex_unlock(&rw->mutex); in __nisdb_assert_rheld()
623 if (rw->reader_count == 0) { in __nisdb_assert_rheld()
624 (void) mutex_unlock(&rw->mutex); in __nisdb_assert_rheld()
628 rr = &rw->reader; in __nisdb_assert_rheld()
631 (void) mutex_unlock(&rw->mutex); in __nisdb_assert_rheld()
637 ret = mutex_unlock(&rw->mutex); in __nisdb_assert_rheld()
643 __nisdb_destroy_lock(__nisdb_rwlock_t *rw) { in __nisdb_destroy_lock() argument
649 if (rw == 0) { in __nisdb_destroy_lock()
656 if (rw->destroyed != 0) in __nisdb_destroy_lock()
659 if ((ret = mutex_lock(&rw->mutex)) != 0) in __nisdb_destroy_lock()
662 if (rw->destroyed != 0) { in __nisdb_destroy_lock()
663 (void) mutex_unlock(&rw->mutex); in __nisdb_destroy_lock()
672 if (((rw->writer_count > 0 && in __nisdb_destroy_lock()
673 (rw->writer.id != myself || rw->writer.count != 1)) || in __nisdb_destroy_lock()
674 (rw->reader_count > 0 && in __nisdb_destroy_lock()
675 !(rw->reader_count == 1 && rw->reader.id == myself && in __nisdb_destroy_lock()
676 rw->reader.count == 1))) || in __nisdb_destroy_lock()
677 (rw->writer_count > 0 && rw->reader_count > 0)) { in __nisdb_destroy_lock()
681 (void) mutex_unlock(&rw->mutex); in __nisdb_destroy_lock()
693 rw->destroyed++; in __nisdb_destroy_lock()
695 return (mutex_unlock(&rw->mutex)); in __nisdb_destroy_lock()
699 __nisdb_lock_report(__nisdb_rwlock_t *rw) { in __nisdb_lock_report() argument
702 if (rw == 0) { in __nisdb_lock_report()
707 if (rw->destroyed) in __nisdb_lock_report()
708 printf("0x%x: DESTROYED\n", rw); in __nisdb_lock_report()
711 rw, rw->force_write ? "disallowed" : "allowed"); in __nisdb_lock_report()
713 if (rw->writer_count == 0) in __nisdb_lock_report()
714 printf("0x%x: No writer\n", rw); in __nisdb_lock_report()
715 else if (rw->writer_count == 1) { in __nisdb_lock_report()
717 rw, rw->writer.id, rw->writer.count); in __nisdb_lock_report()
718 if (rw->writer.wait) in __nisdb_lock_report()
719 printf("0x%x:\tWriter blocked\n", rw); in __nisdb_lock_report()
722 rw, rw->writer_count); in __nisdb_lock_report()
724 if (rw->reader_count == 0) in __nisdb_lock_report()
725 printf("0x%x: No readers\n", rw); in __nisdb_lock_report()
730 rw, rw->reader_count, rw->reader_blocked); in __nisdb_lock_report()
731 for (r = &rw->reader; r != 0; r = r->next) { in __nisdb_lock_report()
733 rw, r->id, r->count, in __nisdb_lock_report()