From c4cd75cf3ec15b6ef62dc8ae01f450720c9d18a0 Mon Sep 17 00:00:00 2001 From: John Sanpe Date: Fri, 17 Jan 2025 11:22:37 +0800 Subject: [PATCH] feat bfdev: added bfx extension function layer Signed-off-by: John Sanpe --- CMakeLists.txt | 71 ++++++++++++++++++++++-------- README.md | 5 +++ build.cmake | 4 ++ examples/btree/benchmark.c | 10 ++--- examples/btree/selftest.c | 16 +++---- include/bfdev/btree.h | 21 +-------- include/bfx/btree.h | 34 ++++++++++++++ scripts/packed-header.cmake | 3 +- src/build.cmake | 1 - src/btree-utils.c => utils/btree.c | 14 +++--- utils/build.cmake | 9 ++++ 11 files changed, 127 insertions(+), 61 deletions(-) create mode 100644 include/bfx/btree.h rename src/btree-utils.c => utils/btree.c (85%) create mode 100644 utils/build.cmake diff --git a/CMakeLists.txt b/CMakeLists.txt index 5427a1c8..c95c7519 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -23,6 +23,7 @@ set(BFDEV_ARCH generic) set(BFDEV_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake) set(BFDEV_HEADER_PATH ${PROJECT_SOURCE_DIR}/include) set(BFDEV_SOURCE_PATH ${PROJECT_SOURCE_DIR}/src) +set(BFDEV_UTILS_PATH ${PROJECT_SOURCE_DIR}/utils) set(BFDEV_DOCUMENT_PATH ${PROJECT_SOURCE_DIR}/docs) set(BFDEV_GENERATED_PATH ${PROJECT_BINARY_DIR}/generated) @@ -48,8 +49,11 @@ string(APPEND BFDEV_RELEASE option(BFDEV_DEVEL "Enable development mode" OFF) option(BFDEV_STRICT "Enable strict compilation" OFF) -option(BFDEV_EXAMPLES "Build examples" OFF) -option(BFDEV_TESTSUITE "Build testsuite" OFF) + +option(BFDEV_BFX "Build Extension Layer" ON) +option(BFDEV_EXAMPLES "Build Examples" OFF) +option(BFDEV_TESTSUITE "Build Testsuite" OFF) +option(BFDEV_DOCS "Install Documentation" OFF) option(BFDEV_ASAN "Enable Address Sanitizer" OFF) option(BFDEV_UBSAN "Enable Undefined Behaviour Sanitizer" OFF) @@ -67,23 +71,38 @@ option(BFDEV_CRC_EXTEND "CRC loop unfolding optimize" ON) if(BFDEV_DEVEL) set(BFDEV_STRICT ON) + set(BFDEV_BFX ON) set(BFDEV_EXAMPLES ON) set(BFDEV_TESTSUITE ON) + set(BFDEV_DOCS ON) set(BFDEV_ASAN ON) set(BFDEV_UBSAN ON) set(BFDEV_GCOV ON) endif() +if(BFDEV_EXAMPLES OR BFDEV_TESTSUITE) + set(BFDEV_BFX ON) +endif() + include(${PROJECT_SOURCE_DIR}/build.cmake) add_subdirectory(${PROJECT_SOURCE_DIR}/scripts) packed_header( bfdev/ - _BFDEV_H_ + _BFDEV_H_ "" ${BFDEV_GENERATED_PATH}/bfdev.h ${BFDEV_HEADER_PATH}/bfdev ) +if(BFDEV_BFX) + packed_header( + bfx/ + _BFX_H_ "#include " + ${BFDEV_GENERATED_PATH}/bfx.h + ${BFDEV_HEADER_PATH}/bfx + ) +endif() + macro(bfdev_dependencies target) add_dependencies( ${target} @@ -134,21 +153,13 @@ if(${CMAKE_PROJECT_NAME} STREQUAL "bfdev") ) install(FILES - ${BFDEV_GENERATED_PATH}/bfdev.h - DESTINATION ${CMAKE_INSTALL_INCLUDEDIR} - ) - - install(FILES - ${PROJECT_SOURCE_DIR}/README.md - ${PROJECT_SOURCE_DIR}/AUTHORS - ${PROJECT_SOURCE_DIR}/COPYING - ${PROJECT_SOURCE_DIR}/COPYING.LIB - DESTINATION ${CMAKE_INSTALL_DOCDIR} + ${BFDEV_CONFIGURE} + DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/bfdev ) install(FILES - ${BFDEV_CONFIGURE} - DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/bfdev + ${BFDEV_GENERATED_PATH}/bfdev.h + DESTINATION ${CMAKE_INSTALL_INCLUDEDIR} ) install(DIRECTORY @@ -158,10 +169,32 @@ if(${CMAKE_PROJECT_NAME} STREQUAL "bfdev") DESTINATION ${CMAKE_INSTALL_INCLUDEDIR} ) - install(DIRECTORY - ${BFDEV_DOCUMENT_PATH} - DESTINATION ${CMAKE_INSTALL_DOCDIR} - ) + if(BFDEV_BFX) + install(FILES + ${BFDEV_GENERATED_PATH}/bfx.h + DESTINATION ${CMAKE_INSTALL_INCLUDEDIR} + ) + + install(DIRECTORY + ${BFDEV_HEADER_PATH}/bfx + DESTINATION ${CMAKE_INSTALL_INCLUDEDIR} + ) + endif() + + if(BFDEV_DOCS) + install(FILES + ${PROJECT_SOURCE_DIR}/README.md + ${PROJECT_SOURCE_DIR}/AUTHORS + ${PROJECT_SOURCE_DIR}/COPYING + ${PROJECT_SOURCE_DIR}/COPYING.LIB + DESTINATION ${CMAKE_INSTALL_DOCDIR} + ) + + install(DIRECTORY + ${BFDEV_DOCUMENT_PATH} + DESTINATION ${CMAKE_INSTALL_DOCDIR} + ) + endif() install(TARGETS bfdev_static bfdev_shared diff --git a/README.md b/README.md index 31ad1fb4..6b2755fc 100644 --- a/README.md +++ b/README.md @@ -51,6 +51,8 @@ View supported components: [Docs](docs/components.md) | include | include path | | scripts | build scripts | | src | core code path | +| testsuite | unit tests and so on | +| utils | API extension functions | ## Reference Path @@ -62,6 +64,7 @@ graph LR arch/asm-generated{exist} subgraph target[User Installation] + include/bfx[bfx] include/bfdev[bfdev] include/bfdev/asm-generic[bfdev:asm-generic] arch/bfdev/asm[bfdev:asm] @@ -73,10 +76,12 @@ graph LR arch/asm -.-> include/asm-generic arch/asm-generated --N--> include/asm-generic include/bfdev --> arch/bfdev/asm-generated + include/bfx --> include/bfdev arch/bfdev/asm-generated --Y--> arch/bfdev/asm arch/bfdev/asm-generated --N--> include/bfdev/asm-generic arch/bfdev/asm -.-> include/bfdev/asm-generic include --> include/bfdev + include --> include/bfx arch/asm --> arch/bfdev/asm include/asm-generic --> arch/bfdev/asm ``` diff --git a/build.cmake b/build.cmake index 71447a6e..2eacc3ea 100644 --- a/build.cmake +++ b/build.cmake @@ -72,6 +72,10 @@ include_directories(${BFDEV_INCLUDE_DIRS}) include(${BFDEV_ARCH_PATH}/build.cmake) include(${BFDEV_SOURCE_PATH}/build.cmake) +if(BFDEV_BFX) + include(${BFDEV_UTILS_PATH}/build.cmake) +endif() + set(BFDEV_LIBRARY_HEADER ${BFDEV_HEADER} ${BFDEV_ASM_HEADER} diff --git a/examples/btree/benchmark.c b/examples/btree/benchmark.c index 701a49ff..04e6f8da 100644 --- a/examples/btree/benchmark.c +++ b/examples/btree/benchmark.c @@ -9,7 +9,7 @@ #include #include #include -#include +#include #include "../time.h" #define BTREE_DEBUG 0 @@ -34,9 +34,9 @@ node_dump(struct bench_node *node) static const bfdev_btree_ops_t bench_ops = { - .alloc = bfdev_btree_alloc, - .free = bfdev_btree_free, - .find = bfdev_btree_key_find, + .alloc = bfx_btree_alloc, + .free = bfx_btree_free, + .find = bfx_btree_key_find, }; int @@ -48,7 +48,7 @@ main(int argc, const char *argv[]) void *block; BFDEV_BTREE_ROOT( - bench_root, &bfdev_btree_layoutptr, + bench_root, &bfx_btree_layoutptr, &bench_ops, NULL ); diff --git a/examples/btree/selftest.c b/examples/btree/selftest.c index 97c1a1e3..ecd56ed9 100644 --- a/examples/btree/selftest.c +++ b/examples/btree/selftest.c @@ -7,7 +7,7 @@ #include #include #include -#include +#include #include #define TEST_LOOP 100 @@ -54,9 +54,9 @@ test_strfind(bfdev_btree_root_t *root, uintptr_t *node, uintptr_t *key) static const bfdev_btree_ops_t test_value_ops = { - .alloc = bfdev_btree_alloc, - .free = bfdev_btree_free, - .find = bfdev_btree_key_find, + .alloc = bfx_btree_alloc, + .free = bfx_btree_free, + .find = bfx_btree_key_find, .clash = test_clash, .remove = test_remove, @@ -64,8 +64,8 @@ test_value_ops = { static const bfdev_btree_ops_t test_string_ops = { - .alloc = bfdev_btree_alloc, - .free = bfdev_btree_free, + .alloc = bfx_btree_alloc, + .free = bfx_btree_free, .find = test_strfind, .clash = test_clash, .remove = test_remove, @@ -81,7 +81,7 @@ test_testing(struct test_node *nodes) int retval; BFDEV_BTREE_ROOT( - root32, &bfdev_btree_layout32, + root32, &bfx_btree_layout32, &test_value_ops, NULL ); @@ -127,7 +127,7 @@ test_testing(struct test_node *nodes) bfdev_btree_release(&root32, NULL, NULL); BFDEV_BTREE_ROOT( - rootstr, &bfdev_btree_layout32, + rootstr, &bfx_btree_layout32, &test_string_ops, NULL ); diff --git a/include/bfdev/btree.h b/include/bfdev/btree.h index d71b1b17..d493b171 100644 --- a/include/bfdev/btree.h +++ b/include/bfdev/btree.h @@ -58,15 +58,6 @@ struct bfdev_btree_ops { #define BFDEV_BTREE_ROOT(name, layout, ops, pdata) \ bfdev_btree_root_t name = BFDEV_BTREE_INIT(layout, ops, pdata) -extern bfdev_btree_layout_t -bfdev_btree_layout32; - -extern bfdev_btree_layout_t -bfdev_btree_layout64; - -extern bfdev_btree_layout_t -bfdev_btree_layoutptr; - static inline void bfdev_btree_init(bfdev_btree_root_t *root, bfdev_btree_layout_t *layout, bfdev_btree_ops_t *ops, void *pdata) @@ -74,18 +65,9 @@ bfdev_btree_init(bfdev_btree_root_t *root, bfdev_btree_layout_t *layout, *root = BFDEV_BTREE_INIT(layout, ops, pdata); } -extern long -bfdev_btree_key_find(bfdev_btree_root_t *root, uintptr_t *node, uintptr_t *key); - extern void bfdev_btree_key_copy(bfdev_btree_root_t *root, uintptr_t *dest, uintptr_t *src); -extern void * -bfdev_btree_alloc(bfdev_btree_root_t *root); - -extern void -bfdev_btree_free(bfdev_btree_root_t *root, void *node); - extern void * bfdev_btree_lookup(bfdev_btree_root_t *root, uintptr_t *key); @@ -99,8 +81,7 @@ extern void * bfdev_btree_remove(bfdev_btree_root_t *root, uintptr_t *key); extern void -bfdev_btree_release(bfdev_btree_root_t *root, bfdev_release_t release, - void *pdata); +bfdev_btree_release(bfdev_btree_root_t *root, bfdev_release_t release, void *pdata); extern void * bfdev_btree_first(bfdev_btree_root_t *root, uintptr_t *key); diff --git a/include/bfx/btree.h b/include/bfx/btree.h new file mode 100644 index 00000000..020df283 --- /dev/null +++ b/include/bfx/btree.h @@ -0,0 +1,34 @@ +/* SPDX-License-Identifier: LGPL-3.0-or-later */ +/* + * Copyright(c) 2022 John Sanpe + */ + +#ifndef _BFX_BTREE_H_ +#define _BFX_BTREE_H_ + +#include +#include + +BFDEV_BEGIN_DECLS + +extern bfdev_btree_layout_t +bfx_btree_layout32; + +extern bfdev_btree_layout_t +bfx_btree_layout64; + +extern bfdev_btree_layout_t +bfx_btree_layoutptr; + +extern long +bfx_btree_key_find(bfdev_btree_root_t *root, uintptr_t *node, uintptr_t *key); + +extern void * +bfx_btree_alloc(bfdev_btree_root_t *root); + +extern void +bfx_btree_free(bfdev_btree_root_t *root, void *node); + +BFDEV_END_DECLS + +#endif /* _BFX_BTREE_H_ */ diff --git a/scripts/packed-header.cmake b/scripts/packed-header.cmake index 45d0a9f0..2c7b783b 100644 --- a/scripts/packed-header.cmake +++ b/scripts/packed-header.cmake @@ -3,7 +3,7 @@ # Copyright(c) 2023 John Sanpe # -function(packed_header prefix name genfile source) +function(packed_header prefix name header genfile source) file(GLOB srclist ${source}/*.h) file(REMOVE ${genfile}) @@ -18,6 +18,7 @@ function(packed_header prefix name genfile source) "\n" ) + file(APPEND ${genfile} ${header} "\n") foreach(srcpath ${srclist}) string(REGEX REPLACE ".+/(.+)" "\\1" filename ${srcpath}) message(STATUS "Packing header: " ${prefix} ${filename}) diff --git a/src/build.cmake b/src/build.cmake index f2367d8a..da56a350 100644 --- a/src/build.cmake +++ b/src/build.cmake @@ -16,7 +16,6 @@ set(BFDEV_SOURCE ${CMAKE_CURRENT_LIST_DIR}/bloom.c ${CMAKE_CURRENT_LIST_DIR}/bsearch.c ${CMAKE_CURRENT_LIST_DIR}/btree.c - ${CMAKE_CURRENT_LIST_DIR}/btree-utils.c ${CMAKE_CURRENT_LIST_DIR}/dword.c ${CMAKE_CURRENT_LIST_DIR}/callback.c ${CMAKE_CURRENT_LIST_DIR}/errname.c diff --git a/src/btree-utils.c b/utils/btree.c similarity index 85% rename from src/btree-utils.c rename to utils/btree.c index 0ce956be..25bf7bed 100644 --- a/src/btree-utils.c +++ b/utils/btree.c @@ -4,7 +4,7 @@ */ #include -#include +#include #include #define BLOCK_SIZE 128 @@ -13,7 +13,7 @@ #define UINTPTR_PER_U64 BFDEV_DIV_ROUND_UP(BFDEV_BYTES_PER_U64, BFDEV_BYTES_PER_UINTPTR) export bfdev_btree_layout_t -bfdev_btree_layout32 = { +bfx_btree_layout32 = { .keylen = UINTPTR_PER_U32, .keynum = NODE_SIZE / sizeof(uintptr_t) / (UINTPTR_PER_U32 + 1), .ptrindex = UINTPTR_PER_U32 * (NODE_SIZE / sizeof(uintptr_t) / (UINTPTR_PER_U32 + 1)), @@ -21,7 +21,7 @@ bfdev_btree_layout32 = { }; export bfdev_btree_layout_t -bfdev_btree_layout64 = { +bfx_btree_layout64 = { .keylen = UINTPTR_PER_U64, .keynum = NODE_SIZE / sizeof(uintptr_t) / (UINTPTR_PER_U64 + 1), .ptrindex = UINTPTR_PER_U64 * (NODE_SIZE / sizeof(uintptr_t) / (UINTPTR_PER_U64 + 1)), @@ -29,7 +29,7 @@ bfdev_btree_layout64 = { }; export bfdev_btree_layout_t -bfdev_btree_layoutptr = { +bfx_btree_layoutptr = { .keylen = 1, .keynum = NODE_SIZE / sizeof(uintptr_t) / 2, .ptrindex = NODE_SIZE / sizeof(uintptr_t) / 2, @@ -37,7 +37,7 @@ bfdev_btree_layoutptr = { }; export long -bfdev_btree_key_find(bfdev_btree_root_t *root, uintptr_t *node, uintptr_t *key) +bfx_btree_key_find(bfdev_btree_root_t *root, uintptr_t *node, uintptr_t *key) { bfdev_btree_layout_t *layout; unsigned int index; @@ -54,7 +54,7 @@ bfdev_btree_key_find(bfdev_btree_root_t *root, uintptr_t *node, uintptr_t *key) } export void * -bfdev_btree_alloc(bfdev_btree_root_t *root) +bfx_btree_alloc(bfdev_btree_root_t *root) { const bfdev_alloc_t *alloc; bfdev_btree_layout_t *layout; @@ -66,7 +66,7 @@ bfdev_btree_alloc(bfdev_btree_root_t *root) } export void -bfdev_btree_free(bfdev_btree_root_t *root, void *node) +bfx_btree_free(bfdev_btree_root_t *root, void *node) { const bfdev_alloc_t *alloc; diff --git a/utils/build.cmake b/utils/build.cmake new file mode 100644 index 00000000..26f3e2e8 --- /dev/null +++ b/utils/build.cmake @@ -0,0 +1,9 @@ +# SPDX-License-Identifier: LGPL-3.0-or-later +# +# Copyright(c) 2025 John Sanpe +# + +set(BFDEV_SOURCE + ${BFDEV_SOURCE} + ${CMAKE_CURRENT_LIST_DIR}/btree.c +)