BMOSP/kernel/lock.c

38 lines
812 B
C
Raw Normal View History

2023-10-21 21:23:51 +03:00
/**
* lock.c
* Функции блокировок
*
* Функционал блокировок и синхронизации
*
*/
#include <fb.h>
#include <lock.h>
#include <stdint.h>
#include <tool.h>
2023-10-24 23:39:00 +03:00
// Если не заблокировано - блокируем
int lock_swap(lock_t *lock) {
return __sync_bool_compare_and_swap(&lock->lock, 0, 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 > 1000000) {
2023-10-29 16:12:00 +03:00
LOG("%s блокировка зависла", lock->file);
assert(0);
}
asm volatile("pause");
}
}
2023-10-24 23:39:00 +03:00
// Запрос разблокировки ресурса
void lock_release(lock_t *lock) {
__sync_bool_compare_and_swap(&lock->lock, 1, 0);
}