From dd89f8418c7f0fa8aabce030285f77edc0c3dfab Mon Sep 17 00:00:00 2001 From: wangyingjun02 <2959448004@qq.com> Date: Fri, 21 Apr 2023 14:39:39 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E4=B8=89=E6=96=B9=E5=BA=93co?= =?UTF-8?q?ncurrentqueue=E7=9A=84=E9=80=82=E9=85=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: wangyingjun02 <2959448004@qq.com> --- concurrentqueue/BUILD.gn | 83 ++++++++++++++++++++ concurrentqueue/CHANGELOG.md | 3 + concurrentqueue/CMakeLists.txt | 22 ++++++ concurrentqueue/README.OpenSource | 11 +++ concurrentqueue/README_zh.md | 17 ++++ concurrentqueue/bundle.json | 35 +++++++++ concurrentqueue/docs/hap_integrate.md | 46 +++++++++++ concurrentqueue/docs/pic/hap.jpeg | Bin 0 -> 44076 bytes concurrentqueue/docs/pic/result.PNG | Bin 0 -> 32896 bytes concurrentqueue/docs/rom_integrate.md | 107 ++++++++++++++++++++++++++ 10 files changed, 324 insertions(+) create mode 100644 concurrentqueue/BUILD.gn create mode 100644 concurrentqueue/CHANGELOG.md create mode 100644 concurrentqueue/CMakeLists.txt create mode 100644 concurrentqueue/README.OpenSource create mode 100644 concurrentqueue/README_zh.md create mode 100644 concurrentqueue/bundle.json create mode 100644 concurrentqueue/docs/hap_integrate.md create mode 100644 concurrentqueue/docs/pic/hap.jpeg create mode 100644 concurrentqueue/docs/pic/result.PNG create mode 100644 concurrentqueue/docs/rom_integrate.md diff --git a/concurrentqueue/BUILD.gn b/concurrentqueue/BUILD.gn new file mode 100644 index 00000000..7d588b44 --- /dev/null +++ b/concurrentqueue/BUILD.gn @@ -0,0 +1,83 @@ +import("//build/ohos.gni") + +declare_args() { + enable_queue_test = false +} + +config("config") { + cflags = [ + "-fPIC", + "-Wall", + "-frtti", + "-fexceptions", + "-Wno-error=unused-variable", + "-Wno-error=self-move", + ] + + cflags_cc = cflags +} + +##生成可执行文件 +ohos_executable("unittests") { + sources = [ + "//third_party/concurrentqueue/tests/common/simplethread.cpp", + "//third_party/concurrentqueue/tests/common/systemtime.cpp", + "//third_party/concurrentqueue/tests/unittests/unittests.cpp", + ] + include_dirs = [ + "//third_party/concurrentqueue", + "//third_party/concurrentqueue/c_api", + "//third_party/concurrentqueue/tests/common", + "//third_party/concurrentqueue/tests/unittests", + ] + + configs = [ ":config" ] + + deps = [ "//third_party/concurrentqueue:concurrentqueue" ] + subsystem_name = "thirdparty" + part_name = "concurrentqueue" +} + +##生成可执行文件 +ohos_executable("fuzztests") { + sources = [ + "//third_party/concurrentqueue/tests/common/simplethread.cpp", + "//third_party/concurrentqueue/tests/common/systemtime.cpp", + "//third_party/concurrentqueue/tests/fuzztests/fuzztests.cpp", + ] + include_dirs = [ + "//third_party/concurrentqueue", + "//third_party/concurrentqueue/c_api", + "//third_party/concurrentqueue/tests/common", + "//third_party/concurrentqueue/tests/fuzztests", + ] + + configs = [ ":config" ] + deps = [ "//third_party/concurrentqueue:concurrentqueue" ] + subsystem_name = "thirdparty" + part_name = "concurrentqueue" +} + +ohos_shared_library("concurrentqueue") { + sources = [ + "//third_party/concurrentqueue/c_api/blockingconcurrentqueue.cpp", + "//third_party/concurrentqueue/c_api/concurrentqueue.cpp", + ] + + include_dirs = [ + "//third_party/concurrentqueue", + "//third_party/concurrentqueue/c_api", + ] + subsystem_name = "thirdparty" + part_name = "concurrentqueue" +} + +group("concurrentqueues") { + deps = [ ":concurrentqueue" ] + if (enable_queue_test) { + deps += [ + ":fuzztests", + ":unittests", + ] + } +} diff --git a/concurrentqueue/CHANGELOG.md b/concurrentqueue/CHANGELOG.md new file mode 100644 index 00000000..4963dc75 --- /dev/null +++ b/concurrentqueue/CHANGELOG.md @@ -0,0 +1,3 @@ +# 1.0.0 + +添加BUILD.gn和cmake,适配在ohos上的编译 diff --git a/concurrentqueue/CMakeLists.txt b/concurrentqueue/CMakeLists.txt new file mode 100644 index 00000000..9fa2bdaa --- /dev/null +++ b/concurrentqueue/CMakeLists.txt @@ -0,0 +1,22 @@ +# the minimum version of CMake. +cmake_minimum_required(VERSION 3.4.1) +project(ConcurrentQueue) + +set(NATIVERENDER_ROOT_PATH ${CMAKE_CURRENT_SOURCE_DIR}) + +include_directories(${NATIVERENDER_ROOT_PATH} + ${NATIVERENDER_ROOT_PATH}/concurrentqueue) + + +add_library(concurrentqueue SHARED concurrentqueue/c_api/concurrentqueue.cpp concurrentqueue/c_api/concurrentqueue.cpp) + +add_executable(unittests concurrentqueue/tests/unittests/unittests.cpp concurrentqueue/tests/common/simplethread.cpp concurrentqueue/tests/common/systemtime.cpp) +add_executable(fuzztests concurrentqueue/tests/fuzztests/fuzztests.cpp concurrentqueue/tests/common/simplethread.cpp concurrentqueue/tests/common/systemtime.cpp) + +target_include_directories(concurrentqueue PRIVATE ${NATIVERENDER_ROOT_PATH} + ${NATIVERENDER_ROOT_PATH}/concurrentqueue/tests/common + ${NATIVERENDER_ROOT_PATH}/concurrentqueue/tests/unittests + ${NATIVERENDER_ROOT_PATH}/concurrentqueue/tests/fuzztests + ${NATIVERENDER_ROOT_PATH}/concurrentqueue/tests/c_api) + +target_link_libraries(unittests PUBLIC concurrentqueue) \ No newline at end of file diff --git a/concurrentqueue/README.OpenSource b/concurrentqueue/README.OpenSource new file mode 100644 index 00000000..d8736fb5 --- /dev/null +++ b/concurrentqueue/README.OpenSource @@ -0,0 +1,11 @@ +[ + { + "Name": "concurrentqueue", + "License": "BSD License", + "License File": "LICENSE", + "Version Number": "v1.0.3", + "Owner" : "wangyingjun5@huawei.com", + "Upstream URL": "https://github.com/cameron314/concurrentqueue", + "Description": "A fast multi-producer, multi-consumer lock-free concurrent queue for C++11" + } +] diff --git a/concurrentqueue/README_zh.md b/concurrentqueue/README_zh.md new file mode 100644 index 00000000..5fa3a899 --- /dev/null +++ b/concurrentqueue/README_zh.md @@ -0,0 +1,17 @@ +# concurrentqueue 三方库说明 + +## 功能简介 + +concurrentqueue是一个高效的线程安全的队列的库。 + +## 使用约束 + +- Rom版本:OpenHarmony3.2 beta2 +- 三方库版本:v1.0.3 +- 当前适配的功能:入队与出队 +- License:[BSD License](https://github.com/cameron314/concurrentqueue/blob/master/LICENSE.md) + +## 集成方式 + +- [系统Rom包集成](./docs/rom_integrate.md) ++ [应用hap包集成](docs/hap_integrate.md) diff --git a/concurrentqueue/bundle.json b/concurrentqueue/bundle.json new file mode 100644 index 00000000..431fcde7 --- /dev/null +++ b/concurrentqueue/bundle.json @@ -0,0 +1,35 @@ +{ + "name": "@ohos/concurrentqueue", + "description": "A fast multi-producer, multi-consumer lock-free concurrent queue for C++11", + "version": "v1.0.3", + "license": "BSD License", + "publishAs": "", + "segment": { + "destPath": "third_party/concurrentqueue" + }, + "dirs": {}, + "scripts": {}, + "readmePath": { + "en": "README" + }, + "component": { + "name": "concurrentqueue", + "subsystem": "thirdparty", + "syscap": [], + "features": [], + "adapted_system_type": ["standard"], + "rom": "", + "ram": "", + "deps": { + "components": [], + "third_party": [] + }, + "build": { + "sub_component": [ + "//third_party/concurrentqueue:concurrentqueues" + ], + "inner_kits": [], + "test": [] + } + } +} \ No newline at end of file diff --git a/concurrentqueue/docs/hap_integrate.md b/concurrentqueue/docs/hap_integrate.md new file mode 100644 index 00000000..6cf2db88 --- /dev/null +++ b/concurrentqueue/docs/hap_integrate.md @@ -0,0 +1,46 @@ +# concurrentqueue如何集成到应用hap +## 准备应用工程 +本库是基于DevEco Studio 3.1 Beta1版本,在RK3568开发板上验证的,如果是从未使用过RK3568,可以先查看[润和RK3568开发板标准系统快速上手](https://gitee.com/openharmony-sig/knowledge_demo_temp/tree/master/docs/rk3568_helloworld) +### 准备应用开发环境 +开发环境的准备参考:[开发环境准备](https://gitee.com/openharmony-sig/knowledge_demo_temp/blob/master/docs/napi_study/docs/hello_napi.md) +### 增加构建脚本及配置文件 +- 下载本仓库,并解压 +- 三方库目录结构 + ``` + tpc_c_cplusplus/concurrentqueue #三方库concurrentqueue的目录结构如下 + ├── docs #存放三方库相关文档的文件夹 + ├── CmakeLists.txt #构建脚本,支持hap包集成 + ├── bundle.json #三方库组件定义文件 + ├── README.OpenSource #说明三方库源码的下载地址,版本,license等信息 + ├── README_zh.md + ``` +- 将concurrentqueue拷贝至工程xxxx/entry/src/main/cpp/thirdparty目录下 +### 准备三方库源码 +- 三方库下载地址:[concurrentqueue](https://github.com/cameron314/concurrentqueue), 版本:v1.0.3 + 解压后修改库文件名为concurrentqueue,拷贝至工程xxxx/entry/src/main/cpp/thirdparty/concurrentqueue目录下 +## 应用中使用三方库 +- 将三方库加入工程中,目录结构如下 + ``` + demo/entry/src/main/cpp + ├── thirdparty #三方库存放目录 + │ ├──concurrentqueue #三方库concurrentqueue + ├── CMakeLists.txt #工程目录的构建脚本 + ├── ..... #工程目录的其他文件 + ``` +- 在工程顶级CMakeLists.txt中引入三方库,增加如下代码 + ``` + include_directories(thirdparty/concurrentqueue/include) + add_subdirectory(thirdparty/concurrentqueue) #引入子目录下的CMakeLists.txt + target_link_libraries(工程库名 PUBLIC concurrentqueue) #工程依赖三方库concurrentqueue + ``` +## 编译工程 +编译工程,安装应用可以参考 [应用的安装和运行](https://gitee.com/openharmony-sig/knowledge_demo_temp/blob/master/docs/napi_study/docs/hello_napi.md#%E5%AE%89%E8%A3%85%E8%B0%83%E8%AF%95) +## 运行效果 +- 在 [concurrentqueue](https://gitee.com/openharmony-tpc/openharmony_tpc_samples/tree/master/concurrentqueue)中,运行效果如下图 +  ![演示](pic/hap.jpeg) +## 参考资料 +- [润和RK3568开发板标准系统快速上手](https://gitee.com/openharmony-sig/knowledge_demo_temp/tree/master/docs/rk3568_helloworld) +- [OpenHarmony三方库地址](https://gitee.com/openharmony-tpc) +- [OpenHarmony知识体系](https://gitee.com/openharmony-sig/knowledge) +- [通过DevEco Studio开发一个NAPI工程](https://gitee.com/openharmony-sig/knowledge_demo_temp/blob/master/docs/napi_study/docs/hello_napi.md#https://gitee.com/openharmony-sig/knowledge/tree/master) + diff --git a/concurrentqueue/docs/pic/hap.jpeg b/concurrentqueue/docs/pic/hap.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..32fcbddc60505c1241df6114cf6ac12a985906ff GIT binary patch literal 44076 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 literal 0 HcmV?d00001 diff --git a/concurrentqueue/docs/pic/result.PNG b/concurrentqueue/docs/pic/result.PNG new file mode 100644 index 0000000000000000000000000000000000000000..bfef8c6146cba53c51cf85da984b5a1b0af75916 GIT binary patch literal 32896 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 literal 0 HcmV?d00001 diff --git a/concurrentqueue/docs/rom_integrate.md b/concurrentqueue/docs/rom_integrate.md new file mode 100644 index 00000000..7a5f15fd --- /dev/null +++ b/concurrentqueue/docs/rom_integrate.md @@ -0,0 +1,107 @@ +# concurrentqueue如何集成到系统Rom +## 准备源码工程 +本库是基于OpenHarmony-v3.2-Beta2版本,在RK3568开发板上验证的,如果是从未使用过RK3568,可以先查看[润和RK3568开发板标准系统快速上手](https://gitee.com/openharmony-sig/knowledge_demo_temp/tree/master/docs/rk3568_helloworld) +### 准备系统Rom源码 +系统源码获取请参考:[OpenHarmony源码下载](https://gitee.com/openharmony/docs/blob/OpenHarmony-v3.2-Beta3/zh-cn/release-notes/OpenHarmony-v3.2-beta2.md) +### 增加构建脚本及配置文件 +- 下载本仓库代码 + ``` + cd ~ + git clone git@gitee.com:openharmony-sig/tpc_c_cplusplus.git --depth=1 + ``` +- 三方库目录结构 + ``` + tpc_c_cplusplus/concurrentqueue #三方库concurrentqueue的目录结构如下 + ├── docs #存放三方库相关文档的文件夹 + ├── BUILD.gn #构建脚本,支持rom包集成 + ├── bundle.json #三方库组件定义文件 + ├── README.OpenSource #说明三方库源码的下载地址,版本,license等信息 + ├── README_zh.md + ``` +- 将三方库拷贝到OpenHarmony源码的third_party目录下 + ``` + cp ~/tpc_c_cplusplus/concurrentqueue ~/openharmony/third_party -rf + ``` +### 准备三方库源码 +``` +cd ~/openharmony/third_party/concurrentqueue #进入三方库目录 +git clone https://github.com/cameron314/concurrentqueue.git #下载三方库源码 +``` +## 系统Rom中引入三方库 +准备完三方库代码后,我们需要将三方库加入到编译构建体系中。标准系统编译构建可以参考文档[标准系统编译构建指导](https://gitee.com/openharmony/docs/blob/OpenHarmony-3.2-Beta1/zh-cn/device-dev/subsystems/subsys-build-standard-large.md) 我们默认三方库是属于OpenHarmony的thirdparty子系统,如果需要自己定义子系统参考文档[如何为三方库组件中添加一个三方库](https://gitee.com/openharmony-sig/knowledge/blob/master/docs/openharmony_getstarted/port_thirdparty/README.md) 新增需要编译的组件,在OpenHarmony源码的vendor/hihope/rk3568/config.json文件中,新增需要编译的组件,如下代码段所示,在thirdparty子系统下面新增concurrentqueue组件 +``` + { + "subsystem": "thirdparty", + "components": [ + { + "component": "musl", + "features": [] + }, + { + "component": "concurrentqueue", + "features": [] + } + ] + } +``` + +## 系统Rom中引入三方库测试程序 +concurrentqueue原生库提供了测试用例,如需要引入测试程序,在OpenHarmony源码的vendor/hihope/rk3568/config.json文件,对应组件的features中打开编译选项: +``` +{ + "subsystem": "thirdparty", + "components": [ + { + "component": "musl", + "features": [] + }, + { + "component": "concurrentqueue", + "features": [ "enable_queue_test=true" ] + } + ] +} +``` +## 编译工程 +在OpenHarmony源码根目录下 +``` +cd ~/openharmony +``` +- 执行编译 + ``` + ./build.sh --product-name rk3568 --ccache + ``` +- 生成文件的路径 + 可执行文件和库生成在out/rk3568/thirdparty/concurrentqueue +## 运行效果 +将编译生成的库和测试文件放到板子上运行,为避免每次将文件推入设备都烧录整个镜像,我们使用hdc_std工具将文件推到开发板上 +- 首先将hdc_std工具编译出来 工具编译出来所在路径out/sdk/ohos-sdk/windows/toolchains/hdc_std.exe + ``` + hb set #源码根目录下使用hb set 选择产品ohos-sdk + hb build #然后编译 + ``` +- 将工具拷贝到Windows,可以为工具目录配置环境变量,也可以在工具所在目录打开windows命令行 +- 将编译生成的unittests和fuzztests可执行文件准备好 +- 将准备好的文件推送到开发板,在windows命令行进行如下操作 + ``` + hdc_std shell mount -o remount,rw / #修改系统权限为可读写 + hdc_std file send unittests /data #将可执行文件推入开发板data目录 + hdc_std file send fuzztests /data #将可执行文件推入开发板data目录 + hdc_std file send libconcurrentqueue.z.so /system/lib64 + hdc_std file send libconcurrentqueue.z.so /system/lib + hdc_std shell #进入开发板 + chmod 777 /data/unittests #添加权限 + chmod 777 /data/fuzztests #添加权限 + cd data #进入测试文件目录 + ./unittests #执行测试文件 + ./fuzztests #执行测试文件 + ``` +- 运行测试程序 效果如下图 +- ![result](pic/result.PNG) +## 参考资料 +- [润和RK3568开发板标准系统快速上手](https://gitee.com/openharmony-sig/knowledge_demo_temp/tree/master/docs/rk3568_helloworld) +- [OpenHarmony三方库地址](https://gitee.com/openharmony-tpc) +- [OpenHarmony知识体系](https://gitee.com/openharmony-sig/knowledge) +- [如何为三方库组件中添加一个三方库](https://gitee.com/openharmony-sig/knowledge/blob/master/docs/openharmony_getstarted/port_thirdparty/README.md) +- [标准系统编译构建指导](https://gitee.com/openharmony/docs/blob/OpenHarmony-3.2-Beta1/zh-cn/device-dev/subsystems/subsys-build-standard-large.md) + -- Gitee