This patch to libgo, from Shenghou Ma, adds support for NumCPU on additional platforms: Solaris, Irix, *BSD, Darwin. Bootstrapped and ran Go testsuite on x86_64-unknown-linux-gnu. Committed to mainline.
Ian
diff -r 12a361bc53d0 libgo/Makefile.am --- a/libgo/Makefile.am Mon Aug 06 21:39:47 2012 -0700 +++ b/libgo/Makefile.am Mon Aug 06 21:40:21 2012 -0700 @@ -390,6 +390,32 @@ runtime_lock_files = runtime/lock_sema.c runtime/thread-sema.c endif +if LIBGO_IS_LINUX +runtime_getncpu_file = runtime/getncpu-linux.c +else +if LIBGO_IS_DARWIN +runtime_getncpu_file = runtime/getncpu-bsd.c +else +if LIBGO_IS_IRIX +runtime_getncpu_file = runtime/getncpu-irix.c +else +if LIBGO_IS_SOLARIS +runtime_getncpu_file = runtime/getncpu-solaris.c +else +if LIBGO_IS_FREEBSD +runtime_getncpu_file = runtime/getncpu-bsd.c +else +if LIBGO_IS_NETBSD +runtime_getncpu_file = runtime/getncpu-bsd.c +else +runtime_getncpu_file = runtime/getncpu-none.c +endif +endif +endif +endif +endif +endif + runtime_files = \ runtime/go-append.c \ runtime/go-assert.c \ @@ -481,7 +507,8 @@ sema.c \ sigqueue.c \ string.c \ - time.c + time.c \ + $(runtime_getncpu_file) goc2c.$(OBJEXT): runtime/goc2c.c $(CC_FOR_BUILD) -c $(CFLAGS_FOR_BUILD) $< diff -r 12a361bc53d0 libgo/runtime/getncpu-bsd.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libgo/runtime/getncpu-bsd.c Mon Aug 06 21:40:21 2012 -0700 @@ -0,0 +1,24 @@ +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +#include <sys/types.h> +#include <sys/sysctl.h> + +#include "runtime.h" +#include "defs.h" + +int32 +getproccount(void) +{ + int mib[2], out; + size_t len; + + mib[0] = CTL_HW; + mib[1] = HW_NCPU; + len = sizeof(out); + if(sysctl(mib, 2, &out, &len, NULL, 0) >= 0) + return (int32)out; + else + return 0; +} diff -r 12a361bc53d0 libgo/runtime/getncpu-irix.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libgo/runtime/getncpu-irix.c Mon Aug 06 21:40:21 2012 -0700 @@ -0,0 +1,16 @@ +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +#include <unistd.h> + +#include "runtime.h" +#include "defs.h" + +int32 +getproccount(void) +{ + int32 n; + n = (int32)sysconf(_SC_NPROC_ONLN); + return n > 1 ? n : 1; +} diff -r 12a361bc53d0 libgo/runtime/getncpu-linux.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libgo/runtime/getncpu-linux.c Mon Aug 06 21:40:21 2012 -0700 @@ -0,0 +1,47 @@ +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +#include <string.h> +#include <sys/types.h> +#include <fcntl.h> +#include <unistd.h> + +#include "runtime.h" +#include "defs.h" + +#ifndef O_CLOEXEC +#define O_CLOEXEC 0 +#endif + +int32 +getproccount(void) +{ + int32 fd, rd, cnt, cpustrlen; + const char *cpustr; + const byte *pos; + byte *bufpos; + byte buf[256]; + + fd = open("/proc/stat", O_RDONLY|O_CLOEXEC, 0); + if(fd == -1) + return 1; + cnt = 0; + bufpos = buf; + cpustr = "\ncpu"; + cpustrlen = strlen(cpustr); + for(;;) { + rd = read(fd, bufpos, sizeof(buf)-cpustrlen); + if(rd == -1) + break; + bufpos[rd] = 0; + for(pos=buf; (pos=(const byte*)strstr((const char*)pos, cpustr)) != nil; cnt++, pos++) { + } + if(rd < cpustrlen) + break; + memmove(buf, bufpos+rd-cpustrlen+1, cpustrlen-1); + bufpos = buf+cpustrlen-1; + } + close(fd); + return cnt ? cnt : 1; +} diff -r 12a361bc53d0 libgo/runtime/getncpu-none.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libgo/runtime/getncpu-none.c Mon Aug 06 21:40:21 2012 -0700 @@ -0,0 +1,12 @@ +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +#include "runtime.h" +#include "defs.h" + +int32 +getproccount(void) +{ + return 0; +} diff -r 12a361bc53d0 libgo/runtime/getncpu-solaris.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libgo/runtime/getncpu-solaris.c Mon Aug 06 21:40:21 2012 -0700 @@ -0,0 +1,16 @@ +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +#include <unistd.h> + +#include "runtime.h" +#include "defs.h" + +int32 +getproccount(void) +{ + int32 n; + n = (int32)sysconf(_SC_NPROCESSORS_ONLN); + return n > 1 ? n : 1; +} diff -r 12a361bc53d0 libgo/runtime/runtime.h --- a/libgo/runtime/runtime.h Mon Aug 06 21:39:47 2012 -0700 +++ b/libgo/runtime/runtime.h Mon Aug 06 21:40:21 2012 -0700 @@ -518,3 +518,5 @@ extern uintptr runtime_stacks_sys; extern _Bool __go_file_line (uintptr, String*, String*, int *); + +int32 getproccount(void); diff -r 12a361bc53d0 libgo/runtime/thread-linux.c --- a/libgo/runtime/thread-linux.c Mon Aug 06 21:39:47 2012 -0700 +++ b/libgo/runtime/thread-linux.c Mon Aug 06 21:40:21 2012 -0700 @@ -72,42 +72,6 @@ *(int32*)0x1006 = 0x1006; } -#ifndef O_CLOEXEC -#define O_CLOEXEC 0 -#endif - -static int32 -getproccount(void) -{ - int32 fd, rd, cnt, cpustrlen; - const char *cpustr; - const byte *pos; - byte *bufpos; - byte buf[256]; - - fd = open("/proc/stat", O_RDONLY|O_CLOEXEC, 0); - if(fd == -1) - return 1; - cnt = 0; - bufpos = buf; - cpustr = "\ncpu"; - cpustrlen = strlen(cpustr); - for(;;) { - rd = read(fd, bufpos, sizeof(buf)-cpustrlen); - if(rd == -1) - break; - bufpos[rd] = 0; - for(pos=buf; (pos=(const byte*)strstr((const char*)pos, cpustr)) != nil; cnt++, pos++) { - } - if(rd < cpustrlen) - break; - memmove(buf, bufpos+rd-cpustrlen+1, cpustrlen-1); - bufpos = buf+cpustrlen-1; - } - close(fd); - return cnt ? cnt : 1; -} - void runtime_osinit(void) { diff -r 12a361bc53d0 libgo/runtime/thread-sema.c --- a/libgo/runtime/thread-sema.c Mon Aug 06 21:39:47 2012 -0700 +++ b/libgo/runtime/thread-sema.c Mon Aug 06 21:40:21 2012 -0700 @@ -138,6 +138,7 @@ void runtime_osinit (void) { + runtime_ncpu = getproccount(); } void