Restartable atomic sequences are code sequences which are guaranteed to execute without preemption. This property is assured by the kernel by re-executing a preempted sequence from the start. This functionality enables applications to build atomic sequences which, when executed to completion, will have executed atomically. Restartable atomic sequences are intended to be used on systems that do not have hardware support for low-overhead atomic primitives.
The
rasctl function manipulates a process's set of restartable atomic sequences. If a restartable atomic sequence is registered and the process is preempted within the range
addr and
addr+
len, then the process is resumed at
addr.
As the process execution can be rolled-back, the code in the sequence should have no side effects other than a final store at
addr+
len-1. The kernel does not guarantee that the sequences are successfully restartable. It assumes that the application knows what it is doing. Restartable atomic sequences should adhere to the following guidelines:
•
have a single entry point and a single exit point;
•
not execute emulated instructions; and
•
not invoke any functions or system calls.
Restartable atomic sequences are inherited from the parent by the child during the
fork(2) operation. Restartable atomic sequences for a process are removed during
exec(3).
The operations that can be applied to a restartable atomic sequence are specified by the
op argument. Possible operations are:
RAS_INSTALL
Install this sequence.
RAS_PURGE
Remove the specified registered sequence for this process.
RAS_PURGE_ALL
Remove all registered sequences for this process.
The
RAS_PURGE and
RAS_PURGE_ALL operations should be considered to have undefined behaviour if there are any other runnable threads in the address space which might be executing within the restartable atomic sequence(s) at the time of the purge. The caller must be responsible for ensuring that there is some form of coordination with other threads to prevent unexpected behaviour.
To preserve the atomicity of sequences, the kernel attempts to protect the sequences from alteration by the
ptrace(2) facility.