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
> 




Reply via email to