]> CyberLeo.Net >> Repos - FreeBSD/releng/8.1.git/blob - sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/rrwlock.h
Copy stable/8 to releng/8.1 in preparation for 8.1-RC1.
[FreeBSD/releng/8.1.git] / sys / cddl / contrib / opensolaris / uts / common / fs / zfs / sys / rrwlock.h
1 /*
2  * CDDL HEADER START
3  *
4  * The contents of this file are subject to the terms of the
5  * Common Development and Distribution License (the "License").
6  * You may not use this file except in compliance with the License.
7  *
8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9  * or http://www.opensolaris.org/os/licensing.
10  * See the License for the specific language governing permissions
11  * and limitations under the License.
12  *
13  * When distributing Covered Code, include this CDDL HEADER in each
14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15  * If applicable, add the following below this CDDL HEADER, with the
16  * fields enclosed by brackets "[]" replaced with your own identifying
17  * information: Portions Copyright [yyyy] [name of copyright owner]
18  *
19  * CDDL HEADER END
20  */
21 /*
22  * Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
23  * Use is subject to license terms.
24  */
25
26 #ifndef _SYS_RR_RW_LOCK_H
27 #define _SYS_RR_RW_LOCK_H
28
29 #pragma ident   "%Z%%M% %I%     %E% SMI"
30
31 #ifdef  __cplusplus
32 extern "C" {
33 #endif
34
35 #include <sys/zfs_context.h>
36 #include <sys/refcount.h>
37
38 /*
39  * A reader-writer lock implementation that allows re-entrant reads, but
40  * still gives writers priority on "new" reads.
41  *
42  * See rrwlock.c for more details about the implementation.
43  *
44  * Fields of the rrwlock_t structure:
45  * - rr_lock: protects modification and reading of rrwlock_t fields
46  * - rr_cv: cv for waking up readers or waiting writers
47  * - rr_writer: thread id of the current writer
48  * - rr_anon_rount: number of active anonymous readers
49  * - rr_linked_rcount: total number of non-anonymous active readers
50  * - rr_writer_wanted: a writer wants the lock
51  */
52 typedef struct rrwlock {
53         kmutex_t        rr_lock;
54         kcondvar_t      rr_cv;
55         kthread_t       *rr_writer;
56         refcount_t      rr_anon_rcount;
57         refcount_t      rr_linked_rcount;
58         boolean_t       rr_writer_wanted;
59 } rrwlock_t;
60
61 /*
62  * 'tag' is used in reference counting tracking.  The
63  * 'tag' must be the same in a rrw_enter() as in its
64  * corresponding rrw_exit().
65  */
66 void rrw_init(rrwlock_t *rrl);
67 void rrw_destroy(rrwlock_t *rrl);
68 void rrw_enter(rrwlock_t *rrl, krw_t rw, void *tag);
69 void rrw_exit(rrwlock_t *rrl, void *tag);
70 boolean_t rrw_held(rrwlock_t *rrl, krw_t rw);
71
72 #define RRW_READ_HELD(x)        rrw_held(x, RW_READER)
73 #define RRW_WRITE_HELD(x)       rrw_held(x, RW_WRITER)
74
75 #ifdef  __cplusplus
76 }
77 #endif
78
79 #endif  /* _SYS_RR_RW_LOCK_H */