Lines Matching defs:table

47  * The hash table routines below implement nested (or recursive)
63 __nis_init_hash_table(__nis_hash_table_mt *table,
68 if (table != 0) {
69 errorcode = pthread_mutex_init(&table->lock, 0);
72 "(table->lock) pthread_mutex_init returned %d (%s)",
76 errorcode = pthread_cond_init(&table->cond, 0);
79 "(table->cond) pthread_cond_init returned %d (%s)",
83 errorcode = pthread_mutex_init(&table->traverser_id_lock, 0);
86 "(table->traverser_id_lock) "
91 table->traversed = 0;
92 table->locked_items = 0;
93 (void) memset(table->keys, 0, sizeof (table->keys));
94 table->first = 0;
95 table->destroyItem = itemDestructor;
100 __nis_lock_hash_table(__nis_hash_table_mt *table, int traverse, char *msg) {
104 if (table != 0) {
108 * table (list). Wait until there are no threads
112 set_thread_status(msg, "table WL");
113 (void) pthread_mutex_lock(&table->lock);
114 set_thread_status(msg, "table L");
115 while ((table->traversed != 0 &&
116 table->traverser_id != myself) ||
117 table->locked_items != 0) {
120 "%d: lh table 0x%x trav cond wait",
121 myself, table));
122 (void) pthread_cond_wait(&table->cond,
123 &table->lock);
126 (void) pthread_mutex_lock(&table->traverser_id_lock);
128 table->traversed = 1;
129 table->traverser_id = myself;
130 (void) pthread_mutex_unlock(&table->traverser_id_lock);
135 * locked the table, lock it. If the table already is
140 if (pthread_mutex_trylock(&table->lock) == EBUSY) {
145 &table->traverser_id_lock);
146 if (table->traversed != 0 &&
147 table->traverser_id == myself) {
152 &table->traverser_id_lock);
157 "%d: lh table 0x%x cond wait",
158 myself, table));
159 set_thread_status(msg, "table WL");
160 (void) pthread_mutex_lock(&table->lock);
161 set_thread_status(msg, "table L");
165 MT_LOG(1, (LOG_NOTICE, "%d: lh table %s lock acquired 0x%x",
166 myself, traverse?"traverse":"non-traverse", table));
174 __nis_ulock_hash_table(__nis_hash_table_mt *table, int traverse, char *msg) {
178 if (table != 0) {
182 * table in order to avoid recursive locking in the
187 (void) pthread_mutex_lock(&table->traverser_id_lock);
189 if (table->traversed != 0 &&
190 table->traverser_id == pthread_self()) {
191 table->traversed = 0;
199 set_thread_status(msg, "table cond_signal");
200 (void) pthread_cond_signal(&table->cond);
202 (void) pthread_mutex_unlock(&table->traverser_id_lock);
207 * traversing the table, leave it locked.
210 (void) pthread_mutex_lock(&table->traverser_id_lock);
212 if (table->traversed == 0) {
215 (void) pthread_mutex_unlock(&table->traverser_id_lock);
219 (void) pthread_mutex_unlock(&table->lock);
220 set_thread_status(msg, "table U");
222 MT_LOG(1, (LOG_NOTICE, "%d: lh table %s release 0x%x (%s)",
223 pthread_self(), traverse?"traverse":"non-traverse", table,
232 __find_item_mt(nis_name name, __nis_hash_table_mt *table, int *keyp) {
238 /* Assume table!=0, table lock held */
243 key %= (sizeof (table->keys) / sizeof (table->keys[0]));
248 for (pp = &table->keys[key]; (it = *pp) != 0; pp = &it->next) {
269 __nis_insert_item_mt(void *arg, __nis_hash_table_mt *table, int readwrite) {
275 if (item == 0 || __nis_lock_hash_table(table, 0, "nitmt") == 0)
278 if ((*(pp = __find_item_mt(item->name, table, &key))) != 0) {
279 (void) __nis_ulock_hash_table(table, 0, "nitmt");
289 table->locked_items++;
293 table->locked_items++;
299 if (table->first)
300 table->first->prv_item = item;
302 item->nxt_item = table->first;
304 table->first = item;
306 (void) __nis_ulock_hash_table(table, 0, "nitmt");
312 __nis_insert_name_mt(nis_name name, __nis_hash_table_mt *table) {
316 if (name == 0 || table == 0)
330 if (! __nis_insert_item_mt(item, table, 0)) {
347 __nis_find_item_mt(nis_name name, __nis_hash_table_mt *table, int readwrite,
353 if (name == 0 || __nis_lock_hash_table(table, 0, "nfimt") == 0)
369 while ((item = *__find_item_mt(name, table, 0)) != 0) {
379 (void) __nis_ulock_hash_table(table, 0, "nfimt");
382 (void) pthread_cond_wait(&item->lock, &table->lock);
389 table->locked_items++;
394 table->locked_items++;
401 (void) __nis_ulock_hash_table(table, 0, "nfimt");
407 __nis_pop_item_mt(__nis_hash_table_mt *table) {
412 if (__nis_lock_hash_table(table, 0, "npimt") == 0)
417 while ((item = table->first) != 0) {
418 if (table->destroyItem != 0)
424 (void) pthread_cond_wait(&item->lock, &table->lock);
429 __nis_ulock_hash_table(table, 0, "npimt");
434 for (cur = table->keys[item->keychain]; cur;
440 table->keys[cur->keychain] = cur->next;
444 table->first = cur->nxt_item;
453 * into the table anymore.
457 /* Adjust the count of locked items in the table */
458 if (table->locked_items != 0 &&
460 table->locked_items--;
461 if (table->locked_items == 0) {
463 (void) pthread_cond_signal(&table->cond);
479 table->destroyItem != 0) {
480 (*table->destroyItem)(item);
488 (void) __nis_ulock_hash_table(table, 0, "npimt");
496 return ((item != 0) ? item : __nis_pop_item_mt(table));
500 __nis_remove_item_mt(nis_name name, __nis_hash_table_mt *table) {
505 if (__nis_lock_hash_table(table, 0, "nrimt") == 0)
510 while ((nl = *(pp = __find_item_mt(name, table, (int *)0))) != 0) {
511 if (table->destroyItem != 0)
517 (void) pthread_cond_wait(&nl->lock, &table->lock);
521 (void) __nis_ulock_hash_table(table, 0, "nrimt");
533 table->first = nl->nxt_item;
540 /* keychain < 0 means not in table anymore */
545 * locked items for the table.
547 if (table->locked_items != 0 &&
549 table->locked_items--;
550 if (table->locked_items == 0) {
552 (void) pthread_cond_signal(&table->cond);
564 if (nl->readers == 0 && nl->writer == 0 && table->destroyItem != 0) {
565 (*table->destroyItem)(nl);
569 (void) __nis_ulock_hash_table(table, 0, "nrimt");
581 __nis_release_item(void *arg, __nis_hash_table_mt *table, int readwrite) {
586 if (item == 0 || __nis_lock_hash_table(table, 0, "nreli") == 0)
594 (void) __nis_ulock_hash_table(table, 0, "nreli");
601 if (table->locked_items != 0)
602 table->locked_items--;
609 if (table->locked_items != 0)
610 table->locked_items--;
615 if (table->locked_items == 0) {
617 (void) pthread_cond_signal(&table->cond);
632 table->destroyItem != 0)
633 (*table->destroyItem)(item);
635 (void) __nis_ulock_hash_table(table, 0, "nreli");
674 __nis_hash_table_mt *table,
680 if (table == 0) {
684 if (__nis_lock_hash_table(table, 1, "nstmt") == 0) {
690 slot < sizeof (table->keys) / sizeof (table->keys[0]);
694 for (it = table->keys[slot]; it != 0; it = it->next) {
700 if (__nis_ulock_hash_table(table, 1, "nstmt") == 0)