__must_check含义及出处

__must_check为Linux内核中的一种属性标记,确保调用函数必须处理返回值,否则编译时将发出警告。此标记定义于include/linux/compiler-gcc4.h文件中,通过__attribute__((warn_unused_result))实现。
 

[linux笔记]__must_check含义及出处

 

include/linux/compiler-gcc4.h
#define __must_check            __attribute__((warn_unused_result))
__must_check函数是指调用函数一定要处理该函数的返回值,否则编译器会给出警告
int sensor_broadcast(uint8_t event_type, void *event_data, void (*free_func)(uint8_t, void *)) { int ret = 0; unsigned int i = 0; unsigned long flags = 0; bool broadcast = false, has_request = false; struct sensor_header *header = (struct sensor_header *)event_data; uint8_t sensor_type = header->sensor_type; struct sensor_core *core = &sens_core; struct list_t *curr = NULL, *tmp = NULL; struct sensor_client *client = NULL; flags = spinlock_lock_irqsave(&core->client_lock); for (i = 0; i < ARRAY_SIZE(core->client_list); ++i) { list_for_each_entry_safe(&core->client_list[i], curr, tmp) { /* * NOTE: each loop must reset has_request to false * if don't reset swtich default branch will send invalid event */ has_request = false; client = list_entry(curr, struct sensor_client, list); switch (event_type) { case EVENT_DATA: has_request = client->request[sensor_type].enable; break; case EVENT_FLUSH_DATA: has_request = client->request[sensor_type].flush > 0; break; case EVENT_CALI_DATA: has_request = client->request[sensor_type].cali; break; case EVENT_BIAS_DATA: has_request = client->request[sensor_type].bias; break; case EVENT_TEMP_CALI_DATA: has_request = client->request[sensor_type].temp; break; case EVENT_SELF_TEST_DATA: has_request = client->request[sensor_type].test; break; case EVENT_RAW_DATA: has_request = client->request[sensor_type].raw; break; default: fatal(NULL); break; } if (has_request) { /* * NOTE: must first set and after broadcast_event failed clear. * if not, event_data will be used after free and system crash. * task0: task1: task2: * broadcast_event * bit_clear_return(free) * * bit_set(task1, task2) * bit_clear_return(crash) */ bit_set(&header->task_map, client->receiver->handle.task); ret = broadcast_event(&client->receiver->handle, SENSOR_HANDLER, event_type, event_data, free_func, false); //传递数据 /* * NOTE: broadcast_event not use failed_auto_free, * when broadcast_event failed return, we should clear task_map. */ if (ret < 0) bit_clear(&header->task_map, client->receiver->handle.task); /* * NOTE: when has_request of client is true in one task, * we must break list_for_each_entry_safe for others clients in this task, * if not, event_data will be used after free and system crash. */ break; } } } /* check bit to detect free or not in spinlock */ broadcast = !!bit_read(&header->task_map); spinlock_unlock_irqrestore(&core->client_lock, flags); /* no task require data must free event data */ if (!broadcast && free_func && event_data) free_func(FORCE_FREE, event_data); /* must return 0 due to multi dispatcher */ return 0; ———————————————— 版权声明:本文为优快云博主「零星,思索」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.youkuaiyun.com/qq_55893245/article/details/140331074
最新发布
12-31
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值