URL
https://opencores.org/ocsvn/or1k/or1k/trunk
Subversion Repositories or1k
[/] [or1k/] [trunk/] [uclinux/] [uClinux-2.0.x/] [include/] [asm-alpha/] [semaphore.h] - Rev 1765
Compare with Previous | Blame | View Log
#ifndef _ALPHA_SEMAPHORE_H #define _ALPHA_SEMAPHORE_H /* * SMP- and interrupt-safe semaphores.. * * (C) Copyright 1996 Linus Torvalds */ #include <asm/atomic.h> #include <asm/system.h> struct semaphore { atomic_t count; atomic_t waking; int lock; /* to make waking testing atomic */ struct wait_queue * wait; }; #define MUTEX ((struct semaphore) { 1, 0, 0, NULL }) #define MUTEX_LOCKED ((struct semaphore) { 0, 0, 0, NULL }) extern void __down(struct semaphore * sem); extern int __down_interruptible(struct semaphore * sem); extern void __up(struct semaphore * sem); /* * This isn't quite as clever as the x86 side, but the gp register * makes things a bit more complicated on the alpha.. */ extern inline void down(struct semaphore * sem) { if (atomic_dec_return(&sem->count) < 0) __down(sem); } /* * Primitives to spin on a lock. Needed only for SMP version. */ extern inline void get_buzz_lock(int *lock_ptr) { #ifdef __SMP__ while (xchg(lock_ptr,1) != 0) ; #endif } /* get_buzz_lock */ extern inline void give_buzz_lock(int *lock_ptr) { #ifdef __SMP__ *lock_ptr = 0 ; #endif } /* give_buzz_lock */ extern inline int down_interruptible(struct semaphore * sem) { int ret = 0; if (atomic_dec_return(&sem->count) < 0) ret = __down_interruptible(sem); return ret; } extern inline void up(struct semaphore * sem) { if (atomic_inc_return(&sem->count) <= 0) __up(sem); } #endif