ACTION!="add", GOTO="drivers_end"的意思
时间: 2023-09-23 09:06:13 浏览: 33
这同样是一个udev规则,通常存储在 /etc/udev/rules.d/ 目录下的 .rules 文件中。该规则的意思是:
如果一个设备不是 "add" 操作(例如,设备被删除),则执行一个 GOTO 操作,跳转到名为 "drivers_end" 的标签处,后面的规则将不再执行。
解释一下:
- ACTION!="add":表示匹配除了 "add" 操作之外的所有操作,例如,删除设备的操作。
- GOTO="drivers_end":表示执行一个跳转操作,跳转到名为 "drivers_end" 的标签处。
因此,该规则的作用是在设备被删除时,跳转到名为 "drivers_end" 的标签处,从而避免后面的规则被执行。这可以用于优化udev规则的执行效率,避免不必要的操作。
相关问题
WORD32 packetShadowDelete(SDDM_LPP_PACKET_KEY* pPacketKey, SDDM_LPP_PACKET* pPacketValue) { WORD32 dwRet = ROSNG_PARAM_ERROR; WORD32 so_desc = 0; WORD32 tcp_index = 0; if((NULL == pPacketKey) || (NULL == pPacketValue)) { ROSNG_TRACE_WARNING("Invalid para!!!\n"); goto error; } so_desc = pPacketValue->so_desc; tcp_index = pPacketValue->sddm_tcp_packet_cb.index; if((TCP_RECV_QUEUE == pPacketValue->pkt_queue) && (0 != so_desc)) { if(ROSNG_SUCCESS != packetShadowDeletePkt(&gSocketTable.packetRecvAvlTree,pPacketKey,pPacketValue,so_desc)) { ROSNG_TRACE_WARNING("packetShadowDeletePkt fail\n"); goto error; } } else if((TCP_SEND_QUEUE == pPacketValue->pkt_queue) && (0 != tcp_index)) { if(ROSNG_SUCCESS != packetShadowDeletePkt(&tcp_config.packetSendAvlTree,pPacketKey,pPacketValue,tcp_index)) { ROSNG_TRACE_WARNING("packetShadowDeletePkt fail\n"); goto error; } } else { XOS_ASSERT(0); goto error; } dwRet = ROSNG_SUCCESS; error: return dwRet; } 用c语言写一个ft测试用例
以下是一个简单的ft测试用例,测试packetShadowDelete函数是否能够正常处理输入参数并返回正确的结果。
```c
#include <stdio.h>
#include <assert.h>
typedef unsigned int WORD32;
typedef struct {
WORD32 index;
} SDDM_TCP_PACKET_CB;
typedef struct {
WORD32 so_desc;
SDDM_TCP_PACKET_CB sddm_tcp_packet_cb;
WORD32 pkt_queue;
} SDDM_LPP_PACKET;
typedef struct {
// some fields
} SDDM_LPP_PACKET_KEY;
#define TCP_RECV_QUEUE 0
#define TCP_SEND_QUEUE 1
#define ROSNG_SUCCESS 0
#define ROSNG_PARAM_ERROR -1
#define ROSNG_TRACE_WARNING(...) printf(__VA_ARGS__)
#define XOS_ASSERT(...) assert(__VA_ARGS__)
typedef struct {
// some fields
} PacketAvlTree;
PacketAvlTree packetRecvAvlTree;
PacketAvlTree packetSendAvlTree;
WORD32 packetShadowDeletePkt(PacketAvlTree* tree, SDDM_LPP_PACKET_KEY* key, SDDM_LPP_PACKET* value, WORD32 index) {
// some implementation
return ROSNG_SUCCESS;
}
WORD32 packetShadowDelete(SDDM_LPP_PACKET_KEY* pPacketKey, SDDM_LPP_PACKET* pPacketValue) {
WORD32 dwRet = ROSNG_PARAM_ERROR;
WORD32 so_desc = 0;
WORD32 tcp_index = 0;
if((NULL == pPacketKey) || (NULL == pPacketValue))
{
ROSNG_TRACE_WARNING("Invalid para!!!\n");
goto error;
}
so_desc = pPacketValue->so_desc;
tcp_index = pPacketValue->sddm_tcp_packet_cb.index;
if((TCP_RECV_QUEUE == pPacketValue->pkt_queue) && (0 != so_desc))
{
if(ROSNG_SUCCESS != packetShadowDeletePkt(&packetRecvAvlTree,pPacketKey,pPacketValue,so_desc))
{
ROSNG_TRACE_WARNING("packetShadowDeletePkt fail\n");
goto error;
}
}
else if((TCP_SEND_QUEUE == pPacketValue->pkt_queue) && (0 != tcp_index))
{
if(ROSNG_SUCCESS != packetShadowDeletePkt(&packetSendAvlTree,pPacketKey,pPacketValue,tcp_index))
{
ROSNG_TRACE_WARNING("packetShadowDeletePkt fail\n");
goto error;
}
}
else
{
XOS_ASSERT(0);
goto error;
}
dwRet = ROSNG_SUCCESS;
error:
return dwRet;
}
int main() {
SDDM_LPP_PACKET_KEY key;
key.some_field = 123;
SDDM_LPP_PACKET value;
value.so_desc = 456;
value.sddm_tcp_packet_cb.index = 789;
value.pkt_queue = TCP_RECV_QUEUE;
WORD32 ret = packetShadowDelete(&key, &value);
assert(ret == ROSNG_SUCCESS);
return 0;
}
```
优化以下代码:int MainWindow::ONVIF_GetDeviceInformation(const char *DeviceXAddr) { int result = 0; struct soap *soap = NULL; _tds__GetDeviceInformation * devinfo_req; _tds__GetDeviceInformationResponse * devinfo_resp; SOAP_ASSERT(NULL != DeviceXAddr); SOAP_ASSERT(NULL != (soap = ONVIF_soap_new(SOAP_SOCK_TIMEOUT))); memset(&devinfo_req, 0x00, sizeof(devinfo_req)); memset(&devinfo_resp, 0x00, sizeof(devinfo_resp)); result = soap_call___tds__GetDeviceInformation(soap, DeviceXAddr, NULL, devinfo_req, devinfo_resp); SOAP_CHECK_ERROR(result, soap, "GetDeviceInformation"); dump_tds__GetDeviceInformationResponse(devinfo_resp); EXIT: if (NULL != soap) { ONVIF_soap_delete(soap); } return result; }
优化后的代码如下:
```c++
int MainWindow::ONVIF_GetDeviceInformation(const char *DeviceXAddr) {
int result = 0;
struct soap *soap = ONVIF_soap_new(SOAP_SOCK_TIMEOUT);
if (soap == NULL) {
return SOAP_ERR;
}
_tds__GetDeviceInformation devinfo_req;
_tds__GetDeviceInformationResponse devinfo_resp;
memset(&devinfo_req, 0x00, sizeof(devinfo_req));
memset(&devinfo_resp, 0x00, sizeof(devinfo_resp));
result = soap_call___tds__GetDeviceInformation(soap, DeviceXAddr, NULL, &devinfo_req, &devinfo_resp);
SOAP_CHECK_ERROR(result, soap, "GetDeviceInformation");
dump_tds__GetDeviceInformationResponse(&devinfo_resp);
EXIT:
ONVIF_soap_delete(soap);
return result;
}
```
优化点如下:
1. 减少了多余的 NULL 判断,使用 ONVIF_soap_new 函数直接创建并初始化了 soap 对象。
2. 去掉了不必要的结构体指针,直接定义结构体变量 devinfo_req 和 devinfo_resp。
3. 修正了调用 soap_call___tds__GetDeviceInformation 函数时的参数类型,将结构体指针改为结构体变量的地址。
4. 去掉了 goto 语句,改用代码块 EXIT 来进行错误处理和资源释放。
相关推荐
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)