[BACK]Return to simplelock.h CVS log [TXT][DIR] Up to [local] / sys / sys

Annotation of sys/sys/simplelock.h, Revision 1.1

1.1     ! nbrk        1: /*     $OpenBSD: simplelock.h,v 1.11 2004/06/13 21:49:28 niklas Exp $  */
        !             2:
        !             3: #ifndef _SIMPLELOCK_H_
        !             4: #define _SIMPLELOCK_H_
        !             5:
        !             6: #ifdef MULTIPROCESSOR
        !             7: #include <machine/lock.h>
        !             8: #endif
        !             9:
        !            10: /*
        !            11:  * A simple spin lock.
        !            12:  *
        !            13:  * This structure only sets one bit of data, but is sized based on the
        !            14:  * minimum word size that can be operated on by the hardware test-and-set
        !            15:  * instruction. It is only needed for multiprocessors, as uniprocessors
        !            16:  * will always run to completion or a sleep. It is an error to hold one
        !            17:  * of these locks while a process is sleeping.
        !            18:  */
        !            19: struct simplelock {
        !            20: #ifdef MULTIPROCESSOR
        !            21:        __cpu_simple_lock_t lock_data;
        !            22: #else
        !            23:        int     lock_data;
        !            24: #endif
        !            25: };
        !            26:
        !            27: #ifdef _KERNEL
        !            28:
        !            29: /*
        !            30:  * We can't debug locks when we use them in real life.
        !            31:  */
        !            32: #if defined(MULTIPROCESSOR) && defined(LOCKDEBUG)
        !            33: #undef LOCKDEBUG
        !            34: #endif
        !            35:
        !            36: #if !defined(MULTIPROCESSOR) || 1
        !            37:
        !            38: #define SLOCK_LOCKED 1
        !            39: #define SLOCK_UNLOCKED 0
        !            40:
        !            41: #ifndef LOCKDEBUG
        !            42:
        !            43: #define        simple_lock(lkp)
        !            44: #define        simple_lock_try(lkp)    (1)     /* always succeeds */
        !            45: #define        simple_unlock(lkp)
        !            46: #define simple_lock_assert(lkp)
        !            47:
        !            48: static __inline void simple_lock_init(struct simplelock *lkp)
        !            49: {
        !            50:
        !            51:        lkp->lock_data = SLOCK_UNLOCKED;
        !            52: }
        !            53:
        !            54: #else
        !            55:
        !            56: void _simple_unlock(__volatile struct simplelock *, const char *, int);
        !            57: int _simple_lock_try(__volatile struct simplelock *, const char *, int);
        !            58: void _simple_lock(__volatile struct simplelock *, const char *, int);
        !            59: void _simple_lock_assert(__volatile struct simplelock *, int, const char *, int);
        !            60:
        !            61: void simple_lock_init(struct simplelock *);
        !            62: #define simple_unlock(lkp) _simple_unlock(lkp, __FILE__, __LINE__)
        !            63: #define simple_lock_try(lkp) _simple_lock_try(lkp, __FILE__, __LINE__)
        !            64: #define simple_lock(lkp) _simple_lock(lkp, __FILE__, __LINE__)
        !            65: #define simple_lock_assert(lkp, state) _simple_lock_assert(lkp, state, __FILE__, __LINE__)
        !            66:
        !            67: #endif /* !defined(LOCKDEBUG) */
        !            68:
        !            69: #else  /* MULTIPROCESSOR */
        !            70:
        !            71: /*
        !            72:  * The simple-lock routines are the primitives out of which the lock
        !            73:  * package is built. The machine-dependent code must implement an
        !            74:  * atomic test_and_set operation that indivisibly sets the simple lock
        !            75:  * to non-zero and returns its old value. It also assumes that the
        !            76:  * setting of the lock to zero below is indivisible. Simple locks may
        !            77:  * only be used for exclusive locks.
        !            78:  */
        !            79:
        !            80: static __inline void simple_lock_init(struct simplelock *lkp)
        !            81: {
        !            82:        __cpu_simple_lock_init(&lkp->lock_data);
        !            83: }
        !            84:
        !            85: static __inline void simple_lock(__volatile struct simplelock *lkp)
        !            86: {
        !            87:        __cpu_simple_lock(&lkp->lock_data);
        !            88: }
        !            89:
        !            90: static __inline int simple_lock_try(__volatile struct simplelock *lkp)
        !            91: {
        !            92:        return (__cpu_simple_lock_try(&lkp->lock_data));
        !            93: }
        !            94:
        !            95: static __inline void simple_unlock(__volatile struct simplelock *lkp)
        !            96: {
        !            97:        __cpu_simple_unlock(&lkp->lock_data);
        !            98: }
        !            99: #endif /* MULTIPROCESSOR */
        !           100:
        !           101: #endif /* _KERNEL */
        !           102:
        !           103: #endif /* !_SIMPLELOCK_H_ */

CVSweb