atomic_read
时间: 2023-06-21 12:24:34 浏览: 223
`atomic_read` 是一个宏,用于原子地读取一个 `atomic_t` 类型变量的值。在多线程并发访问时,使用 `atomic_read` 可以保证读取的值是原子的,即不会出现并发读取导致的竞态条件。它的定义如下:
```c
#define atomic_read(v) atomic_read(&(v)->counter)
```
其中,`v` 是一个 `atomic_t` 类型的变量,`counter` 是 `atomic_t` 结构体中的一个成员变量,用于存储原子变量的值。 `atomic_read` 宏的作用是将 `v` 的地址传递给 `atomic_read` 函数,实际上是调用了 `atomic_read` 函数对 `v` 进行原子读操作。
相关问题
atomic_read函数原型
atomic_read函数的原型为:
```c
int atomic_read(const atomic_t *v);
```
其中,`atomic_t`是Linux内核中原子变量的定义类型,`v`是指向要读取的原子变量的指针。
该函数用于读取原子变量的值,并返回该值。由于原子变量是多线程并发访问的,因此需要使用原子操作来保证读取操作的原子性和线程安全性。
static u64 extend_obj_stats(struct zram *zram, u16 gid, int type) { if (!CHECK(zram->zgrp, "zram extend is not enable!\n")) return 0; if (!CHECK_BOUND(gid, 0, zram->zgrp->nr_grp - 1)) return 0; if (type == CACHE_SIZE) return atomic64_read(&zram->zgrp->stats[gid].zram_size); else if (type == CACHE_PAGE) return atomic_read(&zram->zgrp->stats[gid].zram_pages); else if (type == CACHE_FAULT) return atomic64_read(&zram->zgrp->stats[gid].zram_fault); #ifdef CONFIG_ZRAM_EXTEND_WRITEBACK else if (type == SWAP_SIZE) return atomic64_read(&zram->zgrp->stats[gid].wb_size); else if (type == SWAP_PAGE) return atomic_read(&zram->zgrp->stats[gid].wb_pages); else if (type == READ_SIZE) return atomic64_read(&zram->zgrp->stats[gid].read_size); else if (type == WRITE_SIZE) return atomic64_read(&zram->zgrp->stats[gid].write_size); else if (type == SWAP_FAULT) return atomic64_read(&zram->zgrp->stats[gid].wb_fault); BUG(); #endif return 0; } 这个函数做一下流程优化
可以做如下的流程优化:
```c
static u64 extend_obj_stats(struct zram *zram, u16 gid, int type) {
if (!CHECK(zram->zgrp, "zram extend is not enable!\n"))
return 0;
if (!CHECK_BOUND(gid, 0, zram->zgrp->nr_grp - 1))
return 0;
switch (type) {
case CACHE_SIZE:
return atomic64_read(&zram->zgrp->stats[gid].zram_size);
case CACHE_PAGE:
return atomic_read(&zram->zgrp->stats[gid].zram_pages);
case CACHE_FAULT:
return atomic64_read(&zram->zgrp->stats[gid].zram_fault);
#ifdef CONFIG_ZRAM_EXTEND_WRITEBACK
case SWAP_SIZE:
return atomic64_read(&zram->zgrp->stats[gid].wb_size);
case SWAP_PAGE:
return atomic_read(&zram->zgrp->stats[gid].wb_pages);
case READ_SIZE:
return atomic64_read(&zram->zgrp->stats[gid].read_size);
case WRITE_SIZE:
return atomic64_read(&zram->zgrp->stats[gid].write_size);
case SWAP_FAULT:
return atomic64_read(&zram->zgrp->stats[gid].wb_fault);
#endif
default:
break;
}
BUG();
return 0;
}
```
这里使用 `switch-case` 替换了原来的 `if-else` 结构,使代码更加简洁易读。同时,由于 `BUG()` 表示代码中存在错误,因此可以将其放在 `default` 分支中,避免出现无法预料的错误。
阅读全文