#include <spinlock.h>
spinlock_t * spinlockCreate()
{
spinlock_t * lock = kmalloc(sizeof(spinlock_t));
if (lock == NULL)
kpanic("SPINLOCK: Couldn't create spinlock\n");
memset(lock, '\0', sizeof(spinlock_t));
return lock;
}
void spinlockInit(spinlock_t & lock)
{
memset(lock, '\0', sizeof(spinlock_t));
}
void spinlockDelete(spinlock_t * lock)
{
int i;
int notComplete = 1;
deleteInProgress = 1;
while (notComplete == 1)
{
notComplete = 0;
for (i = 0; i < 16; i++)
{
while(choiceInProgress[i] != 0)
notComplete = 1;
while(ticket[i] != 0)
notComplete = 1;
}
}
delete lock;
}
int spinlockLock(spinlock_t *, int cpuID)
{
int max_ticket = 0;
int i;
if (deleteInProgress == 1)
return SPINLOCK_FAIL_DELETING;
choiceInProgress[cpuID] = 1;
for (i = 0; i < 16; i++)
if (ticket[i] >= max_ticket)
max_ticket = ticket[i];
max_ticket++;
ticket[cpuID] = max_ticket;
choiceInProgress[cpuID] = 0;
for (i = 0; i < 16; i++)
{
while(choiceInProgress[i] == 1)
;
while (((ticket[i] < max_ticket) || ((ticket[i] == max_ticket) && (i < cpuID)))
&& (ticket[i] != 0))
;
}
return SPINLOCK_SUCCESS;
}
int spinlockUnlock(spinlock_t * lock, int cpuID)
{
ticket[cpuID] = 0;
return SPINLOCK_SUCCESS;
}