Initial FreeBSD support (#1214)

This commit is contained in:
Pescador Barquero
2025-10-21 09:41:56 -05:00
committed by GitHub
parent 3507e1872f
commit 21e38d8531
5 changed files with 57 additions and 4 deletions
+1 -1
View File
@@ -139,7 +139,7 @@ if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC")
target_compile_options(${TARGET_NAME} PUBLIC /arch:AVX)
endif()
endif()
elseif ("${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "x86_64" OR "${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "AMD64" OR "${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "x86" OR "${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "i386")
elseif ("${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "x86_64" OR "${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "AMD64" OR "${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "amd64" OR "${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "x86" OR "${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "i386")
if (USE_AVX512)
target_compile_options(${TARGET_NAME} PUBLIC -mavx512f -mavx512vl -mavx512dq -mavx2 -mbmi -mpopcnt -mlzcnt -mf16c)
elseif (USE_AVX2)
+46 -2
View File
@@ -34,7 +34,13 @@
#include <WinBase.h>
#endif // _WIN32
#ifdef PLATFORM_LINUX
#if defined(__FREEBSD__)
#include <kvm.h>
#include <sys/param.h>
#include <sys/sysctl.h>
#include <sys/user.h>
#pragma comment(lib,"kvm")
#elif defined(PLATFORM_LINUX)
#include <sys/sysinfo.h>
#endif // PLATFORM_LINUX
@@ -1348,12 +1354,22 @@ namespace wi::helper
std::string GetExecutablePath()
{
#ifdef _WIN32
#if defined(_WIN32)
wchar_t wstr[1024] = {};
GetModuleFileName(NULL, wstr, arraysize(wstr));
char str[1024] = {};
StringConvert(wstr, str, arraysize(str));
return str;
#elif defined(__FREEBSD__)
int name[] = { CTL_KERN, KERN_PROC, KERN_PROC_PATHNAME, -1 };
char str[MAXPATHLEN] = {};
size_t length;
int error = sysctl(name, 4, str, &length, NULL, 0);
if (error < 0 || length <= 1) {
// sysctl failed
return std::string();
}
return std::string(str, length);
#else
return std::filesystem::canonical("/proc/self/exe").string();
#endif // _WIN32
@@ -1958,6 +1974,34 @@ namespace wi::helper
GetProcessMemoryInfo(GetCurrentProcess(), (PROCESS_MEMORY_COUNTERS*)&pmc, sizeof(pmc));
mem.process_physical = pmc.WorkingSetSize;
mem.process_virtual = pmc.PrivateUsage;
#elif defined(__FREEBSD__)
static uint64_t phys_mem = 0;
static uint64_t swap_mem = 0;
size_t sysctl_buf_s;
int page_size = getpagesize();
if (phys_mem == 0)
{
int phys_mem_name[] = { CTL_HW, HW_PHYSMEM };
sysctl_buf_s = sizeof(phys_mem);
sysctl(phys_mem_name, 2, &phys_mem, &sysctl_buf_s, NULL, 0);
kvm_t *kvm;
if ((kvm = kvm_open(NULL, "/dev/null", "/dev/null", O_RDONLY, "GetMemoryUsage")) != NULL)
{
struct kvm_swap swap;
if (kvm_getswapinfo(kvm, &swap, 1, 0) == 0)
swap_mem = swap.ksw_total * page_size;
kvm_close(kvm);
}
}
mem.total_physical = phys_mem;
mem.total_virtual = swap_mem;
struct kinfo_proc kinfo;
int proc_name[] = { CTL_KERN, KERN_PROC, KERN_PROC_PID, getpid() };
sysctl_buf_s = sizeof(struct kinfo_proc);
if (sysctl(proc_name, 4, &kinfo, &sysctl_buf_s, NULL, 0) == 0)
{
mem.process_physical = kinfo.ki_rssize * page_size;
}
#elif defined(PLATFORM_LINUX)
struct sysinfo info;
constexpr int PAGE_SIZE = 4096;
+6 -1
View File
@@ -14,6 +14,9 @@
#ifdef PLATFORM_LINUX
#include <pthread.h>
#ifdef __FREEBSD__
#include <pthread_np.h>
#endif
#include <sys/resource.h>
#endif // PLATFORM_LINUX
@@ -198,7 +201,9 @@ namespace wi::jobsystem
{
std::thread& worker = res.threads.emplace_back([threadID, priority, &res] {
#ifdef PLATFORM_LINUX
#if defined(__FREEBSD__)
// TODO: FreeBSD's setpriority is incompatible with the expected Linux non-standard behavior
#elif defined(PLATFORM_LINUX)
// from the sched(2) manpage:
// In the current [Linux 2.6.23+] implementation, each unit of
@@ -12,7 +12,9 @@
#include "OpenImageDenoise/oidn.hpp"
#if OIDN_VERSION_MAJOR >= 2
#define OPEN_IMAGE_DENOISE
#ifdef _WIN32
#pragma comment(lib,"OpenImageDenoise.lib")
#endif
// Also provide the required DLL files from OpenImageDenoise release near the exe!
#endif // OIDN_VERSION_MAJOR >= 2
#endif // __has_include("OpenImageDenoise/oidn.hpp")
+2
View File
@@ -18,7 +18,9 @@
#include "OpenImageDenoise/oidn.hpp"
#if OIDN_VERSION_MAJOR >= 2
#define OPEN_IMAGE_DENOISE
#ifdef _WIN32
#pragma comment(lib,"OpenImageDenoise.lib")
#endif
// Also provide the required DLL files from OpenImageDenoise release near the exe!
#endif // OIDN_VERSION_MAJOR >= 2
#endif // __has_include("OpenImageDenoise/oidn.hpp")