Lines Matching refs:rw
39 __nisdb_rwinit(__nisdb_rwlock_t *rw) {
43 if (rw == 0) {
50 if ((ret = mutex_init(&rw->mutex, USYNC_THREAD, 0)) != 0)
52 if ((ret = cond_init(&rw->cv, USYNC_THREAD, 0)) != 0)
54 rw->destroyed = 0;
75 rw->force_write = NISDB_FORCE_WRITE;
77 rw->writer_count = rw->reader_count = rw->reader_blocked = 0;
78 rw->writer.id = rw->reader.id = INV_PTHREAD_ID;
79 rw->writer.count = rw->reader.count = 0;
80 rw->writer.next = rw->reader.next = 0;
87 find_reader(pthread_t id, __nisdb_rwlock_t *rw) {
91 for (rr = &rw->reader; rr != 0; rr = rr->next) {
105 __nisdb_rw_readlock_ok(__nisdb_rwlock_t *rw) {
110 if (rw == 0)
113 if (rw->destroyed != 0)
116 if ((ret = mutex_lock(&rw->mutex)) != 0)
123 if (rw->destroyed == 0 && rw->reader_count == 0) {
124 rw->force_write = 0;
130 (void) mutex_unlock(&rw->mutex);
137 __nisdb_rw_force_writelock(__nisdb_rwlock_t *rw) {
142 if (rw == 0 || rw->destroyed != 0)
145 if ((ret = mutex_lock(&rw->mutex)) != 0)
152 if (rw->destroyed == 0 && rw->reader_count == 0) {
153 rw->force_write = 1;
159 (void) mutex_unlock(&rw->mutex);
166 __nisdb_wlock_trylock(__nisdb_rwlock_t *rw, int trylock) {
173 if (rw == 0) {
181 if (rw->destroyed != 0)
184 if ((ret = mutex_lock(&rw->mutex)) != 0)
187 if (rw->destroyed != 0) {
188 (void) mutex_unlock(&rw->mutex);
193 if (rw->reader_count == 0 && rw->writer_count == 0) {
194 rw->writer_count = 1;
195 rw->writer.id = myself;
196 rw->writer.count = 1;
197 return (mutex_unlock(&rw->mutex));
204 if (rw->reader_count > 0) {
205 if ((rr = find_reader(myself, rw)) != 0) {
213 if (rw->reader_count ==
214 (rw->reader_blocked + 1))
223 if (rw->reader_count == rw->reader_blocked)
239 (rw->writer_count == 0 && rw->reader_count == 0) ||
240 ((rw->writer_count == 0 || rw->writer.id == myself) &&
241 (rw->reader_count == 0) ||
242 (rw->reader_count == 1 &&
243 rw->reader.id == myself))) {
252 if (rw->writer_count == 0 || rw->writer.id == myself) {
262 (void) mutex_unlock(&rw->mutex);
269 rw->reader_blocked++;
271 if ((ret = cond_wait(&rw->cv, &rw->mutex)) != 0) {
274 if (rw->reader_blocked > 0)
275 rw->reader_blocked--;
281 (void) mutex_unlock(&rw->mutex);
286 if (rw->reader_blocked > 0)
287 rw->reader_blocked--;
296 rw->writer.id = myself;
298 rw->writer.count++;
300 if (rw->writer_count == 0)
301 rw->writer_count = 1;
303 return (mutex_unlock(&rw->mutex));
307 __nisdb_wlock(__nisdb_rwlock_t *rw) {
308 return (__nisdb_wlock_trylock(rw, 0));
313 increment_reader(pthread_t id, __nisdb_rwlock_t *rw) {
317 for (rr = &rw->reader; rr != 0; rr = rr->next) {
321 if (rw->reader_count == 0 && rr == &rw->reader) {
324 rw->reader_count = 1;
334 rr->next = rw->reader.next;
335 rw->reader.next = rr;
336 rw->reader_count++;
345 __nisdb_rlock(__nisdb_rwlock_t *rw) {
351 if (rw == 0) {
359 if (rw->destroyed != 0)
362 if (rw->force_write)
363 return (__nisdb_wlock(rw));
365 if ((ret = mutex_lock(&rw->mutex)) != 0)
368 if (rw->destroyed != 0) {
369 (void) mutex_unlock(&rw->mutex);
373 rr = find_reader(myself, rw);
376 while (rw->writer_count > 0 && rw->writer.id != myself) {
379 rw->reader_blocked++;
381 if ((ret = cond_wait(&rw->cv, &rw->mutex)) != 0) {
384 if (rw->reader_blocked > 0)
385 rw->reader_blocked--;
391 (void) mutex_unlock(&rw->mutex);
396 if (rw->reader_blocked > 0)
397 rw->reader_blocked--;
405 rr = increment_reader(myself, rw);
406 ret = mutex_unlock(&rw->mutex);
412 __nisdb_wulock(__nisdb_rwlock_t *rw) {
417 if (rw == 0) {
425 if (rw->destroyed != 0)
428 if ((ret = mutex_lock(&rw->mutex)) != 0)
431 if (rw->destroyed != 0) {
432 (void) mutex_unlock(&rw->mutex);
437 if (rw->writer_count == 0 ||
438 rw->writer.id != myself || rw->writer.count == 0) {
442 (void) mutex_unlock(&rw->mutex);
446 rw->writer.count--;
447 if (rw->writer.count == 0) {
448 rw->writer.id = INV_PTHREAD_ID;
449 rw->writer_count = 0;
450 if ((ret = cond_broadcast(&rw->cv)) != 0) {
451 (void) mutex_unlock(&rw->mutex);
456 return (mutex_unlock(&rw->mutex));
461 __nisdb_rulock(__nisdb_rwlock_t *rw) {
467 if (rw == 0) {
474 if (rw->destroyed != 0)
477 if (rw->force_write)
478 return (__nisdb_wulock(rw));
480 if ((ret = mutex_lock(&rw->mutex)) != 0)
483 if (rw->destroyed != 0) {
484 (void) mutex_unlock(&rw->mutex);
489 if (rw->reader_count == 0 ||
490 (rw->writer_count > 0 && rw->writer.id != myself)) {
494 (void) mutex_unlock(&rw->mutex);
499 for (rr = &rw->reader, prev = 0; rr != 0; prev = rr, rr = rr->next) {
508 (void) mutex_unlock(&rw->mutex);
514 if (rr != &rw->reader) {
525 rw->reader.id = rr->id;
526 rw->reader.count = rr->count;
527 rw->reader.next = rr->next;
534 rw->reader_count--;
538 if (rw->reader_count == 0) {
539 if ((ret = cond_broadcast(&rw->cv)) != 0) {
540 (void) mutex_unlock(&rw->mutex);
545 return (mutex_unlock(&rw->mutex));
551 __nisdb_assert_wheld(__nisdb_rwlock_t *rw) {
556 if (rw == 0) {
563 if (rw->destroyed != 0)
566 if ((ret = mutex_lock(&rw->mutex)) != 0)
569 if (rw->destroyed != 0) {
570 (void) mutex_unlock(&rw->mutex);
574 if (rw->writer_count == 0 || rw->writer.id != pthread_self()) {
575 ret = mutex_unlock(&rw->mutex);
584 return (mutex_unlock(&rw->mutex));
590 __nisdb_assert_rheld(__nisdb_rwlock_t *rw) {
597 if (rw == 0) {
604 if (rw->destroyed != 0)
607 if (rw->force_write)
608 return (__nisdb_assert_wheld(rw));
610 if ((ret = mutex_lock(&rw->mutex)) != 0)
613 if (rw->destroyed != 0) {
614 (void) mutex_unlock(&rw->mutex);
619 if (rw->writer_count > 0 && rw->writer.id == myself) {
620 (void) mutex_unlock(&rw->mutex);
624 if (rw->reader_count == 0) {
625 (void) mutex_unlock(&rw->mutex);
629 rr = &rw->reader;
632 (void) mutex_unlock(&rw->mutex);
638 ret = mutex_unlock(&rw->mutex);
644 __nisdb_destroy_lock(__nisdb_rwlock_t *rw) {
651 if (rw == 0) {
658 if (rw->destroyed != 0)
661 if ((ret = mutex_lock(&rw->mutex)) != 0)
664 if (rw->destroyed != 0) {
665 (void) mutex_unlock(&rw->mutex);
674 if ((rw->writer_count > 0 &&
675 (rw->writer.id != myself || rw->writer.count != 1) ||
676 (rw->reader_count > 0 &&
677 !(rw->reader_count == 1 && rw->reader.id == myself &&
678 rw->reader.count == 1))) ||
679 (rw->writer_count > 0 && rw->reader_count > 0)) {
683 (void) mutex_unlock(&rw->mutex);
695 rw->destroyed++;
697 return (mutex_unlock(&rw->mutex));
701 __nisdb_lock_report(__nisdb_rwlock_t *rw) {
704 if (rw == 0) {
709 if (rw->destroyed)
710 printf("0x%x: DESTROYED\n", rw);
713 rw, rw->force_write ? "disallowed" : "allowed");
715 if (rw->writer_count == 0)
716 printf("0x%x: No writer\n", rw);
717 else if (rw->writer_count == 1) {
719 rw, rw->writer.id, rw->writer.count);
720 if (rw->writer.wait)
721 printf("0x%x:\tWriter blocked\n", rw);
724 rw, rw->writer_count);
726 if (rw->reader_count == 0)
727 printf("0x%x: No readers\n", rw);
732 rw, rw->reader_count, rw->reader_blocked);
733 for (r = &rw->reader; r != 0; r = r->next) {
735 rw, r->id, r->count,