]>
Commit | Line | Data |
---|---|---|
9f0a21e6 MM |
1 | /* |
2 | * Copyright (c) 2007 Pawel Jakub Dawidek <pjd@FreeBSD.org> | |
3 | * All rights reserved. | |
4 | * | |
5 | * Redistribution and use in source and binary forms, with or without | |
6 | * modification, are permitted provided that the following conditions | |
7 | * are met: | |
8 | * 1. Redistributions of source code must retain the above copyright | |
9 | * notice, this list of conditions and the following disclaimer. | |
10 | * 2. Redistributions in binary form must reproduce the above copyright | |
11 | * notice, this list of conditions and the following disclaimer in the | |
12 | * documentation and/or other materials provided with the distribution. | |
13 | * | |
14 | * THIS SOFTWARE IS PROVIDED BY THE AUTHORS AND CONTRIBUTORS ``AS IS'' AND | |
15 | * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | |
16 | * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | |
17 | * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE | |
18 | * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL | |
19 | * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS | |
20 | * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) | |
21 | * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT | |
22 | * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY | |
23 | * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | |
24 | * SUCH DAMAGE. | |
25 | * | |
26 | * $FreeBSD$ | |
27 | */ | |
28 | ||
29 | #ifndef _OPENSOLARIS_SYS_RWLOCK_H_ | |
30 | #define _OPENSOLARIS_SYS_RWLOCK_H_ | |
31 | ||
32 | #include <sys/param.h> | |
33 | #include <sys/proc.h> | |
34 | #include <sys/lock.h> | |
35 | #include <sys/sx.h> | |
36 | ||
37 | typedef enum { | |
38 | RW_DEFAULT = 4 /* kernel default rwlock */ | |
39 | } krw_type_t; | |
40 | ||
41 | ||
42 | typedef enum { | |
43 | RW_NONE = 0, | |
44 | RW_WRITER = 1, | |
45 | RW_READER = 2 | |
46 | } krw_t; | |
47 | ||
48 | typedef struct sx krwlock_t; | |
49 | ||
50 | #ifndef OPENSOLARIS_WITNESS | |
51 | #define RW_FLAGS (SX_DUPOK | SX_NOWITNESS) | |
52 | #else | |
53 | #define RW_FLAGS (SX_DUPOK) | |
54 | #endif | |
55 | ||
56 | #define RW_READ_HELD(x) (rw_read_held((x))) | |
57 | #define RW_WRITE_HELD(x) (rw_write_held((x))) | |
58 | #define RW_LOCK_HELD(x) (rw_lock_held((x))) | |
59 | #define RW_ISWRITER(x) (rw_iswriter(x)) | |
9f0a21e6 MM |
60 | #define rw_init(lock, desc, type, arg) do { \ |
61 | const char *_name; \ | |
62 | ASSERT((type) == 0 || (type) == RW_DEFAULT); \ | |
63 | KASSERT(((lock)->lock_object.lo_flags & LO_ALLMASK) != \ | |
64 | LO_EXPECTED, ("lock %s already initialized", #lock)); \ | |
7ada752a | 65 | bzero((lock), sizeof (struct sx)); \ |
9f0a21e6 MM |
66 | for (_name = #lock; *_name != '\0'; _name++) { \ |
67 | if (*_name >= 'a' && *_name <= 'z') \ | |
68 | break; \ | |
69 | } \ | |
70 | if (*_name == '\0') \ | |
71 | _name = #lock; \ | |
72 | sx_init_flags((lock), _name, RW_FLAGS); \ | |
73 | } while (0) | |
74 | #define rw_destroy(lock) sx_destroy(lock) | |
75 | #define rw_enter(lock, how) do { \ | |
76 | if ((how) == RW_READER) \ | |
77 | sx_slock(lock); \ | |
78 | else /* if ((how) == RW_WRITER) */ \ | |
79 | sx_xlock(lock); \ | |
80 | } while (0) | |
81 | ||
82 | #define rw_tryenter(lock, how) \ | |
83 | ((how) == RW_READER ? sx_try_slock(lock) : sx_try_xlock(lock)) | |
84 | #define rw_exit(lock) sx_unlock(lock) | |
85 | #define rw_downgrade(lock) sx_downgrade(lock) | |
86 | #define rw_tryupgrade(lock) sx_try_upgrade(lock) | |
87 | #define rw_read_held(lock) \ | |
88 | ((lock)->sx_lock != SX_LOCK_UNLOCKED && \ | |
7ada752a | 89 | ((lock)->sx_lock & SX_LOCK_SHARED)) |
9f0a21e6 MM |
90 | #define rw_write_held(lock) sx_xlocked(lock) |
91 | #define rw_lock_held(lock) (rw_read_held(lock) || rw_write_held(lock)) | |
92 | #define rw_iswriter(lock) sx_xlocked(lock) | |
93 | #define rw_owner(lock) sx_xholder(lock) | |
94 | ||
9f0a21e6 | 95 | #endif /* _OPENSOLARIS_SYS_RWLOCK_H_ */ |