]> Cypherpunks repositories - gostls13.git/commitdiff
runtime: emit collection stacks in GODEBUG=allocfreetrace mode
authorRuss Cox <rsc@golang.org>
Tue, 14 Jan 2014 15:39:50 +0000 (10:39 -0500)
committerRuss Cox <rsc@golang.org>
Tue, 14 Jan 2014 15:39:50 +0000 (10:39 -0500)
R=khr, dvyukov
CC=golang-codereviews
https://golang.org/cl/51830043

src/pkg/runtime/malloc.h
src/pkg/runtime/mgc0.c
src/pkg/runtime/mprof.goc

index 66154c0db62fa58987626dc2c0277e2874588c29..9f34b55461d69b86fd17681a37bce5d8aad46081 100644 (file)
@@ -521,6 +521,7 @@ enum
 void   runtime·MProf_Malloc(void*, uintptr, uintptr);
 void   runtime·MProf_Free(Bucket*, void*, uintptr);
 void   runtime·MProf_GC(void);
+void   runtime·MProf_TraceGC(void);
 int32  runtime·gcprocs(void);
 void   runtime·helpgc(int32 nproc);
 void   runtime·gchelper(void);
index 9b7d013700399ccc17db5846feed23ffa5bab217..af4ba42a620677681a5f6e0d67ca1fed427dcf11 100644 (file)
@@ -2163,6 +2163,9 @@ runtime·gc(int32 force)
        a.start_time = runtime·nanotime();
        m->gcing = 1;
        runtime·stoptheworld();
+       
+       if(runtime·debug.allocfreetrace)
+               runtime·MProf_TraceGC();
 
        clearpools();
 
index 5523a9144693d227e03da6e63334825bfc1b63f1..51d0224250f32838e6f7aa00827642cd9a2cf61c 100644 (file)
@@ -173,6 +173,18 @@ printstackframes(uintptr *stk, int32 nstk)
        }
 }
 
+// Called by collector to report a gc in allocfreetrace mode.
+void
+runtime·MProf_TraceGC(void)
+{
+       uintptr stk[32];
+       int32 nstk;
+
+       nstk = runtime·callers(1, stk, nelem(stk));
+       runtime·printf("MProf_TraceGC\n");
+       printstackframes(stk, nstk);
+}
+
 // Called by malloc to record a profiled block.
 void
 runtime·MProf_Malloc(void *p, uintptr size, uintptr typ)
@@ -183,14 +195,14 @@ runtime·MProf_Malloc(void *p, uintptr size, uintptr typ)
        int8 *name;
        int32 nstk;
 
-       nstk = runtime·callers(1, stk, 32);
+       nstk = runtime·callers(1, stk, nelem(stk));
        runtime·lock(&proflock);
-        if(runtime·debug.allocfreetrace) {
+       if(runtime·debug.allocfreetrace) {
                type = (Type*)(typ & ~3);
                name = typeinfoname(typ & 3);
                runtime·printf("MProf_Malloc(p=%p, size=%p, type=%p <%s", p, size, type, name);
                if(type != nil)
-                       runtime·printf(" of %S", *type->string);
+                       runtime·printf(" of %S", *type->string);
                runtime·printf(">)\n");
                printstackframes(stk, nstk);
        }
@@ -247,7 +259,7 @@ runtime·blockevent(int64 cycles, int32 skip)
        if(rate <= 0 || (rate > cycles && runtime·fastrand1()%rate > cycles))
                return;
 
-       nstk = runtime·callers(skip, stk, 32);
+       nstk = runtime·callers(skip, stk, nelem(stk));
        runtime·lock(&proflock);
        b = stkbucket(BProf, stk, nstk, true);
        b->count++;