$NetBSD: patch-aa,v 1.10 2021/06/28 15:53:57 tnn Exp $ -DragonFly support. -Add workaround for missing sem_timedwait() in NetBSD < 6.99.4 --- hotspot/src/os/bsd/vm/os_bsd.cpp.orig 2021-05-14 21:52:06.000000000 +0000 +++ hotspot/src/os/bsd/vm/os_bsd.cpp @@ -110,7 +110,7 @@ # include #endif -#if defined(__FreeBSD__) || defined(__NetBSD__) +#if defined(__FreeBSD__) || defined(__NetBSD__) || defined(__DragonFly__) # include #endif @@ -296,6 +296,7 @@ void os::Bsd::initialize_system_info() { size_t len; int cpu_val; julong mem_val; + struct rlimit limits; /* get processors count via hw.ncpus sysctl */ mib[0] = CTL_HW; @@ -334,14 +335,11 @@ void os::Bsd::initialize_system_info() { _physical_memory = 256*1024*1024; // fallback (XXXBSD?) } -#ifdef __OpenBSD__ - { - // limit _physical_memory memory view on OpenBSD since - // datasize rlimit restricts us anyway. - struct rlimit limits; - getrlimit(RLIMIT_DATA, &limits); - _physical_memory = MIN2(_physical_memory, (julong)limits.rlim_cur); - } + getrlimit(RLIMIT_DATA, &limits); + _physical_memory = MIN2(_physical_memory, (julong)limits.rlim_cur); +#if defined(RLIMIT_AS) + getrlimit(RLIMIT_AS, &limits); + _physical_memory = MIN2(_physical_memory, (julong)limits.rlim_cur); #endif } @@ -393,7 +391,7 @@ void os::init_system_properties_values() // ... // 7: The default directories, normally /lib and /usr/lib. #ifndef DEFAULT_LIBPATH -#define DEFAULT_LIBPATH "/lib:/usr/lib" +#define DEFAULT_LIBPATH "@PREFIX@/lib/jni:@PREFIX@/lib:/lib:/usr/lib" #endif // Base path of extensions installed on the system. @@ -1605,8 +1603,15 @@ void * os::dll_load(const char *filename {EM_PPC, EM_PPC, ELFCLASS32, ELFDATA2MSB, (char*)"Power PC 32"}, {EM_PPC64, EM_PPC64, ELFCLASS64, ELFDATA2MSB, (char*)"Power PC 64"}, {EM_ARM, EM_ARM, ELFCLASS32, ELFDATA2LSB, (char*)"ARM"}, +#if defined(EM_AARCH64) + {EM_AARCH64, EM_AARCH64, ELFCLASS64, ELFDATA2LSB, (char*)"Aarch64"}, +#endif +#if defined(EM_S390) {EM_S390, EM_S390, ELFCLASSNONE, ELFDATA2MSB, (char*)"IBM System/390"}, +#endif +#if defined(EM_ALPHA) {EM_ALPHA, EM_ALPHA, ELFCLASS64, ELFDATA2LSB, (char*)"Alpha"}, +#endif {EM_MIPS_RS3_LE, EM_MIPS_RS3_LE, ELFCLASS32, ELFDATA2LSB, (char*)"MIPSel"}, {EM_MIPS, EM_MIPS, ELFCLASS32, ELFDATA2MSB, (char*)"MIPS"}, {EM_PARISC, EM_PARISC, ELFCLASS32, ELFDATA2MSB, (char*)"PARISC"}, @@ -2108,11 +2113,15 @@ class Semaphore : public StackObj { }; Semaphore::Semaphore() { + _semaphore = NULL; SEM_INIT(_semaphore, 0); } Semaphore::~Semaphore() { - SEM_DESTROY(_semaphore); + if (_semaphore != NULL) { + SEM_DESTROY(_semaphore); + _semaphore = NULL; + } } void Semaphore::signal() { @@ -2166,6 +2175,33 @@ bool Semaphore::timedwait(unsigned int s #else +#if defined(__NetBSD__) && (__NetBSD_Version__ < 699000400) +static inline int sem_timedwait(sem_t *sem, struct timespec *ts) { + struct timespec onems = { 0, 1000000 }; + struct timespec total = { 0, 0 }; + struct timespec unslept; + struct timespec elapsed; + struct timespec tmp; + + while (timespeccmp(ts, &total, >)) { + if (sem_trywait(sem) == 0) + return 0; + + if (errno != EAGAIN) + return -1; + + (void)nanosleep(&onems, &unslept); + + timespecsub(&onems, &unslept, &elapsed); + timespecadd(&total, &elapsed, &tmp); + total.tv_sec = tmp.tv_sec; + total.tv_nsec = tmp.tv_nsec; + } + errno = ETIMEDOUT; + return -1; +} +#endif /* __NetBSD__ */ + bool Semaphore::trywait() { return sem_trywait(&_semaphore) == 0; } @@ -2316,7 +2352,7 @@ static void warn_fail_commit_memory(char // problem. bool os::pd_commit_memory(char* addr, size_t size, bool exec) { int prot = exec ? PROT_READ|PROT_WRITE|PROT_EXEC : PROT_READ|PROT_WRITE; -#ifdef __OpenBSD__ +#if defined(__OpenBSD__) || defined(__NetBSD__) // XXX: Work-around mmap/MAP_FIXED bug temporarily on OpenBSD if (::mprotect(addr, size, prot) == 0) { return true; @@ -3017,7 +3053,7 @@ OSReturn os::set_native_priority(Thread* #ifdef __OpenBSD__ // OpenBSD pthread_setprio starves low priority threads return OS_OK; -#elif defined(__FreeBSD__) +#elif defined(__FreeBSD__) || defined(__DragonFly__) int ret = pthread_setprio(thread->osthread()->pthread_id(), newpri); return (ret == 0) ? OS_OK : OS_ERR; #elif defined(__APPLE__) || defined(__NetBSD__) @@ -3046,7 +3082,7 @@ OSReturn os::get_native_priority(const T } errno = 0; -#if defined(__OpenBSD__) || defined(__FreeBSD__) +#if defined(__OpenBSD__) || defined(__FreeBSD__) || defined(__DragonFly__) *priority_ptr = pthread_getprio(thread->osthread()->pthread_id()); #elif defined(__APPLE__) || defined(__NetBSD__) int policy; @@ -3733,7 +3769,11 @@ void os::Bsd::check_signal_handler(int s struct sigaction act; if (os_sigaction == NULL) { // only trust the default sigaction, in case it has been interposed +#if defined(__NetBSD__) + os_sigaction = (os_sigaction_t)dlsym(RTLD_DEFAULT, "__sigaction14"); +#else os_sigaction = (os_sigaction_t)dlsym(RTLD_DEFAULT, "sigaction"); +#endif if (os_sigaction == NULL) return; } @@ -4065,7 +4105,7 @@ void os::set_native_thread_name(const ch #elif defined(__FreeBSD__) || defined(__OpenBSD__) pthread_set_name_np(pthread_self(), name); #elif defined(__NetBSD__) - pthread_setname_np(pthread_self(), "%s", name); + pthread_setname_np(pthread_self(), "%s", (void*)name); #endif } }