139 lines
3.4 KiB
Text
139 lines
3.4 KiB
Text
/* --- Version 4.0 --- 12-Feb-1999 --- */
|
|
/*
|
|
* Include the following routines :
|
|
* atomic_or()
|
|
* scaledtimestamp()
|
|
*
|
|
* Updated the copyright.
|
|
*/
|
|
|
|
/*
|
|
* unsigned int atomic_or(unsigned int *area, unsigned int mask)
|
|
*
|
|
* Atomically or the mask into *area.
|
|
* Returns the old value.
|
|
*/
|
|
/*
|
|
* long long scaledtimestamp(double scale)
|
|
*
|
|
* Read the PPC timebase. Convert the time base value based on
|
|
* scale.
|
|
*
|
|
* Caveat: scale can not be 0, NaN, Inf. It's upto the caller
|
|
* to validate scale before calling this.
|
|
*/
|
|
|
|
/* --- Version 3.0 --- 23-Oct-1998 --- */
|
|
/*
|
|
* Made the headers c++ friendly
|
|
* Build a static library with dynamic code generation.
|
|
* If you make a copy of the libatomic.a do not forget to run "ranlib".
|
|
*/
|
|
|
|
/* --- Version 2.0 --- 23-Oct-1998 --- */
|
|
/*
|
|
* Added routines described in timestamp.h
|
|
* Test program for these is in hmi.c
|
|
*/
|
|
|
|
/* --- Version 1.0 --- 12-Oct-1998 --- */
|
|
/*
|
|
* void spin_lock_init(spin_lock_t)
|
|
*
|
|
* Initialize a spin lock.
|
|
* These locks should be cache aligned and a multiple of cache size.
|
|
*/
|
|
|
|
/*
|
|
* void spin_lock_unlock(spin_lock_t)
|
|
*
|
|
* Unconditionally release lock.
|
|
*/
|
|
|
|
/*
|
|
* unsigned int spin_lock_lock(spin_lock_t)
|
|
*
|
|
* Try to acquire spin-lock. Return success (1).
|
|
*/
|
|
|
|
/*
|
|
* unsigned int spin_lock_bit(spin_lock_t, unsigned int bits)
|
|
*
|
|
* Try to acquire spin-lock. The second parameter is the bit mask to
|
|
* test and set. multiple bits may be set.
|
|
* Return success (1).
|
|
*/
|
|
|
|
/*
|
|
* unsigned int spin_unlock_bit(spin_lock_t, unsigned int bits)
|
|
*
|
|
* Release bit based spin-lock. The second parameter is the bit mask to
|
|
* clear. Multiple bits may be cleared.
|
|
*/
|
|
|
|
/*
|
|
* unsigned int spin_lock_try(spin_lock_t)
|
|
*
|
|
* Try to acquire spin-lock. Return success (1) or failure (0).
|
|
*/
|
|
|
|
/*
|
|
* unsigned int spin_lock_held(spin_lock_t)
|
|
*
|
|
* Return 1 if lock is held
|
|
* N.B. Racy, of course.
|
|
*/
|
|
|
|
/*
|
|
* unsigned int compare_and_store(unsigned int oval,
|
|
* unsigned int nval, unsigned int *area)
|
|
*
|
|
* Compare oval to area if equal, store nval, and return true
|
|
* else return false and no store
|
|
* This is an atomic operation
|
|
*/
|
|
|
|
/*
|
|
* unsigned int atomic_add(unsigned int *area, int val)
|
|
*
|
|
* Atomically add the second parameter to the first.
|
|
* Returns the result.
|
|
*/
|
|
|
|
/*
|
|
* unsigned int atomic_sub(unsigned int *area, int val)
|
|
*
|
|
* Atomically subtract the second parameter from the first.
|
|
* Returns the result.
|
|
*/
|
|
|
|
/*
|
|
* void queue_atomic(unsigned int * anchor,
|
|
* unsigned int * elem, unsigned int disp)
|
|
*
|
|
* Atomically inserts the element at the head of the list
|
|
* anchor is the pointer to the first element
|
|
* element is the pointer to the element to insert
|
|
* disp is the displacement into the element to the chain pointer
|
|
*/
|
|
|
|
/*
|
|
* void queue_atomic_list(unsigned int * anchor,
|
|
* unsigned int * first, unsigned int * last,
|
|
* unsigned int disp)
|
|
*
|
|
* Atomically inserts the list of elements at the head of the list
|
|
* anchor is the pointer to the first element
|
|
* first is the pointer to the first element to insert
|
|
* last is the pointer to the last element to insert
|
|
* disp is the displacement into the element to the chain pointer
|
|
*/
|
|
|
|
/*
|
|
* unsigned int *dequeue_atomic(unsigned int *anchor, unsigned int disp)
|
|
*
|
|
* Atomically removes the first element in a list and returns it.
|
|
* anchor is the pointer to the first element
|
|
* disp is the displacement into the element to the chain pointer
|
|
* Returns element if found, 0 if empty.
|
|
*/
|