Back to index

glibc  2.9
Functions | Variables
pthread_rwlock_init.c File Reference
#include "pthreadP.h"
#include <kernel-features.h>

Go to the source code of this file.

Functions

int __pthread_rwlock_init (pthread_rwlock_t *rwlock, const pthread_rwlockattr_t *attr)

Variables

static struct pthread_rwlockattr

Function Documentation

int __pthread_rwlock_init ( pthread_rwlock_t *  rwlock,
const pthread_rwlockattr_t *  attr 
)

Definition at line 32 of file pthread_rwlock_init.c.

{
  const struct pthread_rwlockattr *iattr;

  iattr = ((const struct pthread_rwlockattr *) attr) ?: &default_attr;

  rwlock->__data.__lock = 0;
  rwlock->__data.__nr_readers = 0;
  rwlock->__data.__readers_wakeup = 0;
  rwlock->__data.__writer_wakeup = 0;
  rwlock->__data.__nr_readers_queued = 0;
  rwlock->__data.__nr_writers_queued = 0;
  rwlock->__data.__writer = 0;

  rwlock->__data.__flags
    = iattr->lockkind == PTHREAD_RWLOCK_PREFER_WRITER_NONRECURSIVE_NP;

  /* The __SHARED field is computed to minimize the work that needs to
     be done while handling the futex.  There are two inputs: the
     availability of private futexes and whether the rwlock is shared
     or private.  Unfortunately the value of a private rwlock is
     fixed: it must be zero.  The PRIVATE_FUTEX flag has the value
     0x80 in case private futexes are available and zero otherwise.
     This leads to the following table:

                 |     pshared     |     result
                 | shared  private | shared  private |
     ------------+-----------------+-----------------+
     !avail 0    |     0       0   |     0       0   |
      avail 0x80 |  0x80       0   |     0    0x80   |

     If the pshared value is in locking functions XORed with avail
     we get the expected result.  */
#ifdef __ASSUME_PRIVATE_FUTEX
  rwlock->__data.__shared = (iattr->pshared == PTHREAD_PROCESS_PRIVATE
                          ? 0 : FUTEX_PRIVATE_FLAG);
#else
  rwlock->__data.__shared = (iattr->pshared == PTHREAD_PROCESS_PRIVATE
                          ? 0
                          : THREAD_GETMEM (THREAD_SELF,
                                         header.private_futex));
#endif

  rwlock->__data.__pad1 = 0;
  rwlock->__data.__pad2 = 0;

  return 0;
}

Variable Documentation

struct pthread_rwlockattr [static]
Initial value:
  {
    .lockkind = PTHREAD_RWLOCK_DEFAULT_NP,
    .pshared = PTHREAD_PROCESS_PRIVATE
  }

Definition at line 24 of file pthread_rwlock_init.c.