summaryrefslogtreecommitdiffstats
path: root/po/es/man2/futex.2.po
diff options
context:
space:
mode:
Diffstat (limited to 'po/es/man2/futex.2.po')
-rw-r--r--po/es/man2/futex.2.po3072
1 files changed, 3072 insertions, 0 deletions
diff --git a/po/es/man2/futex.2.po b/po/es/man2/futex.2.po
new file mode 100644
index 00000000..46991e2a
--- /dev/null
+++ b/po/es/man2/futex.2.po
@@ -0,0 +1,3072 @@
+# Spanish translation of manpages
+# This file is distributed under the same license as the manpages-l10n package.
+# Copyright © of this file:
+# Juan Piernas <piernas@ditec.um.es>, 2005.
+msgid ""
+msgstr ""
+"Project-Id-Version: manpages-l10n\n"
+"POT-Creation-Date: 2024-03-01 16:56+0100\n"
+"PO-Revision-Date: 2021-01-30 16:24+0100\n"
+"Last-Translator: Juan Piernas <piernas@ditec.um.es>\n"
+"Language-Team: Spanish <debian-l10n-spanish@lists.debian.org>\n"
+"Language: es\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Generator: Lokalize 20.04.1\n"
+
+#. type: TH
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+#, no-wrap
+msgid "futex"
+msgstr ""
+
+#. type: TH
+#: archlinux fedora-40 fedora-rawhide mageia-cauldron
+#, no-wrap
+msgid "2023-10-31"
+msgstr "31 Octubre 2023"
+
+#. type: TH
+#: archlinux fedora-40 fedora-rawhide mageia-cauldron
+#, no-wrap
+msgid "Linux man-pages 6.06"
+msgstr "Páginas de manual de Linux 6.06"
+
+#. type: SH
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+#, no-wrap
+msgid "NAME"
+msgstr "NOMBRE"
+
+#. type: Plain text
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+msgid "futex - fast user-space locking"
+msgstr "futex - bloqueos rápidos en espacio de usuario"
+
+#. type: SH
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+#, no-wrap
+msgid "LIBRARY"
+msgstr "BIBLIOTECA"
+
+#. type: Plain text
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+msgid "Standard C library (I<libc>, I<-lc>)"
+msgstr "Biblioteca Estándar C (I<libc>, I<-lc>)"
+
+#. type: SH
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+#, no-wrap
+msgid "SYNOPSIS"
+msgstr "SINOPSIS"
+
+#. type: Plain text
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+#, fuzzy, no-wrap
+#| msgid ""
+#| "B<#include E<lt>linux/futex.hE<gt>>\n"
+#| "B<#include E<lt>stdint.hE<gt>>\n"
+#| "B<#include E<lt>sys/time.hE<gt>>\n"
+msgid ""
+"B<#include E<lt>linux/futex.hE<gt>> /* Definition of B<FUTEX_*> constants */\n"
+"B<#include E<lt>sys/syscall.hE<gt>> /* Definition of B<SYS_*> constants */\n"
+"B<#include E<lt>unistd.hE<gt>>\n"
+msgstr ""
+"B<#include E<lt>linux/futex.hE<gt>>\n"
+"B<#include E<lt>stdint.hE<gt>>\n"
+"B<#include E<lt>sys/time.hE<gt>>\n"
+
+#. type: Plain text
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+#, fuzzy, no-wrap
+#| msgid ""
+#| "B<int futex(int *>I<uaddr>B<, int >I<futex_op>B<, int >I<val>B<,>\n"
+#| "B< const struct timespec *>I<timeout>B<,>I< > /* or: B<uint32_t >I<val2>B< */>\n"
+#| "B< int *>I<uaddr2>B<, int >I<val3>B<);>\n"
+msgid ""
+"B<long syscall(SYS_futex, uint32_t *>I<uaddr>B<, int >I<futex_op>B<, uint32_t >I<val>B<,>\n"
+"B< const struct timespec *>I<timeout>B<,>I< > /* or: B<uint32_t >I<val2>B< */>\n"
+"B< uint32_t *>I<uaddr2>B<, uint32_t >I<val3>B<);>\n"
+msgstr ""
+"B<int futex(int *>I<uaddr>B<, int >I<futex_op>B<, int >I<val>B<,>\n"
+"B< const struct timespec *>I<timeout>B<,>I< > /* or: B<uint32_t >I<val2>B< */>\n"
+"B< int *>I<uaddr2>B<, int >I<val3>B<);>\n"
+
+#. type: Plain text
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+msgid ""
+"I<Note>: glibc provides no wrapper for B<futex>(), necessitating the use of "
+"B<syscall>(2)."
+msgstr ""
+
+#. type: SH
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+#, no-wrap
+msgid "DESCRIPTION"
+msgstr "DESCRIPCIÓN"
+
+#. type: Plain text
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+msgid ""
+"The B<futex>() system call provides a method for waiting until a certain "
+"condition becomes true. It is typically used as a blocking construct in the "
+"context of shared-memory synchronization. When using futexes, the majority "
+"of the synchronization operations are performed in user space. A user-space "
+"program employs the B<futex>() system call only when it is likely that the "
+"program has to block for a longer time until the condition becomes true. "
+"Other B<futex>() operations can be used to wake any processes or threads "
+"waiting for a particular condition."
+msgstr ""
+
+#. type: Plain text
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+msgid ""
+"A futex is a 32-bit value\\[em]referred to below as a I<futex "
+"word>\\[em]whose address is supplied to the B<futex>() system call. "
+"(Futexes are 32 bits in size on all platforms, including 64-bit systems.) "
+"All futex operations are governed by this value. In order to share a futex "
+"between processes, the futex is placed in a region of shared memory, created "
+"using (for example) B<mmap>(2) or B<shmat>(2). (Thus, the futex word may "
+"have different virtual addresses in different processes, but these addresses "
+"all refer to the same location in physical memory.) In a multithreaded "
+"program, it is sufficient to place the futex word in a global variable "
+"shared by all threads."
+msgstr ""
+
+#
+#. Notes from Darren Hart (Dec 2015):
+#. Totally ordered with respect futex operations refers to semantics
+#. of the ACQUIRE/RELEASE operations and how they impact ordering of
+#. memory reads and writes. The kernel futex operations are protected
+#. by spinlocks, which ensure that all operations are serialized
+#. with respect to one another.
+#. This is a lot to attempt to define in this document. Perhaps a
+#. reference to linux/Documentation/memory-barriers.txt as a footnote
+#. would be sufficient? Or perhaps for this manual, "serialized" would
+#. be sufficient, with a footnote regarding "totally ordered" and a
+#. pointer to the memory-barrier documentation?
+#. FIXME(Torvald Riegel):
+#. Eventually we want to have some text in NOTES to satisfy
+#. the reference in the following sentence
+#. See NOTES for a detailed specification of
+#. the synchronization semantics.
+#. type: Plain text
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+msgid ""
+"When executing a futex operation that requests to block a thread, the kernel "
+"will block only if the futex word has the value that the calling thread "
+"supplied (as one of the arguments of the B<futex>() call) as the expected "
+"value of the futex word. The loading of the futex word's value, the "
+"comparison of that value with the expected value, and the actual blocking "
+"will happen atomically and will be totally ordered with respect to "
+"concurrent operations performed by other threads on the same futex word. "
+"Thus, the futex word is used to connect the synchronization in user space "
+"with the implementation of blocking by the kernel. Analogously to an atomic "
+"compare-and-exchange operation that potentially changes shared memory, "
+"blocking via a futex is an atomic compare-and-block operation."
+msgstr ""
+
+#. type: Plain text
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+msgid ""
+"One use of futexes is for implementing locks. The state of the lock (i.e., "
+"acquired or not acquired) can be represented as an atomically accessed flag "
+"in shared memory. In the uncontended case, a thread can access or modify "
+"the lock state with atomic instructions, for example atomically changing it "
+"from not acquired to acquired using an atomic compare-and-exchange "
+"instruction. (Such instructions are performed entirely in user mode, and "
+"the kernel maintains no information about the lock state.) On the other "
+"hand, a thread may be unable to acquire a lock because it is already "
+"acquired by another thread. It then may pass the lock's flag as a futex "
+"word and the value representing the acquired state as the expected value to "
+"a B<futex>() wait operation. This B<futex>() operation will block if and "
+"only if the lock is still acquired (i.e., the value in the futex word still "
+"matches the \"acquired state\"). When releasing the lock, a thread has to "
+"first reset the lock state to not acquired and then execute a futex "
+"operation that wakes threads blocked on the lock flag used as a futex word "
+"(this can be further optimized to avoid unnecessary wake-ups). See "
+"B<futex>(7) for more detail on how to use futexes."
+msgstr ""
+
+#. type: Plain text
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+msgid ""
+"Besides the basic wait and wake-up futex functionality, there are further "
+"futex operations aimed at supporting more complex use cases."
+msgstr ""
+
+#. type: Plain text
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+msgid ""
+"Note that no explicit initialization or destruction is necessary to use "
+"futexes; the kernel maintains a futex (i.e., the kernel-internal "
+"implementation artifact) only while operations such as B<FUTEX_WAIT>, "
+"described below, are being performed on a particular futex word."
+msgstr ""
+
+#. type: SS
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+#, no-wrap
+msgid "Arguments"
+msgstr "Opciones"
+
+#. type: Plain text
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+msgid ""
+"The I<uaddr> argument points to the futex word. On all platforms, futexes "
+"are four-byte integers that must be aligned on a four-byte boundary. The "
+"operation to perform on the futex is specified in the I<futex_op> argument; "
+"I<val> is a value whose meaning and purpose depends on I<futex_op>."
+msgstr ""
+
+#. type: Plain text
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+msgid ""
+"The remaining arguments (I<timeout>, I<uaddr2>, and I<val3>) are required "
+"only for certain of the futex operations described below. Where one of "
+"these arguments is not required, it is ignored."
+msgstr ""
+
+#. type: Plain text
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+msgid ""
+"For several blocking operations, the I<timeout> argument is a pointer to a "
+"I<timespec> structure that specifies a timeout for the operation. However, "
+"notwithstanding the prototype shown above, for some operations, the least "
+"significant four bytes of this argument are instead used as an integer whose "
+"meaning is determined by the operation. For these operations, the kernel "
+"casts the I<timeout> value first to I<unsigned long>, then to I<uint32_t>, "
+"and in the remainder of this page, this argument is referred to as I<val2> "
+"when interpreted in this fashion."
+msgstr ""
+
+#. type: Plain text
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+msgid ""
+"Where it is required, the I<uaddr2> argument is a pointer to a second futex "
+"word that is employed by the operation."
+msgstr ""
+
+#
+#. """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+#. type: Plain text
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+msgid ""
+"The interpretation of the final integer argument, I<val3>, depends on the "
+"operation."
+msgstr ""
+
+#. type: SS
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+#, no-wrap
+msgid "Futex operations"
+msgstr ""
+
+#. type: Plain text
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+msgid ""
+"The I<futex_op> argument consists of two parts: a command that specifies the "
+"operation to be performed, bitwise ORed with zero or more options that "
+"modify the behaviour of the operation. The options that may be included in "
+"I<futex_op> are as follows:"
+msgstr ""
+
+#. type: TP
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+#, no-wrap
+msgid "B<FUTEX_PRIVATE_FLAG> (since Linux 2.6.22)"
+msgstr "B<FUTEX_PRIVATE_FLAG> (desde Linux 2.6.22)"
+
+#. commit 34f01cc1f512fa783302982776895c73714ebbc2
+#. I.e., It allows the kernel choose the fast path for validating
+#. the user-space address and avoids expensive VMA lookups,
+#. taking reference counts on file backing store, and so on.
+#. type: Plain text
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+msgid ""
+"This option bit can be employed with all futex operations. It tells the "
+"kernel that the futex is process-private and not shared with another process "
+"(i.e., it is being used for synchronization only between threads of the same "
+"process). This allows the kernel to make some additional performance "
+"optimizations."
+msgstr ""
+
+#. except the obsolete FUTEX_FD, for which the "private" flag was
+#. meaningless
+#. type: Plain text
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+msgid ""
+"As a convenience, I<E<lt>linux/futex.hE<gt>> defines a set of constants with "
+"the suffix B<_PRIVATE> that are equivalents of all of the operations listed "
+"below, but with the B<FUTEX_PRIVATE_FLAG> ORed into the constant value. "
+"Thus, there are B<FUTEX_WAIT_PRIVATE>, B<FUTEX_WAKE_PRIVATE>, and so on."
+msgstr ""
+
+#. type: TP
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+#, no-wrap
+msgid "B<FUTEX_CLOCK_REALTIME> (since Linux 2.6.28)"
+msgstr "B<FUTEX_CLOCK_REALTIME> (desde Linux 2.6.28)"
+
+#. commit 1acdac104668a0834cfa267de9946fac7764d486
+#. commit 337f13046ff03717a9e99675284a817527440a49
+#. commit bf22a6976897977b0a3f1aeba6823c959fc4fdae
+#. type: Plain text
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+msgid ""
+"This option bit can be employed only with the B<FUTEX_WAIT_BITSET>, "
+"B<FUTEX_WAIT_REQUEUE_PI>, (since Linux 4.5) B<FUTEX_WAIT>, and (since Linux "
+"5.14) B<FUTEX_LOCK_PI2> operations."
+msgstr ""
+
+#. type: Plain text
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+msgid ""
+"If this option is set, the kernel measures the I<timeout> against the "
+"B<CLOCK_REALTIME> clock."
+msgstr ""
+
+#. type: Plain text
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+msgid ""
+"If this option is not set, the kernel measures the I<timeout> against the "
+"B<CLOCK_MONOTONIC> clock."
+msgstr ""
+
+#
+#. """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+#. type: Plain text
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+msgid "The operation specified in I<futex_op> is one of the following:"
+msgstr ""
+
+#. type: TP
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+#, no-wrap
+msgid "B<FUTEX_WAIT> (since Linux 2.6.0)"
+msgstr "B<FUTEX_WAIT> (desde Linux 2.6.0)"
+
+#. Strictly speaking, since some time in Linux 2.5.x
+#. FIXME: Torvald, I think we may need to add some explanation of
+#. "totally ordered" here.
+#. type: Plain text
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+msgid ""
+"This operation tests that the value at the futex word pointed to by the "
+"address I<uaddr> still contains the expected value I<val>, and if so, then "
+"sleeps waiting for a B<FUTEX_WAKE> operation on the futex word. The load of "
+"the value of the futex word is an atomic memory access (i.e., using atomic "
+"machine instructions of the respective architecture). This load, the "
+"comparison with the expected value, and starting to sleep are performed "
+"atomically and totally ordered with respect to other futex operations on the "
+"same futex word. If the thread starts to sleep, it is considered a waiter "
+"on this futex word. If the futex value does not match I<val>, then the call "
+"fails immediately with the error B<EAGAIN>."
+msgstr ""
+
+#. type: Plain text
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+msgid ""
+"The purpose of the comparison with the expected value is to prevent lost "
+"wake-ups. If another thread changed the value of the futex word after the "
+"calling thread decided to block based on the prior value, and if the other "
+"thread executed a B<FUTEX_WAKE> operation (or similar wake-up) after the "
+"value change and before this B<FUTEX_WAIT> operation, then the calling "
+"thread will observe the value change and will not start to sleep."
+msgstr ""
+
+#. type: Plain text
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+msgid ""
+"If the I<timeout> is not NULL, the structure it points to specifies a "
+"timeout for the wait. (This interval will be rounded up to the system clock "
+"granularity, and is guaranteed not to expire early.) The timeout is by "
+"default measured according to the B<CLOCK_MONOTONIC> clock, but, since Linux "
+"4.5, the B<CLOCK_REALTIME> clock can be selected by specifying "
+"B<FUTEX_CLOCK_REALTIME> in I<futex_op>. If I<timeout> is NULL, the call "
+"blocks indefinitely."
+msgstr ""
+
+#. type: Plain text
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+msgid ""
+"I<Note>: for B<FUTEX_WAIT>, I<timeout> is interpreted as a I<relative> "
+"value. This differs from other futex operations, where I<timeout> is "
+"interpreted as an absolute value. To obtain the equivalent of B<FUTEX_WAIT> "
+"with an absolute timeout, employ B<FUTEX_WAIT_BITSET> with I<val3> specified "
+"as B<FUTEX_BITSET_MATCH_ANY>."
+msgstr ""
+
+#
+#
+#. FIXME . (Torvald) I think we should remove this. Or maybe adapt to a
+#. different example.
+#. For
+#. .BR futex (7),
+#. this call is executed if decrementing the count gave a negative value
+#. (indicating contention),
+#. and will sleep until another process or thread releases
+#. the futex and executes the
+#. .B FUTEX_WAKE
+#. operation.
+#. """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+#. type: Plain text
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+msgid "The arguments I<uaddr2> and I<val3> are ignored."
+msgstr ""
+
+#. type: TP
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+#, no-wrap
+msgid "B<FUTEX_WAKE> (since Linux 2.6.0)"
+msgstr "B<FUTEX_WAKE> (desde Linux 2.6.0)"
+
+#. Strictly speaking, since Linux 2.5.x
+#. type: Plain text
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+msgid ""
+"This operation wakes at most I<val> of the waiters that are waiting (e.g., "
+"inside B<FUTEX_WAIT>) on the futex word at the address I<uaddr>. Most "
+"commonly, I<val> is specified as either 1 (wake up a single waiter) or "
+"B<INT_MAX> (wake up all waiters). No guarantee is provided about which "
+"waiters are awoken (e.g., a waiter with a higher scheduling priority is not "
+"guaranteed to be awoken in preference to a waiter with a lower priority)."
+msgstr ""
+
+#
+#
+#
+#. type: Plain text
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+msgid "The arguments I<timeout>, I<uaddr2>, and I<val3> are ignored."
+msgstr ""
+
+#. type: TP
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+#, no-wrap
+msgid "B<FUTEX_FD> (from Linux 2.6.0 up to and including Linux 2.6.25)"
+msgstr ""
+
+#. Strictly speaking, from Linux 2.5.x to Linux 2.6.25
+#. type: Plain text
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+msgid ""
+"This operation creates a file descriptor that is associated with the futex "
+"at I<uaddr>. The caller must close the returned file descriptor after use. "
+"When another process or thread performs a B<FUTEX_WAKE> on the futex word, "
+"the file descriptor indicates as being readable with B<select>(2), "
+"B<poll>(2), and B<epoll>(7)"
+msgstr ""
+
+#. type: Plain text
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+msgid ""
+"The file descriptor can be used to obtain asynchronous notifications: if "
+"I<val> is nonzero, then, when another process or thread executes a "
+"B<FUTEX_WAKE>, the caller will receive the signal number that was passed in "
+"I<val>."
+msgstr ""
+
+#
+#. commit 82af7aca56c67061420d618cc5a30f0fd4106b80
+#. """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+#. type: Plain text
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+msgid ""
+"Because it was inherently racy, B<FUTEX_FD> has been removed from Linux "
+"2.6.26 onward."
+msgstr ""
+
+#. type: TP
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+#, no-wrap
+msgid "B<FUTEX_REQUEUE> (since Linux 2.6.0)"
+msgstr "B<FUTEX_REQUEUE> (desde Linux 2.6.0)"
+
+#
+#. """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+#. type: Plain text
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+msgid ""
+"This operation performs the same task as B<FUTEX_CMP_REQUEUE> (see below), "
+"except that no check is made using the value in I<val3>. (The argument "
+"I<val3> is ignored.)"
+msgstr ""
+
+#. type: TP
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+#, no-wrap
+msgid "B<FUTEX_CMP_REQUEUE> (since Linux 2.6.7)"
+msgstr "B<FUTEX_CMP_REQUEUE> (desde Linux 2.6.7)"
+
+#. type: Plain text
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+msgid ""
+"This operation first checks whether the location I<uaddr> still contains the "
+"value I<val3>. If not, the operation fails with the error B<EAGAIN>. "
+"Otherwise, the operation wakes up a maximum of I<val> waiters that are "
+"waiting on the futex at I<uaddr>. If there are more than I<val> waiters, "
+"then the remaining waiters are removed from the wait queue of the source "
+"futex at I<uaddr> and added to the wait queue of the target futex at "
+"I<uaddr2>. The I<val2> argument specifies an upper limit on the number of "
+"waiters that are requeued to the futex at I<uaddr2>."
+msgstr ""
+
+#. FIXME(Torvald) Is the following correct? Or is just the decision
+#. which threads to wake or requeue part of the atomic operation?
+#. Notes from a f2f conversation with Thomas Gleixner (Aug 2015): ###
+#. The operation is serialized with respect to operations on both
+#. source and target futex. No other waiter can enqueue itself
+#. for waiting and no other waiter can dequeue itself because of
+#. a timeout or signal.
+#. type: Plain text
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+msgid ""
+"The load from I<uaddr> is an atomic memory access (i.e., using atomic "
+"machine instructions of the respective architecture). This load, the "
+"comparison with I<val3>, and the requeueing of any waiters are performed "
+"atomically and totally ordered with respect to other operations on the same "
+"futex word."
+msgstr ""
+
+#. type: Plain text
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+msgid ""
+"Typical values to specify for I<val> are 0 or 1. (Specifying B<INT_MAX> is "
+"not useful, because it would make the B<FUTEX_CMP_REQUEUE> operation "
+"equivalent to B<FUTEX_WAKE>.) The limit value specified via I<val2> is "
+"typically either 1 or B<INT_MAX>. (Specifying the argument as 0 is not "
+"useful, because it would make the B<FUTEX_CMP_REQUEUE> operation equivalent "
+"to B<FUTEX_WAIT>.)"
+msgstr ""
+
+#. But, as Rich Felker points out, there remain valid use cases for
+#. FUTEX_REQUEUE, for example, when the calling thread is requeuing
+#. the target(s) to a lock that the calling thread owns
+#. From: Rich Felker <dalias@libc.org>
+#. Date: Wed, 29 Oct 2014 22:43:17 -0400
+#. To: Darren Hart <dvhart@infradead.org>
+#. CC: libc-alpha@sourceware.org, ...
+#. Subject: Re: Add futex wrapper to glibc?
+#. type: Plain text
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+msgid ""
+"The B<FUTEX_CMP_REQUEUE> operation was added as a replacement for the "
+"earlier B<FUTEX_REQUEUE>. The difference is that the check of the value at "
+"I<uaddr> can be used to ensure that requeueing happens only under certain "
+"conditions, which allows race conditions to be avoided in certain use cases."
+msgstr ""
+
+#. type: Plain text
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+msgid ""
+"Both B<FUTEX_REQUEUE> and B<FUTEX_CMP_REQUEUE> can be used to avoid "
+"\"thundering herd\" wake-ups that could occur when using B<FUTEX_WAKE> in "
+"cases where all of the waiters that are woken need to acquire another "
+"futex. Consider the following scenario, where multiple waiter threads are "
+"waiting on B, a wait queue implemented using a futex:"
+msgstr ""
+
+#. type: Plain text
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+#, no-wrap
+msgid ""
+"lock(A)\n"
+"while (!check_value(V)) {\n"
+" unlock(A);\n"
+" block_on(B);\n"
+" lock(A);\n"
+"};\n"
+"unlock(A);\n"
+msgstr ""
+"lock(A)\n"
+"while (!check_value(V)) {\n"
+" unlock(A);\n"
+" block_on(B);\n"
+" lock(A);\n"
+"};\n"
+"unlock(A);\n"
+
+#
+#. """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+#. type: Plain text
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+msgid ""
+"If a waker thread used B<FUTEX_WAKE>, then all waiters waiting on B would be "
+"woken up, and they would all try to acquire lock A. However, waking all of "
+"the threads in this manner would be pointless because all except one of the "
+"threads would immediately block on lock A again. By contrast, a requeue "
+"operation wakes just one waiter and moves the other waiters to lock A, and "
+"when the woken waiter unlocks A then the next waiter can proceed."
+msgstr ""
+
+#. type: TP
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+#, no-wrap
+msgid "B<FUTEX_WAKE_OP> (since Linux 2.6.14)"
+msgstr "B<FUTEX_WAKE_OP> (desde Linux 2.6.14)"
+
+#. commit 4732efbeb997189d9f9b04708dc26bf8613ed721
+#. Author: Jakub Jelinek <jakub@redhat.com>
+#. Date: Tue Sep 6 15:16:25 2005 -0700
+#. FIXME. (Torvald) The glibc condvar implementation is currently being
+#. revised (e.g., to not use an internal lock anymore).
+#. It is probably more future-proof to remove this paragraph.
+#. [Torvald, do you have an update here?]
+#. type: Plain text
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+msgid ""
+"This operation was added to support some user-space use cases where more "
+"than one futex must be handled at the same time. The most notable example "
+"is the implementation of B<pthread_cond_signal>(3), which requires "
+"operations on two futexes, the one used to implement the mutex and the one "
+"used in the implementation of the wait queue associated with the condition "
+"variable. B<FUTEX_WAKE_OP> allows such cases to be implemented without "
+"leading to high rates of contention and context switching."
+msgstr ""
+
+#. type: Plain text
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+msgid ""
+"The B<FUTEX_WAKE_OP> operation is equivalent to executing the following code "
+"atomically and totally ordered with respect to other futex operations on any "
+"of the two supplied futex words:"
+msgstr ""
+
+#. type: Plain text
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+#, fuzzy, no-wrap
+#| msgid ""
+#| "int oldval = *(int *) uaddr2;\n"
+#| "*(int *) uaddr2 = oldval I<op> I<oparg>;\n"
+#| "futex(uaddr, FUTEX_WAKE, val, 0, 0, 0);\n"
+#| "if (oldval I<cmp> I<cmparg>)\n"
+#| " futex(uaddr2, FUTEX_WAKE, val2, 0, 0, 0);\n"
+msgid ""
+"uint32_t oldval = *(uint32_t *) uaddr2;\n"
+"*(uint32_t *) uaddr2 = oldval I<op> I<oparg>;\n"
+"futex(uaddr, FUTEX_WAKE, val, 0, 0, 0);\n"
+"if (oldval I<cmp> I<cmparg>)\n"
+" futex(uaddr2, FUTEX_WAKE, val2, 0, 0, 0);\n"
+msgstr ""
+"int oldval = *(int *) uaddr2;\n"
+"*(int *) uaddr2 = oldval I<op> I<oparg>;\n"
+"futex(uaddr, FUTEX_WAKE, val, 0, 0, 0);\n"
+"if (oldval I<cmp> I<cmparg>)\n"
+" futex(uaddr2, FUTEX_WAKE, val2, 0, 0, 0);\n"
+
+#. type: Plain text
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+msgid "In other words, B<FUTEX_WAKE_OP> does the following:"
+msgstr ""
+
+#. type: IP
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+#, no-wrap
+msgid "\\[bu]"
+msgstr "\\[bu]"
+
+#. type: Plain text
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+msgid ""
+"saves the original value of the futex word at I<uaddr2> and performs an "
+"operation to modify the value of the futex at I<uaddr2>; this is an atomic "
+"read-modify-write memory access (i.e., using atomic machine instructions of "
+"the respective architecture)"
+msgstr ""
+
+#. type: Plain text
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+msgid ""
+"wakes up a maximum of I<val> waiters on the futex for the futex word at "
+"I<uaddr>; and"
+msgstr ""
+
+#. type: Plain text
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+msgid ""
+"dependent on the results of a test of the original value of the futex word "
+"at I<uaddr2>, wakes up a maximum of I<val2> waiters on the futex for the "
+"futex word at I<uaddr2>."
+msgstr ""
+
+#. type: Plain text
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+msgid ""
+"The operation and comparison that are to be performed are encoded in the "
+"bits of the argument I<val3>. Pictorially, the encoding is:"
+msgstr ""
+
+#. type: Plain text
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+#, no-wrap
+msgid ""
+"+---+---+-----------+-----------+\n"
+"|op |cmp| oparg | cmparg |\n"
+"+---+---+-----------+-----------+\n"
+" 4 4 12 12 E<lt>== # of bits\n"
+msgstr ""
+
+#. type: Plain text
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+msgid "Expressed in code, the encoding is:"
+msgstr ""
+
+#. type: Plain text
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+#, no-wrap
+msgid ""
+"#define FUTEX_OP(op, oparg, cmp, cmparg) \\e\n"
+" (((op & 0xf) E<lt>E<lt> 28) | \\e\n"
+" ((cmp & 0xf) E<lt>E<lt> 24) | \\e\n"
+" ((oparg & 0xfff) E<lt>E<lt> 12) | \\e\n"
+" (cmparg & 0xfff))\n"
+msgstr ""
+"#define FUTEX_OP(op, oparg, cmp, cmparg) \\e\n"
+" (((op & 0xf) E<lt>E<lt> 28) | \\e\n"
+" ((cmp & 0xf) E<lt>E<lt> 24) | \\e\n"
+" ((oparg & 0xfff) E<lt>E<lt> 12) | \\e\n"
+" (cmparg & 0xfff))\n"
+
+#. type: Plain text
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+msgid ""
+"In the above, I<op> and I<cmp> are each one of the codes listed below. The "
+"I<oparg> and I<cmparg> components are literal numeric values, except as "
+"noted below."
+msgstr ""
+
+#. type: Plain text
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+msgid "The I<op> component has one of the following values:"
+msgstr ""
+
+#. type: Plain text
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+#, fuzzy, no-wrap
+#| msgid ""
+#| "FUTEX_OP_SET 0 /* uaddr2 = oparg; */\n"
+#| "FUTEX_OP_ADD 1 /* uaddr2 += oparg; */\n"
+#| "FUTEX_OP_OR 2 /* uaddr2 |= oparg; */\n"
+#| "FUTEX_OP_ANDN 3 /* uaddr2 &= \\(tioparg; */\n"
+#| "FUTEX_OP_XOR 4 /* uaddr2 \\(ha= oparg; */\n"
+msgid ""
+"FUTEX_OP_SET 0 /* uaddr2 = oparg; */\n"
+"FUTEX_OP_ADD 1 /* uaddr2 += oparg; */\n"
+"FUTEX_OP_OR 2 /* uaddr2 |= oparg; */\n"
+"FUTEX_OP_ANDN 3 /* uaddr2 &= \\[ti]oparg; */\n"
+"FUTEX_OP_XOR 4 /* uaddr2 \\[ha]= oparg; */\n"
+msgstr ""
+"FUTEX_OP_SET 0 /* uaddr2 = oparg; */\n"
+"FUTEX_OP_ADD 1 /* uaddr2 += oparg; */\n"
+"FUTEX_OP_OR 2 /* uaddr2 |= oparg; */\n"
+"FUTEX_OP_ANDN 3 /* uaddr2 &= \\(tioparg; */\n"
+"FUTEX_OP_XOR 4 /* uaddr2 \\(ha= oparg; */\n"
+
+#. type: Plain text
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+msgid ""
+"In addition, bitwise ORing the following value into I<op> causes "
+"I<(1\\~E<lt>E<lt>\\~oparg)> to be used as the operand:"
+msgstr ""
+
+#. type: Plain text
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+#, no-wrap
+msgid "FUTEX_OP_ARG_SHIFT 8 /* Use (1 E<lt>E<lt> oparg) as operand */\n"
+msgstr ""
+
+#. type: Plain text
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+msgid "The I<cmp> field is one of the following:"
+msgstr ""
+
+#. type: Plain text
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+#, no-wrap
+msgid ""
+"FUTEX_OP_CMP_EQ 0 /* if (oldval == cmparg) wake */\n"
+"FUTEX_OP_CMP_NE 1 /* if (oldval != cmparg) wake */\n"
+"FUTEX_OP_CMP_LT 2 /* if (oldval E<lt> cmparg) wake */\n"
+"FUTEX_OP_CMP_LE 3 /* if (oldval E<lt>= cmparg) wake */\n"
+"FUTEX_OP_CMP_GT 4 /* if (oldval E<gt> cmparg) wake */\n"
+"FUTEX_OP_CMP_GE 5 /* if (oldval E<gt>= cmparg) wake */\n"
+msgstr ""
+"FUTEX_OP_CMP_EQ 0 /* if (oldval == cmparg) wake */\n"
+"FUTEX_OP_CMP_NE 1 /* if (oldval != cmparg) wake */\n"
+"FUTEX_OP_CMP_LT 2 /* if (oldval E<lt> cmparg) wake */\n"
+"FUTEX_OP_CMP_LE 3 /* if (oldval E<lt>= cmparg) wake */\n"
+"FUTEX_OP_CMP_GT 4 /* if (oldval E<gt> cmparg) wake */\n"
+"FUTEX_OP_CMP_GE 5 /* if (oldval E<gt>= cmparg) wake */\n"
+
+#
+#. """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+#. type: Plain text
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+msgid ""
+"The return value of B<FUTEX_WAKE_OP> is the sum of the number of waiters "
+"woken on the futex I<uaddr> plus the number of waiters woken on the futex "
+"I<uaddr2>."
+msgstr ""
+
+#. type: TP
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+#, no-wrap
+msgid "B<FUTEX_WAIT_BITSET> (since Linux 2.6.25)"
+msgstr "B<FUTEX_WAIT_BITSET> (desde Linux 2.6.25)"
+
+#. commit cd689985cf49f6ff5c8eddc48d98b9d581d9475d
+#. type: Plain text
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+msgid ""
+"This operation is like B<FUTEX_WAIT> except that I<val3> is used to provide "
+"a 32-bit bit mask to the kernel. This bit mask, in which at least one bit "
+"must be set, is stored in the kernel-internal state of the waiter. See the "
+"description of B<FUTEX_WAKE_BITSET> for further details."
+msgstr ""
+
+#. type: Plain text
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+msgid ""
+"If I<timeout> is not NULL, the structure it points to specifies an absolute "
+"timeout for the wait operation. If I<timeout> is NULL, the operation can "
+"block indefinitely."
+msgstr ""
+
+#
+#. """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+#. type: Plain text
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+msgid "The I<uaddr2> argument is ignored."
+msgstr ""
+
+#. type: TP
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+#, no-wrap
+msgid "B<FUTEX_WAKE_BITSET> (since Linux 2.6.25)"
+msgstr "B<FUTEX_WAKE_BITSET> (desde Linux 2.6.25)"
+
+#. commit cd689985cf49f6ff5c8eddc48d98b9d581d9475d
+#. type: Plain text
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+msgid ""
+"This operation is the same as B<FUTEX_WAKE> except that the I<val3> argument "
+"is used to provide a 32-bit bit mask to the kernel. This bit mask, in which "
+"at least one bit must be set, is used to select which waiters should be "
+"woken up. The selection is done by a bitwise AND of the \"wake\" bit mask "
+"(i.e., the value in I<val3>) and the bit mask which is stored in the kernel-"
+"internal state of the waiter (the \"wait\" bit mask that is set using "
+"B<FUTEX_WAIT_BITSET>). All of the waiters for which the result of the AND "
+"is nonzero are woken up; the remaining waiters are left sleeping."
+msgstr ""
+
+#
+#
+#. According to http://locklessinc.com/articles/futex_cheat_sheet/:
+#. "The original reason for the addition of these extensions
+#. was to improve the performance of pthread read-write locks
+#. in glibc. However, the pthreads library no longer uses the
+#. same locking algorithm, and these extensions are not used
+#. without the bitset parameter being all ones.
+#. The page goes on to note that the FUTEX_WAIT_BITSET operation
+#. is nevertheless used (with a bit mask of all ones) in order to
+#. obtain the absolute timeout functionality that is useful
+#. for efficiently implementing Pthreads APIs (which use absolute
+#. timeouts); FUTEX_WAIT provides only relative timeouts.
+#. type: Plain text
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+msgid ""
+"The effect of B<FUTEX_WAIT_BITSET> and B<FUTEX_WAKE_BITSET> is to allow "
+"selective wake-ups among multiple waiters that are blocked on the same "
+"futex. However, note that, depending on the use case, employing this bit-"
+"mask multiplexing feature on a futex can be less efficient than simply using "
+"multiple futexes, because employing bit-mask multiplexing requires the "
+"kernel to check all waiters on a futex, including those that are not "
+"interested in being woken up (i.e., they do not have the relevant bit set in "
+"their \"wait\" bit mask)."
+msgstr ""
+
+#. type: Plain text
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+msgid ""
+"The constant B<FUTEX_BITSET_MATCH_ANY>, which corresponds to all 32 bits set "
+"in the bit mask, can be used as the I<val3> argument for "
+"B<FUTEX_WAIT_BITSET> and B<FUTEX_WAKE_BITSET>. Other than differences in "
+"the handling of the I<timeout> argument, the B<FUTEX_WAIT> operation is "
+"equivalent to B<FUTEX_WAIT_BITSET> with I<val3> specified as "
+"B<FUTEX_BITSET_MATCH_ANY>; that is, allow a wake-up by any waker. The "
+"B<FUTEX_WAKE> operation is equivalent to B<FUTEX_WAKE_BITSET> with I<val3> "
+"specified as B<FUTEX_BITSET_MATCH_ANY>; that is, wake up any waiter(s)."
+msgstr ""
+
+#
+#. """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+#. type: Plain text
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+msgid "The I<uaddr2> and I<timeout> arguments are ignored."
+msgstr ""
+
+#. type: SS
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+#, no-wrap
+msgid "Priority-inheritance futexes"
+msgstr ""
+
+#. type: Plain text
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+msgid ""
+"Linux supports priority-inheritance (PI) futexes in order to handle priority-"
+"inversion problems that can be encountered with normal futex locks. "
+"Priority inversion is the problem that occurs when a high-priority task is "
+"blocked waiting to acquire a lock held by a low-priority task, while tasks "
+"at an intermediate priority continuously preempt the low-priority task from "
+"the CPU. Consequently, the low-priority task makes no progress toward "
+"releasing the lock, and the high-priority task remains blocked."
+msgstr ""
+
+#. type: Plain text
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+msgid ""
+"Priority inheritance is a mechanism for dealing with the priority-inversion "
+"problem. With this mechanism, when a high-priority task becomes blocked by "
+"a lock held by a low-priority task, the priority of the low-priority task is "
+"temporarily raised to that of the high-priority task, so that it is not "
+"preempted by any intermediate level tasks, and can thus make progress toward "
+"releasing the lock. To be effective, priority inheritance must be "
+"transitive, meaning that if a high-priority task blocks on a lock held by a "
+"lower-priority task that is itself blocked by a lock held by another "
+"intermediate-priority task (and so on, for chains of arbitrary length), then "
+"both of those tasks (or more generally, all of the tasks in a lock chain) "
+"have their priorities raised to be the same as the high-priority task."
+msgstr ""
+
+#
+#. Quoting Darren Hart:
+#. These opcodes paired with the PI futex value policy (described below)
+#. defines a "futex" as PI aware. These were created very specifically
+#. in support of PI pthread_mutexes, so it makes a lot more sense to
+#. talk about a PI aware pthread_mutex, than a PI aware futex, since
+#. there is a lot of policy and scaffolding that has to be built up
+#. around it to use it properly (this is what a PI pthread_mutex is).
+#. type: Plain text
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+msgid ""
+"From a user-space perspective, what makes a futex PI-aware is a policy "
+"agreement (described below) between user space and the kernel about the "
+"value of the futex word, coupled with the use of the PI-futex operations "
+"described below. (Unlike the other futex operations described above, the PI-"
+"futex operations are designed for the implementation of very specific IPC "
+"mechanisms.)"
+msgstr ""
+
+#. mtk: The following text is drawn from the Hart/Guniguntala paper
+#. (listed in SEE ALSO), but I have reworded some pieces
+#. significantly.
+#. type: Plain text
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+msgid ""
+"The PI-futex operations described below differ from the other futex "
+"operations in that they impose policy on the use of the value of the futex "
+"word:"
+msgstr ""
+
+#. type: Plain text
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+msgid "If the lock is not acquired, the futex word's value shall be 0."
+msgstr ""
+
+#. type: Plain text
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+msgid ""
+"If the lock is acquired, the futex word's value shall be the thread ID (TID; "
+"see B<gettid>(2)) of the owning thread."
+msgstr ""
+
+#. type: Plain text
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+msgid ""
+"If the lock is owned and there are threads contending for the lock, then the "
+"B<FUTEX_WAITERS> bit shall be set in the futex word's value; in other words, "
+"this value is:"
+msgstr ""
+
+#. type: Plain text
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+#, fuzzy, no-wrap
+#| msgid " FUTEX_WAITERS | TID\n"
+msgid "FUTEX_WAITERS | TID\n"
+msgstr " FUTEX_WAITERS | TID\n"
+
+#. type: Plain text
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+msgid ""
+"(Note that is invalid for a PI futex word to have no owner and "
+"B<FUTEX_WAITERS> set.)"
+msgstr ""
+
+#. type: Plain text
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+msgid ""
+"With this policy in place, a user-space application can acquire an "
+"unacquired lock or release a lock using atomic instructions executed in user "
+"mode (e.g., a compare-and-swap operation such as I<cmpxchg> on the x86 "
+"architecture). Acquiring a lock simply consists of using compare-and-swap "
+"to atomically set the futex word's value to the caller's TID if its previous "
+"value was 0. Releasing a lock requires using compare-and-swap to set the "
+"futex word's value to 0 if the previous value was the expected TID."
+msgstr ""
+
+#. type: Plain text
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+msgid ""
+"If a futex is already acquired (i.e., has a nonzero value), waiters must "
+"employ the B<FUTEX_LOCK_PI> or B<FUTEX_LOCK_PI2> operations to acquire the "
+"lock. If other threads are waiting for the lock, then the B<FUTEX_WAITERS> "
+"bit is set in the futex value; in this case, the lock owner must employ the "
+"B<FUTEX_UNLOCK_PI> operation to release the lock."
+msgstr ""
+
+#. type: Plain text
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+msgid ""
+"In the cases where callers are forced into the kernel (i.e., required to "
+"perform a B<futex>() call), they then deal directly with a so-called RT-"
+"mutex, a kernel locking mechanism which implements the required priority-"
+"inheritance semantics. After the RT-mutex is acquired, the futex value is "
+"updated accordingly, before the calling thread returns to user space."
+msgstr ""
+
+#. tglx (July 2015):
+#. If there are multiple waiters on a pi futex then a wake pi operation
+#. will wake the first waiter and hand over the lock to this waiter. This
+#. includes handing over the rtmutex which represents the futex in the
+#. kernel. The strict requirement is that the futex owner and the rtmutex
+#. owner must be the same, except for the update period which is
+#. serialized by the futex internal locking. That means the kernel must
+#. update the user-space value prior to returning to user space
+#. type: Plain text
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+msgid ""
+"It is important to note that the kernel will update the futex word's value "
+"prior to returning to user space. (This prevents the possibility of the "
+"futex word's value ending up in an invalid state, such as having an owner "
+"but the value being 0, or having waiters but not having the B<FUTEX_WAITERS> "
+"bit set.)"
+msgstr ""
+
+#. tglx (July 2015):
+#. The FUTEX_OWNER_DIED bit can also be set on uncontended futexes, where
+#. the kernel has no state associated. This happens via the robust futex
+#. mechanism. In that case the futex value will be set to
+#. FUTEX_OWNER_DIED. The robust futex mechanism is also available for non
+#. PI futexes.
+#. type: Plain text
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+msgid ""
+"If a futex has an associated RT-mutex in the kernel (i.e., there are blocked "
+"waiters) and the owner of the futex/RT-mutex dies unexpectedly, then the "
+"kernel cleans up the RT-mutex and hands it over to the next waiter. This in "
+"turn requires that the user-space value is updated accordingly. To indicate "
+"that this is required, the kernel sets the B<FUTEX_OWNER_DIED> bit in the "
+"futex word along with the thread ID of the new owner. User space can detect "
+"this situation via the presence of the B<FUTEX_OWNER_DIED> bit and is then "
+"responsible for cleaning up the stale state left over by the dead owner."
+msgstr ""
+
+#. type: Plain text
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+msgid ""
+"PI futexes are operated on by specifying one of the values listed below in "
+"I<futex_op>. Note that the PI futex operations must be used as paired "
+"operations and are subject to some additional requirements:"
+msgstr ""
+
+#. type: Plain text
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+msgid ""
+"B<FUTEX_LOCK_PI>, B<FUTEX_LOCK_PI2>, and B<FUTEX_TRYLOCK_PI> pair with "
+"B<FUTEX_UNLOCK_PI>. B<FUTEX_UNLOCK_PI> must be called only on a futex owned "
+"by the calling thread, as defined by the value policy, otherwise the error "
+"B<EPERM> results."
+msgstr ""
+
+#. type: Plain text
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+msgid ""
+"B<FUTEX_WAIT_REQUEUE_PI> pairs with B<FUTEX_CMP_REQUEUE_PI>. This must be "
+"performed from a non-PI futex to a distinct PI futex (or the error B<EINVAL> "
+"results). Additionally, I<val> (the number of waiters to be woken) must be "
+"1 (or the error B<EINVAL> results)."
+msgstr ""
+
+#
+#. """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+#. type: Plain text
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+msgid "The PI futex operations are as follows:"
+msgstr ""
+
+#. type: TP
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+#, no-wrap
+msgid "B<FUTEX_LOCK_PI> (since Linux 2.6.18)"
+msgstr "B<FUTEX_LOCK_PI> (desde Linux 2.6.18)"
+
+#. commit c87e2837be82df479a6bae9f155c43516d2feebc
+#. type: Plain text
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+msgid ""
+"This operation is used after an attempt to acquire the lock via an atomic "
+"user-mode instruction failed because the futex word has a nonzero "
+"value\\[em]specifically, because it contained the (PID-namespace-specific) "
+"TID of the lock owner."
+msgstr ""
+
+# #-#-#-#-# archlinux: futex.2.pot (PACKAGE VERSION) #-#-#-#-#
+#
+#
+#
+#
+# #-#-#-#-# debian-buster: futex.2.pot (PACKAGE VERSION) #-#-#-#-#
+#
+#
+#
+# #-#-#-#-# debian-unstable: futex.2.pot (PACKAGE VERSION) #-#-#-#-#
+#
+#
+#
+#
+# #-#-#-#-# fedora-rawhide: futex.2.pot (PACKAGE VERSION) #-#-#-#-#
+#
+#
+#
+#
+# #-#-#-#-# mageia-cauldron: futex.2.pot (PACKAGE VERSION) #-#-#-#-#
+#
+#
+#
+#
+# #-#-#-#-# opensuse-tumbleweed: futex.2.pot (PACKAGE VERSION) #-#-#-#-#
+#
+#
+#
+#
+#. tglx (July 2015):
+#. The operation here is similar to the FUTEX_WAIT logic. When the user
+#. space atomic acquire does not succeed because the futex value was non
+#. zero, then the waiter goes into the kernel, takes the kernel internal
+#. lock and retries the acquisition under the lock. If the acquisition
+#. does not succeed either, then it sets the FUTEX_WAITERS bit, to signal
+#. the lock owner that it needs to go into the kernel. Here is the pseudo
+#. code:
+#. lock(kernel_lock);
+#. retry:
+#. /*
+#. * Owner might have unlocked in user space before we
+#. * were able to set the waiter bit.
+#. */
+#. if (atomic_acquire(futex) == SUCCESS) {
+#. unlock(kernel_lock());
+#. return 0;
+#. }
+#. /*
+#. * Owner might have unlocked after the above atomic_acquire()
+#. * attempt.
+#. */
+#. if (atomic_set_waiters_bit(futex) != SUCCESS)
+#. goto retry;
+#. queue_waiter();
+#. unlock(kernel_lock);
+#. block();
+#. type: Plain text
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+msgid ""
+"The operation checks the value of the futex word at the address I<uaddr>. "
+"If the value is 0, then the kernel tries to atomically set the futex value "
+"to the caller's TID. If the futex word's value is nonzero, the kernel "
+"atomically sets the B<FUTEX_WAITERS> bit, which signals the futex owner that "
+"it cannot unlock the futex in user space atomically by setting the futex "
+"value to 0. After that, the kernel:"
+msgstr ""
+
+#. type: IP
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+#, no-wrap
+msgid "(1)"
+msgstr "(1)"
+
+#. type: Plain text
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+msgid "Tries to find the thread which is associated with the owner TID."
+msgstr ""
+
+#. type: IP
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+#, no-wrap
+msgid "(2)"
+msgstr "(2)"
+
+#. type: Plain text
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+msgid ""
+"Creates or reuses kernel state on behalf of the owner. (If this is the "
+"first waiter, there is no kernel state for this futex, so kernel state is "
+"created by locking the RT-mutex and the futex owner is made the owner of the "
+"RT-mutex. If there are existing waiters, then the existing state is reused.)"
+msgstr ""
+
+#. type: IP
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+#, no-wrap
+msgid "(3)"
+msgstr "(3)"
+
+#. type: Plain text
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+msgid ""
+"Attaches the waiter to the futex (i.e., the waiter is enqueued on the RT-"
+"mutex waiter list)."
+msgstr ""
+
+#
+#. August 2015:
+#. mtk: If the realm is restricted purely to SCHED_OTHER (SCHED_NORMAL)
+#. processes, does the nice value come into play also?
+#. tglx: No. SCHED_OTHER/NORMAL tasks are handled in FIFO order
+#. (i.e., task 1 blocks on lock A, held by task 2,
+#. while task 2 blocks on lock B, held by task 3)
+#. type: Plain text
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+msgid ""
+"If more than one waiter exists, the enqueueing of the waiter is in "
+"descending priority order. (For information on priority ordering, see the "
+"discussion of the B<SCHED_DEADLINE>, B<SCHED_FIFO>, and B<SCHED_RR> "
+"scheduling policies in B<sched>(7).) The owner inherits either the waiter's "
+"CPU bandwidth (if the waiter is scheduled under the B<SCHED_DEADLINE> "
+"policy) or the waiter's priority (if the waiter is scheduled under the "
+"B<SCHED_RR> or B<SCHED_FIFO> policy). This inheritance follows the lock "
+"chain in the case of nested locking and performs deadlock detection."
+msgstr ""
+
+#
+#
+#. 2016-07-07 response from Thomas Gleixner on LKML:
+#. From: Thomas Gleixner <tglx@linutronix.de>
+#. Date: 6 July 2016 at 20:57
+#. Subject: Re: futex: Allow FUTEX_CLOCK_REALTIME with FUTEX_WAIT op
+#. On Thu, 23 Jun 2016, Michael Kerrisk (man-pages) wrote:
+#. > On 06/23/2016 08:28 PM, Darren Hart wrote:
+#. > > And as a follow-on, what is the reason for FUTEX_LOCK_PI only using
+#. > > CLOCK_REALTIME? It seems reasonable to me that a user may want to wait a
+#. > > specific amount of time, regardless of wall time.
+#. >
+#. > Yes, that's another weird inconsistency.
+#. The reason is that phtread_mutex_timedlock() uses absolute timeouts based on
+#. CLOCK_REALTIME. glibc folks asked to make that the default behaviour back
+#. then when we added LOCK_PI.
+#. type: Plain text
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+msgid ""
+"The I<timeout> argument provides a timeout for the lock attempt. If "
+"I<timeout> is not NULL, the structure it points to specifies an absolute "
+"timeout, measured against the B<CLOCK_REALTIME> clock. If I<timeout> is "
+"NULL, the operation will block indefinitely."
+msgstr ""
+
+#
+#. """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+#. type: Plain text
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+msgid "The I<uaddr2>, I<val>, and I<val3> arguments are ignored."
+msgstr ""
+
+#. type: TP
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+#, fuzzy, no-wrap
+#| msgid "B<FUTEX_LOCK_PI> (since Linux 2.6.18)"
+msgid "B<FUTEX_LOCK_PI2> (since Linux 5.14)"
+msgstr "B<FUTEX_LOCK_PI> (desde Linux 2.6.18)"
+
+#
+#. commit bf22a6976897977b0a3f1aeba6823c959fc4fdae
+#. """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+#. type: Plain text
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+msgid ""
+"This operation is the same as B<FUTEX_LOCK_PI>, except that the clock "
+"against which I<timeout> is measured is selectable. By default, the "
+"(absolute) timeout specified in I<timeout> is measured against the "
+"B<CLOCK_MONOTONIC> clock, but if the B<FUTEX_CLOCK_REALTIME> flag is "
+"specified in I<futex_op>, then the timeout is measured against the "
+"B<CLOCK_REALTIME> clock."
+msgstr ""
+
+#. type: TP
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+#, no-wrap
+msgid "B<FUTEX_TRYLOCK_PI> (since Linux 2.6.18)"
+msgstr "B<FUTEX_TRYLOCK_PI> (desde Linux 2.6.18)"
+
+#. commit c87e2837be82df479a6bae9f155c43516d2feebc
+#. type: Plain text
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+msgid ""
+"This operation tries to acquire the lock at I<uaddr>. It is invoked when a "
+"user-space atomic acquire did not succeed because the futex word was not 0."
+msgstr ""
+
+#. Paraphrasing a f2f conversation with Thomas Gleixner about the
+#. above point (Aug 2015): ###
+#. There is a rare possibility of a race condition involving an
+#. uncontended futex with no owner, but with waiters. The
+#. kernel-user-space contract is that if a futex is nonzero, you must
+#. go into kernel. The futex was owned by a task, and that task dies
+#. but there are no waiters, so the futex value is non zero.
+#. Therefore, the next locker has to go into the kernel,
+#. so that the kernel has a chance to clean up. (CMXCH on zero
+#. in user space would fail, so kernel has to clean up.)
+#. Darren Hart (Oct 2015):
+#. The trylock in the kernel has more state, so it can independently
+#. verify the flags that user space must trust implicitly.
+#. type: Plain text
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+msgid ""
+"Because the kernel has access to more state information than user space, "
+"acquisition of the lock might succeed if performed by the kernel in cases "
+"where the futex word (i.e., the state information accessible to use-space) "
+"contains stale state (B<FUTEX_WAITERS> and/or B<FUTEX_OWNER_DIED>). This "
+"can happen when the owner of the futex died. User space cannot handle this "
+"condition in a race-free manner, but the kernel can fix this up and acquire "
+"the futex."
+msgstr ""
+
+#
+#. """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+#. type: Plain text
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+msgid "The I<uaddr2>, I<val>, I<timeout>, and I<val3> arguments are ignored."
+msgstr ""
+
+#. type: TP
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+#, no-wrap
+msgid "B<FUTEX_UNLOCK_PI> (since Linux 2.6.18)"
+msgstr "B<FUTEX_UNLOCK_PI> (desde Linux 2.6.18)"
+
+#. commit c87e2837be82df479a6bae9f155c43516d2feebc
+#. type: Plain text
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+msgid ""
+"This operation wakes the top priority waiter that is waiting in "
+"B<FUTEX_LOCK_PI> or B<FUTEX_LOCK_PI2> on the futex address provided by the "
+"I<uaddr> argument."
+msgstr ""
+
+#. type: Plain text
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+msgid ""
+"This is called when the user-space value at I<uaddr> cannot be changed "
+"atomically from a TID (of the owner) to 0."
+msgstr ""
+
+#. type: TP
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+#, no-wrap
+msgid "B<FUTEX_CMP_REQUEUE_PI> (since Linux 2.6.31)"
+msgstr "B<FUTEX_CMP_REQUEUE_PI> (desde Linux 2.6.31)"
+
+#. commit 52400ba946759af28442dee6265c5c0180ac7122
+#. type: Plain text
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+msgid ""
+"This operation is a PI-aware variant of B<FUTEX_CMP_REQUEUE>. It requeues "
+"waiters that are blocked via B<FUTEX_WAIT_REQUEUE_PI> on I<uaddr> from a non-"
+"PI source futex (I<uaddr>) to a PI target futex (I<uaddr2>)."
+msgstr ""
+
+#. type: Plain text
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+msgid ""
+"As with B<FUTEX_CMP_REQUEUE>, this operation wakes up a maximum of I<val> "
+"waiters that are waiting on the futex at I<uaddr>. However, for "
+"B<FUTEX_CMP_REQUEUE_PI>, I<val> is required to be 1 (since the main point is "
+"to avoid a thundering herd). The remaining waiters are removed from the "
+"wait queue of the source futex at I<uaddr> and added to the wait queue of "
+"the target futex at I<uaddr2>."
+msgstr ""
+
+#
+#
+#. val2 is the cap on the number of requeued waiters.
+#. In the glibc pthread_cond_broadcast() implementation, this argument
+#. is specified as INT_MAX, and for pthread_cond_signal() it is 0.
+#. The page at http://locklessinc.com/articles/futex_cheat_sheet/
+#. notes that "priority-inheritance Futex to priority-inheritance
+#. Futex requeues are currently unsupported". However, probably
+#. the page does not need to say nothing about this, since
+#. Thomas Gleixner commented (July 2015): "they never will be
+#. supported because they make no sense at all"
+#. """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+#. type: Plain text
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+msgid ""
+"The I<val2> and I<val3> arguments serve the same purposes as for "
+"B<FUTEX_CMP_REQUEUE>."
+msgstr ""
+
+#. type: TP
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+#, no-wrap
+msgid "B<FUTEX_WAIT_REQUEUE_PI> (since Linux 2.6.31)"
+msgstr "B<FUTEX_WAIT_REQUEUE_PI> (desde Linux 2.6.31)"
+
+#. commit 52400ba946759af28442dee6265c5c0180ac7122
+#. type: Plain text
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+msgid ""
+"Wait on a non-PI futex at I<uaddr> and potentially be requeued (via a "
+"B<FUTEX_CMP_REQUEUE_PI> operation in another task) onto a PI futex at "
+"I<uaddr2>. The wait operation on I<uaddr> is the same as for B<FUTEX_WAIT>."
+msgstr ""
+
+#. type: Plain text
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+msgid ""
+"The waiter can be removed from the wait on I<uaddr> without requeueing on "
+"I<uaddr2> via a B<FUTEX_WAKE> operation in another task. In this case, the "
+"B<FUTEX_WAIT_REQUEUE_PI> operation fails with the error B<EAGAIN>."
+msgstr ""
+
+#. type: Plain text
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+msgid "The I<val3> argument is ignored."
+msgstr ""
+
+#
+#
+#
+#
+#
+#. Darren Hart notes that a patch to allow glibc to fully support
+#. PI-aware pthreads condition variables has not yet been accepted into
+#. glibc. The story is complex, and can be found at
+#. https://sourceware.org/bugzilla/show_bug.cgi?id=11588
+#. Darren notes that in the meantime, the patch is shipped with various
+#. PREEMPT_RT-enabled Linux systems.
+#. Related to the preceding, Darren proposed that somewhere, man-pages
+#. should document the following point:
+#. While the Linux kernel, since Linux 2.6.31, supports requeueing of
+#. priority-inheritance (PI) aware mutexes via the
+#. FUTEX_WAIT_REQUEUE_PI and FUTEX_CMP_REQUEUE_PI futex operations,
+#. the glibc implementation does not yet take full advantage of this.
+#. Specifically, the condvar internal data lock remains a non-PI aware
+#. mutex, regardless of the type of the pthread_mutex associated with
+#. the condvar. This can lead to an unbounded priority inversion on
+#. the internal data lock even when associating a PI aware
+#. pthread_mutex with a condvar during a pthread_cond*_wait
+#. operation. For this reason, it is not recommended to rely on
+#. priority inheritance when using pthread condition variables.
+#. The problem is that the obvious location for this text is
+#. the pthread_cond*wait(3) man page. However, such a man page
+#. does not currently exist.
+#. """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+#. type: Plain text
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+msgid ""
+"The B<FUTEX_WAIT_REQUEUE_PI> and B<FUTEX_CMP_REQUEUE_PI> were added to "
+"support a fairly specific use case: support for priority-inheritance-aware "
+"POSIX threads condition variables. The idea is that these operations should "
+"always be paired, in order to ensure that user space and the kernel remain "
+"in sync. Thus, in the B<FUTEX_WAIT_REQUEUE_PI> operation, the user-space "
+"application pre-specifies the target of the requeue that takes place in the "
+"B<FUTEX_CMP_REQUEUE_PI> operation."
+msgstr ""
+
+#. type: SH
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+#, no-wrap
+msgid "RETURN VALUE"
+msgstr "VALOR DEVUELTO"
+
+#. type: Plain text
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+msgid ""
+"In the event of an error (and assuming that B<futex>() was invoked via "
+"B<syscall>(2)), all operations return -1 and set I<errno> to indicate the "
+"error."
+msgstr ""
+
+#. type: Plain text
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+msgid ""
+"The return value on success depends on the operation, as described in the "
+"following list:"
+msgstr ""
+
+#. type: TP
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+#, no-wrap
+msgid "B<FUTEX_WAIT>"
+msgstr "B<FUTEX_WAIT>"
+
+#. type: Plain text
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+msgid ""
+"Returns 0 if the caller was woken up. Note that a wake-up can also be "
+"caused by common futex usage patterns in unrelated code that happened to "
+"have previously used the futex word's memory location (e.g., typical futex-"
+"based implementations of Pthreads mutexes can cause this under some "
+"conditions). Therefore, callers should always conservatively assume that a "
+"return value of 0 can mean a spurious wake-up, and use the futex word's "
+"value (i.e., the user-space synchronization scheme) to decide whether to "
+"continue to block or not."
+msgstr ""
+
+#. type: TP
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+#, no-wrap
+msgid "B<FUTEX_WAKE>"
+msgstr "B<FUTEX_WAKE>"
+
+#. type: Plain text
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+#, fuzzy
+#| msgid "Returns the number of processes woken up."
+msgid "Returns the number of waiters that were woken up."
+msgstr "Devuelve el número de procesos despertados."
+
+#. type: TP
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+#, no-wrap
+msgid "B<FUTEX_FD>"
+msgstr "B<FUTEX_FD>"
+
+#. type: Plain text
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+msgid "Returns the new file descriptor associated with the futex."
+msgstr "Devuelve el nuevo descriptor de fichero asociado al I<futex>."
+
+#. type: TP
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+#, no-wrap
+msgid "B<FUTEX_REQUEUE>"
+msgstr "B<FUTEX_REQUEUE>"
+
+#. type: TP
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+#, no-wrap
+msgid "B<FUTEX_CMP_REQUEUE>"
+msgstr "B<FUTEX_CMP_REQUEUE>"
+
+#. type: Plain text
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+msgid ""
+"Returns the total number of waiters that were woken up or requeued to the "
+"futex for the futex word at I<uaddr2>. If this value is greater than "
+"I<val>, then the difference is the number of waiters requeued to the futex "
+"for the futex word at I<uaddr2>."
+msgstr ""
+
+#. type: TP
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+#, no-wrap
+msgid "B<FUTEX_WAKE_OP>"
+msgstr "B<FUTEX_WAKE_OP>"
+
+#. type: Plain text
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+msgid ""
+"Returns the total number of waiters that were woken up. This is the sum of "
+"the woken waiters on the two futexes for the futex words at I<uaddr> and "
+"I<uaddr2>."
+msgstr ""
+
+#. type: TP
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+#, no-wrap
+msgid "B<FUTEX_WAIT_BITSET>"
+msgstr "B<FUTEX_WAIT_BITSET>"
+
+#. type: Plain text
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+msgid ""
+"Returns 0 if the caller was woken up. See B<FUTEX_WAIT> for how to "
+"interpret this correctly in practice."
+msgstr ""
+
+#. type: TP
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+#, no-wrap
+msgid "B<FUTEX_WAKE_BITSET>"
+msgstr "B<FUTEX_WAKE_BITSET>"
+
+#. type: TP
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+#, no-wrap
+msgid "B<FUTEX_LOCK_PI>"
+msgstr "B<FUTEX_LOCK_PI>"
+
+#. type: Plain text
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+msgid "Returns 0 if the futex was successfully locked."
+msgstr ""
+
+#. type: TP
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+#, fuzzy, no-wrap
+#| msgid "B<FUTEX_LOCK_PI>"
+msgid "B<FUTEX_LOCK_PI2>"
+msgstr "B<FUTEX_LOCK_PI>"
+
+#. type: TP
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+#, no-wrap
+msgid "B<FUTEX_TRYLOCK_PI>"
+msgstr "B<FUTEX_TRYLOCK_PI>"
+
+#. type: TP
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+#, no-wrap
+msgid "B<FUTEX_UNLOCK_PI>"
+msgstr "B<FUTEX_UNLOCK_PI>"
+
+#. type: Plain text
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+msgid "Returns 0 if the futex was successfully unlocked."
+msgstr ""
+
+#. type: TP
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+#, no-wrap
+msgid "B<FUTEX_CMP_REQUEUE_PI>"
+msgstr "B<FUTEX_CMP_REQUEUE_PI>"
+
+#. type: Plain text
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+msgid ""
+"Returns the total number of waiters that were woken up or requeued to the "
+"futex for the futex word at I<uaddr2>. If this value is greater than "
+"I<val>, then difference is the number of waiters requeued to the futex for "
+"the futex word at I<uaddr2>."
+msgstr ""
+
+#. type: TP
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+#, no-wrap
+msgid "B<FUTEX_WAIT_REQUEUE_PI>"
+msgstr "B<FUTEX_WAIT_REQUEUE_PI>"
+
+#
+#. """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+#. type: Plain text
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+msgid ""
+"Returns 0 if the caller was successfully requeued to the futex for the futex "
+"word at I<uaddr2>."
+msgstr ""
+
+#. type: SH
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+#, no-wrap
+msgid "ERRORS"
+msgstr "ERRORES"
+
+#. type: TP
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+#, no-wrap
+msgid "B<EACCES>"
+msgstr "B<EACCES>"
+
+#. type: Plain text
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+msgid "No read access to the memory of a futex word."
+msgstr ""
+
+#. type: TP
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+#, no-wrap
+msgid "B<EAGAIN>"
+msgstr "B<EAGAIN>"
+
+#. type: Plain text
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+msgid ""
+"(B<FUTEX_WAIT>, B<FUTEX_WAIT_BITSET>, B<FUTEX_WAIT_REQUEUE_PI>) The value "
+"pointed to by I<uaddr> was not equal to the expected value I<val> at the "
+"time of the call."
+msgstr ""
+
+#. type: Plain text
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+msgid ""
+"B<Note>: on Linux, the symbolic names B<EAGAIN> and B<EWOULDBLOCK> (both of "
+"which appear in different parts of the kernel futex code) have the same "
+"value."
+msgstr ""
+
+#. type: Plain text
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+msgid ""
+"(B<FUTEX_CMP_REQUEUE>, B<FUTEX_CMP_REQUEUE_PI>) The value pointed to by "
+"I<uaddr> is not equal to the expected value I<val3>."
+msgstr ""
+
+#. type: Plain text
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+msgid ""
+"(B<FUTEX_LOCK_PI>, B<FUTEX_LOCK_PI2>, B<FUTEX_TRYLOCK_PI>, "
+"B<FUTEX_CMP_REQUEUE_PI>) The futex owner thread ID of I<uaddr> (for "
+"B<FUTEX_CMP_REQUEUE_PI>: I<uaddr2>) is about to exit, but has not yet "
+"handled the internal state cleanup. Try again."
+msgstr ""
+
+#. type: TP
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+#, no-wrap
+msgid "B<EDEADLK>"
+msgstr "B<EDEADLK>"
+
+#. type: Plain text
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+msgid ""
+"(B<FUTEX_LOCK_PI>, B<FUTEX_LOCK_PI2>, B<FUTEX_TRYLOCK_PI>, "
+"B<FUTEX_CMP_REQUEUE_PI>) The futex word at I<uaddr> is already locked by "
+"the caller."
+msgstr ""
+
+#
+#. FIXME . I see that kernel/locking/rtmutex.c uses EDEADLK in some
+#. places, and EDEADLOCK in others. On almost all architectures
+#. these constants are synonymous. Is there a reason that both
+#. names are used?
+#. tglx (July 2015): "No. We should probably fix that."
+#. type: Plain text
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+msgid ""
+"(B<FUTEX_CMP_REQUEUE_PI>) While requeueing a waiter to the PI futex for the "
+"futex word at I<uaddr2>, the kernel detected a deadlock."
+msgstr ""
+
+#. type: TP
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+#, no-wrap
+msgid "B<EFAULT>"
+msgstr "B<EFAULT>"
+
+#. type: Plain text
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+msgid ""
+"A required pointer argument (i.e., I<uaddr>, I<uaddr2>, or I<timeout>) did "
+"not point to a valid user-space address."
+msgstr ""
+
+#. type: TP
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+#, no-wrap
+msgid "B<EINTR>"
+msgstr "B<EINTR>"
+
+#. type: Plain text
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+msgid ""
+"A B<FUTEX_WAIT> or B<FUTEX_WAIT_BITSET> operation was interrupted by a "
+"signal (see B<signal>(7)). Before Linux 2.6.22, this error could also be "
+"returned for a spurious wakeup; since Linux 2.6.22, this no longer happens."
+msgstr ""
+
+#. type: TP
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+#, no-wrap
+msgid "B<EINVAL>"
+msgstr "B<EINVAL>"
+
+#. type: Plain text
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+msgid ""
+"The operation in I<futex_op> is one of those that employs a timeout, but the "
+"supplied I<timeout> argument was invalid (I<tv_sec> was less than zero, or "
+"I<tv_nsec> was not less than 1,000,000,000)."
+msgstr ""
+
+#. type: Plain text
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+msgid ""
+"The operation specified in I<futex_op> employs one or both of the pointers "
+"I<uaddr> and I<uaddr2>, but one of these does not point to a valid "
+"object\\[em]that is, the address is not four-byte-aligned."
+msgstr ""
+
+#. type: Plain text
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+msgid ""
+"(B<FUTEX_WAIT_BITSET>, B<FUTEX_WAKE_BITSET>) The bit mask supplied in "
+"I<val3> is zero."
+msgstr ""
+
+#. type: Plain text
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+msgid ""
+"(B<FUTEX_CMP_REQUEUE_PI>) I<uaddr> equals I<uaddr2> (i.e., an attempt was "
+"made to requeue to the same futex)."
+msgstr ""
+
+#. type: Plain text
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+msgid "(B<FUTEX_FD>) The signal number supplied in I<val> is invalid."
+msgstr ""
+
+#. type: Plain text
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+msgid ""
+"(B<FUTEX_WAKE>, B<FUTEX_WAKE_OP>, B<FUTEX_WAKE_BITSET>, B<FUTEX_REQUEUE>, "
+"B<FUTEX_CMP_REQUEUE>) The kernel detected an inconsistency between the user-"
+"space state at I<uaddr> and the kernel state\\[em]that is, it detected a "
+"waiter which waits in B<FUTEX_LOCK_PI> or B<FUTEX_LOCK_PI2> on I<uaddr>."
+msgstr ""
+
+#. type: Plain text
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+msgid ""
+"(B<FUTEX_LOCK_PI>, B<FUTEX_LOCK_PI2>, B<FUTEX_TRYLOCK_PI>, "
+"B<FUTEX_UNLOCK_PI>) The kernel detected an inconsistency between the user-"
+"space state at I<uaddr> and the kernel state. This indicates either state "
+"corruption or that the kernel found a waiter on I<uaddr> which is waiting "
+"via B<FUTEX_WAIT> or B<FUTEX_WAIT_BITSET>."
+msgstr ""
+
+#. From a conversation with Thomas Gleixner (Aug 2015): ###
+#. The kernel sees: I have non PI state for a futex you tried to
+#. tell me was PI
+#. type: Plain text
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+msgid ""
+"(B<FUTEX_CMP_REQUEUE_PI>) The kernel detected an inconsistency between the "
+"user-space state at I<uaddr2> and the kernel state; that is, the kernel "
+"detected a waiter which waits via B<FUTEX_WAIT> or B<FUTEX_WAIT_BITSET> on "
+"I<uaddr2>."
+msgstr ""
+
+#. type: Plain text
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+msgid ""
+"(B<FUTEX_CMP_REQUEUE_PI>) The kernel detected an inconsistency between the "
+"user-space state at I<uaddr> and the kernel state; that is, the kernel "
+"detected a waiter which waits via B<FUTEX_WAIT> or B<FUTEX_WAIT_BITSET> on "
+"I<uaddr>."
+msgstr ""
+
+#. type: Plain text
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+msgid ""
+"(B<FUTEX_CMP_REQUEUE_PI>) The kernel detected an inconsistency between the "
+"user-space state at I<uaddr> and the kernel state; that is, the kernel "
+"detected a waiter which waits on I<uaddr> via B<FUTEX_LOCK_PI> or "
+"B<FUTEX_LOCK_PI2> (instead of B<FUTEX_WAIT_REQUEUE_PI>)."
+msgstr ""
+
+#. This deals with the case:
+#. wait_requeue_pi(A, B);
+#. requeue_pi(A, C);
+#. type: Plain text
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+msgid ""
+"(B<FUTEX_CMP_REQUEUE_PI>) An attempt was made to requeue a waiter to a "
+"futex other than that specified by the matching B<FUTEX_WAIT_REQUEUE_PI> "
+"call for that waiter."
+msgstr ""
+
+#. type: Plain text
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+msgid "(B<FUTEX_CMP_REQUEUE_PI>) The I<val> argument is not 1."
+msgstr ""
+
+#. type: Plain text
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+msgid "Invalid argument."
+msgstr ""
+
+#. type: TP
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+#, no-wrap
+msgid "B<ENFILE>"
+msgstr "B<ENFILE>"
+
+#. type: Plain text
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+msgid ""
+"(B<FUTEX_FD>) The system-wide limit on the total number of open files has "
+"been reached."
+msgstr ""
+
+#. type: TP
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+#, no-wrap
+msgid "B<ENOMEM>"
+msgstr "B<ENOMEM>"
+
+#. type: Plain text
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+msgid ""
+"(B<FUTEX_LOCK_PI>, B<FUTEX_LOCK_PI2>, B<FUTEX_TRYLOCK_PI>, "
+"B<FUTEX_CMP_REQUEUE_PI>) The kernel could not allocate memory to hold state "
+"information."
+msgstr ""
+
+#. type: TP
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+#, no-wrap
+msgid "B<ENOSYS>"
+msgstr "B<ENOSYS>"
+
+#. type: Plain text
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+msgid "Invalid operation specified in I<futex_op>."
+msgstr ""
+
+#. type: Plain text
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+msgid ""
+"The B<FUTEX_CLOCK_REALTIME> option was specified in I<futex_op>, but the "
+"accompanying operation was neither B<FUTEX_WAIT>, B<FUTEX_WAIT_BITSET>, "
+"B<FUTEX_WAIT_REQUEUE_PI>, nor B<FUTEX_LOCK_PI2>."
+msgstr ""
+
+#. type: Plain text
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+msgid ""
+"(B<FUTEX_LOCK_PI>, B<FUTEX_LOCK_PI2>, B<FUTEX_TRYLOCK_PI>, "
+"B<FUTEX_UNLOCK_PI>, B<FUTEX_CMP_REQUEUE_PI>, B<FUTEX_WAIT_REQUEUE_PI>) A "
+"run-time check determined that the operation is not available. The PI-futex "
+"operations are not implemented on all architectures and are not supported on "
+"some CPU variants."
+msgstr ""
+
+#. type: TP
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+#, no-wrap
+msgid "B<EPERM>"
+msgstr "B<EPERM>"
+
+#. type: Plain text
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+msgid ""
+"(B<FUTEX_LOCK_PI>, B<FUTEX_LOCK_PI2>, B<FUTEX_TRYLOCK_PI>, "
+"B<FUTEX_CMP_REQUEUE_PI>) The caller is not allowed to attach itself to the "
+"futex at I<uaddr> (for B<FUTEX_CMP_REQUEUE_PI>: the futex at I<uaddr2>). "
+"(This may be caused by a state corruption in user space.)"
+msgstr ""
+
+#. type: Plain text
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+msgid ""
+"(B<FUTEX_UNLOCK_PI>) The caller does not own the lock represented by the "
+"futex word."
+msgstr ""
+
+#. type: TP
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+#, no-wrap
+msgid "B<ESRCH>"
+msgstr "B<ESRCH>"
+
+#. type: Plain text
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+msgid ""
+"(B<FUTEX_LOCK_PI>, B<FUTEX_LOCK_PI2>, B<FUTEX_TRYLOCK_PI>, "
+"B<FUTEX_CMP_REQUEUE_PI>) The thread ID in the futex word at I<uaddr> does "
+"not exist."
+msgstr ""
+
+#. type: Plain text
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+msgid ""
+"(B<FUTEX_CMP_REQUEUE_PI>) The thread ID in the futex word at I<uaddr2> does "
+"not exist."
+msgstr ""
+
+#. type: TP
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+#, no-wrap
+msgid "B<ETIMEDOUT>"
+msgstr "B<ETIMEDOUT>"
+
+#
+#. """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+#. type: Plain text
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+msgid ""
+"The operation in I<futex_op> employed the timeout specified in I<timeout>, "
+"and the timeout expired before the operation completed."
+msgstr ""
+
+#. type: SH
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+#, no-wrap
+msgid "STANDARDS"
+msgstr "ESTÁNDARES"
+
+#. type: Plain text
+#: archlinux debian-unstable fedora-40 fedora-rawhide mageia-cauldron
+#: opensuse-leap-15-6 opensuse-tumbleweed
+msgid "Linux."
+msgstr "Linux."
+
+#. type: SH
+#: archlinux debian-unstable fedora-40 fedora-rawhide mageia-cauldron
+#: opensuse-leap-15-6 opensuse-tumbleweed
+#, no-wrap
+msgid "HISTORY"
+msgstr "HISTORIAL"
+
+#. type: Plain text
+#: archlinux debian-unstable fedora-40 fedora-rawhide mageia-cauldron
+#: opensuse-leap-15-6 opensuse-tumbleweed
+#, fuzzy
+#| msgid "Linux."
+msgid "Linux 2.6.0."
+msgstr "Linux."
+
+#. type: Plain text
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+#, fuzzy
+#| msgid ""
+#| "Initial futex support was merged in Linux 2.5.7 but with different "
+#| "semantics from those described above. Current semantics are available "
+#| "from Linux 2.5.40 onwards."
+msgid ""
+"Initial futex support was merged in Linux 2.5.7 but with different semantics "
+"from what was described above. A four-argument system call with the "
+"semantics described in this page was introduced in Linux 2.5.40. A fifth "
+"argument was added in Linux 2.5.70, and a sixth argument was added in Linux "
+"2.6.7."
+msgstr ""
+"El soporte inicial para I<futex> se añadió a la versión 2.5.7 de Linux pero "
+"con una semántica distinta a la descrita más arriba. La semántica actual se "
+"encuentra disponible desde la versión 2.5.40 de Linux."
+
+#. type: SH
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+#, no-wrap
+msgid "EXAMPLES"
+msgstr "EJEMPLOS"
+
+#. type: Plain text
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+msgid ""
+"The program below demonstrates use of futexes in a program where a parent "
+"process and a child process use a pair of futexes located inside a shared "
+"anonymous mapping to synchronize access to a shared resource: the terminal. "
+"The two processes each write I<nloops> (a command-line argument that "
+"defaults to 5 if omitted) messages to the terminal and employ a "
+"synchronization protocol that ensures that they alternate in writing "
+"messages. Upon running this program we see output such as the following:"
+msgstr ""
+
+#. type: Plain text
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+#, no-wrap
+msgid ""
+"$ B<./futex_demo>\n"
+"Parent (18534) 0\n"
+"Child (18535) 0\n"
+"Parent (18534) 1\n"
+"Child (18535) 1\n"
+"Parent (18534) 2\n"
+"Child (18535) 2\n"
+"Parent (18534) 3\n"
+"Child (18535) 3\n"
+"Parent (18534) 4\n"
+"Child (18535) 4\n"
+msgstr ""
+
+#. type: SS
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+#, no-wrap
+msgid "Program source"
+msgstr "Código fuente"
+
+#. type: Plain text
+#: archlinux debian-unstable fedora-40 fedora-rawhide mageia-cauldron
+#: opensuse-tumbleweed
+#, no-wrap
+msgid ""
+"/* futex_demo.c\n"
+"\\&\n"
+" Usage: futex_demo [nloops]\n"
+" (Default: 5)\n"
+"\\&\n"
+" Demonstrate the use of futexes in a program where parent and child\n"
+" use a pair of futexes located inside a shared anonymous mapping to\n"
+" synchronize access to a shared resource: the terminal. The two\n"
+" processes each write \\[aq]num-loops\\[aq] messages to the terminal and employ\n"
+" a synchronization protocol that ensures that they alternate in\n"
+" writing messages.\n"
+"*/\n"
+"#define _GNU_SOURCE\n"
+"#include E<lt>err.hE<gt>\n"
+"#include E<lt>errno.hE<gt>\n"
+"#include E<lt>linux/futex.hE<gt>\n"
+"#include E<lt>stdatomic.hE<gt>\n"
+"#include E<lt>stdint.hE<gt>\n"
+"#include E<lt>stdio.hE<gt>\n"
+"#include E<lt>stdlib.hE<gt>\n"
+"#include E<lt>sys/mman.hE<gt>\n"
+"#include E<lt>sys/syscall.hE<gt>\n"
+"#include E<lt>sys/time.hE<gt>\n"
+"#include E<lt>sys/wait.hE<gt>\n"
+"#include E<lt>unistd.hE<gt>\n"
+"\\&\n"
+"static uint32_t *futex1, *futex2, *iaddr;\n"
+"\\&\n"
+"static int\n"
+"futex(uint32_t *uaddr, int futex_op, uint32_t val,\n"
+" const struct timespec *timeout, uint32_t *uaddr2, uint32_t val3)\n"
+"{\n"
+" return syscall(SYS_futex, uaddr, futex_op, val,\n"
+" timeout, uaddr2, val3);\n"
+"}\n"
+"\\&\n"
+"/* Acquire the futex pointed to by \\[aq]futexp\\[aq]: wait for its value to\n"
+" become 1, and then set the value to 0. */\n"
+"\\&\n"
+"static void\n"
+"fwait(uint32_t *futexp)\n"
+"{\n"
+" long s;\n"
+" const uint32_t one = 1;\n"
+"\\&\n"
+" /* atomic_compare_exchange_strong(ptr, oldval, newval)\n"
+" atomically performs the equivalent of:\n"
+"\\&\n"
+" if (*ptr == *oldval)\n"
+" *ptr = newval;\n"
+"\\&\n"
+" It returns true if the test yielded true and *ptr was updated. */\n"
+"\\&\n"
+" while (1) {\n"
+"\\&\n"
+" /* Is the futex available? */\n"
+" if (atomic_compare_exchange_strong(futexp, &one, 0))\n"
+" break; /* Yes */\n"
+"\\&\n"
+" /* Futex is not available; wait. */\n"
+"\\&\n"
+" s = futex(futexp, FUTEX_WAIT, 0, NULL, NULL, 0);\n"
+" if (s == -1 && errno != EAGAIN)\n"
+" err(EXIT_FAILURE, \"futex-FUTEX_WAIT\");\n"
+" }\n"
+"}\n"
+"\\&\n"
+"/* Release the futex pointed to by \\[aq]futexp\\[aq]: if the futex currently\n"
+" has the value 0, set its value to 1 and then wake any futex waiters,\n"
+" so that if the peer is blocked in fwait(), it can proceed. */\n"
+"\\&\n"
+"static void\n"
+"fpost(uint32_t *futexp)\n"
+"{\n"
+" long s;\n"
+" const uint32_t zero = 0;\n"
+"\\&\n"
+" /* atomic_compare_exchange_strong() was described\n"
+" in comments above. */\n"
+"\\&\n"
+" if (atomic_compare_exchange_strong(futexp, &zero, 1)) {\n"
+" s = futex(futexp, FUTEX_WAKE, 1, NULL, NULL, 0);\n"
+" if (s == -1)\n"
+" err(EXIT_FAILURE, \"futex-FUTEX_WAKE\");\n"
+" }\n"
+"}\n"
+"\\&\n"
+"int\n"
+"main(int argc, char *argv[])\n"
+"{\n"
+" pid_t childPid;\n"
+" unsigned int nloops;\n"
+"\\&\n"
+" setbuf(stdout, NULL);\n"
+"\\&\n"
+" nloops = (argc E<gt> 1) ? atoi(argv[1]) : 5;\n"
+"\\&\n"
+" /* Create a shared anonymous mapping that will hold the futexes.\n"
+" Since the futexes are being shared between processes, we\n"
+" subsequently use the \"shared\" futex operations (i.e., not the\n"
+" ones suffixed \"_PRIVATE\"). */\n"
+"\\&\n"
+" iaddr = mmap(NULL, sizeof(*iaddr) * 2, PROT_READ | PROT_WRITE,\n"
+" MAP_ANONYMOUS | MAP_SHARED, -1, 0);\n"
+" if (iaddr == MAP_FAILED)\n"
+" err(EXIT_FAILURE, \"mmap\");\n"
+"\\&\n"
+" futex1 = &iaddr[0];\n"
+" futex2 = &iaddr[1];\n"
+"\\&\n"
+" *futex1 = 0; /* State: unavailable */\n"
+" *futex2 = 1; /* State: available */\n"
+"\\&\n"
+" /* Create a child process that inherits the shared anonymous\n"
+" mapping. */\n"
+"\\&\n"
+" childPid = fork();\n"
+" if (childPid == -1)\n"
+" err(EXIT_FAILURE, \"fork\");\n"
+"\\&\n"
+" if (childPid == 0) { /* Child */\n"
+" for (unsigned int j = 0; j E<lt> nloops; j++) {\n"
+" fwait(futex1);\n"
+" printf(\"Child (%jd) %u\\en\", (intmax_t) getpid(), j);\n"
+" fpost(futex2);\n"
+" }\n"
+"\\&\n"
+" exit(EXIT_SUCCESS);\n"
+" }\n"
+"\\&\n"
+" /* Parent falls through to here. */\n"
+"\\&\n"
+" for (unsigned int j = 0; j E<lt> nloops; j++) {\n"
+" fwait(futex2);\n"
+" printf(\"Parent (%jd) %u\\en\", (intmax_t) getpid(), j);\n"
+" fpost(futex1);\n"
+" }\n"
+"\\&\n"
+" wait(NULL);\n"
+"\\&\n"
+" exit(EXIT_SUCCESS);\n"
+"}\n"
+msgstr ""
+
+#. SRC END
+#. type: SH
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+#, no-wrap
+msgid "SEE ALSO"
+msgstr "VÉASE TAMBIÉN"
+
+#. type: Plain text
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+msgid ""
+"B<get_robust_list>(2), B<restart_syscall>(2), "
+"B<pthread_mutexattr_getprotocol>(3), B<futex>(7), B<sched>(7)"
+msgstr ""
+"B<get_robust_list>(2), B<restart_syscall>(2), "
+"B<pthread_mutexattr_getprotocol>(3), B<futex>(7), B<sched>(7)"
+
+#. type: Plain text
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+msgid "The following kernel source files:"
+msgstr ""
+
+#. type: Plain text
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+msgid "I<Documentation/pi-futex.txt>"
+msgstr "I<Documentation/pi-futex.txt>"
+
+#. type: Plain text
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+msgid "I<Documentation/futex-requeue-pi.txt>"
+msgstr "I<Documentation/futex-requeue-pi.txt>"
+
+#. type: Plain text
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+msgid "I<Documentation/locking/rt-mutex.txt>"
+msgstr "I<Documentation/locking/rt-mutex.txt>"
+
+#. type: Plain text
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+msgid "I<Documentation/locking/rt-mutex-design.txt>"
+msgstr "I<Documentation/locking/rt-mutex-design.txt>"
+
+#. type: Plain text
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+msgid "I<Documentation/robust-futex-ABI.txt>"
+msgstr "I<Documentation/robust-futex-ABI.txt>"
+
+#. type: Plain text
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+msgid ""
+"Franke, H., Russell, R., and Kirwood, M., 2002. I<Fuss, Futexes and "
+"Furwocks: Fast Userlevel Locking in Linux> (from proceedings of the Ottawa "
+"Linux Symposium 2002),"
+msgstr ""
+
+#. type: Plain text
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+msgid ""
+"E<.UR http://kernel.org\\:/doc\\:/ols\\:/2002\\:/ols2002-pages-479-495.pdf> "
+"E<.UE>"
+msgstr ""
+"E<.UR http://kernel.org\\:/doc\\:/ols\\:/2002\\:/ols2002-pages-479-495.pdf> "
+"E<.UE>"
+
+#. type: Plain text
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+msgid ""
+"Hart, D., 2009. I<A futex overview and update>, E<.UR http://lwn.net/"
+"Articles/360699/> E<.UE>"
+msgstr ""
+"Hart, D., 2009. I<A futex overview and update>, E<.UR http://lwn.net/"
+"Articles/360699/> E<.UE>"
+
+#. type: Plain text
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+msgid ""
+"Hart, D.\\& and Guniguntala, D., 2009. I<Requeue-PI: Making glibc Condvars "
+"PI-Aware> (from proceedings of the 2009 Real-Time Linux Workshop), E<.UR "
+"http://lwn.net/images/conf/rtlws11/papers/proc/p10.pdf> E<.UE>"
+msgstr ""
+
+#. type: Plain text
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+msgid ""
+"Drepper, U., 2011. I<Futexes Are Tricky>, E<.UR http://www.akkadia.org/"
+"drepper/futex.pdf> E<.UE>"
+msgstr ""
+"Drepper, U., 2011. I<Futexes Are Tricky>, E<.UR http://www.akkadia.org/"
+"drepper/futex.pdf> E<.UE>"
+
+#. type: Plain text
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+msgid "Futex example library, futex-*.tar.bz2 at"
+msgstr ""
+
+# #-#-#-#-# archlinux: futex.2.pot (PACKAGE VERSION) #-#-#-#-#
+#
+# #-#-#-#-# debian-buster: futex.2.pot (PACKAGE VERSION) #-#-#-#-#
+#
+# #-#-#-#-# debian-unstable: futex.2.pot (PACKAGE VERSION) #-#-#-#-#
+#
+# #-#-#-#-# fedora-rawhide: futex.2.pot (PACKAGE VERSION) #-#-#-#-#
+#
+# #-#-#-#-# mageia-cauldron: futex.2.pot (PACKAGE VERSION) #-#-#-#-#
+#
+#. type: Plain text
+#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide
+#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed
+#, fuzzy
+#| msgid ""
+#| "E<.UR ftp://ftp.kernel.org\\:/pub\\:/linux\\:/kernel\\:/people\\:/rusty/> "
+#| "E<.UE>"
+msgid ""
+"E<.UR https://mirrors.kernel.org\\:/pub\\:/linux\\:/kernel\\:/people\\:/"
+"rusty/> E<.UE>"
+msgstr ""
+"E<.UR ftp://ftp.kernel.org\\:/pub\\:/linux\\:/kernel\\:/people\\:/rusty/> E<."
+"UE>"
+
+#. type: TH
+#: debian-bookworm
+#, no-wrap
+msgid "2023-02-05"
+msgstr "5 Febrero 2023"
+
+#. type: TH
+#: debian-bookworm
+#, no-wrap
+msgid "Linux man-pages 6.03"
+msgstr "Páginas de manual de Linux 6.03"
+
+#. type: SH
+#: debian-bookworm
+#, no-wrap
+msgid "VERSIONS"
+msgstr "VERSIONES"
+
+#. type: Plain text
+#: debian-bookworm
+msgid ""
+"Futexes were first made available in a stable kernel release with Linux "
+"2.6.0."
+msgstr ""
+
+#. type: Plain text
+#: debian-bookworm
+msgid "This system call is Linux-specific."
+msgstr "Esta llamada del sistema es específica de Linux."
+
+#. type: SH
+#: debian-bookworm
+#, no-wrap
+msgid "NOTES"
+msgstr "NOTAS"
+
+#
+#. TODO FIXME(Torvald) Above, we cite this section and claim it contains
+#. details on the synchronization semantics; add the C11 equivalents
+#. here (or whatever we find consensus for).
+#. """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+#. type: Plain text
+#: debian-bookworm
+msgid ""
+"Several higher-level programming abstractions are implemented via futexes, "
+"including POSIX semaphores and various POSIX threads synchronization "
+"mechanisms (mutexes, condition variables, read-write locks, and barriers)."
+msgstr ""
+
+#. type: Plain text
+#: debian-bookworm opensuse-leap-15-6
+#, no-wrap
+msgid "/* futex_demo.c\n"
+msgstr "/* futex_demo.c\n"
+
+#. type: Plain text
+#: debian-bookworm opensuse-leap-15-6
+#, no-wrap
+msgid ""
+" Usage: futex_demo [nloops]\n"
+" (Default: 5)\n"
+msgstr ""
+" Usage: futex_demo [nloops]\n"
+" (Default: 5)\n"
+
+#. type: Plain text
+#: debian-bookworm opensuse-leap-15-6
+#, no-wrap
+msgid ""
+" Demonstrate the use of futexes in a program where parent and child\n"
+" use a pair of futexes located inside a shared anonymous mapping to\n"
+" synchronize access to a shared resource: the terminal. The two\n"
+" processes each write \\[aq]num-loops\\[aq] messages to the terminal and employ\n"
+" a synchronization protocol that ensures that they alternate in\n"
+" writing messages.\n"
+"*/\n"
+"#define _GNU_SOURCE\n"
+"#include E<lt>err.hE<gt>\n"
+"#include E<lt>errno.hE<gt>\n"
+"#include E<lt>linux/futex.hE<gt>\n"
+"#include E<lt>stdatomic.hE<gt>\n"
+"#include E<lt>stdint.hE<gt>\n"
+"#include E<lt>stdio.hE<gt>\n"
+"#include E<lt>stdlib.hE<gt>\n"
+"#include E<lt>sys/mman.hE<gt>\n"
+"#include E<lt>sys/syscall.hE<gt>\n"
+"#include E<lt>sys/time.hE<gt>\n"
+"#include E<lt>sys/wait.hE<gt>\n"
+"#include E<lt>unistd.hE<gt>\n"
+msgstr ""
+
+#. type: Plain text
+#: debian-bookworm opensuse-leap-15-6
+#, fuzzy, no-wrap
+#| msgid "static int *futex1, *futex2, *iaddr;\n"
+msgid "static uint32_t *futex1, *futex2, *iaddr;\n"
+msgstr "static int *futex1, *futex2, *iaddr;\n"
+
+#. type: Plain text
+#: debian-bookworm opensuse-leap-15-6
+#, fuzzy, no-wrap
+#| msgid ""
+#| "static int\n"
+#| "futex(int *uaddr, int futex_op, int val,\n"
+#| " const struct timespec *timeout, int *uaddr2, int val3)\n"
+#| "{\n"
+#| " return syscall(SYS_futex, uaddr, futex_op, val,\n"
+#| " timeout, uaddr2, val3);\n"
+#| "}\n"
+msgid ""
+"static int\n"
+"futex(uint32_t *uaddr, int futex_op, uint32_t val,\n"
+" const struct timespec *timeout, uint32_t *uaddr2, uint32_t val3)\n"
+"{\n"
+" return syscall(SYS_futex, uaddr, futex_op, val,\n"
+" timeout, uaddr2, val3);\n"
+"}\n"
+msgstr ""
+"static int\n"
+"futex(int *uaddr, int futex_op, int val,\n"
+" const struct timespec *timeout, int *uaddr2, int val3)\n"
+"{\n"
+" return syscall(SYS_futex, uaddr, futex_op, val,\n"
+" timeout, uaddr2, val3);\n"
+"}\n"
+
+#. type: Plain text
+#: debian-bookworm opensuse-leap-15-6
+#, no-wrap
+msgid ""
+"/* Acquire the futex pointed to by \\[aq]futexp\\[aq]: wait for its value to\n"
+" become 1, and then set the value to 0. */\n"
+msgstr ""
+
+#. type: Plain text
+#: debian-bookworm opensuse-leap-15-6
+#, fuzzy, no-wrap
+#| msgid ""
+#| "static void\n"
+#| "fwait(int *futexp)\n"
+#| "{\n"
+#| " int s;\n"
+msgid ""
+"static void\n"
+"fwait(uint32_t *futexp)\n"
+"{\n"
+" long s;\n"
+" const uint32_t one = 1;\n"
+msgstr ""
+"static void\n"
+"fwait(int *futexp)\n"
+"{\n"
+" int s;\n"
+
+#. type: Plain text
+#: debian-bookworm opensuse-leap-15-6
+#, no-wrap
+msgid ""
+" /* atomic_compare_exchange_strong(ptr, oldval, newval)\n"
+" atomically performs the equivalent of:\n"
+msgstr ""
+
+#. type: Plain text
+#: debian-bookworm opensuse-leap-15-6
+#, no-wrap
+msgid ""
+" if (*ptr == *oldval)\n"
+" *ptr = newval;\n"
+msgstr ""
+" if (*ptr == *oldval)\n"
+" *ptr = newval;\n"
+
+#. type: Plain text
+#: debian-bookworm opensuse-leap-15-6
+#, no-wrap
+msgid " It returns true if the test yielded true and *ptr was updated. */\n"
+msgstr ""
+
+#. type: Plain text
+#: debian-bookworm opensuse-leap-15-6
+#, no-wrap
+msgid " while (1) {\n"
+msgstr " while (1) {\n"
+
+#. type: Plain text
+#: debian-bookworm opensuse-leap-15-6
+#, no-wrap
+msgid ""
+" /* Is the futex available? */\n"
+" if (atomic_compare_exchange_strong(futexp, &one, 0))\n"
+" break; /* Yes */\n"
+msgstr ""
+
+#. type: Plain text
+#: debian-bookworm opensuse-leap-15-6
+#, no-wrap
+msgid " /* Futex is not available; wait. */\n"
+msgstr ""
+
+#. type: Plain text
+#: debian-bookworm opensuse-leap-15-6
+#, fuzzy, no-wrap
+#| msgid ""
+#| " s = futex(futexp, FUTEX_WAIT, 0, NULL, NULL, 0);\n"
+#| " if (s == -1 && errno != EAGAIN)\n"
+#| " errExit(\"futex-FUTEX_WAIT\");\n"
+#| " }\n"
+#| "}\n"
+msgid ""
+" s = futex(futexp, FUTEX_WAIT, 0, NULL, NULL, 0);\n"
+" if (s == -1 && errno != EAGAIN)\n"
+" err(EXIT_FAILURE, \"futex-FUTEX_WAIT\");\n"
+" }\n"
+"}\n"
+msgstr ""
+" s = futex(futexp, FUTEX_WAIT, 0, NULL, NULL, 0);\n"
+" if (s == -1 && errno != EAGAIN)\n"
+" errExit(\"futex-FUTEX_WAIT\");\n"
+" }\n"
+"}\n"
+
+#. type: Plain text
+#: debian-bookworm opensuse-leap-15-6
+#, no-wrap
+msgid ""
+"/* Release the futex pointed to by \\[aq]futexp\\[aq]: if the futex currently\n"
+" has the value 0, set its value to 1 and then wake any futex waiters,\n"
+" so that if the peer is blocked in fwait(), it can proceed. */\n"
+msgstr ""
+
+#. type: Plain text
+#: debian-bookworm opensuse-leap-15-6
+#, fuzzy, no-wrap
+#| msgid ""
+#| "static void\n"
+#| "fpost(int *futexp)\n"
+#| "{\n"
+#| " int s;\n"
+msgid ""
+"static void\n"
+"fpost(uint32_t *futexp)\n"
+"{\n"
+" long s;\n"
+" const uint32_t zero = 0;\n"
+msgstr ""
+"static void\n"
+"fpost(int *futexp)\n"
+"{\n"
+" int s;\n"
+
+#. type: Plain text
+#: debian-bookworm opensuse-leap-15-6
+#, no-wrap
+msgid ""
+" /* atomic_compare_exchange_strong() was described\n"
+" in comments above. */\n"
+msgstr ""
+
+#. type: Plain text
+#: debian-bookworm opensuse-leap-15-6
+#, fuzzy, no-wrap
+#| msgid ""
+#| " const int zero = 0;\n"
+#| " if (atomic_compare_exchange_strong(futexp, &zero, 1)) {\n"
+#| " s = futex(futexp, FUTEX_WAKE, 1, NULL, NULL, 0);\n"
+#| " if (s == -1)\n"
+#| " errExit(\"futex-FUTEX_WAKE\");\n"
+#| " }\n"
+#| "}\n"
+msgid ""
+" if (atomic_compare_exchange_strong(futexp, &zero, 1)) {\n"
+" s = futex(futexp, FUTEX_WAKE, 1, NULL, NULL, 0);\n"
+" if (s == -1)\n"
+" err(EXIT_FAILURE, \"futex-FUTEX_WAKE\");\n"
+" }\n"
+"}\n"
+msgstr ""
+" const int zero = 0;\n"
+" if (atomic_compare_exchange_strong(futexp, &zero, 1)) {\n"
+" s = futex(futexp, FUTEX_WAKE, 1, NULL, NULL, 0);\n"
+" if (s == -1)\n"
+" errExit(\"futex-FUTEX_WAKE\");\n"
+" }\n"
+"}\n"
+
+#. type: Plain text
+#: debian-bookworm opensuse-leap-15-6
+#, fuzzy, no-wrap
+#| msgid ""
+#| "int\n"
+#| "main(int argc, char *argv[])\n"
+#| "{\n"
+#| " pid_t childPid;\n"
+#| " int j, nloops;\n"
+msgid ""
+"int\n"
+"main(int argc, char *argv[])\n"
+"{\n"
+" pid_t childPid;\n"
+" unsigned int nloops;\n"
+msgstr ""
+"int\n"
+"main(int argc, char *argv[])\n"
+"{\n"
+" pid_t childPid;\n"
+" int j, nloops;\n"
+
+#. type: Plain text
+#: debian-bookworm opensuse-leap-15-6
+#, no-wrap
+msgid " setbuf(stdout, NULL);\n"
+msgstr " setbuf(stdout, NULL);\n"
+
+#. type: Plain text
+#: debian-bookworm opensuse-leap-15-6
+#, no-wrap
+msgid " nloops = (argc E<gt> 1) ? atoi(argv[1]) : 5;\n"
+msgstr " nloops = (argc E<gt> 1) ? atoi(argv[1]) : 5;\n"
+
+#. type: Plain text
+#: debian-bookworm opensuse-leap-15-6
+#, no-wrap
+msgid ""
+" /* Create a shared anonymous mapping that will hold the futexes.\n"
+" Since the futexes are being shared between processes, we\n"
+" subsequently use the \"shared\" futex operations (i.e., not the\n"
+" ones suffixed \"_PRIVATE\"). */\n"
+msgstr ""
+
+#. type: Plain text
+#: debian-bookworm opensuse-leap-15-6
+#, fuzzy, no-wrap
+#| msgid ""
+#| " iaddr = mmap(NULL, sizeof(int) * 2, PROT_READ | PROT_WRITE,\n"
+#| " MAP_ANONYMOUS | MAP_SHARED, -1, 0);\n"
+#| " if (iaddr == MAP_FAILED)\n"
+#| " errExit(\"mmap\");\n"
+msgid ""
+" iaddr = mmap(NULL, sizeof(*iaddr) * 2, PROT_READ | PROT_WRITE,\n"
+" MAP_ANONYMOUS | MAP_SHARED, -1, 0);\n"
+" if (iaddr == MAP_FAILED)\n"
+" err(EXIT_FAILURE, \"mmap\");\n"
+msgstr ""
+" iaddr = mmap(NULL, sizeof(int) * 2, PROT_READ | PROT_WRITE,\n"
+" MAP_ANONYMOUS | MAP_SHARED, -1, 0);\n"
+" if (iaddr == MAP_FAILED)\n"
+" errExit(\"mmap\");\n"
+
+#. type: Plain text
+#: debian-bookworm opensuse-leap-15-6
+#, no-wrap
+msgid ""
+" futex1 = &iaddr[0];\n"
+" futex2 = &iaddr[1];\n"
+msgstr ""
+" futex1 = &iaddr[0];\n"
+" futex2 = &iaddr[1];\n"
+
+#. type: Plain text
+#: debian-bookworm opensuse-leap-15-6
+#, no-wrap
+msgid ""
+" *futex1 = 0; /* State: unavailable */\n"
+" *futex2 = 1; /* State: available */\n"
+msgstr ""
+
+#. type: Plain text
+#: debian-bookworm opensuse-leap-15-6
+#, no-wrap
+msgid ""
+" /* Create a child process that inherits the shared anonymous\n"
+" mapping. */\n"
+msgstr ""
+
+#. type: Plain text
+#: debian-bookworm opensuse-leap-15-6
+#, fuzzy, no-wrap
+#| msgid ""
+#| " childPid = fork();\n"
+#| " if (childPid == -1)\n"
+#| " errExit(\"fork\");\n"
+msgid ""
+" childPid = fork();\n"
+" if (childPid == -1)\n"
+" err(EXIT_FAILURE, \"fork\");\n"
+msgstr ""
+" childPid = fork();\n"
+" if (childPid == -1)\n"
+" errExit(\"fork\");\n"
+
+#. type: Plain text
+#: debian-bookworm opensuse-leap-15-6
+#, fuzzy, no-wrap
+#| msgid ""
+#| " for (j = 0; j E<lt> nloops; j++) {\n"
+#| " fwait(futex2);\n"
+#| " printf(\"Parent (%ld) %d\\en\", (long) getpid(), j);\n"
+#| " fpost(futex1);\n"
+#| " }\n"
+msgid ""
+" if (childPid == 0) { /* Child */\n"
+" for (unsigned int j = 0; j E<lt> nloops; j++) {\n"
+" fwait(futex1);\n"
+" printf(\"Child (%jd) %u\\en\", (intmax_t) getpid(), j);\n"
+" fpost(futex2);\n"
+" }\n"
+msgstr ""
+" for (j = 0; j E<lt> nloops; j++) {\n"
+" fwait(futex2);\n"
+" printf(\"Parent (%ld) %d\\en\", (long) getpid(), j);\n"
+" fpost(futex1);\n"
+" }\n"
+
+#. type: Plain text
+#: debian-bookworm opensuse-leap-15-6
+#, no-wrap
+msgid ""
+" exit(EXIT_SUCCESS);\n"
+" }\n"
+msgstr ""
+" exit(EXIT_SUCCESS);\n"
+" }\n"
+
+#. type: Plain text
+#: debian-bookworm opensuse-leap-15-6
+#, no-wrap
+msgid " /* Parent falls through to here. */\n"
+msgstr ""
+
+#. type: Plain text
+#: debian-bookworm opensuse-leap-15-6
+#, fuzzy, no-wrap
+#| msgid ""
+#| " for (j = 0; j E<lt> nloops; j++) {\n"
+#| " fwait(futex2);\n"
+#| " printf(\"Parent (%ld) %d\\en\", (long) getpid(), j);\n"
+#| " fpost(futex1);\n"
+#| " }\n"
+msgid ""
+" for (unsigned int j = 0; j E<lt> nloops; j++) {\n"
+" fwait(futex2);\n"
+" printf(\"Parent (%jd) %u\\en\", (intmax_t) getpid(), j);\n"
+" fpost(futex1);\n"
+" }\n"
+msgstr ""
+" for (j = 0; j E<lt> nloops; j++) {\n"
+" fwait(futex2);\n"
+" printf(\"Parent (%ld) %d\\en\", (long) getpid(), j);\n"
+" fpost(futex1);\n"
+" }\n"
+
+#. type: Plain text
+#: debian-bookworm opensuse-leap-15-6
+#, no-wrap
+msgid " wait(NULL);\n"
+msgstr " wait(NULL);\n"
+
+#. type: Plain text
+#: debian-bookworm opensuse-leap-15-6
+#, no-wrap
+msgid ""
+" exit(EXIT_SUCCESS);\n"
+"}\n"
+msgstr ""
+" exit(EXIT_SUCCESS);\n"
+"}\n"
+
+#. type: TH
+#: debian-unstable opensuse-tumbleweed
+#, no-wrap
+msgid "2023-05-03"
+msgstr "3 Mayo 2023"
+
+#. type: TH
+#: debian-unstable opensuse-tumbleweed
+#, no-wrap
+msgid "Linux man-pages 6.05.01"
+msgstr "Páginas de manual de Linux 6.05.01"
+
+#. type: TH
+#: opensuse-leap-15-6
+#, no-wrap
+msgid "2023-03-30"
+msgstr "30 Marzo 2023"
+
+#. type: TH
+#: opensuse-leap-15-6
+#, no-wrap
+msgid "Linux man-pages 6.04"
+msgstr "Linux man-pages 6.04"