From 6849ff747d76f7c09226e7d902f5ba8c1fcb055a Mon Sep 17 00:00:00 2001 From: Stepan Usatiuk Date: Fri, 23 Aug 2024 23:26:03 +0200 Subject: [PATCH] a little cleanup --- .github/workflows/server.yml | 29 +++++---- .../dhfs/supportlib/DhfsSupportNative.java | 2 + libdhfs_support/CMakeLists.txt | 35 ++++++++++ libdhfs_support/DhfsSupportNative.cpp | 64 ++++++++++++++----- libdhfs_support/builder/cross-build.sh | 6 +- libdhfs_support/builder/docker-launch.sh | 2 +- 6 files changed, 107 insertions(+), 31 deletions(-) diff --git a/.github/workflows/server.yml b/.github/workflows/server.yml index 4b3bb9ab..b0204ad7 100644 --- a/.github/workflows/server.yml +++ b/.github/workflows/server.yml @@ -108,10 +108,9 @@ jobs: distribution: "zulu" cache: maven - - name: Cmake build + - name: Build the library run: | - cmake -B"build" -S"libdhfs_support" -DDHFS_LIB_INSTALL="$(pwd)/result" - cmake --build build --target install + CMAKE_ARGS="-DCMAKE_BUILD_TYPE=Release" DO_LOCAL_BUILD=True libdhfs_support/builder/cross-build.sh both build "$(pwd)/result" - name: Upload build uses: actions/upload-artifact@v3 @@ -127,12 +126,13 @@ jobs: - name: Set up Docker Buildx uses: docker/setup-buildx-action@v3 + - name: Set up QEMU uses: docker/setup-qemu-action@v3 - - name: build + - name: Build the library run: | - CROSS_PLATFORM="linux/arm64" libdhfs_support/builder/cross-build.sh both build "$(pwd)/result" + CMAKE_ARGS="-DCMAKE_BUILD_TYPE=Release" CROSS_PLATFORM="linux/arm64" libdhfs_support/builder/cross-build.sh both build "$(pwd)/result" - name: Upload build uses: actions/upload-artifact@v3 @@ -152,14 +152,15 @@ jobs: with: path: downloaded-libs - - name: Merge + - name: Merge all run: rsync -av downloaded-libs/NativeLib*/* result/ - - name: Check paths + - name: Check that libs exists run: | test -f "result/Linux-x86_64/libdhfs_support.so" || exit 1 - - uses: actions/upload-artifact@v3 + - name: Upload + uses: actions/upload-artifact@v3 with: name: NativeLibs path: result @@ -179,17 +180,20 @@ jobs: - name: Checkout repository uses: actions/checkout@v4 - - uses: actions/download-artifact@v3 + - name: Download server package + uses: actions/download-artifact@v3 with: name: DHFS Server Package path: dhfs-package-downloaded - - uses: actions/download-artifact@v3 + - name: Download webui + uses: actions/download-artifact@v3 with: name: Webui path: webui-dist-downloaded - - uses: actions/download-artifact@v3 + - name: Download native libs + uses: actions/download-artifact@v3 with: name: NativeLibs path: dhfs-native-downloaded @@ -314,7 +318,8 @@ jobs: - name: Tar run wrapper run: tar -cvf ~/run-wrapper.tar.gz ./run-wrapper-out - - uses: actions/upload-artifact@v3 + - name: Upload + uses: actions/upload-artifact@v3 with: name: Run wrapper path: ~/run-wrapper.tar.gz diff --git a/dhfs-parent/supportlib/src/main/java/com/usatiuk/dhfs/supportlib/DhfsSupportNative.java b/dhfs-parent/supportlib/src/main/java/com/usatiuk/dhfs/supportlib/DhfsSupportNative.java index 8876791a..db6039b5 100644 --- a/dhfs-parent/supportlib/src/main/java/com/usatiuk/dhfs/supportlib/DhfsSupportNative.java +++ b/dhfs-parent/supportlib/src/main/java/com/usatiuk/dhfs/supportlib/DhfsSupportNative.java @@ -15,4 +15,6 @@ class DhfsSupportNative { static native void dropByteBuffer(long token); + static native int getPageSize(); + } \ No newline at end of file diff --git a/libdhfs_support/CMakeLists.txt b/libdhfs_support/CMakeLists.txt index 18c74426..209e5d12 100644 --- a/libdhfs_support/CMakeLists.txt +++ b/libdhfs_support/CMakeLists.txt @@ -3,12 +3,47 @@ project(libdhfs_support CXX) set(CMAKE_CXX_STANDARD 17) +if (CMAKE_BUILD_TYPE STREQUAL "Debug") + if (NOT SANITIZE) + set(SANITIZE YES) + endif () +endif () + +include(CheckCXXCompilerFlag) + +if (SANITIZE STREQUAL "YES") + message(WARNING "Enabling sanitizers!") + add_compile_options(-Werror -Wall -Wextra -pedantic -Wshadow -Wformat=2 -Wfloat-equal -D_GLIBCXX_DEBUG -Wconversion) + check_cxx_compiler_flag(-fsanitize-trap=all CAN_TRAP) + if (CAN_TRAP) + add_compile_options(-fsanitize=undefined -fsanitize-trap=all -fno-sanitize-recover) + add_link_options(-fsanitize=undefined -fsanitize-trap=all -fno-sanitize-recover) + else () + message(WARNING "Sanitizers not supported!") + endif () +endif () + +if (CMAKE_BUILD_TYPE STREQUAL "Release") + add_compile_options(-flto) + add_link_options(-flto) +endif () + +if (NOT CMAKE_BUILD_TYPE STREQUAL "Debug") + add_compile_options(-O3) + add_link_options(-O3) +endif () + +add_compile_options(-Wno-unused-parameter) + +message(STATUS "Build type: ${CMAKE_BUILD_TYPE}") + find_package(JNI REQUIRED COMPONENTS JVM) find_package(Java REQUIRED) include(UseJava) add_jar(DhfsSupportNative "${PROJECT_SOURCE_DIR}/../dhfs-parent/supportlib/src/main/java/com/usatiuk/dhfs/supportlib/DhfsSupportNative.java" + "${PROJECT_SOURCE_DIR}/LibPathDummy.java" GENERATE_NATIVE_HEADERS DhfsSupportNative-native) add_library(dhfs_support SHARED DhfsSupportNative.cpp) diff --git a/libdhfs_support/DhfsSupportNative.cpp b/libdhfs_support/DhfsSupportNative.cpp index a69f1b86..e112bf67 100644 --- a/libdhfs_support/DhfsSupportNative.cpp +++ b/libdhfs_support/DhfsSupportNative.cpp @@ -7,18 +7,40 @@ #include "com_usatiuk_dhfs_supportlib_DhfsSupportNative.h" -long get_page_size() { - static const long PAGE_SIZE = sysconf(_SC_PAGESIZE); +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wsign-conversion" +#pragma GCC diagnostic ignored "-Wsign-compare" + +template +constexpr To checked_cast(const From& f) { + To result = static_cast(f); + assert(f == result); + return result; +} + +#pragma GCC diagnostic pop + +unsigned int get_page_size() { + static const auto PAGE_SIZE = checked_cast(sysconf(_SC_PAGESIZE)); return PAGE_SIZE; } -constexpr uintptr_t align_up(uintptr_t what, size_t alignment) { +template +T align_up(T what, A alignment) { assert(__builtin_popcount(alignment) == 1); - const uintptr_t mask = alignment - 1; - if (what & mask) { - return (what & ~mask) + alignment; - } - return what; + + const T mask = checked_cast(alignment - 1); + + T ret; + + if (what & mask) + ret = (what + mask) & ~mask; + else + ret = what; + + assert((ret & mask) == 0); + + return ret; } extern "C" { @@ -28,28 +50,33 @@ JNIEXPORT void JNICALL Java_com_usatiuk_dhfs_supportlib_DhfsSupportNative_hello( JNIEXPORT jlong JNICALL Java_com_usatiuk_dhfs_supportlib_DhfsSupportNative_allocateUninitializedByteBuffer (JNIEnv* env, jclass klass, jobjectArray bb, jint size) { + if (size < 0) { + env->ThrowNew(env->FindClass("java/lang/IllegalArgumentException"), "Size less than 0?"); + return 0; + } + + size_t checked_size = checked_cast(size); + void* buf; - if (size < get_page_size()) - buf = malloc(size); + if (checked_size < get_page_size()) + buf = malloc(checked_size); else - buf = std::aligned_alloc(get_page_size(), align_up(size, get_page_size())); + buf = std::aligned_alloc(get_page_size(), align_up(checked_size, get_page_size())); if (buf == nullptr) { env->ThrowNew(env->FindClass("java/lang/OutOfMemoryError"), "Buffer memory allocation failed"); return 0; } - env->SetObjectArrayElement(bb, 0, env->NewDirectByteBuffer(buf, size)); + env->SetObjectArrayElement(bb, 0, env->NewDirectByteBuffer(buf, checked_cast(checked_size))); - jlong token = static_cast((uintptr_t) buf); - assert(token == (uintptr_t)buf); + jlong token = checked_cast((uintptr_t) buf); return token; } JNIEXPORT void JNICALL Java_com_usatiuk_dhfs_supportlib_DhfsSupportNative_dropByteBuffer (JNIEnv* env, jclass klass, jlong token) { - uintptr_t addr = static_cast(token); - assert(addr == token); + const auto addr = checked_cast(token); if (addr == 0) { env->ThrowNew(env->FindClass("java/lang/IllegalArgumentException"), "Trying to free null pointer"); @@ -58,4 +85,9 @@ JNIEXPORT void JNICALL Java_com_usatiuk_dhfs_supportlib_DhfsSupportNative_dropBy free((void*) addr); } + +JNIEXPORT jint JNICALL Java_com_usatiuk_dhfs_supportlib_DhfsSupportNative_getPageSize +(JNIEnv*, jclass) { + return checked_cast(get_page_size()); +} } diff --git a/libdhfs_support/builder/cross-build.sh b/libdhfs_support/builder/cross-build.sh index b4208feb..43d4b6d6 100755 --- a/libdhfs_support/builder/cross-build.sh +++ b/libdhfs_support/builder/cross-build.sh @@ -1,9 +1,11 @@ #!/usr/bin/env bash +CMAKE_ARGS="${CMAKE_ARGS:--DCMAKE_BUILD_TYPE=Debug}" + export SCRIPT_DIR=$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" &>/dev/null && pwd) cd "$SCRIPT_DIR" -if [[ -z "${INSIDE_DOCKER_ALREADY}" ]]; then +if [[ -z "${DO_LOCAL_BUILD}" ]]; then if [[ "$(uname)" == "Linux" ]]; then if [[ -z "${CROSS_PLATFORM}" ]]; then echo "Already on linux" @@ -26,7 +28,7 @@ CONFIGURE_DIR="$2" INSTALL_DIR="$3" function configure() { - cmake -B"$CONFIGURE_DIR" -S"$PROJECT_DIR" -DDHFS_LIB_INSTALL="$INSTALL_DIR" + cmake -B"$CONFIGURE_DIR" -S"$PROJECT_DIR" -DDHFS_LIB_INSTALL="$INSTALL_DIR" $CMAKE_ARGS } function build() { diff --git a/libdhfs_support/builder/docker-launch.sh b/libdhfs_support/builder/docker-launch.sh index 0feed025..af14cbc3 100755 --- a/libdhfs_support/builder/docker-launch.sh +++ b/libdhfs_support/builder/docker-launch.sh @@ -14,5 +14,5 @@ docker build $PLATFORM_ARG --iidfile "$DOCKER_IMG_FILE" . ROOT_DIR="$(dirname "$(dirname "$SCRIPT_DIR")")" -docker run $PLATFORM_ARG --rm -v "$ROOT_DIR:$ROOT_DIR" -e INSIDE_DOCKER_ALREADY=TRUE "$(cat "$DOCKER_IMG_FILE")" \ +docker run $PLATFORM_ARG --rm -v "$ROOT_DIR:$ROOT_DIR" -e DO_LOCAL_BUILD=TRUE "$(cat "$DOCKER_IMG_FILE")" \ "$SCRIPT_DIR/cross-build.sh" "$@"