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>
#include <tcb-offsets.h>

Go to the source code of this file.

Defines

#define LOCK_INSTR   "lock;"
#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_EBX_LOAD
#define LLL_EBX_REG   "b"
#define LLL_ENTER_KERNEL   "int $0x80\n\t"
#define BUSY_WAIT_NOP   asm ("rep; nop")
#define LLL_STUB_UNWIND_INFO_START
#define LLL_STUB_UNWIND_INFO_END
#define LLL_STUB_UNWIND_INFO_3
#define LLL_STUB_UNWIND_INFO_4
#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_trylock_asm
#define lll_trylock(futex)
#define lll_robust_trylock(futex, id)
#define lll_cond_trylock(futex)
#define __lll_lock_asm_start
#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_asm
#define lll_unlock(futex, private)
#define lll_robust_unlock(futex, private)
#define lll_robust_dead(futex, private)
#define lll_islocked(futex)   (futex != LLL_LOCK_INITIALIZER)
#define lll_wait_tid(tid)
#define lll_timedwait_tid(tid, abstime)

Functions

int __lll_timedwait_tid (int *tid, const struct timespec *abstime) __attribute__((regparm(2))) attribute_hidden

Define Documentation

Value:
"cmpl $0, %%gs:%P6\n\t"                         \
                           "je 0f\n\t"                               \
                           "lock\n"                                         \
                           "0:\tcmpxchgl %1, %2\n\t"

Definition at line 280 of file lowlevellock.h.

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

Definition at line 72 of file lowlevellock.h.

Value:
"cmpl $0, %%gs:%P5\n\t" \
                        "je 0f\n\t"                                         \
                        "lock\n"                                     \
                        "0:\tcmpxchgl %2, %1"

Definition at line 242 of file lowlevellock.h.

Value:
"cmpl $0, %%gs:%P3\n\t"                         \
                       "je 0f\n\t"                                   \
                       "lock\n"                                      \
                       "0:\tsubl $1,%0\n\t"

Definition at line 449 of file lowlevellock.h.

#define BUSY_WAIT_NOP   asm ("rep; nop")

Definition at line 119 of file lowlevellock.h.

#define FUTEX_CMP_REQUEUE   4

Definition at line 50 of file lowlevellock.h.

#define FUTEX_LOCK_PI   6

Definition at line 52 of file lowlevellock.h.

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

Definition at line 57 of file lowlevellock.h.

#define FUTEX_PRIVATE_FLAG   128

Definition at line 55 of file lowlevellock.h.

#define FUTEX_TRYLOCK_PI   8

Definition at line 54 of file lowlevellock.h.

#define FUTEX_UNLOCK_PI   7

Definition at line 53 of file lowlevellock.h.

#define FUTEX_WAIT   0

Definition at line 48 of file lowlevellock.h.

#define FUTEX_WAKE   1

Definition at line 49 of file lowlevellock.h.

#define FUTEX_WAKE_OP   5

Definition at line 51 of file lowlevellock.h.

#define lll_cond_lock (   futex,
  private 
)
Value:
(void)                                                        \
    ({ int ignore1, ignore2, ignore3;                                       \
       __asm __volatile (LOCK_INSTR "cmpxchgl %1, %2\n\t"                   \
                      "jnz _L_cond_lock_%=\n\t"                      \
                      ".subsection 1\n\t"                            \
                      ".type _L_cond_lock_%=,@function\n"                   \
                      "_L_cond_lock_%=:\n"                                  \
                      "1:\tleal %2, %%edx\n"                                \
                      "0:\tmovl %7, %%ecx\n"                                \
                      "2:\tcall __lll_lock_wait\n"                          \
                      "3:\tjmp 18f\n"                                \
                      "4:\t.size _L_cond_lock_%=, 4b-1b\n\t"                \
                      ".previous\n"                                         \
                      LLL_STUB_UNWIND_INFO_4                                \
                      "18:"                                          \
                      : "=a" (ignore1), "=c" (ignore2), "=m" (futex),      \
                        "=&d" (ignore3)                              \
                      : "0" (0), "1" (2), "m" (futex), "g" ((int) (private))\
                      : "memory");                                   \
    })

Definition at line 355 of file lowlevellock.h.

#define lll_cond_trylock (   futex)
Value:
({ int ret;                                                          \
     __asm __volatile (LOCK_INSTR "cmpxchgl %2, %1"                         \
                     : "=a" (ret), "=m" (futex)                      \
                     : "r" (LLL_LOCK_INITIALIZER_WAITERS),                  \
                      "m" (futex), "0" (LLL_LOCK_INITIALIZER)        \
                     : "memory");                                    \
     ret; })

Definition at line 268 of file lowlevellock.h.

#define LLL_EBX_LOAD

Definition at line 104 of file lowlevellock.h.

#define LLL_EBX_REG   "b"

Definition at line 105 of file lowlevellock.h.

#define LLL_ENTER_KERNEL   "int $0x80\n\t"

Definition at line 115 of file lowlevellock.h.

#define lll_futex_timed_wait (   futex,
  val,
  timeout,
  private 
)
Value:
({                                                                   \
    int __status;                                                    \
    register __typeof (val) _val asm ("edx") = (val);                       \
    __asm __volatile (LLL_EBX_LOAD                                   \
                    LLL_ENTER_KERNEL                                        \
                    LLL_EBX_LOAD                                     \
                    : "=a" (__status)                                       \
                    : "0" (SYS_futex), LLL_EBX_REG (futex), "S" (timeout),  \
                     "c" (__lll_private_flag (FUTEX_WAIT, private)),        \
                     "d" (_val), "i" (offsetof (tcbhead_t, sysinfo))        \
                    : "memory");                                     \
    __status;                                                        \
  })

Definition at line 202 of file lowlevellock.h.

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

Definition at line 198 of file lowlevellock.h.

#define lll_futex_wake (   futex,
  nr,
  private 
)
Value:
do {                                                                 \
    int __ignore;                                                    \
    register __typeof (nr) _nr asm ("edx") = (nr);                          \
    __asm __volatile (LLL_EBX_LOAD                                   \
                    LLL_ENTER_KERNEL                                        \
                    LLL_EBX_LOAD                                     \
                    : "=a" (__ignore)                                       \
                    : "0" (SYS_futex), LLL_EBX_REG (futex),                 \
                     "c" (__lll_private_flag (FUTEX_WAKE, private)),        \
                     "d" (_nr),                                      \
                     "i" (0) /* phony, to align next arg's number */,      \
                     "i" (offsetof (tcbhead_t, sysinfo)));                  \
  } while (0)

Definition at line 218 of file lowlevellock.h.

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

Definition at line 535 of file lowlevellock.h.

#define lll_lock (   futex,
  private 
)

Definition at line 286 of file lowlevellock.h.

#define LLL_LOCK_INITIALIZER   (0)

Definition at line 95 of file lowlevellock.h.

#define LLL_LOCK_INITIALIZER_LOCKED   (1)

Definition at line 96 of file lowlevellock.h.

#define LLL_LOCK_INITIALIZER_WAITERS   (2)

Definition at line 97 of file lowlevellock.h.

#define LLL_PRIVATE   0

Definition at line 62 of file lowlevellock.h.

#define lll_robust_cond_lock (   futex,
  id,
  private 
)
Value:
({ int result, ignore1, ignore2;                                     \
     __asm __volatile (LOCK_INSTR "cmpxchgl %1, %2\n\t"                     \
                     "jnz _L_robust_cond_lock_%=\n\t"                       \
                     ".subsection 1\n\t"                             \
                     ".type _L_robust_cond_lock_%=,@function\n"             \
                     "_L_robust_cond_lock_%=:\n"                     \
                     "1:\tleal %2, %%edx\n"                                 \
                     "0:\tmovl %7, %%ecx\n"                                 \
                     "2:\tcall __lll_robust_lock_wait\n"                    \
                     "3:\tjmp 18f\n"                                        \
                     "4:\t.size _L_robust_cond_lock_%=, 4b-1b\n\t"          \
                     ".previous\n"                                   \
                     LLL_STUB_UNWIND_INFO_4                                 \
                     "18:"                                           \
                     : "=a" (result), "=c" (ignore1), "=m" (futex),         \
                      "=&d" (ignore2)                                \
                     : "0" (0), "1" (id | FUTEX_WAITERS), "m" (futex),      \
                      "g" ((int) (private))                                 \
                     : "memory");                                    \
     result; })

Definition at line 378 of file lowlevellock.h.

#define lll_robust_dead (   futex,
  private 
)
Value:
(void)                                                        \
    ({ int __ignore;                                                 \
       register int _nr asm ("edx") = 1;                             \
       __asm __volatile (LOCK_INSTR "orl %5, (%2)\n\t"                      \
                      LLL_EBX_LOAD                                   \
                      LLL_ENTER_KERNEL                               \
                      LLL_EBX_LOAD                                   \
                      : "=a" (__ignore)                              \
                      : "0" (SYS_futex), LLL_EBX_REG (&(futex)),            \
                        "c" (__lll_private_flag (FUTEX_WAKE, private)),    \
                        "d" (_nr), "i" (FUTEX_OWNER_DIED),                  \
                        "i" (offsetof (tcbhead_t, sysinfo)));        \
    })

Definition at line 520 of file lowlevellock.h.

#define lll_robust_lock (   futex,
  id,
  private 
)
Value:
({ int result, ignore1, ignore2;                                     \
     __asm __volatile (LOCK_INSTR "cmpxchgl %1, %2\n\t"                     \
                     "jnz _L_robust_lock_%=\n\t"                     \
                     ".subsection 1\n\t"                             \
                     ".type _L_robust_lock_%=,@function\n"                  \
                     "_L_robust_lock_%=:\n"                                 \
                     "1:\tleal %2, %%edx\n"                                 \
                     "0:\tmovl %7, %%ecx\n"                                 \
                     "2:\tcall __lll_robust_lock_wait\n"                    \
                     "3:\tjmp 18f\n"                                        \
                     "4:\t.size _L_robust_lock_%=, 4b-1b\n\t"               \
                     ".previous\n"                                   \
                     LLL_STUB_UNWIND_INFO_4                                 \
                     "18:"                                           \
                     : "=a" (result), "=c" (ignore1), "=m" (futex),         \
                      "=&d" (ignore2)                                \
                     : "0" (0), "1" (id), "m" (futex), "g" ((int) (private))\
                     : "memory");                                    \
     result; })

Definition at line 331 of file lowlevellock.h.

#define lll_robust_timedlock (   futex,
  timeout,
  id,
  private 
)
Value:
({ int result, ignore1, ignore2, ignore3;                            \
     __asm __volatile (LOCK_INSTR "cmpxchgl %1, %3\n\t"                     \
                     "jnz _L_robust_timedlock_%=\n\t"                       \
                     ".subsection 1\n\t"                             \
                     ".type _L_robust_timedlock_%=,@function\n"             \
                     "_L_robust_timedlock_%=:\n"                     \
                     "1:\tleal %3, %%ecx\n"                                 \
                     "0:\tmovl %8, %%edx\n"                                 \
                     "2:\tcall __lll_robust_timedlock_wait\n"               \
                     "3:\tjmp 18f\n"                                        \
                     "4:\t.size _L_robust_timedlock_%=, 4b-1b\n\t"          \
                     ".previous\n"                                   \
                     LLL_STUB_UNWIND_INFO_4                                 \
                     "18:"                                           \
                     : "=a" (result), "=c" (ignore1), "=&d" (ignore2),      \
                      "=m" (futex), "=S" (ignore3)                          \
                     : "0" (0), "1" (id), "m" (futex), "m" (timeout),       \
                      "4" ((int) (private))                                 \
                     : "memory");                                    \
     result; })

Definition at line 424 of file lowlevellock.h.

#define lll_robust_trylock (   futex,
  id 
)
Value:
({ int ret;                                                          \
     __asm __volatile (LOCK_INSTR "cmpxchgl %2, %1"                         \
                     : "=a" (ret), "=m" (futex)                      \
                     : "r" (id), "m" (futex),                               \
                      "0" (LLL_LOCK_INITIALIZER)                     \
                     : "memory");                                    \
     ret; })

Definition at line 258 of file lowlevellock.h.

#define lll_robust_unlock (   futex,
  private 
)
Value:
(void)                                                        \
    ({ int ignore, ignore2;                                          \
       __asm __volatile (LOCK_INSTR "andl %3, %0\n\t"                       \
                      "jne _L_robust_unlock_%=\n\t"                         \
                      ".subsection 1\n\t"                            \
                      ".type _L_robust_unlock_%=,@function\n"        \
                      "_L_robust_unlock_%=:\n\t"                     \
                      "1:\tleal %0, %%eax\n"                                \
                      "0:\tmovl %5, %%ecx\n"                                \
                      "2:\tcall __lll_unlock_wake\n"                        \
                      "3:\tjmp 18f\n"                                \
                      "4:\t.size _L_robust_unlock_%=, 4b-1b\n\t"            \
                      ".previous\n"                                         \
                      LLL_STUB_UNWIND_INFO_4                                \
                      "18:"                                          \
                      : "=m" (futex), "=&a" (ignore), "=&c" (ignore2)      \
                      : "i" (FUTEX_WAITERS), "m" (futex),                   \
                        "g" ((int) (private))                        \
                      : "memory");                                   \
    })

Definition at line 497 of file lowlevellock.h.

Definition at line 63 of file lowlevellock.h.

Value:
LLL_STUB_UNWIND_INFO_START                              \
"10:\t"       ".byte 0x40 + (2b-1b) # DW_CFA_advance_loc\n\t"  \
LLL_STUB_UNWIND_INFO_END

Definition at line 174 of file lowlevellock.h.

Value:
LLL_STUB_UNWIND_INFO_START                              \
"10:\t"       ".byte 0x40 + (0b-1b) # DW_CFA_advance_loc\n\t"  \
       ".byte 0x16   # DW_CFA_val_expression\n\t"              \
       ".uleb128 0x8\n\t"                               \
       ".uleb128 20f-19f\n"                             \
"19:\t"       ".byte 0x78   # DW_OP_breg8\n\t"                 \
       ".sleb128 3b-0b\n"                               \
"20:\t"       ".byte 0x40 + (2b-0b) # DW_CFA_advance_loc\n\t"  \
LLL_STUB_UNWIND_INFO_END

Definition at line 186 of file lowlevellock.h.

Value:
".byte 0x16   # DW_CFA_val_expression\n\t"              \
       ".uleb128 0x8\n\t"                               \
       ".uleb128 12f-11f\n"                             \
"11:\t"       ".byte 0x78   # DW_OP_breg8\n\t"                 \
       ".sleb128 3b-2b\n"                               \
"12:\t"       ".byte 0x40 + (3b-2b-1) # DW_CFA_advance_loc\n\t"       \
       ".byte 0x16   # DW_CFA_val_expression\n\t"              \
       ".uleb128 0x8\n\t"                               \
       ".uleb128 16f-13f\n"                             \
"13:\t"       ".byte 0x78   # DW_OP_breg8\n\t"                 \
       ".sleb128 15f-14f\n\t"                                  \
       ".byte 0x0d   # DW_OP_const4s\n"                 \
"14:\t"       ".4byte       3b-.\n\t"                                 \
       ".byte 0x1c   # DW_OP_minus\n\t"                 \
       ".byte 0x0d   # DW_OP_const4s\n"                 \
"15:\t"       ".4byte       18f-.\n\t"                                \
       ".byte 0x22   # DW_OP_plus\n"                           \
"16:\t"       ".align 4\n"                                     \
"17:\t"       ".previous\n"

Definition at line 147 of file lowlevellock.h.

Value:
".section     .eh_frame,\"a\",@progbits\n"              \
"5:\t" ".long 7f-6f  # Length of Common Information Entry\n"   \
"6:\t" ".long 0x0    # CIE Identifier Tag\n\t"          \
       ".byte 0x1    # CIE Version\n\t"                 \
       ".ascii \"zR\\0\"    # CIE Augmentation\n\t"            \
       ".uleb128 0x1 # CIE Code Alignment Factor\n\t"   \
       ".sleb128 -4  # CIE Data Alignment Factor\n\t"   \
       ".byte 0x8    # CIE RA Column\n\t"               \
       ".uleb128 0x1 # Augmentation size\n\t"           \
       ".byte 0x1b   # FDE Encoding (pcrel sdata4)\n\t" \
       ".byte 0xc    # DW_CFA_def_cfa\n\t"                     \
       ".uleb128 0x4\n\t"                               \
       ".uleb128 0x0\n\t"                               \
       ".align 4\n"                                     \
"7:\t" ".long 17f-8f # FDE Length\n"                           \
"8:\t" ".long 8b-5b  # FDE CIE offset\n\t"                     \
       ".long 1b-.   # FDE initial location\n\t"        \
       ".long 4b-1b  # FDE address range\n\t"           \
       ".uleb128 0x0 # Augmentation size\n\t"           \
       ".byte 0x16   # DW_CFA_val_expression\n\t"              \
       ".uleb128 0x8\n\t"                               \
       ".uleb128 10f-9f\n"                              \
"9:\t" ".byte 0x78   # DW_OP_breg8\n\t"                 \
       ".sleb128 3b-1b\n"

Definition at line 122 of file lowlevellock.h.

#define lll_timedlock (   futex,
  timeout,
  private 
)
Value:
({ int result, ignore1, ignore2, ignore3;                            \
     __asm __volatile (LOCK_INSTR "cmpxchgl %1, %3\n\t"                     \
                     "jnz _L_timedlock_%=\n\t"                       \
                     ".subsection 1\n\t"                             \
                     ".type _L_timedlock_%=,@function\n"                    \
                     "_L_timedlock_%=:\n"                            \
                     "1:\tleal %3, %%ecx\n"                                 \
                     "0:\tmovl %8, %%edx\n"                                 \
                     "2:\tcall __lll_timedlock_wait\n"               \
                     "3:\tjmp 18f\n"                                        \
                     "4:\t.size _L_timedlock_%=, 4b-1b\n\t"                 \
                     ".previous\n"                                   \
                     LLL_STUB_UNWIND_INFO_4                                 \
                     "18:"                                           \
                     : "=a" (result), "=c" (ignore1), "=&d" (ignore2),      \
                      "=m" (futex), "=S" (ignore3)                          \
                     : "0" (0), "1" (1), "m" (futex), "m" (timeout),        \
                      "4" ((int) (private))                                 \
                     : "memory");                                    \
     result; })

Definition at line 401 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 564 of file lowlevellock.h.

#define lll_trylock (   futex)
Value:
({ int ret;                                                          \
     __asm __volatile (__lll_trylock_asm                             \
                     : "=a" (ret), "=m" (futex)                      \
                     : "r" (LLL_LOCK_INITIALIZER_LOCKED), "m" (futex),      \
                      "0" (LLL_LOCK_INITIALIZER),                           \
                      "i" (MULTIPLE_THREADS_OFFSET)                         \
                     : "memory");                                    \
     ret; })

Definition at line 248 of file lowlevellock.h.

#define lll_unlock (   futex,
  private 
)

Definition at line 455 of file lowlevellock.h.

#define lll_wait_tid (   tid)
Value:
do {                                                                 \
    int __ignore;                                                    \
    register __typeof (tid) _tid asm ("edx") = (tid);                       \
    if (_tid != 0)                                                   \
      __asm __volatile (LLL_EBX_LOAD                                        \
                     "1:\tmovl %1, %%eax\n\t"                        \
                     LLL_ENTER_KERNEL                                \
                     "cmpl $0, (%%ebx)\n\t"                                 \
                     "jne 1b\n\t"                                    \
                     LLL_EBX_LOAD                                    \
                     : "=&a" (__ignore)                              \
                     : "i" (SYS_futex), LLL_EBX_REG (&tid), "S" (0),        \
                       "c" (FUTEX_WAIT), "d" (_tid),                        \
                       "i" (offsetof (tcbhead_t, sysinfo))                  \
                     : "memory");                                    \
  } while (0)

Definition at line 544 of file lowlevellock.h.

#define LOCK_INSTR   "lock;"

Definition at line 34 of file lowlevellock.h.

#define SYS_futex   240

Definition at line 47 of file lowlevellock.h.


Function Documentation

int __lll_timedwait_tid ( int tid,
const struct timespec abstime 
)