mirror of
https://github.com/golang/go
synced 2024-11-22 08:44:41 -07:00
new (more fifo) schedulint algorithm
newproc will reuse dead procs SVN=127565
This commit is contained in:
parent
44b8934d35
commit
e7d549fbd7
@ -35,8 +35,24 @@ sys·newproc(int32 siz, byte* fn, byte* arg0)
|
||||
sys·panicl(123);
|
||||
}
|
||||
|
||||
newg = mal(sizeof(G));
|
||||
stk = mal(4096);
|
||||
// try to rip off an old goroutine
|
||||
for(newg=allg; newg!=nil; newg=newg->alllink)
|
||||
if(newg->status == Gdead)
|
||||
break;
|
||||
|
||||
if(newg == nil) {
|
||||
newg = mal(sizeof(G));
|
||||
stk = mal(4096);
|
||||
newg->stack0 = stk;
|
||||
|
||||
newg->status = Gwaiting;
|
||||
newg->alllink = allg;
|
||||
allg = newg;
|
||||
} else {
|
||||
stk = newg->stack0;
|
||||
newg->status = Gwaiting;
|
||||
}
|
||||
|
||||
newg->stackguard = stk+160;
|
||||
|
||||
sp = stk + 4096 - 4*8;
|
||||
@ -56,8 +72,6 @@ sys·newproc(int32 siz, byte* fn, byte* arg0)
|
||||
newg->goid = goidgen;
|
||||
|
||||
newg->status = Grunnable;
|
||||
newg->alllink = allg;
|
||||
allg = newg;
|
||||
|
||||
//prints(" goid=");
|
||||
//sys·printint(newg->goid);
|
||||
@ -67,18 +81,25 @@ sys·newproc(int32 siz, byte* fn, byte* arg0)
|
||||
G*
|
||||
select(void)
|
||||
{
|
||||
G *gp, *bestg;
|
||||
G *gp;
|
||||
|
||||
bestg = nil;
|
||||
for(gp=allg; gp!=nil; gp=gp->alllink) {
|
||||
if(gp->status != Grunnable)
|
||||
continue;
|
||||
if(bestg == nil || gp->pri < bestg->pri)
|
||||
bestg = gp;
|
||||
gp = m->lastg;
|
||||
if(gp == nil)
|
||||
gp = allg;
|
||||
|
||||
for(gp=gp->alllink; gp!=nil; gp=gp->alllink) {
|
||||
if(gp->status == Grunnable) {
|
||||
m->lastg = gp;
|
||||
return gp;
|
||||
}
|
||||
}
|
||||
if(bestg != nil)
|
||||
bestg->pri++;
|
||||
return bestg;
|
||||
for(gp=allg; gp!=nil; gp=gp->alllink) {
|
||||
if(gp->status == Grunnable) {
|
||||
m->lastg = gp;
|
||||
return gp;
|
||||
}
|
||||
}
|
||||
return nil;
|
||||
}
|
||||
|
||||
void
|
||||
|
@ -105,11 +105,11 @@ struct G
|
||||
{
|
||||
byte* stackguard; // must not move
|
||||
byte* stackbase; // must not move
|
||||
byte* stack0; // first stack segment
|
||||
Gobuf sched;
|
||||
G* alllink; // on allq
|
||||
G* qlink; // on wait q
|
||||
int32 status;
|
||||
int32 pri;
|
||||
int32 goid;
|
||||
byte elem[8]; // transfer element for chan
|
||||
};
|
||||
@ -117,8 +117,9 @@ struct M
|
||||
{
|
||||
G* g0; // g0 w interrupt stack - must not move
|
||||
uint64 morearg; // arg to morestack - must not move
|
||||
uint64 cret; // return value from C - must not move
|
||||
uint64 cret; // return value from C - must not move
|
||||
G* curg; // current running goroutine
|
||||
G* lastg; // last running goroutine - to emulate fifo
|
||||
Gobuf sched;
|
||||
Gobuf morestack;
|
||||
byte* moresp;
|
||||
|
Loading…
Reference in New Issue
Block a user