#include <ubixos/spinlock.h> #include <ubixos/sched.h> spinLock_t *BigLock = NULL; spinLock_t *BigLocksLock = NULL; #define READ 1 #define WRITE 0 void spinWriteLock(spinLock_t *lock, uInt32 id, uInt8 emergency) { spinLock_t *tmp; spinLock(&BigLocksLock); lock->Type = READ; if(emergency) { tmp = BigLock->First->Next; BigLock->First = lock; tmp->Previous = lock; } else { tmp = BigLock->Last; lock->Previous = tmp; BigLock->Last = lock; lock->Next = NULL; } spinUnlock(&BigLocksLock); while(1) { spinLock(&BigLocksLock); if(BigLock->First->ID != id && BigLock->First->Locked) break; spinUnlock(&BigLocksLock); } } void spinReadLock(spinLock_t *lock, uInt32 id, uInt8 emergency) { spinLock_t *tmp; spinLock(&BigLocksLock); lock->Type = READ; if(emergency) { tmp = BigLock->First->Next; BigLock->First = lock; tmp->Previous = lock; } else { tmp = BigLock->Last; lock->Previous = tmp; BigLock->Last = lock; lock->Next = NULL; } spinUnlock(&BigLocksLock); while(1) { spinLock(&BigLocksLock); if(BigLock->First->ID != id && BigLock->First->Locked) break; spinUnlock(&BigLocksLock); } } /* void spinLockInit(spinLock_t *lock) { *lock = SPIN_LOCK_INITIALIZER; } */ void spinLock(spinLock_t *lock) { while (lock->Locked != 0); } void spinUnlock(spinLock_t *lock) { *lock->Locked = 0x0; } /* int spinTryLock(spinLock_t *lock) { register int locked; asm volatile("xchgl %0, %1" : "=&r" (locked), "=m" (*lock) : "0" (1) ); return(!locked); } void spinLock_scheduler(spinLock_t *lock) { while (*lock != 0); } int spinLockLocked(spinLock_t *lock) { return(*lock != 0); } */ /*** END ***/