OSDN Git Service

runtime: Ignore stack sizes when deciding when to GC.
authorian <ian@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 20 Apr 2012 04:58:41 +0000 (04:58 +0000)
committerian <ian@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 20 Apr 2012 04:58:41 +0000 (04:58 +0000)
Also allocate heap bitmaps bit in page size units and clear
context when putting G structures on free list.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/branches/gcc-4_7-branch@186608 138bc75d-0d04-0410-961f-82ee72b054a4

libgo/runtime/malloc.goc
libgo/runtime/mgc0.c
libgo/runtime/proc.c
libgo/runtime/runtime.h

index 97cfabe..253fdbe 100644 (file)
@@ -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;
index 4aa7c45..7e68535 100644 (file)
@@ -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;
 }
index 9ad9f96..660c69f 100644 (file)
@@ -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;
index a81c210..d379f99 100644 (file)
@@ -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;