1 /** 2 * @file atomic.h 3 * @author fslongjin (longjin@RinGoTek.cn) 4 * @brief 原子变量 5 * @version 0.1 6 * @date 2022-04-12 7 * 8 * @copyright Copyright (c) 2022 9 * 10 */ 11 #pragma once 12 13 #define atomic_read(atomic) ((atomic)->value) // 读取原子变量 14 #define atomic_set(atomic,val) (((atomic)->value) = (val)) // 设置原子变量的初始值 15 16 typedef struct 17 { 18 volatile long value; 19 } atomic_t; 20 21 /** 22 * @brief 原子变量增加值 23 * 24 * @param ato 原子变量对象 25 * @param val 要增加的值 26 */ 27 inline void atomic_add(atomic_t *ato, long val) 28 { 29 asm volatile("lock addq %1, %0 \n\t" 30 : "=m"(ato->value) 31 : "m"(val) 32 : "memory"); 33 } 34 35 /** 36 * @brief 原子变量减少值 37 * 38 * @param ato 原子变量对象 39 * @param val 要减少的值 40 */ 41 inline void atomic_sub(atomic_t *ato, long val) 42 { 43 asm volatile("lock subq %1, %0 \n\t" 44 : "=m"(ato->value) 45 : "m"(val) 46 : "memory"); 47 } 48 49 /** 50 * @brief 原子变量自增 51 * 52 * @param ato 原子变量对象 53 */ 54 void atomic_inc(atomic_t *ato) 55 { 56 asm volatile("lock incq %0 \n\t" 57 : "=m"(ato->value) 58 : "m"(ato->value) 59 : "memory"); 60 } 61 62 /** 63 * @brief 原子变量自减 64 * 65 * @param ato 原子变量对象 66 */ 67 void atomic_dec(atomic_t *ato) 68 { 69 asm volatile("lock decq %0 \n\t" 70 : "=m"(ato->value) 71 : "m"(ato->value) 72 : "memory"); 73 } 74 75 /** 76 * @brief 设置原子变量的mask 77 * 78 * @param ato 原子变量对象 79 */ 80 inline void atomic_set_mask(atomic_t *ato, long mask) 81 { 82 __asm__ __volatile__("lock orq %1, %0 \n\t" 83 : "=m"(ato->value) 84 : "r"(mask) 85 : "memory"); 86 } 87 88 /** 89 * @brief 清除原子变量的mask 90 * 91 * @param ato 原子变量对象 92 */ 93 inline void atomic_clear_mask(atomic_t *ato, long mask) 94 { 95 __asm__ __volatile__("lock andq %1, %0 \n\t" 96 : "=m"(ato->value) 97 : "r"(mask) 98 : "memory"); 99 } 100