#include <stdio.h>
#include <string.h>
#include <stdarg.h>
+#include <stdint.h>
#include <dirent.h>
#include <sys/time.h>
#include <time.h>
memcpy(dst, PICO_DATA_DIR, sizeof PICO_DATA_DIR);
return sizeof(PICO_DATA_DIR) - 1;
#else
- int j, ret = readlink("/proc/self/exe", dst, len - 1);
+ int j, ret = readlink(
+#ifdef __FreeBSD__
+ "/proc/curproc/file",
+#else
+ "/proc/self/exe",
+#endif
+ dst, len - 1);
if (ret < 0) {
perror("readlink");
ret = 0;
{
int ret = plat_get_exe_dir(dst, len);
if (ret < 0)
- return ret;
+ ret = 0;
memcpy(dst + ret, "skin/", sizeof "skin/");
return ret + sizeof("skin/") - 1;
*/
if (size >= HUGETLB_THRESHOLD)
flags |= MAP_HUGETLB;
+#ifdef MAP_JIT
+ if (need_exec)
+ flags |= MAP_JIT;
+#endif
ret = mmap(req, size, prot, flags, -1, 0);
if (ret == MAP_FAILED && (flags & MAP_HUGETLB)) {
}
flags &= ~MAP_HUGETLB;
ret = mmap(req, size, prot, flags, -1, 0);
+#ifdef MADV_HUGEPAGE
+ if (ret != MAP_FAILED && ((uintptr_t)ret & (2*1024*1024 - 1))) {
+ // try to manually realign assuming bottom-to-top alloc
+ munmap(ret, size);
+ ret = (void *)((uintptr_t)ret & ~(2*1024*1024 - 1));
+ ret = mmap(ret, size, prot, flags, -1, 0);
+ }
+ if (ret != MAP_FAILED)
+ madvise(ret, size, MADV_HUGEPAGE);
+#endif
}
if (ret == MAP_FAILED)
return NULL;
{
void *ret;
+#ifdef MREMAP_MAYMOVE
ret = mremap(ptr, oldsize, newsize, MREMAP_MAYMOVE);
- if (ret == MAP_FAILED) {
+ if (ret == MAP_FAILED)
+#endif
+ {
fprintf(stderr, "mremap %p %zd %zd: ",
ptr, oldsize, newsize);
perror(NULL);