1
0
mirror of https://github.com/golang/go synced 2024-11-23 13:00:07 -07:00

runtime: clean up scanning of Gs

Use a real type for Gs instead of scanning them conservatively.
Zero the schedlink pointer when it is dead.

Update #7820

LGTM=rsc
R=rsc, dvyukov
CC=golang-codereviews
https://golang.org/cl/89360043
This commit is contained in:
Keith Randall 2014-04-28 12:47:09 -04:00
parent 573cfe9561
commit 29d1b211fd
3 changed files with 22 additions and 1 deletions

View File

@ -631,6 +631,7 @@ BitVector runtime·stackmapdata(StackMap *stackmap, int32 n);
// defined in mgc0.go
void runtime·gc_m_ptr(Eface*);
void runtime·gc_g_ptr(Eface*);
void runtime·gc_itab_ptr(Eface*);
void runtime·memorydump(void);

View File

@ -9,6 +9,11 @@ func gc_m_ptr(ret *interface{}) {
*ret = (*m)(nil)
}
// Called from C. Returns the Go type *g.
func gc_g_ptr(ret *interface{}) {
*ret = (*g)(nil)
}
// Called from C. Returns the Go type *itab.
func gc_itab_ptr(ret *interface{}) {
*ret = (*itab)(nil)

View File

@ -687,6 +687,21 @@ runtime·allocm(P *p)
return mp;
}
static G*
allocg(void)
{
G *gp;
static Type *gtype;
if(gtype == nil) {
Eface e;
runtime·gc_g_ptr(&e);
gtype = ((PtrType*)e.type)->elem;
}
gp = runtime·cnew(gtype);
return gp;
}
static M* lockextra(bool nilokay);
static void unlockextra(M*);
@ -1746,7 +1761,7 @@ runtime·malg(int32 stacksize)
runtime·throw("runtime: bad stack.h");
}
newg = runtime·malloc(sizeof(G));
newg = allocg();
if(stacksize >= 0) {
stacksize = runtime·round2(StackSystem + stacksize);
if(g == m->g0) {