list_first_entry_or_null
时间: 2023-08-06 11:02:36 浏览: 303
`list_first_entry_or_null` 是一个宏定义在 Linux 内核中,用于获取链表的第一个元素的指针,如果链表为空则返回 NULL。
它的定义如下:
```c
#define list_first_entry_or_null(ptr, type, member) \
(!list_empty(ptr) ? list_first_entry(ptr, type, member) : NULL)
```
与 `list_first_entry` 宏类似,`ptr` 是链表头指针,`type` 是链表节点的数据类型,`member` 是链表节点在数据结构中的成员名。
使用 `list_first_entry_or_null` 宏可以安全地获取链表的第一个节点的指针,即使链表为空,也会返回 NULL 而不会导致错误。这在需要处理可能为空的链表时很有用。
相关问题
这段代码是什么意思 cmeq_link_t* get_link_from_pool() { cmeq_link_t *plink = NULL; pthread_mutex_lock(&link_pool.lock_idle); while (list_empty(&link_pool.idle_head)) { pthread_mutex_unlock(&link_pool.lock_idle); sem_wait(&link_pool.wait_idle_link); pthread_mutex_lock(&link_pool.lock_idle); } plink = list_first_entry(&link_pool.idle_head, cmeq_link_t, user); list_del_init(&(plink->user)); pthread_mutex_unlock(&link_pool.lock_idle); // plink->testFlg = 1; //printf("get cmeq link %d\n", ++link_cnt); return plink; }
这段代码是一个函数,函数名为get_link_from_pool,返回值为cmeq_link_t类型的指针。这个函数的作用是从连接池中获取一个空闲的连接,并返回该连接的指针。
在函数中,首先定义了一个空指针plink,然后通过pthread_mutex_lock函数锁定了连接池的空闲连接列表。接下来使用while循环,在连接池的空闲连接列表为空的情况下,使用sem_wait函数等待连接池中有空闲连接可用。当获取到一个空闲连接时,使用list_first_entry函数获取该连接,并从空闲连接列表中删除该连接。最后通过pthread_mutex_unlock函数解锁连接池的空闲连接列表,并将获取到的连接指针返回。
注释中的plink->testFlg = 1和printf语句是注释掉的代码,不会被执行。
根据接口“”@FeignClient(name = "UserUgsApi", url = "${newbim.login-domain}") public interface IApplicationServicePlatformClient {@PostMapping("/ums/v1/feign/omp/project/search") ResultWrapper<QueryAllProject> listUserProject(@RequestHeader("BSP_TOKEN") String bspToken, @RequestHeader("BSP_USER_ID") String bspUserId, @RequestHeader("BSP_USER_ENV_ID") String bspUserEnvId, @RequestHeader("BSP_USER_TENANT") String bspUserTenant, @RequestBody ProjectCondition queryProjectDto);和代码”@Component @Slf4j public class ApplicationServicePlatformClientProxy { @Autowired private IApplicationServicePlatformClient applicationServicePlatformClient; public QueryAllProject listUserProject(String appId, String companyId, String designStatusList, String pageSize, ProjectCondition userId) { ResultWrapper<QueryAllProject> result = null; return result.getData(); } }“检查并修改下面内容:@Override public List<ProjectCountVO> projectCount(String beginTime, String endTime, Integer forceType, String projectId) { List<TaskTask> taskTaskList = this.listStatisticsTask(beginTime, endTime, forceType, projectId); if (CollectionUtil.isEmpty(taskTaskList)) { return Collections.emptyList(); } List<ProjectCountVO> result = new ArrayList<>(); Map<String, List<TaskTask>> projectTaskMap = taskTaskList.stream().collect(Collectors.groupingBy(TaskTask::getProjectId)); for (Map.Entry<String, List<TaskTask>> projectTaskEntry : projectTaskMap.entrySet()) { projectId = projectTaskEntry.getKey(); ProjectCountVO projectCountVO = new ProjectCountVO(); projectCountVO.setId(projectId); //查询项目名称 QueryAllProject queryAllProject = applicationServicePlatformClientProxy.listUserProject( "token", "userId", "userEnvId", "userTenant", new ProjectCondition()); String projectName = queryAllProject.getBtpProjectId(); projectCountVO.setName(projectName); List<TaskTask> taskList = projectTaskEntry.getValue(); projectCountVO.setTaskCount(taskList.size()); Integer problemCount = CollectionUtil.isEmpty(taskList) ? 0 : taskList.stream().collect(Collectors.summingInt(task -> Optional.ofNullable(task.getProblemNum()).orElse(0))); projectCountVO.setProblemCount(problemCount); result.add(projectCountVO); } return result; }
根据提供的代码和接口,需要修改的部分如下:
1. 在 ApplicationServicePlatformClientProxy 类中,listUserProject 方法的参数应该与接口中的参数一致,即接收一个 ProjectCondition 类型的对象。
修改后的代码如下:
```
@Component
@Slf4j
public class ApplicationServicePlatformClientProxy {
@Autowired
private IApplicationServicePlatformClient applicationServicePlatformClient;
public QueryAllProject listUserProject(String bspToken, String bspUserId, String bspUserEnvId, String bspUserTenant, ProjectCondition queryProjectDto) {
ResultWrapper<QueryAllProject> result = applicationServicePlatformClient.listUserProject(bspToken, bspUserId, bspUserEnvId, bspUserTenant, queryProjectDto);
return result.getData();
}
}
```
2. 在 projectCount 方法中,根据项目 ID 查询项目名称的代码需要修改。
修改后的代码如下:
```
//查询项目名称
ProjectCondition queryProjectDto = new ProjectCondition();
queryProjectDto.setBtpProjectId(projectId);
QueryAllProject queryAllProject = applicationServicePlatformClientProxy.listUserProject("token", "userId", "userEnvId", "userTenant", queryProjectDto);
String projectName = queryAllProject.getProjectList().stream().findFirst().orElse(new Project()).getProjectName();
projectCountVO.setName(projectName);
```
需要注意的是,这里调用的接口返回的是 QueryAllProject 对象,而不是具体的项目名称。因此需要根据查询参数设置 ProjectCondition 对象,然后调用 listUserProject 方法获取项目列表,再从列表中获取对应项目的名称。
阅读全文