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);
}
|