Back to index

glibc  2.9
Defines | Functions
lowlevellock.h File Reference
#include <time.h>
#include <sys/param.h>
#include <bits/pthreadtypes.h>
#include <kernel-features.h>

Go to the source code of this file.

Defines

#define SYS_futex   240
#define FUTEX_WAIT   0
#define FUTEX_WAKE   1
#define FUTEX_CMP_REQUEUE   4
#define FUTEX_WAKE_OP   5
#define FUTEX_LOCK_PI   6
#define FUTEX_UNLOCK_PI   7
#define FUTEX_TRYLOCK_PI   8
#define FUTEX_PRIVATE_FLAG   128
#define FUTEX_OP_CLEAR_WAKE_IF_GT_ONE   ((4 << 24) | 1)
#define LLL_PRIVATE   0
#define LLL_SHARED   FUTEX_PRIVATE_FLAG
#define __lll_private_flag(fl, private)   ((fl) | THREAD_GETMEM (THREAD_SELF, header.private_futex))
#define LLL_LOCK_INITIALIZER   (0)
#define LLL_LOCK_INITIALIZER_LOCKED   (1)
#define LLL_LOCK_INITIALIZER_WAITERS   (2)
#define lll_trylock(futex)
#define lll_robust_trylock(futex, id)
#define lll_cond_trylock(futex)
#define lll_lock(futex, private)
#define lll_robust_lock(futex, id, private)
#define lll_cond_lock(futex, private)
#define lll_robust_cond_lock(futex, id, private)
#define lll_timedlock(futex, timeout, private)
#define lll_robust_timedlock(futex, timeout, id, private)
#define lll_unlock(futex, private)
#define lll_robust_unlock(futex, private)
#define lll_robust_dead(futex, private)
#define SYSCALL_WITH_INST_PAD   "\ trapa #0x14"
#define lll_futex_wait(futex, val, private)   lll_futex_timed_wait (futex, val, NULL, private)
#define lll_futex_timed_wait(futex, val, timeout, private)
#define lll_futex_wake(futex, nr, private)
#define lll_islocked(futex)   (futex != LLL_LOCK_INITIALIZER)
#define lll_wait_tid(tid)
#define lll_timedwait_tid(tid, abstime)

Functions

int __lll_lock_wait_private (int val, int *__futex) attribute_hidden
int __lll_lock_wait (int val, int *__futex, int private) attribute_hidden
int __lll_timedlock_wait (int val, int *__futex, const struct timespec *abstime, int private) attribute_hidden
int __lll_robust_lock_wait (int val, int *__futex, int private) attribute_hidden
int __lll_robust_timedlock_wait (int val, int *__futex, const struct timespec *abstime, int private) attribute_hidden
int __lll_unlock_wake_private (int *__futex) attribute_hidden
int __lll_unlock_wake (int *__futex, int private) attribute_hidden
int __lll_timedwait_tid (int *tid, const struct timespec *abstime) attribute_hidden

Define Documentation

#define __lll_private_flag (   fl,
  private 
)    ((fl) | THREAD_GETMEM (THREAD_SELF, header.private_futex))

Definition at line 54 of file lowlevellock.h.

#define FUTEX_CMP_REQUEUE   4

Definition at line 32 of file lowlevellock.h.

#define FUTEX_LOCK_PI   6

Definition at line 34 of file lowlevellock.h.

#define FUTEX_OP_CLEAR_WAKE_IF_GT_ONE   ((4 << 24) | 1)

Definition at line 39 of file lowlevellock.h.

#define FUTEX_PRIVATE_FLAG   128

Definition at line 37 of file lowlevellock.h.

#define FUTEX_TRYLOCK_PI   8

Definition at line 36 of file lowlevellock.h.

#define FUTEX_UNLOCK_PI   7

Definition at line 35 of file lowlevellock.h.

#define FUTEX_WAIT   0

Definition at line 30 of file lowlevellock.h.

#define FUTEX_WAKE   1

Definition at line 31 of file lowlevellock.h.

#define FUTEX_WAKE_OP   5

Definition at line 33 of file lowlevellock.h.

#define lll_cond_lock (   futex,
  private 
)
Value:
(void) ({ int __result, *__futex = &(futex); \
           __asm __volatile ("\           .align 2\n\          mova 1f,r0\n\        nop\n\        mov r15,r1\n\        mov #-8,r15\n\            0: mov.l @%2,%0\n\            tst %0,%0\n\         bf 1f\n\             mov.l %1,@%2\n\           1: mov r1,r15"\
              : "=&r" (__result) : "r" (2), "r" (__futex) \
              : "r0", "r1", "t", "memory"); \
           if (__result) \
             __lll_lock_wait (__result, __futex, private); })

Definition at line 207 of file lowlevellock.h.

#define lll_cond_trylock (   futex)
Value:
({ unsigned char __result; \
     __asm __volatile ("\   .align 2\n\   mova 1f,r0\n\ nop\n\ mov r15,r1\n\ mov #-8,r15\n\     0: mov.l @%1,r2\n\     cmp/eq r2,%3\n\      bf 1f\n\      mov.l %2,@%1\n\     1: mov r1,r15\n\      mov #-1,%0\n\ negc %0,%0"\
       : "=r" (__result) \
       : "r" (&(futex)), \
         "r" (LLL_LOCK_INITIALIZER_WAITERS), \
         "r" (LLL_LOCK_INITIALIZER) \
       : "r0", "r1", "r2", "t", "memory"); \
     __result; })

Definition at line 139 of file lowlevellock.h.

#define lll_futex_timed_wait (   futex,
  val,
  timeout,
  private 
)
Value:
({                                                                   \
    int __status;                                                    \
    register unsigned long __r3 asm ("r3") = SYS_futex;                     \
    register unsigned long __r4 asm ("r4") = (unsigned long) (futex);       \
    register unsigned long __r5 asm ("r5")                                  \
      = __lll_private_flag (FUTEX_WAIT, private);                           \
    register unsigned long __r6 asm ("r6") = (unsigned long) (val);         \
    register unsigned long __r7 asm ("r7") = (timeout);                     \
    __asm __volatile (SYSCALL_WITH_INST_PAD                                 \
                    : "=z" (__status)                                       \
                    : "r" (__r3), "r" (__r4), "r" (__r5),                   \
                     "r" (__r6), "r" (__r7)                                 \
                    : "memory", "t");                                       \
    __status;                                                        \
  })

Definition at line 349 of file lowlevellock.h.

#define lll_futex_wait (   futex,
  val,
  private 
)    lll_futex_timed_wait (futex, val, NULL, private)

Definition at line 345 of file lowlevellock.h.

#define lll_futex_wake (   futex,
  nr,
  private 
)
Value:
do {                                                                 \
    int __ignore;                                                    \
    register unsigned long __r3 asm ("r3") = SYS_futex;                     \
    register unsigned long __r4 asm ("r4") = (unsigned long) (futex);       \
    register unsigned long __r5 asm ("r5")                                  \
      = __lll_private_flag (FUTEX_WAKE, private);                           \
    register unsigned long __r6 asm ("r6") = (unsigned long) (nr);          \
    register unsigned long __r7 asm ("r7") = 0;                             \
    __asm __volatile (SYSCALL_WITH_INST_PAD                                 \
                    : "=z" (__ignore)                                       \
                    : "r" (__r3), "r" (__r4), "r" (__r5),                   \
                     "r" (__r6), "r" (__r7)                                 \
                    : "memory", "t");                                       \
  } while (0)

Definition at line 367 of file lowlevellock.h.

#define lll_islocked (   futex)    (futex != LLL_LOCK_INITIALIZER)

Definition at line 384 of file lowlevellock.h.

#define lll_lock (   futex,
  private 
)
Value:
(void) ({ int __result, *__futex = &(futex); \
           __asm __volatile ("\           .align 2\n\          mova 1f,r0\n\        nop\n\        mov r15,r1\n\        mov #-8,r15\n\            0: mov.l @%2,%0\n\            tst %0,%0\n\         bf 1f\n\             mov.l %1,@%2\n\           1: mov r1,r15"\
              : "=&r" (__result) : "r" (1), "r" (__futex) \
              : "r0", "r1", "t", "memory"); \
           if (__result) \
             { \
              if (__builtin_constant_p (private) \
                  && (private) == LLL_PRIVATE) \
                __lll_lock_wait_private (__result, __futex); \
	        else \
		  __lll_lock_wait (__result, __futex, (private));     \
             } \
    })

Definition at line 161 of file lowlevellock.h.

#define LLL_LOCK_INITIALIZER   (0)

Definition at line 75 of file lowlevellock.h.

#define LLL_LOCK_INITIALIZER_LOCKED   (1)

Definition at line 76 of file lowlevellock.h.

#define LLL_LOCK_INITIALIZER_WAITERS   (2)

Definition at line 77 of file lowlevellock.h.

#define LLL_PRIVATE   0

Definition at line 44 of file lowlevellock.h.

#define lll_robust_cond_lock (   futex,
  id,
  private 
)
Value:
({ int __result, *__futex = &(futex); \
     __asm __volatile ("\   .align 2\n\   mova 1f,r0\n\ nop\n\ mov r15,r1\n\ mov #-8,r15\n\     0: mov.l @%2,%0\n\     tst %0,%0\n\  bf 1f\n\      mov.l %1,@%2\n\     1: mov r1,r15"\
       : "=&r" (__result) : "r" (id | FUTEX_WAITERS), "r" (__futex) \
       : "r0", "r1", "t", "memory"); \
      if (__result) \
       __result = __lll_robust_lock_wait (__result, __futex, private); \
      __result; })

Definition at line 225 of file lowlevellock.h.

#define lll_robust_dead (   futex,
  private 
)
Value:
(void) ({ int __ignore, *__futex = &(futex); \
           __asm __volatile ("\           .align 2\n\          mova 1f,r0\n\        mov r15,r1\n\        mov #-6,r15\n\            0: mov.l @%1,%0\n\            or %2,%0\n\          mov.l %0,@%1\n\           1: mov r1,r15"\
              : "=&r" (__ignore) : "r" (__futex), "r" (FUTEX_OWNER_DIED) \
              : "r0", "r1", "memory");    \
           lll_futex_wake (__futex, 1, private); })

Definition at line 322 of file lowlevellock.h.

#define lll_robust_lock (   futex,
  id,
  private 
)
Value:
({ int __result, *__futex = &(futex); \
     __asm __volatile ("\   .align 2\n\   mova 1f,r0\n\ nop\n\ mov r15,r1\n\ mov #-8,r15\n\      0: mov.l @%2,%0\n\    tst %0,%0\n\  bf 1f\n\      mov.l %1,@%2\n\      1: mov r1,r15"\
       : "=&r" (__result) : "r" (id), "r" (__futex) \
       : "r0", "r1", "t", "memory"); \
     if (__result) \
       __result = __lll_robust_lock_wait (__result, __futex, private); \
     __result; })

Definition at line 186 of file lowlevellock.h.

#define lll_robust_timedlock (   futex,
  timeout,
  id,
  private 
)
Value:
({ int __result, *__futex = &(futex); \
     __asm __volatile ("\   .align 2\n\   mova 1f,r0\n\ nop\n\ mov r15,r1\n\ mov #-8,r15\n\     0: mov.l @%2,%0\n\     tst %0,%0\n\  bf 1f\n\      mov.l %1,@%2\n\     1: mov r1,r15"\
       : "=&r" (__result) : "r" (id), "r" (__futex) \
       : "r0", "r1", "t", "memory"); \
    if (__result) \
      __result = __lll_robust_timedlock_wait (__result, __futex, \
                                         timeout, private); \
    __result; })

Definition at line 263 of file lowlevellock.h.

#define lll_robust_trylock (   futex,
  id 
)
Value:
({ unsigned char __result; \
     __asm __volatile ("\   .align 2\n\   mova 1f,r0\n\ nop\n\ mov r15,r1\n\ mov #-8,r15\n\     0: mov.l @%1,r2\n\     cmp/eq r2,%3\n\      bf 1f\n\      mov.l %2,@%1\n\     1: mov r1,r15\n\      mov #-1,%0\n\ negc %0,%0"\
       : "=r" (__result) \
       : "r" (&(futex)), \
         "r" (id), \
         "r" (LLL_LOCK_INITIALIZER) \
       : "r0", "r1", "r2", "t", "memory"); \
     __result; })

Definition at line 117 of file lowlevellock.h.

#define lll_robust_unlock (   futex,
  private 
)
Value:
(void) ({ int __result, *__futex = &(futex); \
           __asm __volatile ("\           .align 2\n\          mova 1f,r0\n\        mov r15,r1\n\        mov #-6,r15\n\            0: mov.l @%1,%0\n\            and %2,%0\n\         mov.l %0,@%1\n\           1: mov r1,r15"\
              : "=&r" (__result) : "r" (__futex), "r" (FUTEX_WAITERS) \
              : "r0", "r1", "memory");    \
           if (__result) \
             __lll_unlock_wake (__futex, private); })

Definition at line 306 of file lowlevellock.h.

Definition at line 45 of file lowlevellock.h.

#define lll_timedlock (   futex,
  timeout,
  private 
)
Value:
({ int __result, *__futex = &(futex); \
     __asm __volatile ("\   .align 2\n\   mova 1f,r0\n\ nop\n\ mov r15,r1\n\ mov #-8,r15\n\     0: mov.l @%2,%0\n\     tst %0,%0\n\  bf 1f\n\      mov.l %1,@%2\n\     1: mov r1,r15"\
       : "=&r" (__result) : "r" (1), "r" (__futex) \
       : "r0", "r1", "t", "memory"); \
    if (__result) \
      __result = __lll_timedlock_wait (__result, __futex, timeout, private); \
    __result; })

Definition at line 244 of file lowlevellock.h.

#define lll_timedwait_tid (   tid,
  abstime 
)
Value:
({                                                                   \
    int __result = 0;                                                       \
    if (tid != 0)                                                    \
      {                                                                     \
       if (abstime->tv_nsec < 0 || abstime->tv_nsec >= 1000000000)          \
         __result = EINVAL;                                          \
       else                                                          \
         __result = __lll_timedwait_tid (&tid, abstime);                    \
      }                                                                     \
    __result; })

Definition at line 401 of file lowlevellock.h.

#define lll_trylock (   futex)
Value:
({ unsigned char __result; \
     __asm __volatile ("\   .align 2\n\   mova 1f,r0\n\ nop\n\ mov r15,r1\n\ mov #-8,r15\n\     0: mov.l @%1,r2\n\     cmp/eq r2,%3\n\      bf 1f\n\      mov.l %2,@%1\n\     1: mov r1,r15\n\      mov #-1,%0\n\ negc %0,%0"\
       : "=r" (__result) \
       : "r" (&(futex)), \
         "r" (LLL_LOCK_INITIALIZER_LOCKED), \
         "r" (LLL_LOCK_INITIALIZER) \
       : "r0", "r1", "r2", "t", "memory"); \
     __result; })

Definition at line 95 of file lowlevellock.h.

#define lll_unlock (   futex,
  private 
)
Value:
(void) ({ int __result, *__futex = &(futex); \
           __asm __volatile ("\           .align 2\n\          mova 1f,r0\n\        mov r15,r1\n\        mov #-6,r15\n\            0: mov.l @%1,%0\n\            add #-1,%0\n\        mov.l %0,@%1\n\           1: mov r1,r15"\
              : "=&r" (__result) : "r" (__futex) \
              : "r0", "r1", "memory"); \
           if (__result) \
             { \
              if (__builtin_constant_p (private) \
                  && (private) == LLL_PRIVATE) \
                __lll_unlock_wake_private (__futex); \
	        else \
		  __lll_unlock_wake (__futex, (private)); \
             } \
    })

Definition at line 283 of file lowlevellock.h.

#define lll_wait_tid (   tid)
Value:
do {                                                                 \
    __typeof (tid) *__tid = &(tid);                                         \
    while (*__tid != 0)                                                     \
      lll_futex_wait (__tid, *__tid, LLL_SHARED);                           \
  } while (0)

Definition at line 392 of file lowlevellock.h.

#define SYS_futex   240

Definition at line 29 of file lowlevellock.h.

#define SYSCALL_WITH_INST_PAD   "\ trapa #0x14"

Definition at line 341 of file lowlevellock.h.


Function Documentation

int __lll_lock_wait ( int  val,
int __futex,
int  private 
)
int __lll_lock_wait_private ( int  val,
int __futex 
)
int __lll_robust_lock_wait ( int  val,
int __futex,
int  private 
)
int __lll_robust_timedlock_wait ( int  val,
int __futex,
const struct timespec abstime,
int  private 
)
int __lll_timedlock_wait ( int  val,
int __futex,
const struct timespec abstime,
int  private 
)
int __lll_timedwait_tid ( int tid,
const struct timespec abstime 
)
int __lll_unlock_wake ( int __futex,
int  private 
)