summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRob Pike <r@golang.org>2010-05-06 11:50:47 -0700
committerRob Pike <r@golang.org>2010-05-06 11:50:47 -0700
commitfd4129fbe58a1d84f7177a5a0c27ff339ea9e6e0 (patch)
treeaaefc66929abab72f23a5157d67ec319320b22e6
parent6a7fe297a79f73ddddb528a4ee541499bd2b7e8c (diff)
downloadgolang-fd4129fbe58a1d84f7177a5a0c27ff339ea9e6e0.tar.gz
runtime.GOMAXPROCS: hack it to have it return the old value.
R=rsc CC=golang-dev http://codereview.appspot.com/1140041
-rw-r--r--src/pkg/runtime/extern.go6
-rw-r--r--src/pkg/runtime/proc.c13
-rw-r--r--src/pkg/runtime/runtime.h1
-rw-r--r--src/pkg/runtime/runtime1.goc3
4 files changed, 16 insertions, 7 deletions
diff --git a/src/pkg/runtime/extern.go b/src/pkg/runtime/extern.go
index 1e284e8d7..72b43ae9b 100644
--- a/src/pkg/runtime/extern.go
+++ b/src/pkg/runtime/extern.go
@@ -106,8 +106,10 @@ func LockOSThread()
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)
+// simultaneously and returns the previous setting. If n < 1, it does not
+// change the current setting.
+// This call will go away when the scheduler improves.
+func GOMAXPROCS(n int) int
// Cgocalls returns the number of cgo calls made by the current process.
func Cgocalls() int64
diff --git a/src/pkg/runtime/proc.c b/src/pkg/runtime/proc.c
index acbb3afa1..0fef16aa6 100644
--- a/src/pkg/runtime/proc.c
+++ b/src/pkg/runtime/proc.c
@@ -1136,13 +1136,15 @@ void
}
// delete when scheduler is stronger
-void
-·GOMAXPROCS(int32 n)
+int32
+gomaxprocsfunc(int32 n)
{
- if(n < 1)
- n = 1;
+ int32 ret;
lock(&sched);
+ ret = sched.gomaxprocs;
+ if (n <= 0)
+ n = ret;
sched.gomaxprocs = n;
sched.mcpumax = n;
// handle fewer procs?
@@ -1152,11 +1154,12 @@ void
// we'll only get rescheduled once the
// number has come down.
gosched();
- return;
+ return ret;
}
// handle more procs
matchmg();
unlock(&sched);
+ return ret;
}
void
diff --git a/src/pkg/runtime/runtime.h b/src/pkg/runtime/runtime.h
index 4c9f52e85..9c08796ed 100644
--- a/src/pkg/runtime/runtime.h
+++ b/src/pkg/runtime/runtime.h
@@ -569,6 +569,7 @@ float64 modf(float64 d, float64 *ip);
void semacquire(uint32*);
void semrelease(uint32*);
String signame(int32 sig);
+int32 gomaxprocsfunc(int32 n);
void mapassign(Hmap*, byte*, byte*);
diff --git a/src/pkg/runtime/runtime1.goc b/src/pkg/runtime/runtime1.goc
index 7e5f323c1..64178e98c 100644
--- a/src/pkg/runtime/runtime1.goc
+++ b/src/pkg/runtime/runtime1.goc
@@ -9,3 +9,6 @@ func mal(n uint32) (ret *uint8) {
ret = mal(n);
}
+func GOMAXPROCS(n int32) (ret int32) {
+ ret = gomaxprocsfunc(n);
+}