[M3devel] Proposed Atomic Word.T interfaces.

Tony Hosking hosking at cs.purdue.edu
Sun Dec 20 00:32:43 CET 2009


PS Some of these we probably can implement using existing gcc intrinsics.

On 19 Dec 2009, at 18:30, Tony Hosking wrote:

> Here is my updated proposal for Modula-3 Atomic Word.T.
> These are based on what we can have implemented from libatomic_ops, a prototype implementation for the C++ memory model standardization process.  At the moment they are not gcc intrinsics, but I expect to see that coming as the standard progresses.
> 
> INTERFACE Atomic;
> 
> IMPORT Word;
> 
> TYPE T = Word.T;
> 
> TYPE
>   Order = { Relaxed, Release, Acquire, AcquireRelease, Sequential };
>   (* "Relaxed": The operation does not order memory.
> 
>      "Release": Performs a release operation on the affected memory locations,
>      thus making regular memory writes visible to other threads through the
>      variable to which it is applied.
> 
>      "Acquire": Performs an acquire operation on the affected memory
>      locations, thus making regular memory writes in other threads released
>      through the atomic variable to which it is applied, visible to the
>      current thread.
> 
>      "AcquireRelease": The operation has both acquire and release semantics.
> 
>      "Sequential": The operation has both acquire and release semantics, and
>      in addition, has sequentially-consistent operation ordering. *)
> 
> CONST IsLockFree = RTMachine.IsLockFree;
>   (* True if the operations are lock-free, false otherwise. *)
> 
> PROCEDURE Store(VAR var: T; val: T; order := Order.Sequential);
>   (* Atomically replace the value in "var" with "val".  Memory is affected as
>      per "order".  The "order" shall be neither "Acquire" nor
>      "AcquireRelease". *)
> 
> PROCEDURE Load(READONLY var: T; order := Order.Sequential): T;
>   (* Atomically return the value in "var".  Memory is affected as per "order".
>      The "order" shall be neither "Release" nor "AcquireRelease". *)
> 
> PROCEDURE Swap(VAR var: T; val: T; order := Order.Sequential): T;
>   (* Atomically replace the value in "var" with "val". Returns the value of
>      "var" immediately before the effects. Memory is affected as per order.
>      This is a read-modify-write operation and synchronizes with any
>      evaluation that reads the updated value. *)
> 
> PROCEDURE CompareSwap(VAR var, expected: T;
>                       desired: T; order := Order.Sequential): BOOLEAN;
>   (* Atomically, compares the value in "var" for equality with that in
>      "expected", and if true, replaces the value in "var" with "desired", and
>      if false, updates the value in "expected" with the value in "var".
>      Returns the result of the comparison.  The "order" shall be neither
>      "Release" nor "AcquireRelease".  This is a read-modify-write operation
>      and synchronizes with any evaluation that reads the updated value.  The
>      effect of the CompareSwap operation is:
> 
>      IF var = expected THEN var := desired ELSE expected := var;
> 
>      The CompareSwap operation may fail spuriously, that is return false while
>      leaving the value in "expected" unchanged.  A consequence of spurious
>      failure is that nearly all uses of CompareSwap will be in a loop:
> 
>      expected := Atomic.Load(current);
>      DO
>        desired := function(expected);
>      WHILE NOT Atomic.CompareSwap(current, expected, desired);
>   *)
> 
> PROCEDURE Fence(VAR var: T; order := Order.Sequential);
>   (* Memory is affected as per "order".  Synchronizes with any operation on
>      the same variable.  The "order" shall not be "Relaxed". *)
> 
> PROCEDURE FetchPlus (VAR var; incr: T; order := Sequential): T;
> PROCEDURE FetchMinus(VAR var; mask: T; order := Sequential): T;
> PROCEDURE FetchOr   (VAR var; mask: T; order := Sequential): T;
> PROCEDURE FetchXOr  (VAR var; mask: T; order := Sequential): T;
> PROCEDURE FetchXAnd (VAR var; mask: T; order := Sequential): T;
>   (* Atomically replace the value in "var" with the result of the operation
>      applied to the value in "var" and the given operand.  Memory is affected
>      as per "order".  These operations are read-modify-write operations and
>      synchronize with any evaluation that reads the updated value.  Returns
>      the value of "var" immediately before the effects.
> 
>      For signed integral types, arithmetic is defined to use two's-complement
>      representation. There are no undefined results.  For address types, the
>      result may be an undefined address, but the operations otherwise have no
>      undefined behavior. *)
> 
> END Atomic.
> 
> 
> Antony Hosking | Associate Professor | Computer Science | Purdue University
> 305 N. University Street | West Lafayette | IN 47907 | USA
> Office +1 765 494 6001 | Mobile +1 765 427 5484
> 
> 
> 
> 

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://m3lists.elegosoft.com/pipermail/m3devel/attachments/20091219/0f437284/attachment-0002.html>


More information about the M3devel mailing list