runtime: Ignore stack sizes when deciding when to GC.
Also allocate heap bitmaps bit in page size units and clear context when putting G structures on free list. From-SVN: r186607
This commit is contained in:
parent
8198dc134f
commit
8a72417502
|
@ -72,7 +72,7 @@ runtime_mallocgc(uintptr size, uint32 flag, int32 dogc, int32 zeroed)
|
|||
npages = size >> PageShift;
|
||||
if((size & PageMask) != 0)
|
||||
npages++;
|
||||
s = runtime_MHeap_Alloc(&runtime_mheap, npages, 0, !(flag & FlagNoGC));
|
||||
s = runtime_MHeap_Alloc(&runtime_mheap, npages, 0, 1);
|
||||
if(s == nil)
|
||||
runtime_throw("out of memory");
|
||||
size = npages<<PageShift;
|
||||
|
|
|
@ -4,6 +4,8 @@
|
|||
|
||||
// Garbage collector.
|
||||
|
||||
#include <unistd.h>
|
||||
|
||||
#include "runtime.h"
|
||||
#include "arch.h"
|
||||
#include "malloc.h"
|
||||
|
@ -918,7 +920,7 @@ cachestats(void)
|
|||
uint64 stacks_sys;
|
||||
|
||||
stacks_inuse = 0;
|
||||
stacks_sys = 0;
|
||||
stacks_sys = runtime_stacks_sys;
|
||||
for(m=runtime_allm; m; m=m->alllink) {
|
||||
runtime_purgecachedstats(m);
|
||||
// stacks_inuse += m->stackalloc->inuse;
|
||||
|
@ -1020,7 +1022,7 @@ runtime_gc(int32 force)
|
|||
stealcache();
|
||||
cachestats();
|
||||
|
||||
mstats.next_gc = mstats.heap_alloc+mstats.heap_alloc*gcpercent/100;
|
||||
mstats.next_gc = mstats.heap_alloc+(mstats.heap_alloc-runtime_stacks_sys)*gcpercent/100;
|
||||
m->gcing = 0;
|
||||
|
||||
m->locks++; // disable gc during the mallocs in newproc
|
||||
|
@ -1329,6 +1331,8 @@ runtime_setblockspecial(void *v, bool s)
|
|||
void
|
||||
runtime_MHeap_MapBits(MHeap *h)
|
||||
{
|
||||
size_t page_size;
|
||||
|
||||
// Caller has added extra mappings to the arena.
|
||||
// Add extra mappings of bitmap words as needed.
|
||||
// We allocate extra bitmap pieces in chunks of bitmapChunk.
|
||||
|
@ -1342,6 +1346,9 @@ runtime_MHeap_MapBits(MHeap *h)
|
|||
if(h->bitmap_mapped >= n)
|
||||
return;
|
||||
|
||||
page_size = getpagesize();
|
||||
n = (n+page_size-1) & ~(page_size-1);
|
||||
|
||||
runtime_SysMap(h->arena_start - n, n - h->bitmap_mapped);
|
||||
h->bitmap_mapped = n;
|
||||
}
|
||||
|
|
|
@ -46,6 +46,8 @@ extern void __splitstack_block_signals_context (void *context[10], int *,
|
|||
# define StackMin 2 * 1024 * 1024
|
||||
#endif
|
||||
|
||||
uintptr runtime_stacks_sys;
|
||||
|
||||
static void schedule(G*);
|
||||
|
||||
typedef struct Sched Sched;
|
||||
|
@ -1091,6 +1093,7 @@ schedule(G *gp)
|
|||
m->lockedg = nil;
|
||||
}
|
||||
gp->idlem = nil;
|
||||
runtime_memclr(&gp->context, sizeof gp->context);
|
||||
gfput(gp);
|
||||
if(--runtime_sched.gcount == 0)
|
||||
runtime_exit(0);
|
||||
|
@ -1288,6 +1291,7 @@ runtime_malg(int32 stacksize, byte** ret_stack, size_t* ret_stacksize)
|
|||
*ret_stacksize = stacksize;
|
||||
newg->gcinitial_sp = *ret_stack;
|
||||
newg->gcstack_size = stacksize;
|
||||
runtime_xadd(&runtime_stacks_sys, stacksize);
|
||||
#endif
|
||||
}
|
||||
return newg;
|
||||
|
|
|
@ -463,3 +463,8 @@ struct root_list {
|
|||
};
|
||||
|
||||
void __go_register_gc_roots(struct root_list*);
|
||||
|
||||
// Size of stack space allocated using Go's allocator.
|
||||
// This will be 0 when using split stacks, as in that case
|
||||
// the stacks are allocated by the splitstack library.
|
||||
extern uintptr runtime_stacks_sys;
|
||||
|
|
Loading…
Reference in New Issue