Lines Matching +full:wake +full:- +full:up
34 /* We're the magician, so undefine the define-magic */
46 * one-writer-or-many-readers locking. The following restrictions
52 * the deletion is holding a read-only lock on the item.
67 errorcode = pthread_mutex_init(&table->lock, 0); in __nis_init_hash_table()
70 "(table->lock) pthread_mutex_init returned %d (%s)", in __nis_init_hash_table()
74 errorcode = pthread_cond_init(&table->cond, 0); in __nis_init_hash_table()
77 "(table->cond) pthread_cond_init returned %d (%s)", in __nis_init_hash_table()
81 errorcode = pthread_mutex_init(&table->traverser_id_lock, 0); in __nis_init_hash_table()
84 "(table->traverser_id_lock) " in __nis_init_hash_table()
89 table->traversed = 0; in __nis_init_hash_table()
90 table->locked_items = 0; in __nis_init_hash_table()
91 (void) memset(table->keys, 0, sizeof (table->keys)); in __nis_init_hash_table()
92 table->first = 0; in __nis_init_hash_table()
93 table->destroyItem = itemDestructor; in __nis_init_hash_table()
111 (void) pthread_mutex_lock(&table->lock); in __nis_lock_hash_table()
113 while ((table->traversed != 0 && in __nis_lock_hash_table()
114 table->traverser_id != myself) || in __nis_lock_hash_table()
115 table->locked_items != 0) { in __nis_lock_hash_table()
120 (void) pthread_cond_wait(&table->cond, in __nis_lock_hash_table()
121 &table->lock); in __nis_lock_hash_table()
124 (void) pthread_mutex_lock(&table->traverser_id_lock); in __nis_lock_hash_table()
126 table->traversed = 1; in __nis_lock_hash_table()
127 table->traverser_id = myself; in __nis_lock_hash_table()
128 (void) pthread_mutex_unlock(&table->traverser_id_lock); in __nis_lock_hash_table()
137 set_thread_status(msg, "non-traverse TL"); in __nis_lock_hash_table()
138 if (pthread_mutex_trylock(&table->lock) == EBUSY) { in __nis_lock_hash_table()
143 &table->traverser_id_lock); in __nis_lock_hash_table()
144 if (table->traversed != 0 && in __nis_lock_hash_table()
145 table->traverser_id == myself) { in __nis_lock_hash_table()
150 &table->traverser_id_lock); in __nis_lock_hash_table()
158 (void) pthread_mutex_lock(&table->lock); in __nis_lock_hash_table()
164 myself, traverse?"traverse":"non-traverse", table)); in __nis_lock_hash_table()
185 (void) pthread_mutex_lock(&table->traverser_id_lock); in __nis_ulock_hash_table()
187 if (table->traversed != 0 && in __nis_ulock_hash_table()
188 table->traverser_id == pthread_self()) { in __nis_ulock_hash_table()
189 table->traversed = 0; in __nis_ulock_hash_table()
196 /* Wake up other traversers-to-be */ in __nis_ulock_hash_table()
198 (void) pthread_cond_signal(&table->cond); in __nis_ulock_hash_table()
200 (void) pthread_mutex_unlock(&table->traverser_id_lock); in __nis_ulock_hash_table()
208 (void) pthread_mutex_lock(&table->traverser_id_lock); in __nis_ulock_hash_table()
210 if (table->traversed == 0) { in __nis_ulock_hash_table()
213 (void) pthread_mutex_unlock(&table->traverser_id_lock); in __nis_ulock_hash_table()
217 (void) pthread_mutex_unlock(&table->lock); in __nis_ulock_hash_table()
221 pthread_self(), traverse?"traverse":"non-traverse", table, in __nis_ulock_hash_table()
241 key %= (sizeof (table->keys) / sizeof (table->keys[0])); in __find_item_mt()
246 for (pp = &table->keys[key]; (it = *pp) != 0; pp = &it->next) { in __find_item_mt()
247 if (strcmp(name, it->name) == 0) { in __find_item_mt()
261 * > 0 Non-exclusive access (read-only) to item
276 if ((*(pp = __find_item_mt(item->name, table, &key))) != 0) { in __nis_insert_item_mt()
281 (void) pthread_cond_init(&item->lock, 0); in __nis_insert_item_mt()
282 item->readers = item->writer = 0; in __nis_insert_item_mt()
283 item->last_reader_id = item->writer_id = INV_PTHREAD_ID; in __nis_insert_item_mt()
285 item->writer = 1; in __nis_insert_item_mt()
286 item->writer_id = pthread_self(); in __nis_insert_item_mt()
287 table->locked_items++; in __nis_insert_item_mt()
289 item->readers = 1; in __nis_insert_item_mt()
290 item->last_reader_id = pthread_self(); in __nis_insert_item_mt()
291 table->locked_items++; in __nis_insert_item_mt()
293 item->next = *pp; in __nis_insert_item_mt()
295 item->keychain = key; in __nis_insert_item_mt()
297 if (table->first) in __nis_insert_item_mt()
298 table->first->prv_item = item; in __nis_insert_item_mt()
300 item->nxt_item = table->first; in __nis_insert_item_mt()
301 item->prv_item = NULL; in __nis_insert_item_mt()
302 table->first = item; in __nis_insert_item_mt()
322 if ((item->name = strdup(name)) == 0) { in __nis_insert_name_mt()
329 free(item->name); in __nis_insert_name_mt()
337 * other than to confirm existence indicated by a non-NULL
339 * > 0 Non-exclusive (read-only) access
342 * lock type cannot be acquired, set *trylock = -1 and return 0.
369 (item->writer == 0 && item->readers == 0)) in __nis_find_item_mt()
371 if (item->writer == 0 && readwrite > 0) in __nis_find_item_mt()
373 if ((item->writer != 0 && item->writer_id == me)) in __nis_find_item_mt()
376 *trylock = -1; in __nis_find_item_mt()
380 (void) pthread_cond_wait(&item->lock, &table->lock); in __nis_find_item_mt()
385 if (item->writer == 0) { in __nis_find_item_mt()
386 item->writer_id = me; in __nis_find_item_mt()
387 table->locked_items++; in __nis_find_item_mt()
389 item->writer++; in __nis_find_item_mt()
391 if (item->readers == 0) { in __nis_find_item_mt()
392 table->locked_items++; in __nis_find_item_mt()
394 item->last_reader_id = me; in __nis_find_item_mt()
395 item->readers++; in __nis_find_item_mt()
415 while ((item = table->first) != 0) { in __nis_pop_item_mt()
416 if (table->destroyItem != 0) in __nis_pop_item_mt()
418 if (item->readers == 0 && item->writer == 0) in __nis_pop_item_mt()
420 if (item->writer != 0 && item->writer_id == mtid) in __nis_pop_item_mt()
422 (void) pthread_cond_wait(&item->lock, &table->lock); in __nis_pop_item_mt()
432 for (cur = table->keys[item->keychain]; cur; in __nis_pop_item_mt()
433 prev = cur, cur = cur->next) { in __nis_pop_item_mt()
436 prev->next = cur->next; in __nis_pop_item_mt()
438 table->keys[cur->keychain] = cur->next; in __nis_pop_item_mt()
439 if (cur->prv_item) in __nis_pop_item_mt()
440 cur->prv_item->nxt_item = cur->nxt_item; in __nis_pop_item_mt()
442 table->first = cur->nxt_item; in __nis_pop_item_mt()
443 if (cur->nxt_item) in __nis_pop_item_mt()
444 cur->nxt_item->prv_item = cur->prv_item; in __nis_pop_item_mt()
453 item->keychain = -1; in __nis_pop_item_mt()
456 if (table->locked_items != 0 && in __nis_pop_item_mt()
457 (item->writer > 0 || item->readers > 0)) { in __nis_pop_item_mt()
458 table->locked_items--; in __nis_pop_item_mt()
459 if (table->locked_items == 0) { in __nis_pop_item_mt()
460 /* Wake up traversers-to-be */ in __nis_pop_item_mt()
461 (void) pthread_cond_signal(&table->cond); in __nis_pop_item_mt()
466 * Wake up any threads that were waiting for this item. Obviously, in __nis_pop_item_mt()
469 (void) pthread_cond_signal(&item->lock); in __nis_pop_item_mt()
470 (void) pthread_cond_destroy(&item->lock); in __nis_pop_item_mt()
476 if (item->readers == 0 && item->writer == 0 && in __nis_pop_item_mt()
477 table->destroyItem != 0) { in __nis_pop_item_mt()
478 (*table->destroyItem)(item); in __nis_pop_item_mt()
481 item->next = 0; in __nis_pop_item_mt()
482 item->prv_item = 0; in __nis_pop_item_mt()
483 item->nxt_item = 0; in __nis_pop_item_mt()
509 if (table->destroyItem != 0) in __nis_remove_item_mt()
511 if (nl->readers == 0 && nl->writer == 0) in __nis_remove_item_mt()
513 if (nl->writer != 0 && nl->writer_id == mtid) in __nis_remove_item_mt()
515 (void) pthread_cond_wait(&nl->lock, &table->lock); in __nis_remove_item_mt()
524 *pp = nl->next; in __nis_remove_item_mt()
525 nl->next = 0; in __nis_remove_item_mt()
528 if (nl->prv_item) in __nis_remove_item_mt()
529 nl->prv_item->nxt_item = nl->nxt_item; in __nis_remove_item_mt()
531 table->first = nl->nxt_item; in __nis_remove_item_mt()
533 if (nl->nxt_item) in __nis_remove_item_mt()
534 nl->nxt_item->prv_item = nl->prv_item; in __nis_remove_item_mt()
535 nl->prv_item = 0; in __nis_remove_item_mt()
536 nl->nxt_item = 0; in __nis_remove_item_mt()
539 nl->keychain = -1; in __nis_remove_item_mt()
545 if (table->locked_items != 0 && in __nis_remove_item_mt()
546 (nl->writer > 0 || nl->readers > 0)) { in __nis_remove_item_mt()
547 table->locked_items--; in __nis_remove_item_mt()
548 if (table->locked_items == 0) { in __nis_remove_item_mt()
549 /* Wake up traversers-to-be */ in __nis_remove_item_mt()
550 (void) pthread_cond_signal(&table->cond); in __nis_remove_item_mt()
553 (void) pthread_cond_signal(&nl->lock); in __nis_remove_item_mt()
554 (void) pthread_cond_destroy(&nl->lock); in __nis_remove_item_mt()
562 if (nl->readers == 0 && nl->writer == 0 && table->destroyItem != 0) { in __nis_remove_item_mt()
563 (*table->destroyItem)(nl); in __nis_remove_item_mt()
573 * Release an item that had been acquired exclusively or non-exclusively.
587 if ((readwrite < 0 && abs(readwrite) > item->writer) || in __nis_release_item()
588 (readwrite < 0 && item->writer > 0 && in __nis_release_item()
589 item->writer_id != pthread_self()) || in __nis_release_item()
590 (readwrite > 0 && readwrite > item->readers)) { in __nis_release_item()
597 item->writer += readwrite; in __nis_release_item()
598 if (item->writer == 0 && item->keychain >= 0) { in __nis_release_item()
599 if (table->locked_items != 0) in __nis_release_item()
600 table->locked_items--; in __nis_release_item()
604 item->readers -= readwrite; in __nis_release_item()
605 item->last_reader_id = INV_PTHREAD_ID; in __nis_release_item()
606 if (item->readers == 0 && item->keychain >= 0) { in __nis_release_item()
607 if (table->locked_items != 0) in __nis_release_item()
608 table->locked_items--; in __nis_release_item()
613 if (table->locked_items == 0) { in __nis_release_item()
614 /* Wake up traversers-to-be */ in __nis_release_item()
615 (void) pthread_cond_signal(&table->cond); in __nis_release_item()
618 /* Wake up anyone else who wants this item */ in __nis_release_item()
619 (void) pthread_cond_signal(&item->lock); in __nis_release_item()
626 if (item->keychain < 0 && in __nis_release_item()
627 item->readers == 0 && item->writer == 0 && in __nis_release_item()
628 item->next == 0 && in __nis_release_item()
629 item->prv_item == 0 && item->nxt_item == 0 && in __nis_release_item()
630 table->destroyItem != 0) in __nis_release_item()
631 (*table->destroyItem)(item); in __nis_release_item()
639 * Return -1 if item checked out for both reading and writing, 1 if
648 if (item->writer > 0) { in __nis_item_access()
649 if (item->writer_id != pthread_self()) in __nis_item_access()
651 return (-1); in __nis_item_access()
652 } else if (item->readers > 0) { in __nis_item_access()
664 * first/prv_item/nxt_item and scan in hash-chain order. The iterator
667 * the existing non-MT nis_scan_table() this function has no return
688 slot < sizeof (table->keys) / sizeof (table->keys[0]); in __nis_scan_table_mt()
692 for (it = table->keys[slot]; it != 0; it = it->next) { in __nis_scan_table_mt()