int pthread_rwlock_timedrdlock(pthread_rwlock_t *rwlock, const struct timespec *abs_timeout) { int thread_id, ret = 0; if (rwlock == NULL) return EINVAL; pthread_mutex_lock(&rwlock->lock); thread_id = __get_thread_id(); if (__unlikely(!read_precondition(rwlock, thread_id))) { rwlock->pendingReaders += 1; do { ret = pthread_cond_timedwait(&rwlock->cond, &rwlock->lock, abs_timeout); } while (ret == 0 && !read_precondition(rwlock, thread_id)); rwlock->pendingReaders -= 1; if (ret != 0) goto EXIT; } rwlock->numLocks ++; EXIT: pthread_mutex_unlock(&rwlock->lock); return ret; }
static int __pthread_rwlock_timedrdlock(pthread_rwlock_t* rwlock, const timespec* abs_timeout) { int ret = 0; if (rwlock == NULL) { return EINVAL; } pthread_mutex_lock(&rwlock->lock); int tid = __get_thread()->tid; if (__predict_false(!read_precondition(rwlock, tid))) { rwlock->pendingReaders += 1; do { ret = pthread_cond_timedwait(&rwlock->cond, &rwlock->lock, abs_timeout); } while (ret == 0 && !read_precondition(rwlock, tid)); rwlock->pendingReaders -= 1; if (ret != 0) { goto EXIT; } } ++rwlock->numLocks; EXIT: pthread_mutex_unlock(&rwlock->lock); return ret; }
int pthread_rwlock_tryrdlock(pthread_rwlock_t *rwlock) { int ret = 0; if (rwlock == NULL) return EINVAL; pthread_mutex_lock(&rwlock->lock); if (__predict_false(!read_precondition(rwlock, __get_thread()->tid))) ret = EBUSY; else ++rwlock->numLocks; pthread_mutex_unlock(&rwlock->lock); return ret; }
int pthread_rwlock_tryrdlock(pthread_rwlock_t *rwlock) { int ret = 0; if (rwlock == NULL) return EINVAL; pthread_mutex_lock(&rwlock->lock); if (__unlikely(!read_precondition(rwlock, __get_thread_id()))) ret = EBUSY; else rwlock->numLocks ++; pthread_mutex_unlock(&rwlock->lock); return ret; }