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]

Re: libgo patch committed: Support NumCPU on more platforms


On 07/08/12 05:43, Ian Lance Taylor wrote:
> 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
> 
> 

Wouldn't it be more useful on Linux to check the task's affinity
settings?  Then when a task is locked to a limited set of cores it won't
overload those cores with threads.

R.

> foo.patch
> 
> 
> 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]