|
@@ -142,6 +142,24 @@ os_munmap(void *addr, size_t size);
|
|
|
int
|
|
int
|
|
|
os_mprotect(void *addr, size_t size, int prot);
|
|
os_mprotect(void *addr, size_t size, int prot);
|
|
|
|
|
|
|
|
|
|
+static inline void *
|
|
|
|
|
+os_mremap_slow(void *old_addr, size_t old_size, size_t new_size)
|
|
|
|
|
+{
|
|
|
|
|
+ void *new_memory = os_mmap(NULL, new_size, MMAP_PROT_WRITE | MMAP_PROT_READ,
|
|
|
|
|
+ 0, os_get_invalid_handle());
|
|
|
|
|
+ if (!new_memory) {
|
|
|
|
|
+ return NULL;
|
|
|
|
|
+ }
|
|
|
|
|
+ /*
|
|
|
|
|
+ * bh_memcpy_s can't be used as it doesn't support values bigger than
|
|
|
|
|
+ * UINT32_MAX
|
|
|
|
|
+ */
|
|
|
|
|
+ memcpy(new_memory, old_addr, new_size < old_size ? new_size : old_size);
|
|
|
|
|
+ os_munmap(old_addr, old_size);
|
|
|
|
|
+
|
|
|
|
|
+ return new_memory;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
/* Doesn't guarantee that protection flags will be preserved.
|
|
/* Doesn't guarantee that protection flags will be preserved.
|
|
|
os_mprotect() must be called after remapping. */
|
|
os_mprotect() must be called after remapping. */
|
|
|
void *
|
|
void *
|