diff options
Diffstat (limited to '')
-rw-r--r-- | templates/man2/futex.2.pot | 2832 |
1 files changed, 2832 insertions, 0 deletions
diff --git a/templates/man2/futex.2.pot b/templates/man2/futex.2.pot new file mode 100644 index 00000000..8597d16a --- /dev/null +++ b/templates/man2/futex.2.pot @@ -0,0 +1,2832 @@ +# SOME DESCRIPTIVE TITLE +# Copyright (C) YEAR Free Software Foundation, Inc. +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"POT-Creation-Date: 2024-03-01 16:56+0100\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" +"Language-Team: LANGUAGE <LL@li.org>\n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\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 "" + +#. type: TH +#: archlinux fedora-40 fedora-rawhide mageia-cauldron +#, no-wrap +msgid "Linux man-pages 6.06" +msgstr "" + +#. type: SH +#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide +#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed +#, no-wrap +msgid "NAME" +msgstr "" + +#. 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 "" + +#. type: SH +#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide +#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed +#, no-wrap +msgid "LIBRARY" +msgstr "" + +#. 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 "" + +#. type: SH +#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide +#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed +#, no-wrap +msgid "SYNOPSIS" +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<#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 "" + +#. type: Plain text +#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide +#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed +#, no-wrap +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 "" + +#. 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 "" + +#. 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 "" + +#. 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 "" + +#. 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 "" + +#. 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 "" + +#. 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 "" + +#. 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 "" + +# +#. """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" +#. 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 "" + +#. 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 "" + +# +#. """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" +#. 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 "" + +#. 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 +#, no-wrap +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 "" + +#. 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 "" + +#. 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 "" + +#. 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 +#, 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 &= \\[ti]oparg; */\n" +"FUTEX_OP_XOR 4 /* uaddr2 \\[ha]= oparg; */\n" +msgstr "" + +#. 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 "" + +# +#. """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" +#. 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 "" + +#. 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 "" + +#. 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 +#, no-wrap +msgid "FUTEX_WAITERS | TID\n" +msgstr "" + +#. 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 "" + +#. 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 "" + +# +# +# +# +#. 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 "" + +#. 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 "" + +#. 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 "" + +#. 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 +#, no-wrap +msgid "B<FUTEX_LOCK_PI2> (since Linux 5.14)" +msgstr "" + +# +#. 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 "" + +#. 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 "" + +#. 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 "" + +#. 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 "" + +#. 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 "" + +#. 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 "" + +#. 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 "" + +#. type: Plain text +#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide +#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed +msgid "Returns the number of waiters that were woken up." +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>" +msgstr "" + +#. 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 "" + +#. 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 "" + +#. 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 "" + +#. 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 "" + +#. 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 "" + +#. 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 "" + +#. 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 "" + +#. 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 +#, no-wrap +msgid "B<FUTEX_LOCK_PI2>" +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>" +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>" +msgstr "" + +#. 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 "" + +#. 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 "" + +# +#. """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" +#. 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 "" + +#. 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 "" + +#. 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 "" + +#. 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 "" + +#. 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 "" + +#. 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 "" + +#. 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 "" + +#. 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 "" + +#. 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 "" + +#. 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 "" + +#. 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 "" + +#. 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 "" + +#. 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 "" + +# +#. """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" +#. 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 "" + +#. type: Plain text +#: archlinux debian-unstable fedora-40 fedora-rawhide mageia-cauldron +#: opensuse-leap-15-6 opensuse-tumbleweed +msgid "Linux." +msgstr "" + +#. type: SH +#: archlinux debian-unstable fedora-40 fedora-rawhide mageia-cauldron +#: opensuse-leap-15-6 opensuse-tumbleweed +#, no-wrap +msgid "HISTORY" +msgstr "" + +#. type: Plain text +#: archlinux debian-unstable fedora-40 fedora-rawhide mageia-cauldron +#: opensuse-leap-15-6 opensuse-tumbleweed +msgid "Linux 2.6.0." +msgstr "" + +#. type: Plain text +#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide +#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed +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 "" + +#. type: SH +#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide +#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed +#, no-wrap +msgid "EXAMPLES" +msgstr "" + +#. 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 "" + +#. 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 "" + +#. 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 "" + +#. 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 "" + +#. 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 "" + +#. 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 "" + +#. 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 "" + +#. 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 "" + +#. 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 "" + +#. 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 "" + +#. 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 "" + +#. 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 "" + +#. type: Plain text +#: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide +#: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed +msgid "" +"E<.UR https://mirrors.kernel.org\\:/pub\\:/linux\\:/kernel\\:/people\\:/" +"rusty/> E<.UE>" +msgstr "" + +#. type: TH +#: debian-bookworm +#, no-wrap +msgid "2023-02-05" +msgstr "" + +#. type: TH +#: debian-bookworm +#, no-wrap +msgid "Linux man-pages 6.03" +msgstr "" + +#. type: SH +#: debian-bookworm +#, no-wrap +msgid "VERSIONS" +msgstr "" + +#. 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 "" + +#. type: SH +#: debian-bookworm +#, no-wrap +msgid "NOTES" +msgstr "" + +# +#. 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 "" + +#. type: Plain text +#: debian-bookworm opensuse-leap-15-6 +#, no-wrap +msgid "" +" Usage: futex_demo [nloops]\n" +" (Default: 5)\n" +msgstr "" + +#. 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 +#, no-wrap +msgid "static uint32_t *futex1, *futex2, *iaddr;\n" +msgstr "" + +#. type: Plain text +#: debian-bookworm opensuse-leap-15-6 +#, no-wrap +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 "" + +#. 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 +#, no-wrap +msgid "" +"static void\n" +"fwait(uint32_t *futexp)\n" +"{\n" +" long s;\n" +" const uint32_t one = 1;\n" +msgstr "" + +#. 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 "" + +#. 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 "" + +#. 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 +#, no-wrap +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 "" + +#. 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 +#, no-wrap +msgid "" +"static void\n" +"fpost(uint32_t *futexp)\n" +"{\n" +" long s;\n" +" const uint32_t zero = 0;\n" +msgstr "" + +#. 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 +#, no-wrap +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 "" + +#. type: Plain text +#: debian-bookworm opensuse-leap-15-6 +#, no-wrap +msgid "" +"int\n" +"main(int argc, char *argv[])\n" +"{\n" +" pid_t childPid;\n" +" unsigned int nloops;\n" +msgstr "" + +#. type: Plain text +#: debian-bookworm opensuse-leap-15-6 +#, no-wrap +msgid " setbuf(stdout, NULL);\n" +msgstr "" + +#. type: Plain text +#: debian-bookworm opensuse-leap-15-6 +#, no-wrap +msgid " nloops = (argc E<gt> 1) ? atoi(argv[1]) : 5;\n" +msgstr "" + +#. 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 +#, no-wrap +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 "" + +#. type: Plain text +#: debian-bookworm opensuse-leap-15-6 +#, no-wrap +msgid "" +" futex1 = &iaddr[0];\n" +" futex2 = &iaddr[1];\n" +msgstr "" + +#. 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 +#, no-wrap +msgid "" +" childPid = fork();\n" +" if (childPid == -1)\n" +" err(EXIT_FAILURE, \"fork\");\n" +msgstr "" + +#. type: Plain text +#: debian-bookworm opensuse-leap-15-6 +#, no-wrap +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 "" + +#. type: Plain text +#: debian-bookworm opensuse-leap-15-6 +#, no-wrap +msgid "" +" exit(EXIT_SUCCESS);\n" +" }\n" +msgstr "" + +#. 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 +#, no-wrap +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 "" + +#. type: Plain text +#: debian-bookworm opensuse-leap-15-6 +#, no-wrap +msgid " wait(NULL);\n" +msgstr "" + +#. type: Plain text +#: debian-bookworm opensuse-leap-15-6 +#, no-wrap +msgid "" +" exit(EXIT_SUCCESS);\n" +"}\n" +msgstr "" + +#. type: TH +#: debian-unstable opensuse-tumbleweed +#, no-wrap +msgid "2023-05-03" +msgstr "" + +#. type: TH +#: debian-unstable opensuse-tumbleweed +#, no-wrap +msgid "Linux man-pages 6.05.01" +msgstr "" + +#. type: TH +#: opensuse-leap-15-6 +#, no-wrap +msgid "2023-03-30" +msgstr "" + +#. type: TH +#: opensuse-leap-15-6 +#, no-wrap +msgid "Linux man-pages 6.04" +msgstr "" |