summaryrefslogtreecommitdiff
path: root/src/libs/lock.c
blob: 7b65a69806e61327290cd18cc6a73f1821d20e11 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include "lock.h"
#include "utils.h"
#include "addrmap.h"
#include "time.h"

char locks_pool[LOCKS_POOL_SIZE]; // Automatically zeroed (.bss)

void lock_acquire(int lockid) {
  while(1){
	while(locks_pool[lockid]) {} // Lurking stage
	while(!REG_READ(HARDWARE_LOCK)){} // Acquire HW lock
	if(!locks_pool[lockid]){
	  locks_pool[lockid]=1; // Acquire the lock
	  REG_WRITE(HARDWARE_LOCK,0); // Release HW lock
	  break;
	}
	REG_WRITE(HARDWARE_LOCK,0);
  }
}

void lock_release(int lockid) {
  while(!REG_READ(HARDWARE_LOCK)){}
  locks_pool[lockid]=0;
  REG_WRITE(HARDWARE_LOCK,0);
}