#include "pipe/p_compiler.h"
#if defined(PIPE_OS_UNIX)
-# ifndef _FILE_OFFSET_BITS
-# error _FILE_OFFSET_BITS must be defined to 64
-# endif
# include <sys/mman.h>
#else
# error Unsupported OS
#endif
-#if defined(PIPE_OS_ANDROID)
+#if defined(PIPE_OS_ANDROID) && !defined(__LP64__)
extern void *__mmap2(void *, size_t, int, int, int, size_t);
-static INLINE void *os_mmap(void *addr, size_t length, int prot, int flags, int fd, loff_t offset)
+static inline void *os_mmap(void *addr, size_t length, int prot, int flags,
+ int fd, loff_t offset)
{
/* offset must be aligned to 4096 (not necessarily the page size) */
if (unlikely(offset & 4095)) {
return __mmap2(addr, length, prot, flags, fd, (size_t) (offset >> 12));
}
+# define os_munmap(addr, length) \
+ munmap(addr, length)
+
#else
/* assume large file support exists */
-# define os_mmap(addr, length, prot, flags, fd, offset) mmap(addr, length, prot, flags, fd, offset)
-#endif
+# define os_mmap(addr, length, prot, flags, fd, offset) \
+ mmap(addr, length, prot, flags, fd, offset)
-#define os_munmap(addr, length) munmap(addr, length)
+static inline int os_munmap(void *addr, size_t length)
+{
+ /* Copied from configure code generated by AC_SYS_LARGEFILE */
+#define LARGE_OFF_T ((((off_t) 1 << 31) << 31) - 1 + \
+ (((off_t) 1 << 31) << 31))
+ STATIC_ASSERT(LARGE_OFF_T % 2147483629 == 721 &&
+ LARGE_OFF_T % 2147483647 == 1);
+#undef LARGE_OFF_T
+
+ return munmap(addr, length);
+}
+#endif
#ifdef __cplusplus