nisdb_rw.c revision 2
d39a76e7b087a3d0927cbe6898dc0a6770fa6c68xw * CDDL HEADER START
d39a76e7b087a3d0927cbe6898dc0a6770fa6c68xw * The contents of this file are subject to the terms of the
d39a76e7b087a3d0927cbe6898dc0a6770fa6c68xw * Common Development and Distribution License (the "License").
d39a76e7b087a3d0927cbe6898dc0a6770fa6c68xw * You may not use this file except in compliance with the License.
d39a76e7b087a3d0927cbe6898dc0a6770fa6c68xw * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
d39a76e7b087a3d0927cbe6898dc0a6770fa6c68xw * See the License for the specific language governing permissions
d39a76e7b087a3d0927cbe6898dc0a6770fa6c68xw * and limitations under the License.
d39a76e7b087a3d0927cbe6898dc0a6770fa6c68xw * When distributing Covered Code, include this CDDL HEADER in each
d39a76e7b087a3d0927cbe6898dc0a6770fa6c68xw * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
d39a76e7b087a3d0927cbe6898dc0a6770fa6c68xw * If applicable, add the following below this CDDL HEADER, with the
d39a76e7b087a3d0927cbe6898dc0a6770fa6c68xw * fields enclosed by brackets "[]" replaced with your own identifying
d39a76e7b087a3d0927cbe6898dc0a6770fa6c68xw * information: Portions Copyright [yyyy] [name of copyright owner]
d39a76e7b087a3d0927cbe6898dc0a6770fa6c68xw * CDDL HEADER END
d39a76e7b087a3d0927cbe6898dc0a6770fa6c68xw * Copyright (c) 2001, 2010, Oracle and/or its affiliates. All rights reserved.
d39a76e7b087a3d0927cbe6898dc0a6770fa6c68xw * Nesting-safe RW locking functions. Return 0 when successful, an
d39a76e7b087a3d0927cbe6898dc0a6770fa6c68xw * error number from the E-series when not.
d39a76e7b087a3d0927cbe6898dc0a6770fa6c68xw if (rw == 0) {
d39a76e7b087a3d0927cbe6898dc0a6770fa6c68xw#endif /* NISDB_MT_DEBUG */
d39a76e7b087a3d0927cbe6898dc0a6770fa6c68xw if ((ret = mutex_init(&rw->mutex, USYNC_THREAD, 0)) != 0)
d39a76e7b087a3d0927cbe6898dc0a6770fa6c68xw * If we allow read-to-write lock migration, there's a potential
d39a76e7b087a3d0927cbe6898dc0a6770fa6c68xw * race condition if two or more threads want to upgrade at the
static __nisdb_rl_t *
rr = 0;
return (rr);
int ret;
if (rw == 0)
return (EFAULT);
return (ESHUTDOWN);
return (ret);
ret = 0;
return (ret);
int ret;
return (ESHUTDOWN);
return (ret);
ret = 0;
return (ret);
int ret;
int all_readers_blocked = 0;
if (rw == 0) {
#ifdef NISDB_MT_DEBUG
abort();
return (EFAULT);
return (ESHUTDOWN);
return (ret);
return (ESHUTDOWN);
if (all_readers_blocked) {
if (trylock) {
return (EBUSY);
if (rr != 0) {
if (rr != 0) {
#ifdef NISDB_MT_DEBUG
abort();
return (ret);
if (rr != 0) {
#ifdef NISDB_MT_DEBUG
abort();
static __nisdb_rl_t *
} else if (rr == 0) {
return (rr);
int ret;
if (rw == 0) {
#ifdef NISDB_MT_DEBUG
abort();
return (EFAULT);
return (ESHUTDOWN);
return (ret);
return (ESHUTDOWN);
if (rr != 0) {
if (rr != 0) {
#ifdef NISDB_MT_DEBUG
abort();
return (ret);
if (rr != 0) {
#ifdef NISDB_MT_DEBUG
abort();
int ret;
if (rw == 0) {
#ifdef NISDB_MT_DEBUG
abort();
return (EFAULT);
return (ESHUTDOWN);
return (ret);
return (ESHUTDOWN);
#ifdef NISDB_MT_DEBUG
abort();
return (ENOLCK);
return (ret);
int ret;
if (rw == 0) {
#ifdef NISDB_MT_DEBUG
abort();
return (EFAULT);
return (ESHUTDOWN);
return (ret);
return (ESHUTDOWN);
#ifdef NISDB_MT_DEBUG
abort();
return (ENOLCK);
#ifdef NISDB_MT_DEBUG
abort();
return (ENOLCK);
return (ret);
int ret;
if (rw == 0) {
#ifdef NISDB_MT_DEBUG
abort();
return (EFAULT);
return (ESHUTDOWN);
return (ret);
return (ESHUTDOWN);
int ret;
if (rw == 0) {
#ifdef NISDB_MT_DEBUG
abort();
return (EFAULT);
return (ESHUTDOWN);
return (ret);
return (ESHUTDOWN);
return (EBUSY);
} while (rr != 0);
int ret;
if (rw == 0) {
#ifdef NISDB_MT_DEBUG
abort();
return (EFAULT);
return (ESHUTDOWN);
return (ret);
return (ESHUTDOWN);
#ifdef NISDB_MT_DEBUG
abort();
return (ENOLCK);
if (rw == 0) {
__nisdb_rl_t *r;