diff options
author | Sergei Trofimovich <slyfox@gentoo.org> | 2018-07-18 23:36:58 +0100 |
---|---|---|
committer | Sergei Trofimovich <slyfox@gentoo.org> | 2018-07-18 23:37:16 +0100 |
commit | e175aaf6918bb2b497b83618dc4c270a0d231a1c (patch) | |
tree | cbfd58e83f816de3daf7695f1abc6373d514e780 /rts | |
parent | d0bbe1bf351c8b85c310afb0dd1fb1f12f9474bf (diff) | |
download | haskell-e175aaf6918bb2b497b83618dc4c270a0d231a1c.tar.gz |
fix osReserveHeapMemory block alignment
Before the change osReserveHeapMemory() attempted
to allocate chunks of memory via osTryReserveHeapMemory()
not multiple of MBLOCK_SIZE in the following fallback code:
```
if (at == NULL) {
*len -= *len / 8;
```
and caused assertion failure:
```
$ make fulltest TEST=T11607 WAY=threaded1
T11607: internal error: ASSERTION FAILED: file rts/posix/OSMem.c, line 457
(GHC version 8.7.20180716 for riscv64_unknown_linux)
```
The change applies alignment mask before each MBLOCK allocation attempt
and fixes WAY=threaded1 test failures on qemu-riscv64.
Signed-off-by: Sergei Trofimovich <slyfox@gentoo.org>
Test Plan: run 'make fulltest WAY=threaded1'
Reviewers: simonmar, bgamari, erikd
Reviewed By: simonmar
Subscribers: rwbarton, thomie, carter
Differential Revision: https://phabricator.haskell.org/D4982
Diffstat (limited to 'rts')
-rw-r--r-- | rts/posix/OSMem.c | 4 |
1 files changed, 4 insertions, 0 deletions
diff --git a/rts/posix/OSMem.c b/rts/posix/OSMem.c index e63e798be9..4063ad3550 100644 --- a/rts/posix/OSMem.c +++ b/rts/posix/OSMem.c @@ -441,6 +441,8 @@ osTryReserveHeapMemory (W_ len, void *hint) void *base, *top; void *start, *end; + ASSERT((len & ~MBLOCK_MASK) == len); + /* We try to allocate len + MBLOCK_SIZE, because we need memory which is MBLOCK_SIZE aligned, and then we discard what we don't need */ @@ -517,6 +519,8 @@ void *osReserveHeapMemory(void *startAddressPtr, W_ *len) attempt = 0; while (1) { + *len &= ~MBLOCK_MASK; + if (*len < MBLOCK_SIZE) { // Give up if the system won't even give us 16 blocks worth of heap barf("osReserveHeapMemory: Failed to allocate heap storage"); |