summaryrefslogtreecommitdiffstats
path: root/man4/futex.4
diff options
context:
space:
mode:
Diffstat (limited to 'man4/futex.4')
-rw-r--r--man4/futex.479
1 files changed, 79 insertions, 0 deletions
diff --git a/man4/futex.4 b/man4/futex.4
new file mode 100644
index 000000000..e99322650
--- /dev/null
+++ b/man4/futex.4
@@ -0,0 +1,79 @@
+.\" This manpage has been automatically generated by docbook2man
+.\" from a DocBook document. This tool can be found at:
+.\" <http://shell.ipoline.com/~elmert/comp/docbook2X/>
+.\" Please send any bug reports, improvements, comments, patches,
+.\" etc. to Steve Cheng <steve@ggi-project.org>.
+.TH FUTEX 4 2002-12-31 "" "Linux Programmer's Manual"
+.SH NAME
+futex \- Fast Userspace Locking
+.SH SYNOPSIS
+.nf
+#include <linux/futex.h>
+.fi
+.SH DESCRIPTION
+.PP
+The Linux kernel provides futexes ('Fast Userspace muTexes') as a building block for fast userspace
+locking and semaphores. Futexes are very basic and lend themselves well for building higher level
+locking abstractions such as POSIX mutexes.
+.PP
+This page does not set out to document all design decisions but restricts itself to issues relevant for
+application and library development. Most programmers will in fact not be using futexes directly but
+instead rely on system libraries built on them, such as the NPTL pthreads implementation.
+.PP
+A futex is identified by a piece of memory which can be shared between different processes. In these
+different processes, it need not have identical addresses. In its bare form, a futex has semaphore
+semantics; it is a counter that can be incremented and decremented atomically; processes can wait for the
+value to become positive.
+.PP
+Futex operation is entirely userspace for the non-contended case. The kernel is only involved to arbitrate
+the contended case. As any sane design will strive for non-contension, futexes are also optimised
+for this situation.
+.PP
+In its bare form, a futex is an aligned integer which is only touched by atomic assembler
+instructions. Processes can share this integer over mmap, via shared segments or because they
+share memory space, in which case the application is commonly called multithreaded.
+.SH "SEMANTICS"
+.PP
+Any futex operation starts in userspace, but it may necessary to communicate with the kernel using the
+\fBfutex\fR(2) system call.
+.PP
+To 'up' a futex, execute the proper assembler instructions that will cause the host CPU to atomically
+increment the integer. Afterwards, check if it has in fact changed from 0 to 1, in which case
+there were no waiters and the operation is done. This is the non-contended case which is fast and
+should be common.
+.PP
+In the contended case, the atomic increment changed the counter from -1 (or some other negative number). If this is detected,
+there are waiters. Userspace should now set the counter to 1 and instruct the kernel to wake up any
+waiters using the FUTEX_WAKE operation.
+.PP
+Waiting on a futex, to 'down' it, is the reverse operation. Atomically decrement the counter and
+check if it changed to 0, in which case the operation is done and the futex was uncontended. In all
+other circumstances, the process should set the counter to -1 and request that the kernel wait for
+another process to up the futex. This is done using the FUTEX_WAIT operation.
+.PP
+The futex system call can optionally be passed a timeout specifying how long the kernel should
+wait for the futex to be upped. In this case, semantics are more complex and the programmer is referred
+to \fBfutex\fR(2) for
+more details. The same holds for asynchronous futex waiting.
+.SH "NOTES"
+.PP
+To reiterate, bare futexes are not intended as an easy to use abstraction for end-users. Implementors
+are expected to be assembly literate and to have read the sources of the futex userspace library referenced
+below.
+.PP
+This man page illustrates the most common use of the \fBfutex\fR(2) primitives: it is by no means the only one.
+.SH "AUTHORS"
+.PP
+Futexes were designed and worked on by Hubertus Franke (IBM Thomas J. Watson Research Center),
+Matthew Kirkwood, Ingo Molnar (Red Hat) and Rusty Russell (IBM Linux Technology Center). This page written
+by bert hubert.
+.SH "VERSIONS"
+.PP
+Initial futex support was merged in Linux 2.5.7 but with different semantics from those described above.
+Current semantics are available from Linux 2.5.40 onwards.
+.SH "SEE ALSO"
+.PP
+\fBfutex\fR(2),
+`Fuss, Futexes and Furwocks: Fast Userlevel Locking in Linux' (proceedings of the Ottawa Linux
+Symposium 2002),
+futex example library, futex-*.tar.bz2 <URL:ftp://ftp.kernel.org:/pub/linux/kernel/people/rusty/>.