Lines Matching refs:rwlp

43  * Find/allocate an entry for rwlp in our array of rwlocks held for reading.
49 rwl_entry(rwlock_t *rwlp)
67 if (readlockp->rd_rwlock == rwlp)
73 remembered->rd_rwlock = rwlp;
97 (++readlockp)->rd_rwlock = rwlp;
112 (readlockp += nlocks)->rd_rwlock = rwlp;
136 rw_read_held(rwlock_t *rwlp)
138 volatile uint32_t *rwstate = (volatile uint32_t *)&rwlp->rwlock_readers;
162 if (readlockp->rd_rwlock == rwlp) {
179 rw_write_held(rwlock_t *rwlp)
181 volatile uint32_t *rwstate = (volatile uint32_t *)&rwlp->rwlock_readers;
191 rwlp->rwlock_owner == (uintptr_t)self &&
192 (rwlp->rwlock_type == USYNC_THREAD ||
193 rwlp->rwlock_ownerpid == self->ul_uberdata->pid));
202 rwlock_init(rwlock_t *rwlp, int type, void *arg)
213 rwl_entry(rwlp)->rd_count = 0;
215 (void) memset(rwlp, 0, sizeof (*rwlp));
216 rwlp->rwlock_type = (uint16_t)type;
217 rwlp->rwlock_magic = RWL_MAGIC;
218 rwlp->mutex.mutex_type = (uint8_t)type;
219 rwlp->mutex.mutex_flag = LOCK_INITED;
220 rwlp->mutex.mutex_magic = MUTEX_MAGIC;
229 if (((uintptr_t)rwlp & (_LONG_LONG_ALIGNMENT - 1)) &&
239 rwlock_destroy(rwlock_t *rwlp)
248 rwl_entry(rwlp)->rd_count = 0;
250 rwlp->rwlock_magic = 0;
251 tdb_sync_obj_deregister(rwlp);
282 read_lock_try(rwlock_t *rwlp, int ignore_waiters_flag)
284 volatile uint32_t *rwstate = (volatile uint32_t *)&rwlp->rwlock_readers;
305 read_unlock_try(rwlock_t *rwlp)
307 volatile uint32_t *rwstate = (volatile uint32_t *)&rwlp->rwlock_readers;
326 write_lock_try(rwlock_t *rwlp, int ignore_waiters_flag)
328 volatile uint32_t *rwstate = (volatile uint32_t *)&rwlp->rwlock_readers;
351 write_unlock_try(rwlock_t *rwlp)
353 volatile uint32_t *rwstate = (volatile uint32_t *)&rwlp->rwlock_readers;
373 rw_queue_release(rwlock_t *rwlp)
375 volatile uint32_t *rwstate = (volatile uint32_t *)&rwlp->rwlock_readers;
388 qp = queue_lock(rwlp, MX);
438 ASSERT(ulwp->ul_wchan == rwlp);
461 rwlp->rwlock_owner = (uintptr_t)ulwp;
503 shared_rwlock_lock(rwlock_t *rwlp, timespec_t *tsp, int rd_wr)
505 volatile uint32_t *rwstate = (volatile uint32_t *)&rwlp->rwlock_readers;
506 mutex_t *mp = &rwlp->mutex;
516 DTRACE_PROBE2(plockstat, rw__block, rwlp, rd_wr);
527 if (read_lock_try(rwlp, 0)) {
532 if (write_lock_try(rwlp, 0)) {
553 error = __lwp_rwlock_tryrdlock(rwlp);
555 error = __lwp_rwlock_rdlock(rwlp, tsp);
558 error = __lwp_rwlock_trywrlock(rwlp);
560 error = __lwp_rwlock_wrlock(rwlp, tsp);
565 DTRACE_PROBE3(plockstat, rw__blocked, rwlp, rd_wr, error == 0);
576 rwlock_lock(rwlock_t *rwlp, timespec_t *tsp, int rd_wr)
578 volatile uint32_t *rwstate = (volatile uint32_t *)&rwlp->rwlock_readers;
592 DTRACE_PROBE2(plockstat, rw__block, rwlp, rd_wr);
595 qp = queue_lock(rwlp, MX);
600 if (read_lock_try(rwlp, ignore_waiters_flag))
603 if (write_lock_try(rwlp, ignore_waiters_flag))
672 qp = queue_lock(rwlp, MX);
680 rwlp->rwlock_owner == (uintptr_t)self) {
700 DTRACE_PROBE3(plockstat, rw__blocked, rwlp, rd_wr, error == 0);
707 rw_rdlock_impl(rwlock_t *rwlp, timespec_t *tsp)
712 tdb_rwlock_stats_t *rwsp = RWLOCK_STATS(rwlp, udp);
720 readlockp = rwl_entry(rwlp);
736 if (rw_write_held(rwlp)) {
738 rwlock_error(rwlp, "rwlock_rdlock",
744 if (read_lock_try(rwlp, 0))
746 else if (rwlp->rwlock_type == USYNC_PROCESS) /* kernel-level */
747 error = shared_rwlock_lock(rwlp, tsp, READ_LOCK);
749 error = rwlock_lock(rwlp, tsp, READ_LOCK);
754 rwl_entry(rwlp)->rd_count++;
758 DTRACE_PROBE2(plockstat, rw__acquire, rwlp, READ_LOCK);
760 DTRACE_PROBE3(plockstat, rw__error, rwlp, READ_LOCK, error);
769 rw_rdlock(rwlock_t *rwlp)
772 return (rw_rdlock_impl(rwlp, NULL));
776 lrw_rdlock(rwlock_t *rwlp)
779 (void) rw_rdlock_impl(rwlp, NULL);
783 pthread_rwlock_reltimedrdlock_np(pthread_rwlock_t *_RESTRICT_KYWD rwlp,
790 error = rw_rdlock_impl((rwlock_t *)rwlp, &tslocal);
797 pthread_rwlock_timedrdlock(pthread_rwlock_t *_RESTRICT_KYWD rwlp,
805 error = rw_rdlock_impl((rwlock_t *)rwlp, &tslocal);
812 rw_wrlock_impl(rwlock_t *rwlp, timespec_t *tsp)
816 tdb_rwlock_stats_t *rwsp = RWLOCK_STATS(rwlp, udp);
822 if (rw_read_held(rwlp)) {
824 rwlock_error(rwlp, "rwlock_wrlock",
833 if (rw_write_held(rwlp)) {
835 rwlock_error(rwlp, "rwlock_wrlock",
841 if (write_lock_try(rwlp, 0))
843 else if (rwlp->rwlock_type == USYNC_PROCESS) /* kernel-level */
844 error = shared_rwlock_lock(rwlp, tsp, WRITE_LOCK);
846 error = rwlock_lock(rwlp, tsp, WRITE_LOCK);
850 rwlp->rwlock_owner = (uintptr_t)self;
851 if (rwlp->rwlock_type == USYNC_PROCESS)
852 rwlp->rwlock_ownerpid = udp->pid;
857 DTRACE_PROBE2(plockstat, rw__acquire, rwlp, WRITE_LOCK);
859 DTRACE_PROBE3(plockstat, rw__error, rwlp, WRITE_LOCK, error);
867 rw_wrlock(rwlock_t *rwlp)
870 return (rw_wrlock_impl(rwlp, NULL));
874 lrw_wrlock(rwlock_t *rwlp)
877 (void) rw_wrlock_impl(rwlp, NULL);
881 pthread_rwlock_reltimedwrlock_np(pthread_rwlock_t *_RESTRICT_KYWD rwlp,
888 error = rw_wrlock_impl((rwlock_t *)rwlp, &tslocal);
895 pthread_rwlock_timedwrlock(pthread_rwlock_t *rwlp, const timespec_t *abstime)
902 error = rw_wrlock_impl((rwlock_t *)rwlp, &tslocal);
910 rw_tryrdlock(rwlock_t *rwlp)
914 tdb_rwlock_stats_t *rwsp = RWLOCK_STATS(rwlp, udp);
928 readlockp = rwl_entry(rwlp);
941 if (read_lock_try(rwlp, 0))
943 else if (rwlp->rwlock_type == USYNC_PROCESS) /* kernel-level */
944 error = shared_rwlock_lock(rwlp, NULL, READ_LOCK_TRY);
946 error = rwlock_lock(rwlp, NULL, READ_LOCK_TRY);
951 rwl_entry(rwlp)->rd_count++;
953 DTRACE_PROBE2(plockstat, rw__acquire, rwlp, READ_LOCK);
958 DTRACE_PROBE3(plockstat, rw__error, rwlp, READ_LOCK,
968 rw_trywrlock(rwlock_t *rwlp)
972 tdb_rwlock_stats_t *rwsp = RWLOCK_STATS(rwlp, udp);
980 if (write_lock_try(rwlp, 0))
982 else if (rwlp->rwlock_type == USYNC_PROCESS) /* kernel-level */
983 error = shared_rwlock_lock(rwlp, NULL, WRITE_LOCK_TRY);
985 error = rwlock_lock(rwlp, NULL, WRITE_LOCK_TRY);
988 rwlp->rwlock_owner = (uintptr_t)self;
989 if (rwlp->rwlock_type == USYNC_PROCESS)
990 rwlp->rwlock_ownerpid = udp->pid;
993 DTRACE_PROBE2(plockstat, rw__acquire, rwlp, WRITE_LOCK);
998 DTRACE_PROBE3(plockstat, rw__error, rwlp, WRITE_LOCK,
1008 rw_unlock(rwlock_t *rwlp)
1010 volatile uint32_t *rwstate = (volatile uint32_t *)&rwlp->rwlock_readers;
1032 if (!rw_write_held(rwlp)) {
1034 rwlock_error(rwlp, "rwlock_unlock",
1039 if ((rwsp = RWLOCK_STATS(rwlp, udp)) != NULL) {
1045 rwlp->rwlock_owner = 0;
1046 rwlp->rwlock_ownerpid = 0;
1054 readlockp = rwl_entry(rwlp);
1058 rwlock_error(rwlp, "rwlock_unlock",
1078 rwlock_error(rwlp, "rwlock_unlock", "lock not owned");
1082 if (rd_wr == WRITE_LOCK && write_unlock_try(rwlp)) {
1084 } else if (rd_wr == READ_LOCK && read_unlock_try(rwlp)) {
1086 } else if (rwlp->rwlock_type == USYNC_PROCESS) {
1087 (void) mutex_lock(&rwlp->mutex);
1088 (void) __lwp_rwlock_unlock(rwlp);
1089 (void) mutex_unlock(&rwlp->mutex);
1091 rw_queue_release(rwlp);
1095 DTRACE_PROBE2(plockstat, rw__release, rwlp, rd_wr);
1100 lrw_unlock(rwlock_t *rwlp)
1102 (void) rw_unlock(rwlp);