diff options
author | Ömer Sinan Ağacan <omeragacan@gmail.com> | 2019-01-12 16:08:24 +0300 |
---|---|---|
committer | Ben Gamari <ben@smart-cactus.org> | 2019-01-28 18:07:38 -0500 |
commit | 14001294137e0f86fb7f7be434a1aa8c58454558 (patch) | |
tree | 7f56b6fd459ea101819a5f87b87724a7f221de87 | |
parent | cf5b5a74564a61aeb636a88d68732b913306d101 (diff) | |
download | haskell-14001294137e0f86fb7f7be434a1aa8c58454558.tar.gz |
Fix checkPtrInArena
(See comments)
(cherry picked from commit 448f0e7dd78a8d9404f1aa5e8522cc284360c06d)
-rw-r--r-- | rts/Arena.c | 13 |
1 files changed, 11 insertions, 2 deletions
diff --git a/rts/Arena.c b/rts/Arena.c index e0b4ebde30..a4ff11be7d 100644 --- a/rts/Arena.c +++ b/rts/Arena.c @@ -121,8 +121,17 @@ arenaBlocks( void ) #if defined(DEBUG) void checkPtrInArena( StgPtr p, Arena *arena ) { - for (bdescr *bd = arena->current; bd; bd = bd->link) { - if (p >= bd->start && p < bd->free) { + // We don't update free pointers of arena blocks, so we have to check cached + // free pointer for the first block. + if (p >= arena->current->start && p < arena->free) { + return; + } + + // Rest of the blocks should be full (except there may be a little bit of + // slop at the end). Again, free pointers are not updated so we can't use + // those. + for (bdescr *bd = arena->current->link; bd; bd = bd->link) { + if (p >= bd->start && p < bd->start + (bd->blocks*BLOCK_SIZE_W)) { return; } } |