Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 06 May 1999 15:51:42 -0700
From:      Rahul Dhesi <dhesi@rahul.net>
To:        freebsd-questions@freebsd.org
Subject:   looking for test-and-set or atomic swap instruction
Message-ID:  <199905062251.AA19855@bolero-x.rahul.net>

next in thread | raw e-mail | index | archive | help
I am looking for a machine instruction that could be used to implement
mutual exclusion in software, similar to the traditional test-and-set or
atomic swap instructions, and some way of invoking it from within C code
from within FreeBSD 3.x.  Any suggestions?  More info below.

I don't expect to be using a multiprocessing system, so perhaps that
should make things easier.

I can't use any lock that requires a system call.  I am making accesses
to common shared memory from multiple processes, and a system call would
be too costly.  The rate of shared memory access will be high but
conflicts will be very rare, so a spin lock will do just fine.

A test-and-set instruction will set a specified byte to 1, and return
the previous value of the byte in a status flag.  If implemented as a
test_and_set() function, we would use it like this:

   char volatile lockbyte;

   /* get lock */
   while (test_and_set(lockbyte)) {
      ; /* wait in spin lock */
   }

   ...

   /* release lock */
   lockbyte = 0;

An atomic swap does the same thing, if we can atomically swap the value
of a memory location with a register.  The new value in the register
gives us the old value in the memory location, same as the flag set by
test-and-set.

Rahul Dhesi <dhesi@rahul.net>


To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-questions" in the body of the message




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?199905062251.AA19855>