Blame view
include/asm-cris/semaphore-helper.h
1.5 KB
1da177e4c Linux-2.6.12-rc2 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 |
/* $Id: semaphore-helper.h,v 1.3 2001/03/26 15:00:33 orjanf Exp $ * * SMP- and interrupt-safe semaphores helper functions. Generic versions, no * optimizations whatsoever... * */ #ifndef _ASM_SEMAPHORE_HELPER_H #define _ASM_SEMAPHORE_HELPER_H #include <asm/atomic.h> #include <linux/errno.h> #define read(a) ((a)->counter) #define inc(a) (((a)->counter)++) #define dec(a) (((a)->counter)--) #define count_inc(a) ((*(a))++) /* * These two _must_ execute atomically wrt each other. */ extern inline void wake_one_more(struct semaphore * sem) { atomic_inc(&sem->waking); } extern inline int waking_non_zero(struct semaphore *sem) { unsigned long flags; int ret = 0; local_save_flags(flags); local_irq_disable(); if (read(&sem->waking) > 0) { dec(&sem->waking); ret = 1; } local_irq_restore(flags); return ret; } extern inline int waking_non_zero_interruptible(struct semaphore *sem, struct task_struct *tsk) { int ret = 0; unsigned long flags; local_save_flags(flags); local_irq_disable(); if (read(&sem->waking) > 0) { dec(&sem->waking); ret = 1; } else if (signal_pending(tsk)) { inc(&sem->count); ret = -EINTR; } local_irq_restore(flags); return ret; } extern inline int waking_non_zero_trylock(struct semaphore *sem) { int ret = 1; unsigned long flags; local_save_flags(flags); local_irq_disable(); if (read(&sem->waking) <= 0) inc(&sem->count); else { dec(&sem->waking); ret = 0; } local_irq_restore(flags); return ret; } #endif /* _ASM_SEMAPHORE_HELPER_H */ |