OpenXR Monado创建跨进程通信通道 ipc_connect

 OpenXR Monado创建跨进程通信通道 ipc_connect

@monado/src/xrt/targets/openxr/target.c
xrt_instance_create
@monado/src/xrt/ipc/client/ipc_client_instance.cipc_instance_create(ii, out_xinst);ipc_connectipc_c->ica = ipc_client_android_create(android_globals_get_vm(), android_globals_get_activity());@monado/src/xrt/ipc/android/ipc_client_android.cppint socket = ipc_client_android_blocking_connect(ipc_c->ica);@monado/src/xrt/ipc/android/org.freedesktop.monado.ipc.impl.hppint fd = ica->client.blockingConnect(ica->activity, XRT_ANDROID_PACKAGE);  // blockingConnect(classRef().getMethod("blockingConnect", "(Landroid/content/Context;Ljava/lang/String;)I"))@monado/src/xrt/ipc/android/src/main/java/org/freedesktop/monado/ipc/Client.javablockingConnect(Context context_, String packageName)  //packageName=org.freedesktop.monado.openxr_runtime.out_of_processbind(context_, packageName)Intent intent = new Intent(BuildConfig.SERVICE_ACTION).setPackage(packageName);  // String SERVICE_ACTION = "org.freedesktop.monado.ipc.CONNECT";bindService(context, intent)result = context.bindService(intent, this, flags);@monado/src/xrt/ipc/android/src/main/java/org/freedesktop/monado/ipc/MonadoService.ktMonadoService::onCreateval intent = Intent(this, javaClass)intent.action = BuildConfig.SERVICE_ACTIONstartService(intent)  //启动org.freedesktop.monado.ipc.MonadoService服务onServiceConnectedmonado = IMonado.Stub.asInterface(service);ParcelFileDescriptor[] fds = ParcelFileDescriptor.createSocketPair();ours = fds[0];   //75theirs = fds[1];  //76fd = ours;@monado/src/xrt/ipc/android/src/main/java/org/freedesktop/monado/ipc/MonadoImpl.javamonado.connect(theirs);  //跨进程,进入server进程int fd = parcelFileDescriptor.getFd();  //78(从76复制过来)@monado/src/xrt/targets/service-lib/service_target.cppnativeAddClient(fd)  //Java_org_freedesktop_monado_ipc_MonadoImpl_nativeAddClientreturn IpcServerHelper::instance().addClient(fd);@monado/src/xrt/ipc/server/ipc_server_mainloop_android.creturn ipc_server_mainloop_add_fd(server, &server->ml, fd);int ret = write(ml->pipe_write, &newfd, sizeof(newfd));  //pipe_write=82, newfd=78int ret = epoll_wait(epoll_fd, events, NUM_POLL_EVENTS, NO_SLEEP);if (events[i].data.fd == ml->pipe_read) { handle_listen(vs, ml); }read(ml->pipe_read, &newfd, sizeof(newfd))   //pipe_read=81,newfd=78ml->last_accepted_fd = newfd; @monado/src/xrt/ipc/server/ipc_server_process.cipc_server_start_client_listener_thread(vs, newfd);ics->imc.ipc_handle = ipc_handle;  //ipc_handle=78,openxr_runtime.out_of_process-25265os_thread_start(&it->thread, ipc_server_client_thread, (void *)ics);@monado/src/xrt/ipc/server/ipc_server_per_client_thread.cipc_server_client_thread  //新线程,openxr_runtime.out_of_process-26722volatile struct ipc_client_state *ics = (volatile struct ipc_client_state *)_ics;client_loop(ics);while (ics->server->running) {  //开启线程循环int ret = epoll_wait(epoll_fd, &event, 1, half_a_second_ms);ssize_t len = recv(ics->imc.ipc_handle, &buf, IPC_BUF_SIZE, 0);  //ipc_handle=78@monado/src/xrt/targets/openxr_android/.cxx/Debug/4h1i2215/arm64-v8a/src/xrt/ipc/ipc_server_generated.cxrt_result_t result = ipc_dispatch(ics, ipc_command);
@monado/src/xrt/ipc/server/ipc_server_handler.ccase IPC_SWAPCHAIN_ACQUIRE_IMAGE: reply.result = ipc_handle_swapchain_acquire_image(ics, msg->id,&reply.index);xrt_result_t ret = ipc_send((struct ipc_message_channel *)&ics->imc, &reply, sizeof(reply));return fd.getFd();socket = dup(socket);   //复制一份fd=77,openxr.hello_xr.openglesipc_c->imc.ipc_handle = socket;  //77

@monado/src/xrt/targets/openxr/target.c xrt_instance_create @monado/src/xrt/ipc/client/ipc_client_instance.c ipc_instance_create(ii, out_xinst); ipc_connect ipc_c->ica = ipc_client_android_create(android_globals_get_vm(), android_globals_get_activity()); @monado/src/xrt/ipc/android/ipc_client_android.cpp int socket = ipc_client_android_blocking_connect(ipc_c->ica); @monado/src/xrt/ipc/android/org.freedesktop.monado.ipc.impl.hpp int fd = ica->client.blockingConnect(ica->activity, XRT_ANDROID_PACKAGE); // blockingConnect(classRef().getMethod("blockingConnect", "(Landroid/content/Context;Ljava/lang/String;)I")) @monado/src/xrt/ipc/android/src/main/java/org/freedesktop/monado/ipc/Client.java blockingConnect(Context context_, String packageName) //packageName=org.freedesktop.monado.openxr_runtime.out_of_process bind(context_, packageName) Intent intent = new Intent(BuildConfig.SERVICE_ACTION).setPackage(packageName); // String SERVICE_ACTION = "org.freedesktop.monado.ipc.CONNECT"; bindService(context, intent) result = context.bindService(intent, this, flags); @monado/src/xrt/ipc/android/src/main/java/org/freedesktop/monado/ipc/MonadoService.kt MonadoService::onCreate val intent = Intent(this, javaClass) intent.action = BuildConfig.SERVICE_ACTION startService(intent) //启动org.freedesktop.monado.ipc.MonadoService服务 onServiceConnected monado = IMonado.Stub.asInterface(service); ParcelFileDescriptor[] fds = ParcelFileDescriptor.createSocketPair(); ours = fds[0]; //75 theirs = fds[1]; //76 fd = ours; @monado/src/xrt/ipc/android/src/main/java/org/freedesktop/monado/ipc/MonadoImpl.java monado.connect(theirs); //跨进程,进入server进程 int fd = parcelFileDescriptor.getFd(); //78(从76复制过来) @monado/src/xrt/targets/service-lib/service_target.cpp nativeAddClient(fd) //Java_org_freedesktop_monado_ipc_MonadoImpl_nativeAddClient return IpcServerHelper::instance().addClient(fd); @monado/src/xrt/ipc/server/ipc_server_mainloop_android.c return ipc_server_mainloop_add_fd(server, &server->ml, fd); int ret = write(ml->pipe_write, &newfd, sizeof(newfd)); //pipe_write=82, newfd=78 int ret = epoll_wait(epoll_fd, events, NUM_POLL_EVENTS, NO_SLEEP); if (events[i].data.fd == ml->pipe_read) { handle_listen(vs, ml); } read(ml->pipe_read, &newfd, sizeof(newfd)) //pipe_read=81,newfd=78 ml->last_accepted_fd = newfd; @monado/src/xrt/ipc/server/ipc_server_process.c ipc_server_start_client_listener_thread(vs, newfd); ics->imc.ipc_handle = ipc_handle; //ipc_handle=78,openxr_runtime.out_of_process-25265 os_thread_start(&it->thread, ipc_server_client_thread, (void *)ics); @monado/src/xrt/ipc/server/ipc_server_per_client_thread.c ipc_server_client_thread //新线程,openxr_runtime.out_of_process-26722 volatile struct ipc_client_state *ics = (volatile struct ipc_client_state *)_ics; client_loop(ics); while (ics->server->running) { //开启线程循环 int ret = epoll_wait(epoll_fd, &event, 1, half_a_second_ms); ssize_t len = recv(ics->imc.ipc_handle, &buf, IPC_BUF_SIZE, 0); //ipc_handle=78 @monado/src/xrt/targets/openxr_android/.cxx/Debug/4h1i2215/arm64-v8a/src/xrt/ipc/ipc_server_generated.c xrt_result_t result = ipc_dispatch(ics, ipc_command); @monado/src/xrt/ipc/server/ipc_server_handler.c case IPC_SWAPCHAIN_ACQUIRE_IMAGE: reply.result = ipc_handle_swapchain_acquire_image(ics, msg->id,&reply.index); xrt_result_t ret = ipc_send((struct ipc_message_channel *)&ics->imc, &reply, sizeof(reply)); return fd.getFd(); socket = dup(socket); //复制一份fd=77,openxr.hello_xr.opengles ipc_c->imc.ipc_handle = socket; //77

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/53719.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

补:在Spring Boot 当中使用 Thymeleaf 视图解析器

补&#xff1a;在Spring Boot 当中使用 Thymeleaf 视图解析器 想要在 Spring Boot 当中使用 Thymeleaf 视图&#xff0c;就需要导入相关的 jar 依赖。在 pom.xml 文件中配置 。 <!-- 引入 thymeleaf-start ,项目会自动完成配置&#xff0c;--><dependency>…

网络操作系统项目

部署与管理Active Directory 项目基础知识 活动目录是一种由微软开发的网络服务&#xff0c;用于在网络环境中管理和组织用户、计算机和其他网络资源。它是基于目录服务的概念&#xff0c;类似于电话号码簿。 活动目录主要用于集中管理网络中的用户帐户、组织单位、计算机、打…

统一建模语言UML之类图(Class Diagram)(表示|关系|举例)

文章目录 1.UML2.Class Diagram2.1 类图的表示2.2 类间的关系2.2.1 关联2.2.2 聚合2.2.3 组合2.2.4 泛化&#xff08;继承&#xff09;2.2.5 实现&#xff08;接口实现&#xff09;2.2.6 依赖 2.3 类图的作用 参考&#xff1a;Class Diagram | Unified Modeling Language (UML)…

使用 Watchdog 实现 Python 程序的自动重载

在开发 Python 程序时,特别是在开发图形用户界面(GUI)应用时,我们经常需要频繁修改代码并查看效果。每次修改后手动重启程序既耗时又繁琐。本文将介绍如何使用 Watchdog 库来实现 Python 程序的自动重载,大大提高开发效率。 什么是 Watchdog? Watchdog 是一个 Python 库…

大数据新视界 --大数据大厂之Flink强势崛起:大数据新视界的璀璨明珠

&#x1f496;&#x1f496;&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎你们来到 青云交的博客&#xff01;能与你们在此邂逅&#xff0c;我满心欢喜&#xff0c;深感无比荣幸。在这个瞬息万变的时代&#xff0c;我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…

力扣---80. 删除有序数组中的重复项 II

给你一个有序数组 nums &#xff0c;请你 原地 删除重复出现的元素&#xff0c;使得出现次数超过两次的元素只出现两次 &#xff0c;返回删除后数组的新长度。 不要使用额外的数组空间&#xff0c;你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。 说明&…

electron react离线使用monaco-editor

1.安装monaco-editor/react和monaco-editor pnpm i monaco-editor/react pnpm i monaco-editor 2.引入并做monaco-editor离线配置 import Editor, { DiffEditor, useMonaco, loader } from monaco-editor/react import * as monaco from monaco-editor import editorWorke…

软考 -- 软件设计师 -- 二轮复习(3) -- 数据结构(持续更新)

软考 – 软件设计师 – 二轮复习(3) – 数据结构(持续更新) 文章目录 软考 -- 软件设计师 -- 二轮复习(3) -- 数据结构(持续更新)前言一、时间、空间复杂度二、递归式时间复杂度三、线性表四、栈五、栈和队列六、串七、朴素模式匹配八、KMP模式匹配九、数组十、矩阵十一、树、二…

C#基础(10)变长参数和参数默认值

前言 作为函数的补充知识点&#xff0c;我们已经学习了ref和out&#xff0c;接下来两节我们继续来讲函数相关的内容。本节则讲解变长参数和参数默认值。 函数语法 关键字&#xff1a;params public void PrintNumbers(params int[] numbers) {for 相关逻辑 } 注意 params…

MySql批量迁移数据库

导出数据库 将指定数据库实例&#xff08;MYSQL_HOST、MYSQL_PORT、MYSQL_USER、MYSQL_PASSWORD&#xff09;中的所有数据库&#xff08;表结构、数据&#xff09;导出到指定目录&#xff08;BACKUP_DIR&#xff09;下的多个单独的SQL脚本&#xff0c;每个SQL脚本名称即为数据…

HarmonyOS开发实战( Beta5.0)自定义装饰器实践规范

介绍 本示例介绍通过自定义装饰器在自定义组件中自动添加inspector (布局回调)方法并进行调用。 效果图预览 不涉及 使用说明 在自定义组件上添加自定义装饰器CallbackObserver&#xff0c;并根据参数设置对应的方法名和需要绑定的组件的ID。编译工程&#xff0c;可以根据…

四款音频剪辑软件免费使用,你更pick哪一个?

视频剪辑知随着软件的不断更新&#xff0c;入门门槛和操作难度也随之变得越来越低&#xff0c;但是依然有不少人不知道剪辑视频要用什么工具&#xff0c;作为一个视频剪辑爱好者&#xff0c;我尝试过不少编辑软件&#xff0c;今天就来跟大家分享一下四款视频剪辑软件在实际使用…

adb devices不显示连接设备怎么解决

adb devices不显示设备&#xff0c;首先用老办法检查。假如是显示adb这个命令不认识&#xff0c;那就是系统路径问题。假如能认识adb这个命令&#xff0c;那就检查一下手机有没有开usb调试。 但是我遇到了更奇怪的问题&#xff1a;我把网上的攻略都试了一遍&#xff0c;设备驱…

通用四期ARM架构银河麒麟桌面操作系统V10【安装、配置FTP客户端】

一、操作环境 服务端&#xff1a;银河麒麟桌面操作系统V10SP1 客户端&#xff1a;银河麒麟桌面操作系统V10SP1 二、服务端配置 注&#xff1a;以下命令均在终端执行 鼠标点击桌面右键&#xff0c;选择打开终端 操作步骤&#xff1a; 1、安装vsftpd软件&#xff1a;如果提…

深入理解TCP三次握手

在网络通信中&#xff0c;TCP&#xff08;Transmission Control Protocol&#xff0c;传输控制协议&#xff09;是一个可靠的、面向连接的协议&#xff0c;它保证了数据包的顺序和完整性。为了建立一个稳定的连接&#xff0c;TCP 使用了一个被称为 三次握手&#xff08;Three-W…

滑动窗口(1)_长度最小的子数组

个人主页&#xff1a;C忠实粉丝 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 C忠实粉丝 原创 滑动窗口(1)_长度最小的子数组 收录于专栏【经典算法练习】 本专栏旨在分享学习C的一点学习笔记&#xff0c;欢迎大家在评论区交流讨论&#x1f48c; 目录 1. …

一款高效、简洁的帧动画生成工具

在现代网页设计和移动应用开发中&#xff0c;帧动画是一种常见的动画实现方式&#xff0c;它通过连续显示一系列静态图片来模拟动画效果。然而&#xff0c;手动创建和管理这些帧动画图片不仅耗时费力&#xff0c;而且效率低下。为此&#xff0c;gka 应运而生&#xff0c;它是一…

Java学习Day41:骑龙救!(springMVC)

springMVC与sevlet都是对应表现层web的&#xff0c;但是越复杂的项目使用SpringMVC越方便 基于Java实现MVC模型的轻量级web框架 目标&#xff1a; 小案例&#xff1a; 1.导入依赖 spring-context: 提供 Spring 框架的核心功能&#xff0c;如依赖注入、事件发布和其他应用上…

利用分布式锁在ASP.NET Core中实现防抖

前言 在 Web 应用开发过程中&#xff0c;防抖&#xff08;Debounce&#xff09; 是确保同一操作在短时间内不会被重复触发的一种有效手段。常见的场景包括防止用户在短时间内重复提交表单&#xff0c;或者避免多次点击按钮导致后台服务执行多次相同的操作。无论在单机环境中&a…

人工智能如何改变我们的工作方式

最近&#xff0c;我突然发现&#xff0c;人工智能正在悄悄地改变我们每天的工作方式。可能你和我一样&#xff0c;一开始并没怎么注意到这些变化&#xff0c;直到有一天&#xff0c;我才恍然大悟——原来我们已经不知不觉中被AI“包围”了&#xff01;它正在一点一点地改变着我…