This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
libgo patch committed: Support NumCPU on more platforms
- From: Ian Lance Taylor <iant at google dot com>
- To: gcc-patches at gcc dot gnu dot org
- Date: Mon, 06 Aug 2012 21:43:17 -0700
- Subject: libgo patch committed: Support NumCPU on more platforms
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