]> Cypherpunks repositories - gostls13.git/commitdiff
runtime: run getgcmask on the M stack.
authorKeith Randall <khr@golang.org>
Fri, 5 Sep 2014 21:59:31 +0000 (14:59 -0700)
committerKeith Randall <khr@golang.org>
Fri, 5 Sep 2014 21:59:31 +0000 (14:59 -0700)
LGTM=rsc
R=rsc, khr
CC=golang-codereviews
https://golang.org/cl/132660043

src/pkg/runtime/export_test.go
src/pkg/runtime/mgc0.c
src/pkg/runtime/stubs.goc

index 35a4130ee160c138590f483a4c5e40fc0d38bfc2..fd7fd182fcf45d3fcc877c53576835f0895c5682 100644 (file)
@@ -111,8 +111,19 @@ func ParForIters(desc *ParFor, tid uint32) (uint32, uint32) {
        return begin, end
 }
 
+// in mgc0.c
 //go:noescape
-func GCMask(x interface{}) []byte
+func getgcmask(data unsafe.Pointer, typ *_type, array **byte, len *uint)
+
+func GCMask(x interface{}) (ret []byte) {
+       e := (*eface)(unsafe.Pointer(&x))
+       s := (*slice)(unsafe.Pointer(&ret))
+       onM(func() {
+               getgcmask(e.data, e._type, &s.array, &s.len)
+               s.cap = s.len
+       })
+       return
+}
 
 func testSchedLocalQueue()
 func testSchedLocalQueueSteal()
index 55c38a7e5bf588ddef97393b5e6e7946ca2739f9..d4c414736be332b45293b97d61038b428fe788e5 100644 (file)
@@ -1805,7 +1805,7 @@ getgcmaskcb(Stkframe *frame, void *ctxt)
        Stkframe *frame0;
 
        frame0 = ctxt;
-       if(frame0->sp >= frame->varp - frame->sp && frame0->sp < frame->varp) {
+       if(frame->sp <= frame0->sp && frame0->sp < frame->varp) {
                *frame0 = *frame;
                return false;
        }
@@ -1865,7 +1865,7 @@ runtime·getgcmask(byte *p, Type *t, byte **mask, uintptr *len)
        frame.fn = nil;
        frame.sp = (uintptr)p;
        cb = getgcmaskcb;
-       runtime·gentraceback((uintptr)runtime·getcallerpc(&p), (uintptr)runtime·getcallersp(&p), 0, g, 0, nil, 1000, &cb, &frame, false);
+       runtime·gentraceback(g->m->curg->sched.pc, g->m->curg->sched.sp, 0, g->m->curg, 0, nil, 1000, &cb, &frame, false);
        if(frame.fn != nil) {
                Func *f;
                StackMap *stackmap;
index f6bc14f2c94908811507f9b7045b88bc1ab998ef..34cd1b3bb9633d89217d60bf9af87abc6dcb6ad4 100644 (file)
@@ -54,13 +54,6 @@ func runtime·gomcache() (ret *MCache) {
        ret = g->m->mcache;
 }
 
-// For testing.
-// TODO: find a better place for this.
-func GCMask(x Eface) (mask Slice) {
-       runtime·getgcmask(x.data, x.type, &mask.array, &mask.len);
-       mask.cap = mask.len;
-}
-
 #pragma textflag NOSPLIT
 func reflect·typelinks() (ret Slice) {
         extern Type *runtime·typelink[], *runtime·etypelink[];