[comp.unix.aix] cs system call on RS/6000

tma@progress.COM (Tim Atchison) (12/07/90)

I am looking for a test-and-set instruction (or something like it) on the
IBM RS/6000. I know that the assembly code is proprietary, but I found a 
compare-and-set (cs) system call that looks like it does the same thing.
Unfortunately, I can't find this command in my doc set. Could someone show
me how to use this call ?

The only information that I have is:

int cs (int *dest, int compare, int value)

It has the following logic:

if (compare == *dest) {*dest = value; return(0);}
else return(1);

--------------------------------------------------------------------------------
Timothy M. Atchison			UUCP: mit-eddie!progress!tma
Progress Software Corp.		    	Internet: tma@progress.com
5 Oak Park
Bedford, MA  01730

marc@arnor.uucp (12/10/90)

"cs" follows the "compare and swap" strategy used in the IBM S/370.
It is described in the on line documentation, which includes an
example.  The call is:

cs(int *dest, int comp, int value);

and the idea is that it will store value in destination only if
destination's old value was comp.  This is of course done atomically.
cs returns 0 if it succeeds, 1 if the old value of destination did not
match comp.

For examle, to set a simple spin lock in 

int lock

where the lock is 0 when free and 1 when held:

while (cs(&lock,0,1));

compare and swap can also be used to do many linked list manipulations
directly without ever setting a lock at all.

Marc Auslander