#include <stdio.h>
#include <string.h>
#include <stdarg.h>
+#include <stdint.h>
#include <dirent.h>
#include <sys/time.h>
#include <time.h>
return 0;
}
-static int plat_get_data_dir(char *dst, int len)
+int plat_get_data_dir(char *dst, int len)
+{
+ if (len > 1)
+ strcpy(dst, "/");
+ else *dst = 0;
+ return strlen(dst);
+}
+
+static int plat_get_exe_dir(char *dst, int len)
{
#ifdef PICO_DATA_DIR
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 plat_get_skin_dir(char *dst, int len)
{
- int ret = plat_get_data_dir(dst, len);
+ 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;
#endif
int plat_get_root_dir(char *dst, int len)
{
-#if !defined(__GP2X__) && !defined(PANDORA)
+#if !defined(NO_HOME_DIR) && !defined(__GP2X__) && !defined(PANDORA)
const char *home = getenv("HOME");
int ret;
return ret;
}
#endif
- return plat_get_data_dir(dst, len);
+ return plat_get_exe_dir(dst, len);
}
#ifdef __GP2X__
*/
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)
- return NULL;
+#endif
+ {
+ fprintf(stderr, "mremap %p %zd %zd: ",
+ ptr, oldsize, newsize);
+ perror(NULL);
+ // might be because huge pages can't be remapped,
+ // just make a new mapping
+ ret = plat_mmap(0, newsize, 0, 0);
+ if (ret == MAP_FAILED)
+ return NULL;
+ memcpy(ret, ptr, oldsize);
+ munmap(ptr, oldsize);
+ }
if (ret != ptr)
printf("warning: mremap moved: %p -> %p\n", ptr, ret);