Fix FreeBSD build

This restores some CPP'd code that was added in
c18911602e and accidentally lost in
2477e4e3b8.

Co-authored-by: Eelco Dolstra <edolstra@gmail.com>
This commit is contained in:
John Ericson 2024-06-12 10:02:20 -04:00
parent e74ce01b7f
commit 7c2981fc55
4 changed files with 36 additions and 8 deletions

View File

@ -369,6 +369,14 @@ if test "$gc" = yes; then
PKG_CHECK_MODULES([BDW_GC], [bdw-gc]) PKG_CHECK_MODULES([BDW_GC], [bdw-gc])
CXXFLAGS="$BDW_GC_CFLAGS $CXXFLAGS" CXXFLAGS="$BDW_GC_CFLAGS $CXXFLAGS"
AC_DEFINE(HAVE_BOEHMGC, 1, [Whether to use the Boehm garbage collector.]) AC_DEFINE(HAVE_BOEHMGC, 1, [Whether to use the Boehm garbage collector.])
# See `fixupBoehmStackPointer`, for the integration between Boehm GC
# and Boost coroutines.
old_CFLAGS="$CFLAGS"
# Temporary set `-pthread` just for the next check
CFLAGS="$CFLAGS -pthread"
AC_CHECK_FUNCS([pthread_attr_get_np pthread_getattr_np])
CFLAGS="$old_CFLAGS"
fi fi
AS_IF([test "$ENABLE_UNIT_TESTS" == "yes"],[ AS_IF([test "$ENABLE_UNIT_TESTS" == "yes"],[

View File

@ -48,6 +48,9 @@
#define GC_INCLUDE_NEW #define GC_INCLUDE_NEW
#include <pthread.h> #include <pthread.h>
#if __FreeBSD__
# include <pthread_np.h>
#endif
#include <gc/gc.h> #include <gc/gc.h>
#include <gc/gc_cpp.h> #include <gc/gc_cpp.h>
@ -264,30 +267,42 @@ static BoehmGCStackAllocator boehmGCStackAllocator;
* However, the implementation is quite lean, and usually we don't have active * However, the implementation is quite lean, and usually we don't have active
* coroutines during evaluation, so this is acceptable. * coroutines during evaluation, so this is acceptable.
*/ */
void fixupBoehmStackPointer(void ** sp_ptr, void * pthread_id) { void fixupBoehmStackPointer(void ** sp_ptr, void * _pthread_id) {
void *& sp = *sp_ptr; void *& sp = *sp_ptr;
auto pthread_id = reinterpret_cast<pthread_t>(_pthread_id);
pthread_attr_t pattr; pthread_attr_t pattr;
size_t osStackSize; size_t osStackSize;
void * osStackLow; void * osStackLow;
void * osStackBase; void * osStackBase;
#ifdef __APPLE__ # ifdef __APPLE__
osStackSize = pthread_get_stacksize_np((pthread_t)pthread_id); osStackSize = pthread_get_stacksize_np(pthread_id);
osStackLow = pthread_get_stackaddr_np((pthread_t)pthread_id); osStackLow = pthread_get_stackaddr_np(pthread_id);
#else # else
if (pthread_attr_init(&pattr)) { if (pthread_attr_init(&pattr)) {
throw Error("fixupBoehmStackPointer: pthread_attr_init failed"); throw Error("fixupBoehmStackPointer: pthread_attr_init failed");
} }
if (pthread_getattr_np((pthread_t)pthread_id, &pattr)) { # ifdef HAVE_PTHREAD_GETATTR_NP
if (pthread_getattr_np(pthread_id, &pattr)) {
throw Error("fixupBoehmStackPointer: pthread_getattr_np failed"); throw Error("fixupBoehmStackPointer: pthread_getattr_np failed");
} }
# elif HAVE_PTHREAD_ATTR_GET_NP
if (!pthread_attr_init(&pattr)) {
throw Error("fixupBoehmStackPointer: pthread_attr_init failed");
}
if (!pthread_attr_get_np(pthread_id, &pattr)) {
throw Error("fixupBoehmStackPointer: pthread_attr_get_np failed");
}
# else
# error "Need one of `pthread_attr_get_np` or `pthread_getattr_np`"
# endif
if (pthread_attr_getstack(&pattr, &osStackLow, &osStackSize)) { if (pthread_attr_getstack(&pattr, &osStackLow, &osStackSize)) {
throw Error("fixupBoehmStackPointer: pthread_attr_getstack failed"); throw Error("fixupBoehmStackPointer: pthread_attr_getstack failed");
} }
if (pthread_attr_destroy(&pattr)) { if (pthread_attr_destroy(&pattr)) {
throw Error("fixupBoehmStackPointer: pthread_attr_destroy failed"); throw Error("fixupBoehmStackPointer: pthread_attr_destroy failed");
} }
#endif # endif
osStackBase = (char *)osStackLow + osStackSize; osStackBase = (char *)osStackLow + osStackSize;
// NOTE: We assume the stack grows down, as it does on all architectures we support. // NOTE: We assume the stack grows down, as it does on all architectures we support.
// Architectures that grow the stack up are rare. // Architectures that grow the stack up are rare.

View File

@ -25,6 +25,10 @@
#include <fcntl.h> #include <fcntl.h>
#include <unistd.h> #include <unistd.h>
#ifndef _WIN32 // TODO abstract over proc exit status
# include <sys/wait.h>
#endif
#include <nlohmann/json.hpp> #include <nlohmann/json.hpp>
namespace nix { namespace nix {
@ -1033,7 +1037,7 @@ void DerivationGoal::buildDone()
BuildResult::Status st = BuildResult::MiscFailure; BuildResult::Status st = BuildResult::MiscFailure;
#ifndef _WIN32 #ifndef _WIN32 // TODO abstract over proc exit status
if (hook && WIFEXITED(status) && WEXITSTATUS(status) == 101) if (hook && WIFEXITED(status) && WEXITSTATUS(status) == 101)
st = BuildResult::TimedOut; st = BuildResult::TimedOut;

View File

@ -1,4 +1,5 @@
#include <regex> #include <regex>
#include <thread>
#include <nlohmann/json.hpp> #include <nlohmann/json.hpp>
#include <gtest/gtest.h> #include <gtest/gtest.h>