diff --git a/Source/Processes/AuProcess.Unix.cpp b/Source/Processes/AuProcess.Unix.cpp index 45511926..8103c228 100644 --- a/Source/Processes/AuProcess.Unix.cpp +++ b/Source/Processes/AuProcess.Unix.cpp @@ -34,6 +34,20 @@ #endif #endif + +#if defined(AURORA_PLATFORM_BSD) + #if defined(__FreeBSD__) + #include + #endif + + #include +#endif + +#if defined(AURORA_IS_LINUX_DERIVED) + #include +#endif + + namespace Aurora::Processes { static AuThreadPrimitives::RWLockUnique_t gRWLock; @@ -521,6 +535,62 @@ namespace Aurora::Processes ::chroot(this->startup_.workingDirectory.value().c_str()); } #endif + + if (this->startup_.optAffinity) + { + auto affinity = this->startup_.optAffinity.Value(); + + #if defined(__FreeBSD__) + + cpuset_setid(CPU_WHICH_PID, -1, (cpusetid_t *)&affinity.lower); // I guess? + + #elif defined(AURORA_IS_LINUX_DERIVED) || (defined(AURORA_IS_POSIX_DERIVED) && defined(_GNU_SOURCE)) + + cpu_set_t cpuset; + CPU_ZERO(&cpuset); + + AuUInt8 index {}; + while (affinity.CpuBitScanForward(index, index)) + { + CPU_SET(index, &cpuset); + index++; + } + + if (!CPU_COUNT(&cpuset)) + { + return; + } + + #if defined(AURORA_IS_LINUX_DERIVED) + sched_setaffinity(0, sizeof(cpu_set_t), &cpuset); + #else + pthread_setaffinity_np(pthread_self(), cpuset_size(cpuSet), &cpuset); + #endif + + #elif defined(AURORA_IS_POSIX_DERIVED) + + if (auto cpuSet = cpuset_alloc()) + { + cpuset_init(cpuSet); + + AuUInt8 index {}; + while (affinity.CpuBitScanForward(index, index)) + { + cpuset_set_cpu(cpuSet, index, 1); + index++; + } + + pthread_setaffinity_np(pthread_self(), cpuset_size(cpuSet), cpuSet); + + cpuset_free(cpuSet); + } + + #else + + // Who else? + + #endif + } ::execv(this->startup_.process.c_str(), (char * const *)this->cargs_.data()); // https://pubs.opengroup.org/onlinepubs/9699919799/functions/exec.html