able to unmap memory that may have be allocated using multiple calls
to MMAP, so long as they are adjacent.
-HAVE_MREMAP default: 1 on linux, else 0
+HAVE_MREMAP default: 1 on linux and NetBSD, else 0
If true realloc() uses mremap() to re-allocate large blocks and
extend or shrink allocation spaces.
#define MMAP_CLEARS 1
#endif /* MMAP_CLEARS */
#ifndef HAVE_MREMAP
-#ifdef linux
+#if defined(linux) || defined(__NetBSD__)
#define HAVE_MREMAP 1
-#else /* linux */
+#else /* linux || __NetBSD__ */
#define HAVE_MREMAP 0
-#endif /* linux */
+#endif /* linux || __NetBSD__ */
#endif /* HAVE_MREMAP */
#ifndef MALLOC_FAILURE_ACTION
#define MALLOC_FAILURE_ACTION errno = ENOMEM;
#endif /* HAVE_MMAP */
#if HAVE_MMAP && HAVE_MREMAP
+#if defined(linux)
#define CALL_MREMAP(addr, osz, nsz, mv) mremap((addr), (osz), (nsz), (mv))
+#elif defined(__NetBSD__)
+#define CALL_MREMAP(addr, osz, nsz, mv) mremap((addr), (osz), (addr), (nsz), (mv))
+#else
+#define CALL_MREMAP(addr, osz, nsz, mv) MFAIL
+#endif
#else /* HAVE_MMAP && HAVE_MREMAP */
#define CALL_MREMAP(addr, osz, nsz, mv) MFAIL
#endif /* HAVE_MMAP && HAVE_MREMAP */
int Mono_Posix_FromMremapFlags (guint64 x, guint64 *r)
{
*r = 0;
+#ifndef __NetBSD__
if ((x & Mono_Posix_MremapFlags_MREMAP_MAYMOVE) == Mono_Posix_MremapFlags_MREMAP_MAYMOVE)
#ifdef MREMAP_MAYMOVE
*r |= MREMAP_MAYMOVE;
#else /* def MREMAP_MAYMOVE */
{errno = EINVAL; return -1;}
#endif /* ndef MREMAP_MAYMOVE */
+#else /* def __NetBSD__ */
+ if ((x & Mono_Posix_MremapFlags_MREMAP_MAYMOVE) != Mono_Posix_MremapFlags_MREMAP_MAYMOVE)
+ *r = MAP_FIXED;
+#endif /* def __NetBSD__ */
if (x == 0)
return 0;
return 0;
int Mono_Posix_ToMremapFlags (guint64 x, guint64 *r)
{
*r = 0;
+#ifndef __NetBSD__
if (x == 0)
return 0;
#ifdef MREMAP_MAYMOVE
if ((x & MREMAP_MAYMOVE) == MREMAP_MAYMOVE)
*r |= Mono_Posix_MremapFlags_MREMAP_MAYMOVE;
#endif /* ndef MREMAP_MAYMOVE */
+#else /* def __NetBSD__ */
+ if ((x & MAP_FIXED) != MAP_FIXED)
+ *r |= Mono_Posix_MremapFlags_MREMAP_MAYMOVE;
+#endif
return 0;
}
#endif /* ndef XATTR_REPLACE */
return 0;
}
-
if (Mono_Posix_FromMremapFlags (flags, &_flags) == -1)
return MAP_FAILED;
+#if defined(linux)
return mremap (old_address, (size_t) old_size, (size_t) new_size,
(unsigned long) _flags);
+#elif defined(__NetBSD__)
+ return mremap (old_address, (size_t) old_size, old_address,
+ (size_t) new_size, (unsigned long) _flags);
+#else
+#error Port me
+#endif
}
#endif /* def HAVE_MREMAP */