【Camera Framework笔记】五、流程梳理 - 抢占逻辑

 Camera抢占逻辑总体流程 - handleEvictionsLocked:
            1. 获取所有active pids的oom_adj_scores和process state并更新各clientpriority(里面包含了priorityScore和state值)
                active pid:所有使用过cameraservice服务(打开camera)的客户端对应的pid
                
                     // std::vector<int> ownerPids(mActiveClientManager.getAllOwners());
                        ownerPids.push_back(clientPid);
                
                定义每个clientPid的两个容器priorityScores和states,并通过getProcessStatesScoresFromPids给其赋值
                     // std::vector<int> priorityScores(ownerPids.size());
                     // std::vector<int> states(ownerPids.size());

                这个函数是到系统中查询所有clientPid的score值和state值。
                这里通过binder最终调用到了Java服务中,在AMS中注册的服务“processinfo”
                最终调用的是AMS的getProcessStatesAndOomScoresForPIDs方法。
                ServiceManager.addService("processinfo", new ProcessInfoService(this));
                Get priority scores of all active PIDs
                这里从AMS返回的priorityScore是进程的ADJ值,state是进程的状态(前台,后台等状态
                具体可看ActivityManager.java中PROCESS_STATE_XXX)
                    // status_t err = ProcessInfoService::getProcessStatesScoresFromPids(
                            ownerPids.size(), &ownerPids[0], /*out*/&states[0],
                            /*out*/&priorityScores[0]);

                Update all active clients' priorities(为什么会更新?因为防止client发生变化)
                将上面获取到的进程状态放到pidToPriorityMap的map中,key为进程pid,
                value为ClientPriority
                    // std::map<int,resource_policy::ClientPriority> pidToPriorityMap;
                    // for (size_t i = 0; i < ownerPids.size() - 1; i++) {
                            pidToPriorityMap.emplace(ownerPids[i],
                                    resource_policy::ClientPriority(priorityScores[i], states[i],
                                            /* isVendorClient won't get copied over*/ false,
                                            /* oomScoreOffset won't get copied over*/ 0));
                        }
                    // mActiveClientManager.updatePriorities(pidToPriorityMap);
                
            2. 根据当前想打开的camera信息创建一个clientdescriptor,调用cameraclientmanager的wouldEvict方法拿到需要Evicted的列表
                wouldEvict -> wouldEvictLocked: 详见 2 == 2
            3. 如果想打开的camera在 Evicted列表中,则返回camera—in-use或者max-camera—in-use错误
            4. 遍历Evicted列表,通知error-camera-disconnected错误给client ()
            5. 通过clearcallingIdentity清空远程调用端的uid和pid。用当前本地进程的uid和pid替代(因为cameraclient只能是自己活cameraserver来关闭)清空远程调用端的uid和pid。用当前本地进程的uid和pid替代(因为cameraclient只能是自己活cameraserver来关闭)
            6. 遍历Evicted列表,调用每个client的disconnect方法来关闭camera
            7. 通过restoreCallingIdentity恢复远程调用端的uid和pid信息,正好是clearcallingIdentitly的反过程
            8. 调用mActiveClientManager.waitUntilRemoved等待所有evicted client disconnect完成
            9. evictedClients.clear(); mServiceLock.lock();
            10. 再次检查当前cameraid对应的device是否可用

2 == 2

      wouldEvictLocked  抢占逻辑流程详解:
            冲突的定义:(curkey 当前打开的client A camera 0,key 想打开的client B camera 0)
                bool conflicting  = (
                当前打开的client A camera 0 == 想打开的client B camera 0 ||  
                当前打开的client A 冲突列表中包含想打开的client B camera 0 ||
                想打开的client B 冲突列表中包含当前打开的client A camera 0)
            
            与已打开camera存在冲突:
                同一个进程:
                    同一颗camera(已经打开的被抢占)(同一进程重复打开同一camera)
                        // 如果cameraId相同,则将自己加入evictList。也就是说同一个进程第二次打开一个冲突的设备时,
                        // 将会把第一次打开的驱逐,第二次将会重新打开。
                    不同camera(想打开的抢占失败,无法打开)
                        // 如果cameraId不相同,则会即将第二次打开的进行驱逐。也就是第二次打开将会失败。
                不同进程:
                    已打开优先级低(已经打开的被抢占)(不同进程重复打开同一camera)
                        // 如果发生冲突,或者 resource cost超过最大值并且当前进程优先级更高,则将进行比较的已经存在的client进行驱逐
                    已打开优先级高(想打开的抢占失败,无法打开)(不同进程重复打开同一camera)

            与已打开camera不存在冲突:
                total cost超过最大值100:
                    已打开优先级低(已经打开的被抢占)
                    已打开优先级高(想打开的抢占失败,无法打开)
                total cost未超过最大值(无需抢占)

  • 5
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Jetson GMSL摄像头框架指南是为使用NVIDIA Jetson平台的用户提供的一份指南文档。Jetson平台是一个强大的计算平台,常用于深度学习、计算机视觉和人工智能应用。 GMSL是指通用多媒体串行链(General Multimedia Serial Link),是一种高速串行接口标准,用于连接图像传感器和计算平台。Jetson GMSL摄像头框架指南旨在帮助用户在Jetson平台上使用GMSL相机进行图像采集和处理。 该指南包含了使用Jetson平台接入GMSL摄像头的步骤和方法。首先,它介绍了如何将GMSL摄像头连接到Jetson平台上的CSI端口。然后,指南提供了有关配置和设置GMSL相机驱动程序的详细信息,以确保相机可以正常工作。此外,还介绍了如何设置和调整相机的曝光、白平衡和焦距等参数,以获得最佳的图像质量。 在框架指南中,还提供了使用NVIDIA提供的相机软件开发工具包(Camera Software Development Kit,SDK)的说明。这个SDK提供了各种图像处理函数和算法,用户可以使用这些函数来处理和分析相机采集到的图像。指南中还包括了一些示例代码和实用工具,帮助用户快速上手和开发自己的图像处理应用。 总之,Jetson GMSL摄像头框架指南是一份帮助用户在Jetson平台上使用GMSL相机的详细文档。它提供了连接、配置、设置和开发的步骤和方法,让用户能够充分利用Jetson平台的计算能力和GMSL相机的功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Cam_Rxy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值