Пример #1
0
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;
}
Пример #2
0
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;
}
Пример #3
0
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;
}
Пример #4
0
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;
}