diff options
author | Kamil Rytarowski <n54@gmx.com> | 2018-12-11 18:35:07 +0000 |
---|---|---|
committer | Kamil Rytarowski <n54@gmx.com> | 2018-12-11 18:35:07 +0000 |
commit | 316f42387625e0a8afd9ed1340b9bbced8a924db (patch) | |
tree | e5afb0aa7695e9b2a5f12ba13501adcae093b828 /openmp | |
parent | 98bdf1f21d0a22b0d77ffa7ec86c66d337ef2d6a (diff) | |
download | llvm-316f42387625e0a8afd9ed1340b9bbced8a924db.zip llvm-316f42387625e0a8afd9ed1340b9bbced8a924db.tar.gz llvm-316f42387625e0a8afd9ed1340b9bbced8a924db.tar.bz2 |
Implement __kmp_is_address_mapped() for NetBSD
Summary:
Use the sysctl(3) function to check whether an address is mapped
into the address space.
Reviewers: mgorny, joerg, #openmp
Reviewed By: mgorny
Subscribers: openmp-commits
Tags: #openmp
Differential Revision: https://reviews.llvm.org/D55549
llvm-svn: 348874
Diffstat (limited to 'openmp')
-rw-r--r-- | openmp/runtime/src/z_Linux_util.cpp | 37 |
1 files changed, 35 insertions, 2 deletions
diff --git a/openmp/runtime/src/z_Linux_util.cpp b/openmp/runtime/src/z_Linux_util.cpp index 7b008d7..283a205 100644 --- a/openmp/runtime/src/z_Linux_util.cpp +++ b/openmp/runtime/src/z_Linux_util.cpp @@ -52,6 +52,9 @@ #include <sys/sysctl.h> #elif KMP_OS_DRAGONFLY || KMP_OS_FREEBSD #include <pthread_np.h> +#elif KMP_OS_NETBSD +#include <sys/types.h> +#include <sys/sysctl.h> #endif #include <ctype.h> @@ -2015,9 +2018,39 @@ int __kmp_is_address_mapped(void *addr) { found = 1; } -#elif KMP_OS_DRAGONFLY || KMP_OS_FREEBSD || KMP_OS_NETBSD || KMP_OS_OPENBSD +#elif KMP_OS_NETBSD + + int mib[5]; + mib[0] = CTL_VM; + mib[1] = VM_PROC; + mib[2] = VM_PROC_MAP; + mib[3] = getpid(); + mib[4] = sizeof(struct kinfo_vmentry); + + size_t size; + rc = sysctl(mib, __arraycount(mib), NULL, &size, NULL, 0); + KMP_ASSERT(!rc); + KMP_ASSERT(size); + + size = size * 4 / 3; + struct kinfo_vmentry *kiv = (struct kinfo_vmentry *)KMP_INTERNAL_MALLOC(size); + KMP_ASSERT(kiv); + + rc = sysctl(mib, __arraycount(mib), kiv, &size, NULL, 0); + KMP_ASSERT(!rc); + KMP_ASSERT(size); + + for (size_t i = 0; i < size; i++) { + if (kiv[i].kve_start >= (uint64_t)addr && + kiv[i].kve_end <= (uint64_t)addr) { + found = 1; + break; + } + } + KMP_INTERNAL_FREE(kiv); +#elif KMP_OS_DRAGONFLY || KMP_OS_OPENBSD - // FIXME(DragonFly, FreeBSD, NetBSD, OpenBSD): Implement this + // FIXME(DragonFly, OpenBSD): Implement this found = 1; #else |