This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

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

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]