atomic操作在kernel 源代码中是比较常见的,主要是防止读取的是寄存器的内容,而内存的值已经被其他线程改变,主要是因为多线程的原因。对于 PM 来说,主要是操作atomic struct 里的变量counter。
atomic_read
define atomic_read(v) READ_ONCE((v)->counter)
atomic_set
define atomic_set(v, i) WRITE_ONCE(((v)->counter), (i))
详细代码如下:
atomic_add_unless
atomic_add_unless函数的实现在arch/arm/include/asm/atomic.h中。
atomic_add_unless 这个feature是将新值存入atomic_t类型的变量,并把变量的旧值返回,函数实现如下:
__atomic_add_unless函数path:nclude/asm-generic/atomic.h,函数实现如下:
函数会事先判断a 值是否与传入atomic_t中的counter值相同,如果相同就返回旧的counter值;如果不同的话, 则会call 到atomic_cmpxchg, atomic_cmpxchg 位于
arch/sparc/lib/atomic32.c, 函数实现如下:
该函数用于判断,旧值counter是否和old 相同,如果相同,就会把旧counter 值和 a 的相加之后的值赋值给counter,并且返回旧counter值;如果不相同,就直接返回旧counter值。基本上两次循环就会实现counter值被更新。