a little cleanup

This commit is contained in:
2024-08-23 23:26:03 +02:00
parent 848ab14f8e
commit 6849ff747d
6 changed files with 107 additions and 31 deletions

View File

@@ -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

View File

@@ -15,4 +15,6 @@ class DhfsSupportNative {
static native void dropByteBuffer(long token);
static native int getPageSize();
}

View File

@@ -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)

View File

@@ -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<typename To, typename From>
constexpr To checked_cast(const From& f) {
To result = static_cast<To>(f);
assert(f == result);
return result;
}
#pragma GCC diagnostic pop
unsigned int get_page_size() {
static const auto PAGE_SIZE = checked_cast<unsigned int>(sysconf(_SC_PAGESIZE));
return PAGE_SIZE;
}
constexpr uintptr_t align_up(uintptr_t what, size_t alignment) {
template<typename T, typename A>
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<T>(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_t>(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<jlong>(checked_size)));
jlong token = static_cast<jlong>((uintptr_t) buf);
assert(token == (uintptr_t)buf);
jlong token = checked_cast<jlong>((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<uintptr_t>(token);
assert(addr == token);
const auto addr = checked_cast<uintptr_t>(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<jint>(get_page_size());
}
}

View File

@@ -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() {

View File

@@ -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" "$@"