projects
/
ghc-hetmet.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Release some of the memory allocated to a stack when it shrinks (#2090)
[ghc-hetmet.git]
/
includes
/
Storage.h
diff --git
a/includes/Storage.h
b/includes/Storage.h
index
48b7ec3
..
a830b44
100644
(file)
--- a/
includes/Storage.h
+++ b/
includes/Storage.h
@@
-173,9
+173,6
@@
extern bdescr * RTS_VAR(small_alloc_list);
extern bdescr * RTS_VAR(large_alloc_list);
extern bdescr * RTS_VAR(pinned_object_block);
extern bdescr * RTS_VAR(large_alloc_list);
extern bdescr * RTS_VAR(pinned_object_block);
-extern StgPtr RTS_VAR(alloc_Hp);
-extern StgPtr RTS_VAR(alloc_HpLim);
-
extern nat RTS_VAR(alloc_blocks);
extern nat RTS_VAR(alloc_blocks_lim);
extern nat RTS_VAR(alloc_blocks);
extern nat RTS_VAR(alloc_blocks_lim);
@@
-189,6
+186,9
@@
doYouWantToGC( void )
extern void *allocateExec (nat bytes);
extern void freeExec (void *p);
extern void *allocateExec (nat bytes);
extern void freeExec (void *p);
+/* for splitting blocks groups in two */
+extern bdescr * splitLargeBlock (bdescr *bd, nat blocks);
+
/* -----------------------------------------------------------------------------
Performing Garbage Collection
/* -----------------------------------------------------------------------------
Performing Garbage Collection
@@
-262,11
+262,28
@@
recordMutableGenLock(StgClosure *p, generation *gen)
RELEASE_SM_LOCK;
}
RELEASE_SM_LOCK;
}
+extern bdescr *allocBlock_sync(void);
+
+// Version of recordMutableGen() for use in parallel GC. The same as
+// recordMutableGen(), except that we surround it with a spinlock and
+// call the spinlock version of allocBlock().
INLINE_HEADER void
recordMutableGen_GC(StgClosure *p, generation *gen)
{
INLINE_HEADER void
recordMutableGen_GC(StgClosure *p, generation *gen)
{
+ bdescr *bd;
+
ACQUIRE_SPIN_LOCK(&recordMutableGen_sync);
ACQUIRE_SPIN_LOCK(&recordMutableGen_sync);
- recordMutableGen(p,gen);
+
+ bd = gen->mut_list;
+ if (bd->free >= bd->start + BLOCK_SIZE_W) {
+ bdescr *new_bd;
+ new_bd = allocBlock_sync();
+ new_bd->link = bd;
+ bd = new_bd;
+ gen->mut_list = bd;
+ }
+ *bd->free++ = (StgWord)p;
+
RELEASE_SPIN_LOCK(&recordMutableGen_sync);
}
RELEASE_SPIN_LOCK(&recordMutableGen_sync);
}
@@
-522,11
+539,13
@@
extern void GetRoots ( evac_fn evac );
extern ullong RTS_VAR(total_allocated);
extern lnat calcAllocated ( void );
extern ullong RTS_VAR(total_allocated);
extern lnat calcAllocated ( void );
-extern lnat calcLive ( void );
+extern lnat calcLiveBlocks ( void );
+extern lnat calcLiveWords ( void );
+extern lnat countOccupied ( bdescr *bd );
extern lnat calcNeeded ( void );
#if defined(DEBUG)
extern lnat calcNeeded ( void );
#if defined(DEBUG)
-extern void memInventory(void);
+extern void memInventory(rtsBool show);
extern void checkSanity(void);
extern nat countBlocks(bdescr *);
extern void checkNurserySanity( step *stp );
extern void checkSanity(void);
extern nat countBlocks(bdescr *);
extern void checkNurserySanity( step *stp );