Newer
Older
ubixos / src / sys / kernel / spinlock.c
@apwillia apwillia on 13 Jul 2002 1 KB Added spinlockInit
#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;
}