diff options
| author | gingerBill <bill@gingerbill.org> | 2022-02-05 13:01:21 +0000 |
|---|---|---|
| committer | gingerBill <bill@gingerbill.org> | 2022-02-05 13:01:21 +0000 |
| commit | 2bcc7b00641a0a0a8d7bca3f207082504a85fc0a (patch) | |
| tree | 88f43cbdb1af3fba408cfdc0aee9bd9adf41ea6a | |
| parent | 97be86710306702a672309b23fbe8d38f1e6eeec (diff) | |
| parent | fb710f8cbfa67ad169eff9a33ed67f07cfb5b643 (diff) | |
Merge branch 'master' of https://github.com/odin-lang/Odin
| -rw-r--r-- | core/os/os.odin | 12 | ||||
| -rw-r--r-- | core/os/os_darwin.odin | 2 | ||||
| -rw-r--r-- | core/os/os_freebsd.odin | 2 | ||||
| -rw-r--r-- | core/os/os_linux.odin | 2 |
4 files changed, 16 insertions, 2 deletions
diff --git a/core/os/os.odin b/core/os/os.odin index 83158be80..2ebfebd2e 100644 --- a/core/os/os.odin +++ b/core/os/os.odin @@ -206,11 +206,19 @@ heap_allocator_proc :: proc(allocator_data: rawptr, mode: mem.Allocator_Mode, } } - aligned_resize :: proc(p: rawptr, old_size: int, new_size: int, new_alignment: int) -> ([]byte, mem.Allocator_Error) { + aligned_resize :: proc(p: rawptr, old_size: int, new_size: int, new_alignment: int) -> (new_memory: []byte, err: mem.Allocator_Error) { if p == nil { return nil, nil } - return aligned_alloc(new_size, new_alignment, p) + + new_memory = aligned_alloc(new_size, new_alignment, p) or_return + + // NOTE: heap_resize does not zero the new memory, so we do it + if new_size > old_size { + new_region := mem.raw_data(new_memory[old_size:]) + mem.zero(new_region, new_size - old_size) + } + return } switch mode { diff --git a/core/os/os_darwin.odin b/core/os/os_darwin.odin index ef1d6185a..adb490e4f 100644 --- a/core/os/os_darwin.odin +++ b/core/os/os_darwin.odin @@ -553,6 +553,8 @@ heap_alloc :: proc(size: int) -> rawptr { return _unix_calloc(1, size) } heap_resize :: proc(ptr: rawptr, new_size: int) -> rawptr { + // NOTE: _unix_realloc doesn't guarantee new memory will be zeroed on + // POSIX platforms. Ensure your caller takes this into account. return _unix_realloc(ptr, new_size) } heap_free :: proc(ptr: rawptr) { diff --git a/core/os/os_freebsd.odin b/core/os/os_freebsd.odin index e9314b468..82317532d 100644 --- a/core/os/os_freebsd.odin +++ b/core/os/os_freebsd.odin @@ -378,6 +378,8 @@ heap_alloc :: proc(size: int) -> rawptr { } heap_resize :: proc(ptr: rawptr, new_size: int) -> rawptr { + // NOTE: _unix_realloc doesn't guarantee new memory will be zeroed on + // POSIX platforms. Ensure your caller takes this into account. return _unix_realloc(ptr, c.size_t(new_size)); } diff --git a/core/os/os_linux.odin b/core/os/os_linux.odin index 1c796f1b8..3288388ea 100644 --- a/core/os/os_linux.odin +++ b/core/os/os_linux.odin @@ -727,6 +727,8 @@ heap_alloc :: proc(size: int) -> rawptr { } heap_resize :: proc(ptr: rawptr, new_size: int) -> rawptr { + // NOTE: _unix_realloc doesn't guarantee new memory will be zeroed on + // POSIX platforms. Ensure your caller takes this into account. return _unix_realloc(ptr, c.size_t(new_size)) } |