BMOSP/kernel/lock.c

43 lines
862 B
C
Raw Normal View History

2023-10-21 21:23:51 +03:00
/**
* lock.c
* Функции блокировок
*
* Функционал блокировок и синхронизации
*
*/
#include <fb.h>
#include <lock.h>
#include <log.h>
#include <stdint.h>
#include <tool.h>
2023-10-24 23:39:00 +03:00
// Если не заблокировано - блокируем
int lock_swap(lock_t lock) {
if (lock.lock) { return 0; }
lock.lock = 1;
return 1;
}
2023-10-24 23:39:00 +03:00
// Запрос блокировки ресурса
void lock_acquire(lock_t lock) {
uint64_t count = 0;
for (;;) {
if (lock_swap(lock)) { break; }
count++;
if (count > 10000) {
LOG("%s:%u блокировка зависла", lock.func, lock.line);
assert(0);
}
asm volatile("pause");
if (task_f_init) { task_switch( ); }
}
}
2023-10-24 23:39:00 +03:00
// Запрос разблокировки ресурса
void lock_release(lock_t lock) {
if (lock.lock) { lock.lock = 0; }
}