1 #ifndef __ASM_SH_SEMAPHORE_H 2 #define __ASM_SH_SEMAPHORE_H 4 #include <linux/linkage.h> 7 * SMP- and interrupt-safe semaphores. 9 * (C) Copyright 1996 Linus Torvalds 11 * SuperH verison by Niibe Yutaka 15 #include <linux/spinlock.h> 17 #include <asm/system.h> 18 #include <asm/atomic.h> 23 wait_queue_head_t wait
; 30 # define __SEM_DEBUG_INIT(name) \ 31 , (int)&(name).__magic 33 # define __SEM_DEBUG_INIT(name) 36 #define __SEMAPHORE_INITIALIZER(name,count) \ 37 { ATOMIC_INIT(count), 0, __WAIT_QUEUE_HEAD_INITIALIZER((name).wait) \ 38 __SEM_DEBUG_INIT(name) } 40 #define __MUTEX_INITIALIZER(name) \ 41 __SEMAPHORE_INITIALIZER(name,1) 43 #define __DECLARE_SEMAPHORE_GENERIC(name,count) \ 44 struct semaphore name = __SEMAPHORE_INITIALIZER(name,count) 46 #define DECLARE_MUTEX(name) __DECLARE_SEMAPHORE_GENERIC(name,1) 47 #define DECLARE_MUTEX_LOCKED(name) __DECLARE_SEMAPHORE_GENERIC(name,0) 49 extern inlinevoidsema_init(struct semaphore
*sem
,int val
) 52 * *sem = (struct semaphore)__SEMAPHORE_INITIALIZER((*sem),val); 54 * i'd rather use the more flexible initialization above, but sadly 55 * GCC 2.7.2.3 emits a bogus warning. EGCS doesnt. Oh well. 57 atomic_set(&sem
->count
, val
); 59 init_waitqueue_head(&sem
->wait
); 61 sem
->__magic
= (int)&sem
->__magic
; 65 staticinlinevoidinit_MUTEX(struct semaphore
*sem
) 70 staticinlinevoidinit_MUTEX_LOCKED(struct semaphore
*sem
) 75 asmlinkage
void__down_failed(void/* special register calling convention */); 76 asmlinkage
int__down_failed_interruptible(void/* params in registers */); 77 asmlinkage
int__down_failed_trylock(void/* params in registers */); 78 asmlinkage
void__up_wakeup(void/* special register calling convention */); 80 asmlinkage
void__down(struct semaphore
* sem
); 81 asmlinkage
int__down_interruptible(struct semaphore
* sem
); 82 asmlinkage
int__down_trylock(struct semaphore
* sem
); 83 asmlinkage
void__up(struct semaphore
* sem
); 85 extern spinlock_t semaphore_wake_lock
; 87 extern __inline__
voiddown(struct semaphore
* sem
) 90 CHECK_MAGIC(sem
->__magic
); 93 if(atomic_dec_return(&sem
->count
) <0) 97 extern __inline__
intdown_interruptible(struct semaphore
* sem
) 101 CHECK_MAGIC(sem
->__magic
); 104 if(atomic_dec_return(&sem
->count
) <0) 105 ret
=__down_interruptible(sem
); 109 extern __inline__
intdown_trylock(struct semaphore
* sem
) 113 CHECK_MAGIC(sem
->__magic
); 116 if(atomic_dec_return(&sem
->count
) <0) 117 ret
=__down_trylock(sem
); 122 * Note! This is subtle. We jump to wake people up only if 123 * the semaphore was negative (== somebody was waiting on it). 125 extern __inline__
voidup(struct semaphore
* sem
) 128 CHECK_MAGIC(sem
->__magic
); 130 if(atomic_inc_return(&sem
->count
) <=0) 134 #endif/* __ASM_SH_SEMAPHORE_H */