diff options
Diffstat (limited to 'libjava/gnu/java/nio/channels/natFileChannelPosix.cc')
-rw-r--r-- | libjava/gnu/java/nio/channels/natFileChannelPosix.cc | 24 |
1 files changed, 22 insertions, 2 deletions
diff --git a/libjava/gnu/java/nio/channels/natFileChannelPosix.cc b/libjava/gnu/java/nio/channels/natFileChannelPosix.cc index 8653787..44beae6 100644 --- a/libjava/gnu/java/nio/channels/natFileChannelPosix.cc +++ b/libjava/gnu/java/nio/channels/natFileChannelPosix.cc @@ -56,6 +56,26 @@ details. */ #ifdef HAVE_MMAP #include <sys/mman.h> + +// Use overload resolution to find out the argument types. +// E.g. Solaris 2.6 uses different argument types for munmap and msync. +// This is in case _POSIX_C_SOURCES is smaller than 3. + +template <typename T_implPtr, typename T_implLen> +static inline int +munmap_adaptor(int (*munmap)(T_implPtr caddr, T_implLen sizet), + void* caddr, size_t sizet) +{ + return munmap ((T_implPtr) caddr, (T_implLen) sizet); +} + +template <typename T_implPtr, typename T_implLen, typename T_msync> +static inline int +msync_adaptor(int (*msync)(T_implPtr caddr, T_implLen sizet, T_msync msynct), + void* caddr, size_t sizet, int msynct) +{ + return msync ((T_implPtr) caddr, (T_implLen) sizet, (T_msync) msynct); +} #endif using gnu::gcj::RawData; @@ -498,7 +518,7 @@ void MappedByteBufferImpl::unmapImpl () { #if defined(HAVE_MMAP) - munmap((void*) implPtr, implLen); + munmap_adaptor(munmap, implPtr, implLen); #endif } @@ -517,6 +537,6 @@ void MappedByteBufferImpl::forceImpl () { #if defined(HAVE_MMAP) - ::msync((void*) implPtr, implLen, MS_SYNC); + ::msync_adaptor(msync, implPtr, implLen, MS_SYNC); #endif } |