add runtime.GOMAXPROCS, allowing a program to, in effect, set $GOMAXPROCS

R=rsc
DELTA=29  (28 added, 1 deleted, 0 changed)
OCL=32829
CL=32837
This commit is contained in:
Rob Pike 2009-08-06 13:07:05 -07:00
parent ae3939cb78
commit 7955490de2
3 changed files with 28 additions and 1 deletions

View file

@ -40,3 +40,6 @@ func LockOSThread()
// If the calling goroutine has not called LockOSThread, UnlockOSThread is a no-op.
func UnlockOSThread()
// GOMAXPROCS sets the maximum number of CPUs that can be executing
// simultaneously. This call will go away when the scheduler improves.
func GOMAXPROCS(n int)

View file

@ -807,6 +807,29 @@ runtime·LockOSThread(void)
g->lockedm = m;
}
// delete when scheduler is stronger
void
runtime·GOMAXPROCS(int32 n)
{
if(n < 1)
n = 1;
lock(&sched);
sched.gomaxprocs = n;
sched.mcpumax = n;
// handle fewer procs
while(sched.mcpu > sched.mcpumax) {
noteclear(&sched.stopped);
sched.waitstop = 1;
unlock(&sched);
notesleep(&sched.stopped);
lock(&sched);
}
// handle more procs
matchmg();
unlock(&sched);
}
void
runtime·UnlockOSThread(void)
{
@ -821,4 +844,3 @@ runtime·mid(uint32 ret)
ret = m->id;
FLUSH(&ret);
}

View file

@ -40,6 +40,7 @@ import (
"flag";
"fmt";
"math";
"runtime";
)
var n = flag.Int("n", 2000, "count")
@ -92,6 +93,7 @@ func (v Vec) ATimesTransp(u Vec) {
func main() {
flag.Parse();
runtime.GOMAXPROCS(*nCPU);
N := *n;
u := make(Vec, N);
for i := 0; i < N; i++ {