diff --git a/builder/dockerfile.alpine_318.build b/builder/dockerfile.alpine_318.build index f8620ba..f4d3bdf 100644 --- a/builder/dockerfile.alpine_318.build +++ b/builder/dockerfile.alpine_318.build @@ -73,8 +73,7 @@ RUN \ ENV SCRIPTS_DIR=/tmp/scripts COPY builder/scripts $SCRIPTS_DIR -RUN $SCRIPTS_DIR/build-webp -RUN $SCRIPTS_DIR/build-libjpeg-turbo +RUN $SCRIPTS_DIR/build-deps.sh RUN useradd -m docker && echo "docker:docker" | chpasswd diff --git a/builder/dockerfile.alpine_319.build b/builder/dockerfile.alpine_319.build index d003855..67a8951 100644 --- a/builder/dockerfile.alpine_319.build +++ b/builder/dockerfile.alpine_319.build @@ -73,8 +73,7 @@ RUN \ ENV SCRIPTS_DIR=/tmp/scripts COPY builder/scripts $SCRIPTS_DIR -RUN $SCRIPTS_DIR/build-webp -RUN $SCRIPTS_DIR/build-libjpeg-turbo +RUN $SCRIPTS_DIR/build-deps.sh RUN useradd -m docker && echo "docker:docker" | chpasswd diff --git a/builder/dockerfile.alpine_320.build b/builder/dockerfile.alpine_320.build index b282e6d..cf4e697 100644 --- a/builder/dockerfile.alpine_320.build +++ b/builder/dockerfile.alpine_320.build @@ -73,8 +73,7 @@ RUN \ ENV SCRIPTS_DIR=/tmp/scripts COPY builder/scripts $SCRIPTS_DIR -RUN $SCRIPTS_DIR/build-webp -RUN $SCRIPTS_DIR/build-libjpeg-turbo +RUN $SCRIPTS_DIR/build-deps.sh RUN useradd -m docker && echo "docker:docker" | chpasswd diff --git a/builder/dockerfile.alpine_321.build b/builder/dockerfile.alpine_321.build index 47a2cc7..80972ad 100644 --- a/builder/dockerfile.alpine_321.build +++ b/builder/dockerfile.alpine_321.build @@ -73,8 +73,7 @@ RUN \ ENV SCRIPTS_DIR=/tmp/scripts COPY builder/scripts $SCRIPTS_DIR -RUN $SCRIPTS_DIR/build-webp -RUN $SCRIPTS_DIR/build-libjpeg-turbo +RUN $SCRIPTS_DIR/build-deps.sh RUN useradd -m docker && echo "docker:docker" | chpasswd diff --git a/builder/dockerfile.debian_bookworm.build b/builder/dockerfile.debian_bookworm.build index 98034c6..bda5926 100644 --- a/builder/dockerfile.debian_bookworm.build +++ b/builder/dockerfile.debian_bookworm.build @@ -28,8 +28,7 @@ RUN apt-get update && apt-get -y install libpng-dev libtiff-dev libgif-dev libav ENV SCRIPTS_DIR=/tmp/scripts COPY builder/scripts $SCRIPTS_DIR -RUN $SCRIPTS_DIR/build-webp -RUN $SCRIPTS_DIR/build-libjpeg-turbo +RUN $SCRIPTS_DIR/build-deps.sh RUN useradd -m docker && echo "docker:docker" | chpasswd && adduser docker sudo diff --git a/builder/dockerfile.debian_bullseye.build b/builder/dockerfile.debian_bullseye.build index d9ce288..bd950e7 100644 --- a/builder/dockerfile.debian_bullseye.build +++ b/builder/dockerfile.debian_bullseye.build @@ -31,8 +31,7 @@ RUN CMAKE_URL="https://cmake.org/files/v3.22/cmake-3.22.0" && \ ENV SCRIPTS_DIR=/tmp/scripts COPY builder/scripts $SCRIPTS_DIR -RUN $SCRIPTS_DIR/build-webp -RUN $SCRIPTS_DIR/build-libjpeg-turbo +RUN $SCRIPTS_DIR/build-deps.sh RUN useradd -m docker && echo "docker:docker" | chpasswd && adduser docker sudo diff --git a/builder/dockerfile.debian_buster.build b/builder/dockerfile.debian_buster.build index a1e2afd..9b0bed5 100644 --- a/builder/dockerfile.debian_buster.build +++ b/builder/dockerfile.debian_buster.build @@ -17,8 +17,7 @@ RUN apt-get update && apt-get -y install libpng-dev libtiff-dev libgif-dev libav ENV SCRIPTS_DIR=/tmp/scripts COPY builder/scripts $SCRIPTS_DIR -RUN $SCRIPTS_DIR/build-webp -RUN $SCRIPTS_DIR/build-libjpeg-turbo +RUN $SCRIPTS_DIR/build-deps.sh RUN useradd -m docker && echo "docker:docker" | chpasswd && adduser docker sudo diff --git a/builder/dockerfile.fedora_forty.build b/builder/dockerfile.fedora_forty.build index 983a88f..7859248 100644 --- a/builder/dockerfile.fedora_forty.build +++ b/builder/dockerfile.fedora_forty.build @@ -78,8 +78,7 @@ RUN \ ENV SCRIPTS_DIR=/tmp/scripts COPY builder/scripts $SCRIPTS_DIR -RUN $SCRIPTS_DIR/build-webp -RUN $SCRIPTS_DIR/build-libjpeg-turbo +RUN $SCRIPTS_DIR/build-deps.sh RUN useradd -m docker && echo "docker:docker" | chpasswd diff --git a/builder/dockerfile.fedora_fortyone.build b/builder/dockerfile.fedora_fortyone.build index 336b064..ef00860 100644 --- a/builder/dockerfile.fedora_fortyone.build +++ b/builder/dockerfile.fedora_fortyone.build @@ -79,8 +79,7 @@ RUN \ ENV SCRIPTS_DIR=/tmp/scripts COPY builder/scripts $SCRIPTS_DIR -RUN $SCRIPTS_DIR/build-webp -RUN $SCRIPTS_DIR/build-libjpeg-turbo +RUN $SCRIPTS_DIR/build-deps.sh RUN useradd -m docker && echo "docker:docker" | chpasswd diff --git a/builder/dockerfile.fedora_thirtynine.build b/builder/dockerfile.fedora_thirtynine.build index d1985de..aeaaf88 100644 --- a/builder/dockerfile.fedora_thirtynine.build +++ b/builder/dockerfile.fedora_thirtynine.build @@ -78,8 +78,7 @@ RUN \ ENV SCRIPTS_DIR=/tmp/scripts COPY builder/scripts $SCRIPTS_DIR -RUN $SCRIPTS_DIR/build-webp -RUN $SCRIPTS_DIR/build-libjpeg-turbo +RUN $SCRIPTS_DIR/build-deps.sh RUN useradd -m docker && echo "docker:docker" | chpasswd diff --git a/builder/dockerfile.kali_kali-rolling.build b/builder/dockerfile.kali_kali-rolling.build index 717e8f9..cf97c83 100644 --- a/builder/dockerfile.kali_kali-rolling.build +++ b/builder/dockerfile.kali_kali-rolling.build @@ -19,8 +19,7 @@ RUN apt-get update && apt-get -y install libpng-dev libtiff-dev libgif-dev libav ENV SCRIPTS_DIR=/tmp/scripts COPY builder/scripts $SCRIPTS_DIR -RUN $SCRIPTS_DIR/build-webp -RUN $SCRIPTS_DIR/build-libjpeg-turbo +RUN $SCRIPTS_DIR/build-deps.sh RUN useradd -m docker && echo "docker:docker" | chpasswd && adduser docker sudo diff --git a/builder/dockerfile.opensuse_15.build b/builder/dockerfile.opensuse_15.build index 63d9358..57f81e1 100644 --- a/builder/dockerfile.opensuse_15.build +++ b/builder/dockerfile.opensuse_15.build @@ -9,7 +9,6 @@ RUN zypper install -ny \ bdftopcf \ bigreqsproto-devel \ ninja \ - cmake \ nasm \ curl \ ffmpeg-4-libavcodec-devel \ @@ -49,10 +48,6 @@ RUN zypper install -ny \ xorg-x11-util-devel \ zlib-devel -RUN update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-14 140 \ - --slave /usr/bin/g++ g++ /usr/bin/g++-14 \ - --slave /usr/bin/gcov gcov /usr/bin/gcov-14 - RUN useradd -u 1000 docker && \ groupadd -g 1000 docker && \ usermod -a -G docker docker @@ -71,8 +66,11 @@ RUN ARCH=$(arch) && \ rm cmake.sh ENV SCRIPTS_DIR=/tmp/scripts +ENV CC=/usr/bin/gcc-14 +ENV CXX=/usr/bin/g++-14 + COPY builder/scripts $SCRIPTS_DIR -RUN $SCRIPTS_DIR/build-webp && $SCRIPTS_DIR/build-libjpeg-turbo +RUN $SCRIPTS_DIR/build-deps.sh COPY --chown=docker:docker . /src/ diff --git a/builder/dockerfile.oracle_8.build b/builder/dockerfile.oracle_8.build index 0a9ecfe..9fc54da 100644 --- a/builder/dockerfile.oracle_8.build +++ b/builder/dockerfile.oracle_8.build @@ -41,7 +41,6 @@ RUN dnf install -y --nogpgcheck https://mirrors.rpmfusion.org/free/el/rpmfusion- # Install from new repos RUN dnf install -y \ - tbb-devel \ ffmpeg-devel \ giflib-devel \ lbzip2 \ @@ -58,8 +57,8 @@ RUN dnf install -y \ ENV SCRIPTS_DIR=/tmp/scripts COPY builder/scripts $SCRIPTS_DIR RUN echo "source /opt/rh/gcc-toolset-14/enable" > /etc/profile.d/gcc-toolset.sh && \ - $SCRIPTS_DIR/build-webp && $SCRIPTS_DIR/build-libjpeg-turbo && \ - useradd -m docker && echo "docker:docker" | chpasswd + $SCRIPTS_DIR/build-deps.sh && \ + useradd -m docker && echo "docker:docker" | chpasswd COPY --chown=docker:docker . /src/ diff --git a/builder/dockerfile.oracle_9.build b/builder/dockerfile.oracle_9.build index 674e2f0..8053bd5 100644 --- a/builder/dockerfile.oracle_9.build +++ b/builder/dockerfile.oracle_9.build @@ -57,7 +57,7 @@ RUN dnf install -y \ ENV SCRIPTS_DIR=/tmp/scripts COPY builder/scripts $SCRIPTS_DIR RUN echo "source /opt/rh/gcc-toolset-14/enable" > /etc/profile.d/gcc-toolset.sh && \ - $SCRIPTS_DIR/build-webp && $SCRIPTS_DIR/build-libjpeg-turbo && \ + $SCRIPTS_DIR/build-deps.sh && \ useradd -m docker && echo "docker:docker" | chpasswd COPY --chown=docker:docker . /src/ diff --git a/builder/dockerfile.ubuntu_focal.build b/builder/dockerfile.ubuntu_focal.build index 57c7373..0ecb1ee 100644 --- a/builder/dockerfile.ubuntu_focal.build +++ b/builder/dockerfile.ubuntu_focal.build @@ -13,7 +13,7 @@ RUN apt-get update && \ RUN apt-get update && apt-get install -y --no-install-recommends tzdata RUN apt-get update && apt-get -y build-dep xorg-server libxfont-dev RUN apt-get update && apt-get -y install ninja-build nasm git vim wget curl -RUN apt-get update && apt-get -y install libtbb-dev libpng-dev libtiff-dev libgif-dev libavcodec-dev libssl-dev libxrandr-dev \ +RUN apt-get update && apt-get -y install libpng-dev libtiff-dev libgif-dev libavcodec-dev libssl-dev libxrandr-dev \ libxcursor-dev libavformat-dev libswscale-dev ENV SCRIPTS_DIR=/tmp/scripts @@ -34,8 +34,7 @@ RUN ARCH=$(arch) && \ (echo y; echo n) | bash cmake.sh --prefix=/usr/local --skip-license && \ rm cmake.sh -RUN $SCRIPTS_DIR/build-webp -RUN $SCRIPTS_DIR/build-libjpeg-turbo +RUN $SCRIPTS_DIR/build-deps.sh COPY --chown=docker:docker . /src/ diff --git a/builder/dockerfile.ubuntu_focal.deb.build b/builder/dockerfile.ubuntu_focal.deb.build index ffe6402..8a4db12 100644 --- a/builder/dockerfile.ubuntu_focal.deb.build +++ b/builder/dockerfile.ubuntu_focal.deb.build @@ -3,7 +3,7 @@ FROM ubuntu:focal ENV DEBIAN_FRONTEND noninteractive RUN apt-get update && \ - apt-get -y install vim build-essential devscripts equivs libtbb-dev + apt-get -y install vim build-essential devscripts equivs # Install build-deps for the package. COPY ./debian/control /tmp diff --git a/builder/dockerfile.ubuntu_jammy.build b/builder/dockerfile.ubuntu_jammy.build index 11eafc7..3cbfe75 100644 --- a/builder/dockerfile.ubuntu_jammy.build +++ b/builder/dockerfile.ubuntu_jammy.build @@ -18,8 +18,7 @@ RUN apt-get update && apt-get -y install libpng-dev libtiff-dev libgif-dev libav ENV SCRIPTS_DIR=/tmp/scripts COPY builder/scripts $SCRIPTS_DIR -RUN $SCRIPTS_DIR/build-webp -RUN $SCRIPTS_DIR/build-libjpeg-turbo +RUN $SCRIPTS_DIR/build-deps.sh RUN useradd -m docker && echo "docker:docker" | chpasswd && adduser docker sudo diff --git a/builder/dockerfile.ubuntu_jammy.dev b/builder/dockerfile.ubuntu_jammy.dev index 08ae041..552b588 100644 --- a/builder/dockerfile.ubuntu_jammy.dev +++ b/builder/dockerfile.ubuntu_jammy.dev @@ -53,18 +53,16 @@ RUN sed -i 's$# deb-src$deb-src$' /etc/apt/sources.list && \ libxkbfile-dev \ x11proto-dev \ libgbm-dev \ + htop \ inotify-tools && \ echo "kasm-user ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers RUN curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash - RUN apt install -y nodejs nginx -COPY builder/scripts/build-webp /tmp -COPY builder/scripts/build-libjpeg-turbo /tmp -COPY builder/common.sh /tmp - -RUN chmod +x /tmp/build-webp && /tmp/build-webp -RUN chmod +x /tmp/build-libjpeg-turbo && /tmp/build-libjpeg-turbo +ENV SCRIPTS_DIR=/tmp/scripts +COPY builder/scripts $SCRIPTS_DIR +RUN $SCRIPTS_DIR/build-deps.sh USER 1000 diff --git a/builder/dockerfile.ubuntu_noble.build b/builder/dockerfile.ubuntu_noble.build index dfb796c..4301f3a 100644 --- a/builder/dockerfile.ubuntu_noble.build +++ b/builder/dockerfile.ubuntu_noble.build @@ -18,8 +18,7 @@ RUN apt-get update && apt-get -y install libpng-dev libtiff-dev libgif-dev libav ENV SCRIPTS_DIR=/tmp/scripts COPY builder/scripts $SCRIPTS_DIR -RUN $SCRIPTS_DIR/build-webp -RUN $SCRIPTS_DIR/build-libjpeg-turbo +RUN $SCRIPTS_DIR/build-deps.sh RUN useradd -m docker && echo "docker:docker" | chpasswd && adduser docker sudo diff --git a/builder/scripts/build-deps.sh b/builder/scripts/build-deps.sh new file mode 100755 index 0000000..9c1f205 --- /dev/null +++ b/builder/scripts/build-deps.sh @@ -0,0 +1,8 @@ +#!/bin/bash + +set -e + +source_dir=$(dirname "$0") +"${source_dir}"/build-libjpeg-turbo +"${source_dir}"/build-webp +"${source_dir}"/build-tbb \ No newline at end of file diff --git a/builder/scripts/build-tbb b/builder/scripts/build-tbb new file mode 100755 index 0000000..03593f2 --- /dev/null +++ b/builder/scripts/build-tbb @@ -0,0 +1,63 @@ +#!/usr/bin/env bash + +set -euo pipefail + +build_and_install() { + if [ $older_release -eq 1 ]; then + make extra_inc=big_iron.inc work_dir="$PWD"/ tbb_root="$PWD" + + if [ -d /usr/lib/x86_64-linux-gnu ]; then + LIBS=lib/x86_64-linux-gnu + elif [ -d /usr/lib/aarch64-linux-gnu ]; then + LIBS=lib/aarch64-linux-gnu + elif [ -d /usr/lib/arm-linux-gnueabihf ]; then + LIBS=lib/arm-linux-gnu + fi + + PC_FILE=/usr/${LIBS}/pkgconfig/tbb.pc + echo "prefix=/usr" > "${PC_FILE}" + echo "exec_prefix=\${prefix}" >> "${PC_FILE}" + echo "libdir=\${exec_prefix}/lib/${LIBS}" >> "${PC_FILE}" + echo "includedir=\${prefix}/include" >> "${PC_FILE}" + echo "Name: Threading Building Blocks" >> "${PC_FILE}" + echo "Description: Intel's parallelism library for C++" >> "${PC_FILE}" + echo "URL: http://www.threadingbuildingblocks.org/" >> "${PC_FILE}" + echo "Version: v2020.3.3" >> "${PC_FILE}" + echo "Libs: -ltbb -latomic" >> "${PC_FILE}" + echo "Cflags: -I\${includedir}" >> "${PC_FILE}" + + cp _release/*.a /usr/"${LIBS}"/ + cp -r include/* /usr/include/ + else + cmake -B build -DCMAKE_INSTALL_PREFIX=/usr/local \ + -DTBB_TEST=OFF -DBUILD_SHARED_LIBS=OFF -GNinja . + ninja -C build install + fi +} + +prepare_source() { + DIR=tbb + cd /tmp + [ -d ./${DIR} ] && rm -rf ./${DIR} + mkdir ${DIR} + + if [ $older_release -eq 1 ]; then + TBB_RELEASE="v2020.3.3" + else + TBB_RELEASE=$(curl -sL "https://api.github.com/repos/uxlfoundation/oneTBB/releases/latest" \ + | grep '"tag_name":' | sed -E 's/.*"tag_name": "([^"]+)".*/\1/') + fi + + curl -Ls "https://github.com/uxlfoundation/oneTBB/archive/${TBB_RELEASE}.tar.gz" | \ + + tar xzvf - -C ${DIR}/ --strip-components=1 + cd ${DIR} +} + +older_release=0 +if grep -q 'Ubuntu 20.04\|Debian GNU/Linux 11' /etc/os-release 2>/dev/null; then + older_release=1 +fi + +prepare_source +build_and_install diff --git a/builder/test_build_containers b/builder/test_build_containers new file mode 100755 index 0000000..426770c --- /dev/null +++ b/builder/test_build_containers @@ -0,0 +1,54 @@ +#!/bin/bash + +#set -e + +script_dir="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" +current_dir="$(pwd)" + +images_list=() + +for file in "$script_dir"/dockerfile.*.build; do + if [[ "$file" == *deb* ]] || [[ "$file" == *apk* ]] || [[ "$file" == *rpm* ]] || [[ "$file" == *www* ]]; then + continue + fi + + [ -e "$file" ] || continue + + filename="$(basename "$file")" + image_name=$(echo "$filename" | sed -E 's/^(dockerfile\.|Dockerfile\.)(.*)\.build$/\2/') + + if [ -e builder/build/kasmvnc."$image_name".tar.gz ]; then + continue + fi + + echo "Building docker image: $image_name using file: $file" + + docker build -f "$file" -t "$image_name" "$current_dir" + exit_code=$? + if [ $exit_code -ne 0 ]; then + echo "Build failed for $filename" + break + fi + + rm -rf .cmake CMakeFiles build.ninja cmake_install.cmake cmake_uninstall.cmake CMakeCache.txt config.h + + echo "Running container from image '$image_name'" + # Run the container and capture the exit code + docker run -it -v "$current_dir":/src -v "$current_dir/builder/build":/build "$image_name" + exit_code=$? + + echo "Container for image '$image_name' " + if [ $exit_code -ne 0 ]; then + echo "exited with error (exit code $exit_code)." + break + else + echo "finished successfully." + images_list+=("$image_name") + fi +done + +echo "Removing all built docker images..." +for img in "${images_list[@]}"; do + echo "Removing docker image: $img" + docker rmi -f "$img" +done diff --git a/common/rfb/CMakeLists.txt b/common/rfb/CMakeLists.txt index a55ea60..434470b 100644 --- a/common/rfb/CMakeLists.txt +++ b/common/rfb/CMakeLists.txt @@ -85,7 +85,7 @@ set(RFB_LIBRARIES ${JPEG_LIBRARIES} ${PNG_LIBRARIES} os rdr Xregion) cmake_host_system_information(RESULT DISTRO QUERY DISTRIB_INFO) if ((CMAKE_CXX_COMPILER_ID MATCHES "GNU" AND CMAKE_CXX_COMPILER_VERSION VERSION_LESS 10) OR (DISTRO_PLATFORM_ID MATCHES "platform:el8")) - set(RFB_LIBRARIES ${RFB_LIBRARIES} tbb) + set(RFB_LIBRARIES ${RFB_LIBRARIES} tbb) endif () if (HAVE_PAM) @@ -132,6 +132,13 @@ endif () find_package(PkgConfig REQUIRED) pkg_check_modules(FFMPEG REQUIRED libavcodec libavformat libavutil libswscale) +find_package(TBB) +if (TBB_FOUND) + set(RFB_LIBRARIES ${RFB_LIBRARIES} tbb) +else () + pkg_check_modules(TBB tbb) + set(RFB_LIBRARIES ${RFB_LIBRARIES} ${TBB_LIBRARIES}) +endif () add_library(rfb STATIC ${RFB_SOURCES}) @@ -142,9 +149,10 @@ target_include_directories(rfb PRIVATE ${CMAKE_SOURCE_DIR}/unix/kasmvncpasswd ${CMAKE_SOURCE_DIR}/third_party/tinyxml2 ${FFMPEG_INCLUDE_DIRS} + ${TBB_INCLUDE_DIRS} ) -target_link_libraries(rfb PRIVATE ${RFB_LIBRARIES} tinyxml2_objs) +target_link_libraries(rfb PUBLIC ${RFB_LIBRARIES} tinyxml2_objs) if (UNIX) libtool_create_control_file(rfb) diff --git a/common/rfb/EncodeManager.cxx b/common/rfb/EncodeManager.cxx index 5dbf1dc..7182afc 100644 --- a/common/rfb/EncodeManager.cxx +++ b/common/rfb/EncodeManager.cxx @@ -44,6 +44,7 @@ #include #include #include +#include using namespace rfb; @@ -210,6 +211,9 @@ EncodeManager::EncodeManager(SConnection* conn_, EncCache *encCache_) : conn(con dynamicQualityMin = Server::dynamicQualityMin; dynamicQualityOff = Server::dynamicQualityMax - Server::dynamicQualityMin; } + + const auto num_cores = tbb::this_task_arena::max_concurrency() / 2; + arena.initialize(num_cores); } EncodeManager::~EncodeManager() @@ -1237,12 +1241,13 @@ void EncodeManager::writeRects(const Region& changed, const PixelBuffer* pb, } scalingTime = msSince(&scalestart); - std::for_each(std::execution::par_unseq, std::begin(indices), std::end(indices), [&](size_t i) - { - encoderTypes[i] = getEncoderType(subrects[i], pb, &palettes[i], compresseds[i], + arena.execute([&] { + tbb::parallel_for(static_cast(0), subrects_size, [&](size_t i) { + encoderTypes[i] = getEncoderType(subrects[i], pb, &palettes[i], compresseds[i], &isWebp[i], &fromCache[i], scaledpb, scaledrects[i], ms[i]); - checkWebpFallback(start); + checkWebpFallback(start); + }); }); for (uint32_t i = 0; i < subrects_size; ++i) { diff --git a/common/rfb/EncodeManager.h b/common/rfb/EncodeManager.h index 7844faa..7d6774f 100644 --- a/common/rfb/EncodeManager.h +++ b/common/rfb/EncodeManager.h @@ -32,6 +32,7 @@ #include #include +#include #include namespace rfb { @@ -167,6 +168,7 @@ namespace rfb { protected: SConnection *conn; + tbb::task_arena arena; std::vector encoders; std::vector activeEncoders;