DragonOS/kernel/process/spinlock.h

57 lines
1.2 KiB
C
Raw Normal View History

2022-04-07 09:46:09 +00:00
/**
* @file spinlock.h
* @author fslongjin (longjin@RinGoTek.cn)
* @brief
* @version 0.1
* @date 2022-04-07
*
* @copyright Copyright (c) 2022
*
*/
2022-04-12 13:30:07 +00:00
#pragma once
2022-04-07 09:46:09 +00:00
#include "../common/glib.h"
/**
* @brief
*
*/
typedef struct
{
__volatile__ char lock; // 1:unlocked 0:locked
} spinlock_t;
/**
* @brief
*
* @param lock
*/
void spin_init(spinlock_t *lock)
{
lock->lock = 1;
}
/**
* @brief
*
* @param lock
*/
void spin_lock(spinlock_t *lock)
{
__asm__ __volatile__("1: \n\t"
"lock decq %0 \n\t" // 尝试-1
"jns 3f \n\t" // 加锁成功跳转到步骤3
"2: \n\t" // 加锁失败,稍后再试
"pause \n\t"
"cmpq $0, %0 \n\t"
"jle 2b \n\t" // 若锁被占用,则继续重试
"jmp 1b \n\t" // 尝试加锁
"3:"
: "=m"(lock->lock)::"memory");
}
void spin_unlock(spinlock_t * lock)
{
__asm__ __volatile__("movq $1, %0 \n\t"
:"=m"(lock->lock)::"memory");
}