diff --git a/src/sys/include/ubixos/spinlock.h b/src/sys/include/ubixos/spinlock.h index a934564..7c11e3a 100755 --- a/src/sys/include/ubixos/spinlock.h +++ b/src/sys/include/ubixos/spinlock.h @@ -1,30 +1,30 @@ -#ifndef _SPINLOCK_H - -#define _SPINLOCK_H - -typedef struct -{ - int ticket[16]; // allow up to 16 CPUs. - int choiceInProgress[16]; - - int deleteInProgress; - -} spinlock_t; - -enum spinlock_returns -{ - SPINLOCK_SUCCESS, - SPINLOCK_FAIL_DELETING -} - -spinlock_t * spinlockCreate(); -void spinlockInit(spinlock_t &); -void spinlockDelete(spinlock_t *); - -int spinlockLock(spinlock_t *, int); -int spinlockUnlock(spinlock_t *, int); - -#endif - - - +#ifndef _SPINLOCK_H + +#define _SPINLOCK_H + +typedef struct __SPINLOCK_TYPE +{ + int ticket[16]; // allow up to 16 CPUs. + int choiceInProgress[16]; + + int deleteInProgress; + +} spinlock_t; + +enum spinlock_returns +{ + SPINLOCK_SUCCESS, + SPINLOCK_FAIL_DELETING +}; + +spinlock_t * spinlockCreate(); +void spinlockInit(spinlock_t *); +void spinlockDelete(spinlock_t *); + +int spinlockLock(spinlock_t *, int); +int spinlockUnlock(spinlock_t *, int); + +#endif + + + diff --git a/src/sys/kernel/spinlock.c b/src/sys/kernel/spinlock.c index ba684f2..0bb6e51 100755 --- a/src/sys/kernel/spinlock.c +++ b/src/sys/kernel/spinlock.c @@ -1,4 +1,7 @@ -#include +#include +#include +#include +#include spinlock_t * spinlockCreate() { @@ -12,7 +15,7 @@ return lock; } -void spinlockInit(spinlock_t & lock) +void spinlockInit(spinlock_t * lock) { memset(lock, '\0', sizeof(spinlock_t)); } @@ -22,49 +25,50 @@ int i; int notComplete = 1; - deleteInProgress = 1; + lock->deleteInProgress = 1; while (notComplete == 1) { notComplete = 0; for (i = 0; i < 16; i++) { - while(choiceInProgress[i] != 0) + while(lock->choiceInProgress[i] != 0) notComplete = 1; - while(ticket[i] != 0) + while(lock->ticket[i] != 0) notComplete = 1; } } - delete lock; + kfree(lock); } -int spinlockLock(spinlock_t *, int cpuID) +int spinlockLock(spinlock_t * lock, int cpuID) { int max_ticket = 0; int i; - if (deleteInProgress == 1) + if (lock->deleteInProgress == 1) return SPINLOCK_FAIL_DELETING; - choiceInProgress[cpuID] = 1; + lock->choiceInProgress[cpuID] = 1; for (i = 0; i < 16; i++) - if (ticket[i] >= max_ticket) - max_ticket = ticket[i]; + if (lock->ticket[i] >= max_ticket) + max_ticket = lock->ticket[i]; max_ticket++; - ticket[cpuID] = max_ticket; - choiceInProgress[cpuID] = 0; + lock->ticket[cpuID] = max_ticket; + lock->choiceInProgress[cpuID] = 0; for (i = 0; i < 16; i++) { - while(choiceInProgress[i] == 1) + while(lock->choiceInProgress[i] == 1) ; - while (((ticket[i] < max_ticket) || ((ticket[i] == max_ticket) && (i < cpuID))) - && (ticket[i] != 0)) + while (((lock->ticket[i] < max_ticket) || + ((lock->ticket[i] == max_ticket) && (i < cpuID))) + && (lock->ticket[i] != 0)) ; } @@ -75,8 +79,8 @@ int spinlockUnlock(spinlock_t * lock, int cpuID) { - ticket[cpuID] = 0; + lock->ticket[cpuID] = 0; return SPINLOCK_SUCCESS; } - \ No newline at end of file +