Lines Matching defs:l

61 rwst_enter_common(rwstlock_t *l, krw_t rw, int flags)
67 mutex_enter(&l->rwst_lock);
69 while (RWST_WRITE_HELD(l) ||
70 (rw != RW_READER_STARVEWRITER && RWST_WRITE_WANTED(l))) {
73 mutex_exit(&l->rwst_lock);
79 if (RWST_WRITE_HELD(l)) {
84 readers = l->rwst_count;
87 if (!RWST_READ_WAIT(l, flags)) {
88 mutex_exit(&l->rwst_lock);
92 LOCKSTAT_RECORD4(LS_RW_ENTER_BLOCK, l, sleep_time, rw,
95 RWST_READ_ENTER(l);
96 LOCKSTAT_RECORD(LS_RW_ENTER_ACQUIRE, l, rw);
99 while (RWST_HELD(l)) {
101 mutex_exit(&l->rwst_lock);
106 if (RWST_WRITE_HELD(l)) {
111 readers = l->rwst_count;
114 if (!RWST_WRITE_WAIT(l, flags)) {
115 if (!RWST_WRITE_HELD(l) &&
116 !RWST_WRITE_WANTED(l))
117 RWST_READ_WAKE_ALL(l);
118 mutex_exit(&l->rwst_lock);
122 LOCKSTAT_RECORD4(LS_RW_ENTER_BLOCK, l, sleep_time, rw,
125 RWST_WRITE_ENTER(l);
126 LOCKSTAT_RECORD(LS_RW_ENTER_ACQUIRE, l, rw);
128 mutex_exit(&l->rwst_lock);
133 rwst_exit(rwstlock_t *l)
135 mutex_enter(&l->rwst_lock);
136 if (RWST_WRITE_HELD(l)) {
137 LOCKSTAT_RECORD(LS_RW_EXIT_RELEASE, l, RW_WRITER);
138 RWST_WRITE_EXIT(l);
140 ASSERT(RWST_READ_HELD(l));
141 LOCKSTAT_RECORD(LS_RW_EXIT_RELEASE, l, RW_READER);
142 RWST_READ_EXIT(l);
144 if (!RWST_WRITE_WANTED(l))
145 RWST_READ_WAKE_ALL(l);
146 else if (!RWST_HELD(l))
147 RWST_WRITE_WAKE_ONE(l);
148 mutex_exit(&l->rwst_lock);
152 rwst_enter(rwstlock_t *l, krw_t rw)
154 (void) rwst_enter_common(l, rw, 0);
158 rwst_enter_sig(rwstlock_t *l, krw_t rw)
160 return (rwst_enter_common(l, rw, RWST_SIG));
164 rwst_tryenter(rwstlock_t *l, krw_t rw)
166 return (rwst_enter_common(l, rw, RWST_TRYENTER));
170 rwst_lock_held(rwstlock_t *l, krw_t rw)
173 return (RWST_READ_HELD(l));
175 return (RWST_WRITE_OWNER(l));
180 rwst_init(rwstlock_t *l, char *name, krw_type_t krw_t, void *arg)
182 l->rwst_count = 0;
183 mutex_init(&l->rwst_lock, NULL, MUTEX_DEFAULT, NULL);
184 cv_init(&l->rwst_rcv, NULL, CV_DEFAULT, NULL);
185 cv_init(&l->rwst_wcv, NULL, CV_DEFAULT, NULL);
189 rwst_destroy(rwstlock_t *l)
191 ASSERT(l->rwst_count == 0);
192 mutex_destroy(&l->rwst_lock);
193 cv_destroy(&l->rwst_rcv);
194 cv_destroy(&l->rwst_wcv);
198 rwst_owner(rwstlock_t *l)
200 return (RWST_OWNER(l));