1 /*------------------------------------------------------------------------- 2 * 3 * spin.h 4 * Hardware-independent implementation of spinlocks. 5 * 6 * 7 * The hardware-independent interface to spinlocks is defined by the 8 * typedef "slock_t" and these macros: 9 * 10 * void SpinLockInit(volatile slock_t *lock) 11 * Initialize a spinlock (to the unlocked state). 12 * 13 * void SpinLockAcquire(volatile slock_t *lock) 14 * Acquire a spinlock, waiting if necessary. 15 * Time out and abort() if unable to acquire the lock in a 16 * "reasonable" amount of time --- typically ~ 1 minute. 17 * 18 * void SpinLockRelease(volatile slock_t *lock) 19 * Unlock a previously acquired lock. 20 * 21 * bool SpinLockFree(slock_t *lock) 22 * Tests if the lock is free. Returns TRUE if free, FALSE if locked. 23 * This does *not* change the state of the lock. 24 * 25 * Callers must beware that the macro argument may be evaluated multiple 26 * times! 27 * 28 * Load and store operations in calling code are guaranteed not to be 29 * reordered with respect to these operations, because they include a 30 * compiler barrier. (Before PostgreSQL 9.5, callers needed to use a 31 * volatile qualifier to access data protected by spinlocks.) 32 * 33 * Keep in mind the coding rule that spinlocks must not be held for more 34 * than a few instructions. In particular, we assume it is not possible 35 * for a CHECK_FOR_INTERRUPTS() to occur while holding a spinlock, and so 36 * it is not necessary to do HOLD/RESUME_INTERRUPTS() in these macros. 37 * 38 * These macros are implemented in terms of hardware-dependent macros 39 * supplied by s_lock.h. There is not currently any extra functionality 40 * added by this header, but there has been in the past and may someday 41 * be again. 42 * 43 * 44 * Portions Copyright (c) 1996-2016, PostgreSQL Global Development Group 45 * Portions Copyright (c) 1994, Regents of the University of California 46 * 47 * src/include/storage/spin.h 48 * 49 *------------------------------------------------------------------------- 50 */ 51 #ifndef SPIN_H 52 #define SPIN_H 53 54 #include "storage/s_lock.h" 55 #ifndef HAVE_SPINLOCKS 56 #include "storage/pg_sema.h" 57 #endif 58 59 60 #define SpinLockInit(lock) S_INIT_LOCK(lock) 61 62 #define SpinLockAcquire(lock) S_LOCK(lock) 63 64 #define SpinLockRelease(lock) S_UNLOCK(lock) 65 66 #define SpinLockFree(lock) S_LOCK_FREE(lock) 67 68 69 extern int SpinlockSemas(void); 70 extern Size SpinlockSemaSize(void); 71 72 #ifndef HAVE_SPINLOCKS 73 extern void SpinlockSemaInit(PGSemaphore); 74 extern PGSemaphore SpinlockSemaArray; 75 #endif 76 77 #endif /* SPIN_H */ 78