/* * CDDL HEADER START * * The contents of this file are subject to the terms of the * Common Development and Distribution License, Version 1.0 only * (the "License"). You may not use this file except in compliance * with the License. * * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE * or http://www.opensolaris.org/os/licensing. * See the License for the specific language governing permissions * and limitations under the License. * * When distributing Covered Code, include this CDDL HEADER in each * file and include the License file at usr/src/OPENSOLARIS.LICENSE. * If applicable, add the following below this CDDL HEADER, with the * fields enclosed by brackets "[]" replaced with your own identifying * information: Portions Copyright [yyyy] [name of copyright owner] * * CDDL HEADER END */ /* * Copyright 2004 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. */ #ifndef _NIS_HASHITEM_H #define _NIS_HASHITEM_H #pragma ident "%Z%%M% %I% %E% SMI" #include #include #include "nisdb_rw.h" #ifdef __cplusplus extern "C" { #endif /* Private versions of the various NIS_HASH_ITEM functions */ typedef struct __nis_item_item { pthread_cond_t lock; nis_name name; int keychain; uint32_t readers; pthread_t last_reader_id; uint32_t writer; pthread_t writer_id; struct __nis_item_item *next; struct __nis_item_item *prv_item; struct __nis_item_item *nxt_item; } __nis_hash_item_mt; typedef struct { pthread_mutex_t lock; pthread_cond_t cond; pthread_mutex_t traverser_id_lock; /* * Protects 'traversed' * and 'traverser_id'. */ uint32_t traversed; pthread_t traverser_id; uint32_t locked_items; __nis_hash_item_mt *keys[64]; __nis_hash_item_mt *first; void (*destroyItem)(void *); } __nis_hash_table_mt; #define NIS_HASH_TABLE_MT_INIT { \ PTHREAD_MUTEX_INITIALIZER, \ {0}, \ PTHREAD_MUTEX_INITIALIZER \ /* Zero is fine for the rest */ \ } #define LOCK_LIST(list, msg) (void) __nis_lock_hash_table(list, 1, msg) #define ULOCK_LIST(list, msg) (void) __nis_ulock_hash_table(list, 1, msg) extern void __nis_init_hash_table(__nis_hash_table_mt *, void (*)(void *)); extern int __nis_lock_hash_table(__nis_hash_table_mt *, int, char *); extern int __nis_ulock_hash_table(__nis_hash_table_mt *, int, char *); extern int __nis_insert_item_mt(void *, __nis_hash_table_mt *, int); extern void __nis_insert_name_mt(nis_name, __nis_hash_table_mt *); extern void *__nis_find_item_mt(nis_name, __nis_hash_table_mt *, int, int *); extern void *__nis_pop_item_mt(__nis_hash_table_mt *); extern void *__nis_remove_item_mt(nis_name, __nis_hash_table_mt *); extern int __nis_release_item(void *, __nis_hash_table_mt *, int); extern int __nis_item_access(void *); extern void __nis_scan_table_mt(__nis_hash_table_mt *, bool_t (*)(__nis_hash_item_mt *, void *), void *); /* Define-magic */ #define NIS_HASH_ITEM __nis_hash_item_mt #define NIS_HASH_TABLE __nis_hash_table_mt #define nis_insert_item(i, t) __nis_insert_item_mt(i, t, -1) #define nis_insert_item_rw(i, t, rw) __nis_insert_item_mt(i, t, rw) #define nis_insert_name(n, t) __nis_insert_name_mt(n, t) #define nis_find_item(i, t) __nis_find_item_mt(i, t, -1, 0) #define nis_find_item_rw(i, t, rw) __nis_find_item_mt(i, t, rw, 0) #define nis_pop_item __nis_pop_item_mt #define nis_remove_item __nis_remove_item_mt #define nis_scan_table __nis_scan_table_mt #define MT_LOCK_TYPE(type) (type < 0)?"W":(type > 0)?"R":"N" #ifdef NIS_MT_DEBUG #define MT_LOG(condition, syslogarg) if (condition) syslog ## syslogarg #else #define MT_LOG(condition, syslogarg) #endif /* NIS_MT_DEBUG */ #ifdef __cplusplus } #endif /* __cplusplus */ #endif /* _NIS_HASHITEM_H */