/* --- 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. */