gl: clear w, h on reinit
[libpicofe.git] / linux / plat.c
index 779d5b1..2cdcace 100644 (file)
@@ -13,6 +13,7 @@
 #include <stdio.h>
 #include <string.h>
 #include <stdarg.h>
+#include <stdint.h>
 #include <dirent.h>
 #include <sys/time.h>
 #include <time.h>
@@ -55,7 +56,13 @@ static int plat_get_exe_dir(char *dst, int len)
        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;
@@ -75,7 +82,7 @@ int plat_get_skin_dir(char *dst, int 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;
@@ -86,7 +93,7 @@ int plat_get_skin_dir(char *dst, int len)
 #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;
 
@@ -192,6 +199,10 @@ void *plat_mmap(unsigned long addr, size_t size, int need_exec, int is_fixed)
        */
        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)) {
@@ -203,6 +214,16 @@ void *plat_mmap(unsigned long addr, size_t size, int need_exec, int is_fixed)
                }
                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;
@@ -223,8 +244,11 @@ void *plat_mremap(void *ptr, size_t oldsize, size_t newsize)
 {
        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);