diff --git a/src/arena.c b/src/arena.c index 4e030dd4..d64b8cdd 100644 --- a/src/arena.c +++ b/src/arena.c @@ -124,3 +124,11 @@ void arena_set_readonly(struct arena *arena) arena->readonly = true; #endif } + +void arena_set_readwrite(struct arena *arena) +{ +#if RTC + arena->readonly = false; +#endif + sys_memory_set_committed_readwrite(arena->base, arena->committed); +} diff --git a/src/arena.h b/src/arena.h index 38e7e1d0..36b84894 100644 --- a/src/arena.h +++ b/src/arena.h @@ -33,6 +33,7 @@ void *_arena_push_bytes(struct arena *arena, u64 size, u64 align); void arena_copy_replace(struct arena *dest, struct arena *src); void arena_decommit_unused_blocks(struct arena *arena); void arena_set_readonly(struct arena *arena); +void arena_set_readwrite(struct arena *arena); INLINE void *_arena_push_bytes_zero(struct arena *arena, u64 size, u64 align) { diff --git a/src/sys.h b/src/sys.h index df5e708b..2840a843 100644 --- a/src/sys.h +++ b/src/sys.h @@ -168,6 +168,7 @@ void *sys_memory_commit(void *address, u64 size); void sys_memory_decommit(void *address, u64 size); void sys_memory_set_committed_readonly(void *address, u64 size); +void sys_memory_set_committed_readwrite(void *address, u64 size); /* ========================== * * Time diff --git a/src/sys_win32.c b/src/sys_win32.c index da3e64e7..644c85b2 100644 --- a/src/sys_win32.c +++ b/src/sys_win32.c @@ -208,10 +208,16 @@ void sys_memory_decommit(void *address, u64 size) void sys_memory_set_committed_readonly(void *address, u64 size) { - DWORD old = PAGE_READWRITE; + DWORD old; VirtualProtect(address, size, PAGE_READONLY, &old); } +void sys_memory_set_committed_readwrite(void *address, u64 size) +{ + DWORD old; + VirtualProtect(address, size, PAGE_READWRITE, &old); +} + /* ========================== * * Time * ========================== */