[Glibc-bsd-commits] r4592 - trunk/glibc-ports/kfreebsd/x86_64/fbtl
Petr Salinger
ps-guest at alioth.debian.org
Mon Jul 8 12:43:14 UTC 2013
Author: ps-guest
Date: 2013-06-23 15:26:48 +0000 (Sun, 23 Jun 2013)
New Revision: 4592
Added:
trunk/glibc-ports/kfreebsd/x86_64/fbtl/cancellation.S
Removed:
trunk/glibc-ports/kfreebsd/x86_64/fbtl/libc-lowlevellock.S
trunk/glibc-ports/kfreebsd/x86_64/fbtl/lowlevellock.S
trunk/glibc-ports/kfreebsd/x86_64/fbtl/lowlevellock.h
Log:
uncomplete cancellation.S
Added: trunk/glibc-ports/kfreebsd/x86_64/fbtl/cancellation.S
===================================================================
--- trunk/glibc-ports/kfreebsd/x86_64/fbtl/cancellation.S (rev 0)
+++ trunk/glibc-ports/kfreebsd/x86_64/fbtl/cancellation.S 2013-06-23 15:26:48 UTC (rev 4592)
@@ -0,0 +1,119 @@
+/* Copyright (C) 2009, 2011 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Contributed by Ulrich Drepper <drepper at redhat.com>, 2009.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, see
+ <http://www.gnu.org/licenses/>. */
+
+#include <sysdep.h>
+#include <tcb-offsets.h>
+#include <kernel-features.h>
+#include "lowlevellock.h"
+
+#ifdef IS_IN_libpthread
+# ifdef SHARED
+# define __pthread_unwind __GI___pthread_unwind
+# endif
+#else
+# ifndef SHARED
+ .weak __pthread_unwind
+# endif
+#endif
+
+
+/* It is crucial that the functions in this file don't modify registers
+ other than %rax and %r11. The syscall wrapper code depends on this
+ because it doesn't explicitly save the other registers which hold
+ relevant values. */
+ .text
+
+ .hidden __pthread_enable_asynccancel
+ENTRY(__pthread_enable_asynccancel)
+ movl %fs:CANCELHANDLING, %eax
+2: movl %eax, %r11d
+ orl $TCB_CANCELTYPE_BITMASK, %r11d
+ cmpl %eax, %r11d
+ je 1f
+
+ lock
+ cmpxchgl %r11d, %fs:CANCELHANDLING
+ jnz 2b
+
+ andl $(TCB_CANCELSTATE_BITMASK|TCB_CANCELTYPE_BITMASK|TCB_CANCELED_BITMASK|TCB_EXITING_BITMASK|TCB_CANCEL_RESTMASK|TCB_TERMINATED_BITMASK), %r11d
+ cmpl $(TCB_CANCELTYPE_BITMASK|TCB_CANCELED_BITMASK), %r11d
+ je 3f
+
+1: ret
+
+3: subq $8, %rsp
+ cfi_adjust_cfa_offset(8)
+ LP_OP(mov) $TCB_PTHREAD_CANCELED, %fs:RESULT
+ lock
+ orl $TCB_EXITING_BITMASK, %fs:CANCELHANDLING
+ mov %fs:CLEANUP_JMP_BUF, %RDI_LP
+#ifdef SHARED
+ call __pthread_unwind at PLT
+#else
+ call __pthread_unwind
+#endif
+ hlt
+END(__pthread_enable_asynccancel)
+
+
+ .hidden __pthread_disable_asynccancel
+ENTRY(__pthread_disable_asynccancel)
+ testl $TCB_CANCELTYPE_BITMASK, %edi
+ jnz 1f
+
+ movl %fs:CANCELHANDLING, %eax
+2: movl %eax, %r11d
+ andl $~TCB_CANCELTYPE_BITMASK, %r11d
+ lock
+ cmpxchgl %r11d, %fs:CANCELHANDLING
+ jnz 2b
+
+ movl %r11d, %eax
+3: andl $(TCB_CANCELING_BITMASK|TCB_CANCELED_BITMASK), %eax
+ cmpl $TCB_CANCELING_BITMASK, %eax
+ je 4f
+1: ret
+
+# define UMTX_OP_WAIT_UINT_PRIVATE 15
+# define LOAD_PRIVATE_FUTEX_WAIT(reg) \
+ movl $UMTX_OP_WAIT_UINT_PRIVATE, reg
+
+ /* Performance doesn't matter in this loop. We will
+ delay until the thread is canceled. And we will unlikely
+ enter the loop twice. */
+
+# warning check this:
+ /*
+ The C-code repeatedy does:
+ lll_futex_wait (&self->cancelhandling, newval, LLL_PRIVATE);
+ newval = THREAD_GETMEM (self, cancelhandling);
+
+ but the original NPTL code does not fill rdx
+ with the old value ...
+ */
+
+4: mov %fs:0, %RDI_LP
+ movl $SYS__umtx_op, %eax
+ xorq %r8, %r8
+ xorq %r10, %r10
+ addq $CANCELHANDLING, %rdi
+ LOAD_PRIVATE_FUTEX_WAIT (%esi)
+ syscall
+ movl %fs:CANCELHANDLING, %eax
+ jmp 3b
+END(__pthread_disable_asynccancel)
Deleted: trunk/glibc-ports/kfreebsd/x86_64/fbtl/libc-lowlevellock.S
===================================================================
--- trunk/glibc-ports/kfreebsd/x86_64/fbtl/libc-lowlevellock.S 2013-06-23 14:16:38 UTC (rev 4591)
+++ trunk/glibc-ports/kfreebsd/x86_64/fbtl/libc-lowlevellock.S 2013-06-23 15:26:48 UTC (rev 4592)
@@ -1,19 +0,0 @@
-/* Copyright (C) 2002, 2003, 2007 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
- Contributed by Ulrich Drepper <drepper at redhat.com>, 2002.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, see
- <http://www.gnu.org/licenses/>. */
-
-#include "lowlevellock.S"
Deleted: trunk/glibc-ports/kfreebsd/x86_64/fbtl/lowlevellock.S
===================================================================
--- trunk/glibc-ports/kfreebsd/x86_64/fbtl/lowlevellock.S 2013-06-23 14:16:38 UTC (rev 4591)
+++ trunk/glibc-ports/kfreebsd/x86_64/fbtl/lowlevellock.S 2013-06-23 15:26:48 UTC (rev 4592)
@@ -1,466 +0,0 @@
-/* Copyright (C) 2002-2012 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
- Contributed by Ulrich Drepper <drepper at redhat.com>, 2002.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, see
- <http://www.gnu.org/licenses/>. */
-
-#include <sysdep.h>
-#include <pthread-errnos.h>
-#include <kernel-features.h>
-#include <lowlevellock.h>
-
-#include <stap-probe.h>
-
- .text
-
-#ifdef __ASSUME_PRIVATE_FUTEX
-# define LOAD_PRIVATE_FUTEX_WAIT(reg) \
- movl $(FUTEX_WAIT | FUTEX_PRIVATE_FLAG), reg
-# define LOAD_PRIVATE_FUTEX_WAKE(reg) \
- movl $(FUTEX_WAKE | FUTEX_PRIVATE_FLAG), reg
-# define LOAD_FUTEX_WAIT(reg) \
- xorl $(FUTEX_WAIT | FUTEX_PRIVATE_FLAG), reg
-# define LOAD_FUTEX_WAIT_ABS(reg) \
- xorl $(FUTEX_WAIT_BITSET | FUTEX_PRIVATE_FLAG | FUTEX_CLOCK_REALTIME), reg
-# define LOAD_FUTEX_WAKE(reg) \
- xorl $(FUTEX_WAKE | FUTEX_PRIVATE_FLAG), reg
-#else
-# if FUTEX_WAIT == 0
-# define LOAD_PRIVATE_FUTEX_WAIT(reg) \
- movl %fs:PRIVATE_FUTEX, reg
-# else
-# define LOAD_PRIVATE_FUTEX_WAIT(reg) \
- movl %fs:PRIVATE_FUTEX, reg ; \
- orl $FUTEX_WAIT, reg
-# endif
-# define LOAD_PRIVATE_FUTEX_WAKE(reg) \
- movl %fs:PRIVATE_FUTEX, reg ; \
- orl $FUTEX_WAKE, reg
-# if FUTEX_WAIT == 0
-# define LOAD_FUTEX_WAIT(reg) \
- xorl $FUTEX_PRIVATE_FLAG, reg ; \
- andl %fs:PRIVATE_FUTEX, reg
-# else
-# define LOAD_FUTEX_WAIT(reg) \
- xorl $FUTEX_PRIVATE_FLAG, reg ; \
- andl %fs:PRIVATE_FUTEX, reg ; \
- orl $FUTEX_WAIT, reg
-# endif
-# define LOAD_FUTEX_WAIT_ABS(reg) \
- xorl $FUTEX_PRIVATE_FLAG, reg ; \
- andl %fs:PRIVATE_FUTEX, reg ; \
- orl $FUTEX_WAIT_BITSET | FUTEX_CLOCK_REALTIME, reg
-# define LOAD_FUTEX_WAKE(reg) \
- xorl $FUTEX_PRIVATE_FLAG, reg ; \
- andl %fs:PRIVATE_FUTEX, reg ; \
- orl $FUTEX_WAKE, reg
-#endif
-
-
- .globl __lll_lock_wait_private
- .type __lll_lock_wait_private, at function
- .hidden __lll_lock_wait_private
- .align 16
-__lll_lock_wait_private:
- cfi_startproc
- pushq %r10
- cfi_adjust_cfa_offset(8)
- pushq %rdx
- cfi_adjust_cfa_offset(8)
- cfi_offset(%r10, -16)
- cfi_offset(%rdx, -24)
- xorq %r10, %r10 /* No timeout. */
- movl $2, %edx
- LOAD_PRIVATE_FUTEX_WAIT (%esi)
-
- cmpl %edx, %eax /* NB: %edx == 2 */
- jne 2f
-
-1: LIBC_PROBE (lll_lock_wait_private, 1, %rdi)
- movl $SYS_futex, %eax
- syscall
-
-2: movl %edx, %eax
- xchgl %eax, (%rdi) /* NB: lock is implied */
-
- testl %eax, %eax
- jnz 1b
-
- popq %rdx
- cfi_adjust_cfa_offset(-8)
- cfi_restore(%rdx)
- popq %r10
- cfi_adjust_cfa_offset(-8)
- cfi_restore(%r10)
- retq
- cfi_endproc
- .size __lll_lock_wait_private,.-__lll_lock_wait_private
-
-#ifdef NOT_IN_libc
- .globl __lll_lock_wait
- .type __lll_lock_wait, at function
- .hidden __lll_lock_wait
- .align 16
-__lll_lock_wait:
- cfi_startproc
- pushq %r10
- cfi_adjust_cfa_offset(8)
- pushq %rdx
- cfi_adjust_cfa_offset(8)
- cfi_offset(%r10, -16)
- cfi_offset(%rdx, -24)
- xorq %r10, %r10 /* No timeout. */
- movl $2, %edx
- LOAD_FUTEX_WAIT (%esi)
-
- cmpl %edx, %eax /* NB: %edx == 2 */
- jne 2f
-
-1: LIBC_PROBE (lll_lock_wait, 2, %rdi, %rsi)
- movl $SYS_futex, %eax
- syscall
-
-2: movl %edx, %eax
- xchgl %eax, (%rdi) /* NB: lock is implied */
-
- testl %eax, %eax
- jnz 1b
-
- popq %rdx
- cfi_adjust_cfa_offset(-8)
- cfi_restore(%rdx)
- popq %r10
- cfi_adjust_cfa_offset(-8)
- cfi_restore(%r10)
- retq
- cfi_endproc
- .size __lll_lock_wait,.-__lll_lock_wait
-
- /* %rdi: futex
- %rsi: flags
- %rdx: timeout
- %eax: futex value
- */
- .globl __lll_timedlock_wait
- .type __lll_timedlock_wait, at function
- .hidden __lll_timedlock_wait
- .align 16
-__lll_timedlock_wait:
- cfi_startproc
-# ifndef __ASSUME_FUTEX_CLOCK_REALTIME
-#if 1
- jmp .Lreltmo
-#else
-# ifdef PIC
- cmpl $0, __have_futex_clock_realtime(%rip)
-# else
- cmpl $0, __have_futex_clock_realtime
-# endif
- je .Lreltmo
-#endif
-# endif
-
- cmpq $0, (%rdx)
- js 5f
-
- pushq %r9
- cfi_adjust_cfa_offset(8)
- cfi_rel_offset(%r9, 0)
-
- movq %rdx, %r10
- movl $0xffffffff, %r9d
- LOAD_FUTEX_WAIT_ABS (%esi)
-
- movl $2, %edx
- cmpl %edx, %eax
- jne 2f
-
-1: movl $SYS_futex, %eax
- movl $2, %edx
- syscall
-
-2: xchgl %edx, (%rdi) /* NB: lock is implied */
-
- testl %edx, %edx
- jz 3f
-
- cmpl $-ETIMEDOUT, %eax
- je 4f
- cmpl $-EINVAL, %eax
- jne 1b
-4: movl %eax, %edx
- negl %edx
-
-3: movl %edx, %eax
- popq %r9
- cfi_adjust_cfa_offset(-8)
- cfi_restore(%r9)
- retq
-
-5: movl $ETIMEDOUT, %eax
- retq
-
-# ifndef __ASSUME_FUTEX_CLOCK_REALTIME
-.Lreltmo:
- /* Check for a valid timeout value. */
- cmpq $1000000000, 8(%rdx)
- jae 3f
-
- pushq %r8
- cfi_adjust_cfa_offset(8)
- pushq %r9
- cfi_adjust_cfa_offset(8)
- pushq %r12
- cfi_adjust_cfa_offset(8)
- pushq %r13
- cfi_adjust_cfa_offset(8)
- pushq %r14
- cfi_adjust_cfa_offset(8)
- cfi_offset(%r8, -16)
- cfi_offset(%r9, -24)
- cfi_offset(%r12, -32)
- cfi_offset(%r13, -40)
- cfi_offset(%r14, -48)
- pushq %rsi
- cfi_adjust_cfa_offset(8)
-
- /* Stack frame for the timespec and timeval structs. */
- subq $24, %rsp
- cfi_adjust_cfa_offset(24)
-
- movq %rdi, %r12
- movq %rdx, %r13
-
- movl $2, %edx
- xchgl %edx, (%r12)
-
- testl %edx, %edx
- je 6f
-
-1:
- /* Get current time. */
- movq %rsp, %rdi
- xorl %esi, %esi
- /* This call works because we directly jump to a system call entry
- which preserves all the registers. */
- call JUMPTARGET(__gettimeofday)
-
- /* Compute relative timeout. */
- movq 8(%rsp), %rax
- movl $1000, %edi
- mul %rdi /* Milli seconds to nano seconds. */
- movq (%r13), %rdi
- movq 8(%r13), %rsi
- subq (%rsp), %rdi
- subq %rax, %rsi
- jns 4f
- addq $1000000000, %rsi
- decq %rdi
-4: testq %rdi, %rdi
- js 2f /* Time is already up. */
-
- /* Store relative timeout. */
- movq %rdi, (%rsp)
- movq %rsi, 8(%rsp)
-
- /* Futex call. */
- movl $2, %edx
- movl $1, %eax
- movq %rsp, %r10
- movl 24(%rsp), %esi
- LOAD_FUTEX_WAIT (%esi)
- movq %r12, %rdi
- movl $SYS_futex, %eax
- syscall
-
- /* NB: %edx == 2 */
- xchgl %edx, (%r12)
-
- testl %edx, %edx
- je 6f
-
- cmpl $-ETIMEDOUT, %eax
- jne 1b
-2: movl $ETIMEDOUT, %edx
-
-6: addq $32, %rsp
- cfi_adjust_cfa_offset(-32)
- popq %r14
- cfi_adjust_cfa_offset(-8)
- cfi_restore(%r14)
- popq %r13
- cfi_adjust_cfa_offset(-8)
- cfi_restore(%r13)
- popq %r12
- cfi_adjust_cfa_offset(-8)
- cfi_restore(%r12)
- popq %r9
- cfi_adjust_cfa_offset(-8)
- cfi_restore(%r9)
- popq %r8
- cfi_adjust_cfa_offset(-8)
- cfi_restore(%r8)
- movl %edx, %eax
- retq
-
-3: movl $EINVAL, %eax
- retq
-# endif
- cfi_endproc
- .size __lll_timedlock_wait,.-__lll_timedlock_wait
-#endif
-
-
- .globl __lll_unlock_wake_private
- .type __lll_unlock_wake_private, at function
- .hidden __lll_unlock_wake_private
- .align 16
-__lll_unlock_wake_private:
- cfi_startproc
- pushq %rsi
- cfi_adjust_cfa_offset(8)
- pushq %rdx
- cfi_adjust_cfa_offset(8)
- cfi_offset(%rsi, -16)
- cfi_offset(%rdx, -24)
-
- movl $0, (%rdi)
- LOAD_PRIVATE_FUTEX_WAKE (%esi)
- movl $1, %edx /* Wake one thread. */
- movl $SYS_futex, %eax
- syscall
-
- popq %rdx
- cfi_adjust_cfa_offset(-8)
- cfi_restore(%rdx)
- popq %rsi
- cfi_adjust_cfa_offset(-8)
- cfi_restore(%rsi)
- retq
- cfi_endproc
- .size __lll_unlock_wake_private,.-__lll_unlock_wake_private
-
-#ifdef NOT_IN_libc
- .globl __lll_unlock_wake
- .type __lll_unlock_wake, at function
- .hidden __lll_unlock_wake
- .align 16
-__lll_unlock_wake:
- cfi_startproc
- pushq %rsi
- cfi_adjust_cfa_offset(8)
- pushq %rdx
- cfi_adjust_cfa_offset(8)
- cfi_offset(%rsi, -16)
- cfi_offset(%rdx, -24)
-
- movl $0, (%rdi)
- LOAD_FUTEX_WAKE (%esi)
- movl $1, %edx /* Wake one thread. */
- movl $SYS_futex, %eax
- syscall
-
- popq %rdx
- cfi_adjust_cfa_offset(-8)
- cfi_restore(%rdx)
- popq %rsi
- cfi_adjust_cfa_offset(-8)
- cfi_restore(%rsi)
- retq
- cfi_endproc
- .size __lll_unlock_wake,.-__lll_unlock_wake
-
- .globl __lll_timedwait_tid
- .type __lll_timedwait_tid, at function
- .hidden __lll_timedwait_tid
- .align 16
-__lll_timedwait_tid:
- cfi_startproc
- pushq %r12
- cfi_adjust_cfa_offset(8)
- pushq %r13
- cfi_adjust_cfa_offset(8)
- cfi_offset(%r12, -16)
- cfi_offset(%r13, -24)
-
- movq %rdi, %r12
- movq %rsi, %r13
-
- subq $16, %rsp
- cfi_adjust_cfa_offset(16)
-
- /* Get current time. */
-2: movq %rsp, %rdi
- xorl %esi, %esi
- /* This call works because we directly jump to a system call entry
- which preserves all the registers. */
- call JUMPTARGET(__gettimeofday)
-
- /* Compute relative timeout. */
- movq 8(%rsp), %rax
- movl $1000, %edi
- mul %rdi /* Milli seconds to nano seconds. */
- movq (%r13), %rdi
- movq 8(%r13), %rsi
- subq (%rsp), %rdi
- subq %rax, %rsi
- jns 5f
- addq $1000000000, %rsi
- decq %rdi
-5: testq %rdi, %rdi
- js 6f /* Time is already up. */
-
- movq %rdi, (%rsp) /* Store relative timeout. */
- movq %rsi, 8(%rsp)
-
- movl (%r12), %edx
- testl %edx, %edx
- jz 4f
-
- movq %rsp, %r10
- /* XXX The kernel so far uses global futex for the wakeup at
- all times. */
-#if FUTEX_WAIT == 0
- xorl %esi, %esi
-#else
- movl $FUTEX_WAIT, %esi
-#endif
- movq %r12, %rdi
- movl $SYS_futex, %eax
- syscall
-
- cmpl $0, (%rdi)
- jne 1f
-4: xorl %eax, %eax
-
-8: addq $16, %rsp
- cfi_adjust_cfa_offset(-16)
- popq %r13
- cfi_adjust_cfa_offset(-8)
- cfi_restore(%r13)
- popq %r12
- cfi_adjust_cfa_offset(-8)
- cfi_restore(%r12)
- retq
-
- cfi_adjust_cfa_offset(32)
-1: cmpq $-ETIMEDOUT, %rax
- jne 2b
-
-6: movl $ETIMEDOUT, %eax
- jmp 8b
- cfi_endproc
- .size __lll_timedwait_tid,.-__lll_timedwait_tid
-#endif
Deleted: trunk/glibc-ports/kfreebsd/x86_64/fbtl/lowlevellock.h
===================================================================
--- trunk/glibc-ports/kfreebsd/x86_64/fbtl/lowlevellock.h 2013-06-23 14:16:38 UTC (rev 4591)
+++ trunk/glibc-ports/kfreebsd/x86_64/fbtl/lowlevellock.h 2013-06-23 15:26:48 UTC (rev 4592)
@@ -1,603 +0,0 @@
-/* Copyright (C) 2002-2013 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
- Contributed by Ulrich Drepper <drepper at redhat.com>, 2002.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, see
- <http://www.gnu.org/licenses/>. */
-
-#ifndef _LOWLEVELLOCK_H
-#define _LOWLEVELLOCK_H 1
-
-#include <stap-probe.h>
-
-#ifndef __ASSEMBLER__
-# include <time.h>
-# include <sys/param.h>
-# include <bits/pthreadtypes.h>
-# include <kernel-features.h>
-# include <tcb-offsets.h>
-# include <atomic.h>
-
-# ifndef LOCK_INSTR
-# ifdef UP
-# define LOCK_INSTR /* nothing */
-# else
-# define LOCK_INSTR "lock;"
-# endif
-# endif
-#else
-# ifndef LOCK
-# ifdef UP
-# define LOCK
-# else
-# define LOCK lock
-# endif
-# endif
-#endif
-
-#define SYS_futex 123456
-#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_WAIT_BITSET 9
-#define FUTEX_WAKE_BITSET 10
-#define FUTEX_WAIT_REQUEUE_PI 11
-#define FUTEX_CMP_REQUEUE_PI 12
-#define FUTEX_PRIVATE_FLAG 128
-#define FUTEX_CLOCK_REALTIME 256
-
-#define FUTEX_BITSET_MATCH_ANY 0xffffffff
-
-#define FUTEX_OP_CLEAR_WAKE_IF_GT_ONE ((4 << 24) | 1)
-
-/* Values for 'private' parameter of locking macros. Yes, the
- definition seems to be backwards. But it is not. The bit will be
- reversed before passing to the system call. */
-#define LLL_PRIVATE 0
-#define LLL_SHARED FUTEX_PRIVATE_FLAG
-
-#ifndef __ASSEMBLER__
-
-#if !defined NOT_IN_libc || defined IS_IN_rtld
-/* In libc.so or ld.so all futexes are private. */
-# ifdef __ASSUME_PRIVATE_FUTEX
-# define __lll_private_flag(fl, private) \
- ((fl) | FUTEX_PRIVATE_FLAG)
-# else
-# define __lll_private_flag(fl, private) \
- ((fl) | THREAD_GETMEM (THREAD_SELF, header.private_futex))
-# endif
-#else
-# ifdef __ASSUME_PRIVATE_FUTEX
-# define __lll_private_flag(fl, private) \
- (((fl) | FUTEX_PRIVATE_FLAG) ^ (private))
-# else
-# define __lll_private_flag(fl, private) \
- (__builtin_constant_p (private) \
- ? ((private) == 0 \
- ? ((fl) | THREAD_GETMEM (THREAD_SELF, header.private_futex)) \
- : (fl)) \
- : ({ unsigned int __fl = ((private) ^ FUTEX_PRIVATE_FLAG); \
- asm ("andl %%fs:%P1, %0" : "+r" (__fl) \
- : "i" (offsetof (struct pthread, header.private_futex))); \
- __fl | (fl); }))
-# endif
-#endif
-
-/* Initializer for lock. */
-#define LLL_LOCK_INITIALIZER (0)
-#define LLL_LOCK_INITIALIZER_LOCKED (1)
-#define LLL_LOCK_INITIALIZER_WAITERS (2)
-
-/* Delay in spinlock loop. */
-#define BUSY_WAIT_NOP asm ("rep; nop")
-
-
-#define LLL_STUB_UNWIND_INFO_START \
- ".section .eh_frame,\"a\", at progbits\n" \
-"7:\t" ".long 9f-8f # Length of Common Information Entry\n" \
-"8:\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 -8 # CIE Data Alignment Factor\n\t" \
- ".byte 0x10 # CIE RA Column\n\t" \
- ".uleb128 0x1 # Augmentation size\n\t" \
- ".byte 0x1b # FDE Encoding (pcrel sdata4)\n\t" \
- ".byte 0x12 # DW_CFA_def_cfa_sf\n\t" \
- ".uleb128 0x7\n\t" \
- ".sleb128 16\n\t" \
- ".align " LP_SIZE "\n" \
-"9:\t" ".long 23f-10f # FDE Length\n" \
-"10:\t" ".long 10b-7b # FDE CIE offset\n\t" \
- ".long 1b-. # FDE initial location\n\t" \
- ".long 6b-1b # FDE address range\n\t" \
- ".uleb128 0x0 # Augmentation size\n\t" \
- ".byte 0x16 # DW_CFA_val_expression\n\t" \
- ".uleb128 0x10\n\t" \
- ".uleb128 12f-11f\n" \
-"11:\t" ".byte 0x80 # DW_OP_breg16\n\t" \
- ".sleb128 4b-1b\n"
-#define LLL_STUB_UNWIND_INFO_END \
- ".byte 0x16 # DW_CFA_val_expression\n\t" \
- ".uleb128 0x10\n\t" \
- ".uleb128 14f-13f\n" \
-"13:\t" ".byte 0x80 # DW_OP_breg16\n\t" \
- ".sleb128 4b-2b\n" \
-"14:\t" ".byte 0x40 + (3b-2b) # DW_CFA_advance_loc\n\t" \
- ".byte 0x0e # DW_CFA_def_cfa_offset\n\t" \
- ".uleb128 0\n\t" \
- ".byte 0x16 # DW_CFA_val_expression\n\t" \
- ".uleb128 0x10\n\t" \
- ".uleb128 16f-15f\n" \
-"15:\t" ".byte 0x80 # DW_OP_breg16\n\t" \
- ".sleb128 4b-3b\n" \
-"16:\t" ".byte 0x40 + (4b-3b-1) # DW_CFA_advance_loc\n\t" \
- ".byte 0x0e # DW_CFA_def_cfa_offset\n\t" \
- ".uleb128 128\n\t" \
- ".byte 0x16 # DW_CFA_val_expression\n\t" \
- ".uleb128 0x10\n\t" \
- ".uleb128 20f-17f\n" \
-"17:\t" ".byte 0x80 # DW_OP_breg16\n\t" \
- ".sleb128 19f-18f\n\t" \
- ".byte 0x0d # DW_OP_const4s\n" \
-"18:\t" ".4byte 4b-.\n\t" \
- ".byte 0x1c # DW_OP_minus\n\t" \
- ".byte 0x0d # DW_OP_const4s\n" \
-"19:\t" ".4byte 24f-.\n\t" \
- ".byte 0x22 # DW_OP_plus\n" \
-"20:\t" ".byte 0x40 + (5b-4b+1) # DW_CFA_advance_loc\n\t" \
- ".byte 0x13 # DW_CFA_def_cfa_offset_sf\n\t" \
- ".sleb128 16\n\t" \
- ".byte 0x16 # DW_CFA_val_expression\n\t" \
- ".uleb128 0x10\n\t" \
- ".uleb128 22f-21f\n" \
-"21:\t" ".byte 0x80 # DW_OP_breg16\n\t" \
- ".sleb128 4b-5b\n" \
-"22:\t" ".align " LP_SIZE "\n" \
-"23:\t" ".previous\n"
-
-/* Unwind info for
- 1: leaq ..., %rdi
- 2: subq $128, %rsp
- 3: callq ...
- 4: addq $128, %rsp
- 5: jmp 24f
- 6:
- snippet. */
-#define LLL_STUB_UNWIND_INFO_5 \
-LLL_STUB_UNWIND_INFO_START \
-"12:\t" ".byte 0x40 + (2b-1b) # DW_CFA_advance_loc\n\t" \
-LLL_STUB_UNWIND_INFO_END
-
-/* Unwind info for
- 1: leaq ..., %rdi
- 0: movq ..., %rdx
- 2: subq $128, %rsp
- 3: callq ...
- 4: addq $128, %rsp
- 5: jmp 24f
- 6:
- snippet. */
-#define LLL_STUB_UNWIND_INFO_6 \
-LLL_STUB_UNWIND_INFO_START \
-"12:\t" ".byte 0x40 + (0b-1b) # DW_CFA_advance_loc\n\t" \
- ".byte 0x16 # DW_CFA_val_expression\n\t" \
- ".uleb128 0x10\n\t" \
- ".uleb128 26f-25f\n" \
-"25:\t" ".byte 0x80 # DW_OP_breg16\n\t" \
- ".sleb128 4b-0b\n" \
-"26:\t" ".byte 0x40 + (2b-0b) # DW_CFA_advance_loc\n\t" \
-LLL_STUB_UNWIND_INFO_END
-
-
-#define lll_futex_wait(futex, val, private) \
- lll_futex_timed_wait(futex, val, NULL, private)
-
-
-#define lll_futex_timed_wait(futex, val, timeout, private) \
- ({ \
- register const struct timespec *__to __asm ("r10") = timeout; \
- int __status; \
- register __typeof (val) _val __asm ("edx") = (val); \
- __asm __volatile ("syscall" \
- : "=a" (__status) \
- : "0" (SYS_futex), "D" (futex), \
- "S" (__lll_private_flag (FUTEX_WAIT, private)), \
- "d" (_val), "r" (__to) \
- : "memory", "cc", "r11", "cx"); \
- __status; \
- })
-
-
-#define lll_futex_wake(futex, nr, private) \
- ({ \
- int __status; \
- register __typeof (nr) _nr __asm ("edx") = (nr); \
- LIBC_PROBE (lll_futex_wake, 3, futex, nr, private); \
- __asm __volatile ("syscall" \
- : "=a" (__status) \
- : "0" (SYS_futex), "D" (futex), \
- "S" (__lll_private_flag (FUTEX_WAKE, private)), \
- "d" (_nr) \
- : "memory", "cc", "r10", "r11", "cx"); \
- __status; \
- })
-
-
-/* NB: in the lll_trylock macro we simply return the value in %eax
- after the cmpxchg instruction. In case the operation succeded this
- value is zero. In case the operation failed, the cmpxchg instruction
- has loaded the current value of the memory work which is guaranteed
- to be nonzero. */
-#if defined NOT_IN_libc || defined UP
-# define __lll_trylock_asm LOCK_INSTR "cmpxchgl %2, %1"
-#else
-# define __lll_trylock_asm "cmpl $0, __libc_multiple_threads(%%rip)\n\t" \
- "je 0f\n\t" \
- "lock; cmpxchgl %2, %1\n\t" \
- "jmp 1f\n\t" \
- "0:\tcmpxchgl %2, %1\n\t" \
- "1:"
-#endif
-
-#define lll_trylock(futex) \
- ({ int ret; \
- __asm __volatile (__lll_trylock_asm \
- : "=a" (ret), "=m" (futex) \
- : "r" (LLL_LOCK_INITIALIZER_LOCKED), "m" (futex), \
- "0" (LLL_LOCK_INITIALIZER) \
- : "memory"); \
- ret; })
-
-#define lll_robust_trylock(futex, id) \
- ({ int ret; \
- __asm __volatile (LOCK_INSTR "cmpxchgl %2, %1" \
- : "=a" (ret), "=m" (futex) \
- : "r" (id), "m" (futex), "0" (LLL_LOCK_INITIALIZER) \
- : "memory"); \
- ret; })
-
-#define lll_cond_trylock(futex) \
- ({ 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; })
-
-#if defined NOT_IN_libc || defined UP
-# define __lll_lock_asm_start LOCK_INSTR "cmpxchgl %4, %2\n\t" \
- "jnz 1f\n\t"
-#else
-# define __lll_lock_asm_start "cmpl $0, __libc_multiple_threads(%%rip)\n\t" \
- "je 0f\n\t" \
- "lock; cmpxchgl %4, %2\n\t" \
- "jnz 1f\n\t" \
- "jmp 24f\n" \
- "0:\tcmpxchgl %4, %2\n\t" \
- "jnz 1f\n\t"
-#endif
-
-#define lll_lock(futex, private) \
- (void) \
- ({ int ignore1, ignore2, ignore3; \
- if (__builtin_constant_p (private) && (private) == LLL_PRIVATE) \
- __asm __volatile (__lll_lock_asm_start \
- ".subsection 1\n\t" \
- ".type _L_lock_%=, @function\n" \
- "_L_lock_%=:\n" \
- "1:\tlea %2, %%" RDI_LP "\n" \
- "2:\tsub $128, %%" RSP_LP "\n" \
- "3:\tcallq __lll_lock_wait_private\n" \
- "4:\tadd $128, %%" RSP_LP "\n" \
- "5:\tjmp 24f\n" \
- "6:\t.size _L_lock_%=, 6b-1b\n\t" \
- ".previous\n" \
- LLL_STUB_UNWIND_INFO_5 \
- "24:" \
- : "=S" (ignore1), "=&D" (ignore2), "=m" (futex), \
- "=a" (ignore3) \
- : "0" (1), "m" (futex), "3" (0) \
- : "cx", "r11", "cc", "memory"); \
- else \
- __asm __volatile (__lll_lock_asm_start \
- ".subsection 1\n\t" \
- ".type _L_lock_%=, @function\n" \
- "_L_lock_%=:\n" \
- "1:\tlea %2, %%" RDI_LP "\n" \
- "2:\tsub $128, %%" RSP_LP "\n" \
- "3:\tcallq __lll_lock_wait\n" \
- "4:\tadd $128, %%" RSP_LP "\n" \
- "5:\tjmp 24f\n" \
- "6:\t.size _L_lock_%=, 6b-1b\n\t" \
- ".previous\n" \
- LLL_STUB_UNWIND_INFO_5 \
- "24:" \
- : "=S" (ignore1), "=D" (ignore2), "=m" (futex), \
- "=a" (ignore3) \
- : "1" (1), "m" (futex), "3" (0), "0" (private) \
- : "cx", "r11", "cc", "memory"); \
- }) \
-
-#define lll_robust_lock(futex, id, private) \
- ({ int result, ignore1, ignore2; \
- __asm __volatile (LOCK_INSTR "cmpxchgl %4, %2\n\t" \
- "jnz 1f\n\t" \
- ".subsection 1\n\t" \
- ".type _L_robust_lock_%=, @function\n" \
- "_L_robust_lock_%=:\n" \
- "1:\tlea %2, %%" RDI_LP "\n" \
- "2:\tsub $128, %%" RSP_LP "\n" \
- "3:\tcallq __lll_robust_lock_wait\n" \
- "4:\tadd $128, %%" RSP_LP "\n" \
- "5:\tjmp 24f\n" \
- "6:\t.size _L_robust_lock_%=, 6b-1b\n\t" \
- ".previous\n" \
- LLL_STUB_UNWIND_INFO_5 \
- "24:" \
- : "=S" (ignore1), "=D" (ignore2), "=m" (futex), \
- "=a" (result) \
- : "1" (id), "m" (futex), "3" (0), "0" (private) \
- : "cx", "r11", "cc", "memory"); \
- result; })
-
-#define lll_cond_lock(futex, private) \
- (void) \
- ({ int ignore1, ignore2, ignore3; \
- __asm __volatile (LOCK_INSTR "cmpxchgl %4, %2\n\t" \
- "jnz 1f\n\t" \
- ".subsection 1\n\t" \
- ".type _L_cond_lock_%=, @function\n" \
- "_L_cond_lock_%=:\n" \
- "1:\tlea %2, %%" RDI_LP "\n" \
- "2:\tsub $128, %%" RSP_LP "\n" \
- "3:\tcallq __lll_lock_wait\n" \
- "4:\tadd $128, %%" RSP_LP "\n" \
- "5:\tjmp 24f\n" \
- "6:\t.size _L_cond_lock_%=, 6b-1b\n\t" \
- ".previous\n" \
- LLL_STUB_UNWIND_INFO_5 \
- "24:" \
- : "=S" (ignore1), "=D" (ignore2), "=m" (futex), \
- "=a" (ignore3) \
- : "1" (2), "m" (futex), "3" (0), "0" (private) \
- : "cx", "r11", "cc", "memory"); \
- })
-
-#define lll_robust_cond_lock(futex, id, private) \
- ({ int result, ignore1, ignore2; \
- __asm __volatile (LOCK_INSTR "cmpxchgl %4, %2\n\t" \
- "jnz 1f\n\t" \
- ".subsection 1\n\t" \
- ".type _L_robust_cond_lock_%=, @function\n" \
- "_L_robust_cond_lock_%=:\n" \
- "1:\tlea %2, %%" RDI_LP "\n" \
- "2:\tsub $128, %%" RSP_LP "\n" \
- "3:\tcallq __lll_robust_lock_wait\n" \
- "4:\tadd $128, %%" RSP_LP "\n" \
- "5:\tjmp 24f\n" \
- "6:\t.size _L_robust_cond_lock_%=, 6b-1b\n\t" \
- ".previous\n" \
- LLL_STUB_UNWIND_INFO_5 \
- "24:" \
- : "=S" (ignore1), "=D" (ignore2), "=m" (futex), \
- "=a" (result) \
- : "1" (id | FUTEX_WAITERS), "m" (futex), "3" (0), \
- "0" (private) \
- : "cx", "r11", "cc", "memory"); \
- result; })
-
-#define lll_timedlock(futex, timeout, private) \
- ({ int result, ignore1, ignore2, ignore3; \
- __asm __volatile (LOCK_INSTR "cmpxchgl %1, %4\n\t" \
- "jnz 1f\n\t" \
- ".subsection 1\n\t" \
- ".type _L_timedlock_%=, @function\n" \
- "_L_timedlock_%=:\n" \
- "1:\tlea %4, %%" RDI_LP "\n" \
- "0:\tmov %8, %%" RDX_LP "\n" \
- "2:\tsub $128, %%" RSP_LP "\n" \
- "3:\tcallq __lll_timedlock_wait\n" \
- "4:\tadd $128, %%" RSP_LP "\n" \
- "5:\tjmp 24f\n" \
- "6:\t.size _L_timedlock_%=, 6b-1b\n\t" \
- ".previous\n" \
- LLL_STUB_UNWIND_INFO_6 \
- "24:" \
- : "=a" (result), "=D" (ignore1), "=S" (ignore2), \
- "=&d" (ignore3), "=m" (futex) \
- : "0" (0), "1" (1), "m" (futex), "m" (timeout), \
- "2" (private) \
- : "memory", "cx", "cc", "r10", "r11"); \
- result; })
-
-#define lll_robust_timedlock(futex, timeout, id, private) \
- ({ int result, ignore1, ignore2, ignore3; \
- __asm __volatile (LOCK_INSTR "cmpxchgl %1, %4\n\t" \
- "jnz 1f\n\t" \
- ".subsection 1\n\t" \
- ".type _L_robust_timedlock_%=, @function\n" \
- "_L_robust_timedlock_%=:\n" \
- "1:\tlea %4, %%" RDI_LP "\n" \
- "0:\tmov %8, %%" RDX_LP "\n" \
- "2:\tsub $128, %%" RSP_LP "\n" \
- "3:\tcallq __lll_robust_timedlock_wait\n" \
- "4:\tadd $128, %%" RSP_LP "\n" \
- "5:\tjmp 24f\n" \
- "6:\t.size _L_robust_timedlock_%=, 6b-1b\n\t" \
- ".previous\n" \
- LLL_STUB_UNWIND_INFO_6 \
- "24:" \
- : "=a" (result), "=D" (ignore1), "=S" (ignore2), \
- "=&d" (ignore3), "=m" (futex) \
- : "0" (0), "1" (id), "m" (futex), "m" (timeout), \
- "2" (private) \
- : "memory", "cx", "cc", "r10", "r11"); \
- result; })
-
-#if defined NOT_IN_libc || defined UP
-# define __lll_unlock_asm_start LOCK_INSTR "decl %0\n\t" \
- "jne 1f\n\t"
-#else
-# define __lll_unlock_asm_start "cmpl $0, __libc_multiple_threads(%%rip)\n\t" \
- "je 0f\n\t" \
- "lock; decl %0\n\t" \
- "jne 1f\n\t" \
- "jmp 24f\n\t" \
- "0:\tdecl %0\n\t" \
- "jne 1f\n\t"
-#endif
-
-#define lll_unlock(futex, private) \
- (void) \
- ({ int ignore; \
- if (__builtin_constant_p (private) && (private) == LLL_PRIVATE) \
- __asm __volatile (__lll_unlock_asm_start \
- ".subsection 1\n\t" \
- ".type _L_unlock_%=, @function\n" \
- "_L_unlock_%=:\n" \
- "1:\tlea %0, %%" RDI_LP "\n" \
- "2:\tsub $128, %%" RSP_LP "\n" \
- "3:\tcallq __lll_unlock_wake_private\n" \
- "4:\tadd $128, %%" RSP_LP "\n" \
- "5:\tjmp 24f\n" \
- "6:\t.size _L_unlock_%=, 6b-1b\n\t" \
- ".previous\n" \
- LLL_STUB_UNWIND_INFO_5 \
- "24:" \
- : "=m" (futex), "=&D" (ignore) \
- : "m" (futex) \
- : "ax", "cx", "r11", "cc", "memory"); \
- else \
- __asm __volatile (__lll_unlock_asm_start \
- ".subsection 1\n\t" \
- ".type _L_unlock_%=, @function\n" \
- "_L_unlock_%=:\n" \
- "1:\tlea %0, %%" RDI_LP "\n" \
- "2:\tsub $128, %%" RSP_LP "\n" \
- "3:\tcallq __lll_unlock_wake\n" \
- "4:\tadd $128, %%" RSP_LP "\n" \
- "5:\tjmp 24f\n" \
- "6:\t.size _L_unlock_%=, 6b-1b\n\t" \
- ".previous\n" \
- LLL_STUB_UNWIND_INFO_5 \
- "24:" \
- : "=m" (futex), "=&D" (ignore) \
- : "m" (futex), "S" (private) \
- : "ax", "cx", "r11", "cc", "memory"); \
- })
-
-#define lll_robust_unlock(futex, private) \
- do \
- { \
- int ignore; \
- __asm __volatile (LOCK_INSTR "andl %2, %0\n\t" \
- "jne 1f\n\t" \
- ".subsection 1\n\t" \
- ".type _L_robust_unlock_%=, @function\n" \
- "_L_robust_unlock_%=:\n" \
- "1:\tlea %0, %%" RDI_LP "\n" \
- "2:\tsub $128, %%" RSP_LP "\n" \
- "3:\tcallq __lll_unlock_wake\n" \
- "4:\tadd $128, %%" RSP_LP "\n" \
- "5:\tjmp 24f\n" \
- "6:\t.size _L_robust_unlock_%=, 6b-1b\n\t" \
- ".previous\n" \
- LLL_STUB_UNWIND_INFO_5 \
- "24:" \
- : "=m" (futex), "=&D" (ignore) \
- : "i" (FUTEX_WAITERS), "m" (futex), \
- "S" (private) \
- : "ax", "cx", "r11", "cc", "memory"); \
- } \
- while (0)
-
-#define lll_robust_dead(futex, private) \
- do \
- { \
- int ignore; \
- __asm __volatile (LOCK_INSTR "orl %3, (%2)\n\t" \
- "syscall" \
- : "=m" (futex), "=a" (ignore) \
- : "D" (&(futex)), "i" (FUTEX_OWNER_DIED), \
- "S" (__lll_private_flag (FUTEX_WAKE, private)), \
- "1" (__NR_futex), "d" (1) \
- : "cx", "r11", "cc", "memory"); \
- } \
- while (0)
-
-/* Returns non-zero if error happened, zero if success. */
-#define lll_futex_requeue(ftx, nr_wake, nr_move, mutex, val, private) \
- ({ int __res; \
- register int __nr_move __asm ("r10") = nr_move; \
- register void *__mutex __asm ("r8") = mutex; \
- register int __val __asm ("r9") = val; \
- __asm __volatile ("syscall" \
- : "=a" (__res) \
- : "0" (__NR_futex), "D" ((void *) ftx), \
- "S" (__lll_private_flag (FUTEX_CMP_REQUEUE, \
- private)), "d" (nr_wake), \
- "r" (__nr_move), "r" (__mutex), "r" (__val) \
- : "cx", "r11", "cc", "memory"); \
- __res < 0; })
-
-#define lll_islocked(futex) \
- (futex != LLL_LOCK_INITIALIZER)
-
-
-/* The kernel notifies a process which uses CLONE_CHILD_CLEARTID via futex
- wakeup when the clone terminates. The memory location contains the
- thread ID while the clone is running and is reset to zero
- afterwards.
-
- The macro parameter must not have any side effect. */
-#define lll_wait_tid(tid) \
- do { \
- int __ignore; \
- register __typeof (tid) _tid asm ("edx") = (tid); \
- if (_tid != 0) \
- __asm __volatile ("xorq %%r10, %%r10\n\t" \
- "1:\tmovq %2, %%rax\n\t" \
- "syscall\n\t" \
- "cmpl $0, (%%rdi)\n\t" \
- "jne 1b" \
- : "=&a" (__ignore) \
- : "S" (FUTEX_WAIT), "i" (SYS_futex), "D" (&tid), \
- "d" (_tid) \
- : "memory", "cc", "r10", "r11", "cx"); \
- } while (0)
-
-extern int __lll_timedwait_tid (int *tid, const struct timespec *abstime)
- attribute_hidden;
-#define lll_timedwait_tid(tid, abstime) \
- ({ \
- 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; })
-
-#endif /* !__ASSEMBLER__ */
-
-#endif /* lowlevellock.h */
More information about the Glibc-bsd-commits
mailing list