2010-12-08 14:10:00 -05:00
|
|
|
// Copyright 2009 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 <pthread.h>
|
2011-11-09 23:11:48 +03:00
|
|
|
#include <string.h> // strerror
|
2012-03-14 13:07:25 +09:00
|
|
|
#include <signal.h>
|
2010-12-08 14:10:00 -05:00
|
|
|
#include "libcgo.h"
|
|
|
|
|
|
|
|
|
|
static void* threadentry(void*);
|
all: remove 'extern register M *m' from runtime
The runtime has historically held two dedicated values g (current goroutine)
and m (current thread) in 'extern register' slots (TLS on x86, real registers
backed by TLS on ARM).
This CL removes the extern register m; code now uses g->m.
On ARM, this frees up the register that formerly held m (R9).
This is important for NaCl, because NaCl ARM code cannot use R9 at all.
The Go 1 macrobenchmarks (those with per-op times >= 10 µs) are unaffected:
BenchmarkBinaryTree17 5491374955 5471024381 -0.37%
BenchmarkFannkuch11 4357101311 4275174828 -1.88%
BenchmarkGobDecode 11029957 11364184 +3.03%
BenchmarkGobEncode 6852205 6784822 -0.98%
BenchmarkGzip 650795967 650152275 -0.10%
BenchmarkGunzip 140962363 141041670 +0.06%
BenchmarkHTTPClientServer 71581 73081 +2.10%
BenchmarkJSONEncode 31928079 31913356 -0.05%
BenchmarkJSONDecode 117470065 113689916 -3.22%
BenchmarkMandelbrot200 6008923 5998712 -0.17%
BenchmarkGoParse 6310917 6327487 +0.26%
BenchmarkRegexpMatchMedium_1K 114568 114763 +0.17%
BenchmarkRegexpMatchHard_1K 168977 169244 +0.16%
BenchmarkRevcomp 935294971 914060918 -2.27%
BenchmarkTemplate 145917123 148186096 +1.55%
Minux previous reported larger variations, but these were caused by
run-to-run noise, not repeatable slowdowns.
Actual code changes by Minux.
I only did the docs and the benchmarking.
LGTM=dvyukov, iant, minux
R=minux, josharian, iant, dave, bradfitz, dvyukov
CC=golang-codereviews
https://golang.org/cl/109050043
2014-06-26 11:54:39 -04:00
|
|
|
static void (*setg_gcc)(void*);
|
2010-12-08 14:10:00 -05:00
|
|
|
|
|
|
|
|
void
|
all: remove 'extern register M *m' from runtime
The runtime has historically held two dedicated values g (current goroutine)
and m (current thread) in 'extern register' slots (TLS on x86, real registers
backed by TLS on ARM).
This CL removes the extern register m; code now uses g->m.
On ARM, this frees up the register that formerly held m (R9).
This is important for NaCl, because NaCl ARM code cannot use R9 at all.
The Go 1 macrobenchmarks (those with per-op times >= 10 µs) are unaffected:
BenchmarkBinaryTree17 5491374955 5471024381 -0.37%
BenchmarkFannkuch11 4357101311 4275174828 -1.88%
BenchmarkGobDecode 11029957 11364184 +3.03%
BenchmarkGobEncode 6852205 6784822 -0.98%
BenchmarkGzip 650795967 650152275 -0.10%
BenchmarkGunzip 140962363 141041670 +0.06%
BenchmarkHTTPClientServer 71581 73081 +2.10%
BenchmarkJSONEncode 31928079 31913356 -0.05%
BenchmarkJSONDecode 117470065 113689916 -3.22%
BenchmarkMandelbrot200 6008923 5998712 -0.17%
BenchmarkGoParse 6310917 6327487 +0.26%
BenchmarkRegexpMatchMedium_1K 114568 114763 +0.17%
BenchmarkRegexpMatchHard_1K 168977 169244 +0.16%
BenchmarkRevcomp 935294971 914060918 -2.27%
BenchmarkTemplate 145917123 148186096 +1.55%
Minux previous reported larger variations, but these were caused by
run-to-run noise, not repeatable slowdowns.
Actual code changes by Minux.
I only did the docs and the benchmarking.
LGTM=dvyukov, iant, minux
R=minux, josharian, iant, dave, bradfitz, dvyukov
CC=golang-codereviews
https://golang.org/cl/109050043
2014-06-26 11:54:39 -04:00
|
|
|
x_cgo_init(G* g, void (*setg)(void*))
|
2010-12-08 14:10:00 -05:00
|
|
|
{
|
2011-11-09 23:11:48 +03:00
|
|
|
pthread_attr_t attr;
|
|
|
|
|
size_t size;
|
|
|
|
|
|
all: remove 'extern register M *m' from runtime
The runtime has historically held two dedicated values g (current goroutine)
and m (current thread) in 'extern register' slots (TLS on x86, real registers
backed by TLS on ARM).
This CL removes the extern register m; code now uses g->m.
On ARM, this frees up the register that formerly held m (R9).
This is important for NaCl, because NaCl ARM code cannot use R9 at all.
The Go 1 macrobenchmarks (those with per-op times >= 10 µs) are unaffected:
BenchmarkBinaryTree17 5491374955 5471024381 -0.37%
BenchmarkFannkuch11 4357101311 4275174828 -1.88%
BenchmarkGobDecode 11029957 11364184 +3.03%
BenchmarkGobEncode 6852205 6784822 -0.98%
BenchmarkGzip 650795967 650152275 -0.10%
BenchmarkGunzip 140962363 141041670 +0.06%
BenchmarkHTTPClientServer 71581 73081 +2.10%
BenchmarkJSONEncode 31928079 31913356 -0.05%
BenchmarkJSONDecode 117470065 113689916 -3.22%
BenchmarkMandelbrot200 6008923 5998712 -0.17%
BenchmarkGoParse 6310917 6327487 +0.26%
BenchmarkRegexpMatchMedium_1K 114568 114763 +0.17%
BenchmarkRegexpMatchHard_1K 168977 169244 +0.16%
BenchmarkRevcomp 935294971 914060918 -2.27%
BenchmarkTemplate 145917123 148186096 +1.55%
Minux previous reported larger variations, but these were caused by
run-to-run noise, not repeatable slowdowns.
Actual code changes by Minux.
I only did the docs and the benchmarking.
LGTM=dvyukov, iant, minux
R=minux, josharian, iant, dave, bradfitz, dvyukov
CC=golang-codereviews
https://golang.org/cl/109050043
2014-06-26 11:54:39 -04:00
|
|
|
setg_gcc = setg;
|
2011-11-09 23:11:48 +03:00
|
|
|
pthread_attr_init(&attr);
|
|
|
|
|
pthread_attr_getstacksize(&attr, &size);
|
|
|
|
|
g->stackguard = (uintptr)&attr - size + 4096;
|
|
|
|
|
pthread_attr_destroy(&attr);
|
2010-12-08 14:10:00 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void
|
2013-02-28 16:24:38 -05:00
|
|
|
_cgo_sys_thread_start(ThreadStart *ts)
|
2010-12-08 14:10:00 -05:00
|
|
|
{
|
|
|
|
|
pthread_attr_t attr;
|
2012-03-14 13:07:25 +09:00
|
|
|
sigset_t ign, oset;
|
2010-12-08 14:10:00 -05:00
|
|
|
pthread_t p;
|
|
|
|
|
size_t size;
|
2011-06-28 12:04:50 -04:00
|
|
|
int err;
|
2010-12-08 14:10:00 -05:00
|
|
|
|
2012-03-14 13:07:25 +09:00
|
|
|
sigfillset(&ign);
|
2013-12-22 08:55:29 -08:00
|
|
|
pthread_sigmask(SIG_SETMASK, &ign, &oset);
|
2012-03-14 13:07:25 +09:00
|
|
|
|
2010-12-08 14:10:00 -05:00
|
|
|
pthread_attr_init(&attr);
|
|
|
|
|
pthread_attr_getstacksize(&attr, &size);
|
|
|
|
|
ts->g->stackguard = size;
|
2011-06-28 12:04:50 -04:00
|
|
|
err = pthread_create(&p, &attr, threadentry, ts);
|
2012-03-14 13:07:25 +09:00
|
|
|
|
2013-12-22 08:55:29 -08:00
|
|
|
pthread_sigmask(SIG_SETMASK, &oset, nil);
|
2012-03-14 13:07:25 +09:00
|
|
|
|
2011-06-28 12:04:50 -04:00
|
|
|
if (err != 0) {
|
2014-07-03 21:04:48 -04:00
|
|
|
fatalf("pthread_create failed: %s", strerror(err));
|
2011-06-28 12:04:50 -04:00
|
|
|
}
|
2010-12-08 14:10:00 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static void*
|
|
|
|
|
threadentry(void *v)
|
|
|
|
|
{
|
|
|
|
|
ThreadStart ts;
|
|
|
|
|
|
|
|
|
|
ts = *(ThreadStart*)v;
|
|
|
|
|
free(v);
|
|
|
|
|
|
|
|
|
|
ts.g->stackbase = (uintptr)&ts;
|
|
|
|
|
|
|
|
|
|
/*
|
2013-02-28 16:24:38 -05:00
|
|
|
* _cgo_sys_thread_start set stackguard to stack size;
|
2010-12-08 14:10:00 -05:00
|
|
|
* change to actual guard pointer.
|
|
|
|
|
*/
|
|
|
|
|
ts.g->stackguard = (uintptr)&ts - ts.g->stackguard + 4096;
|
|
|
|
|
|
|
|
|
|
/*
|
2013-03-25 18:14:02 -04:00
|
|
|
* Set specific keys.
|
2010-12-08 14:10:00 -05:00
|
|
|
*/
|
all: remove 'extern register M *m' from runtime
The runtime has historically held two dedicated values g (current goroutine)
and m (current thread) in 'extern register' slots (TLS on x86, real registers
backed by TLS on ARM).
This CL removes the extern register m; code now uses g->m.
On ARM, this frees up the register that formerly held m (R9).
This is important for NaCl, because NaCl ARM code cannot use R9 at all.
The Go 1 macrobenchmarks (those with per-op times >= 10 µs) are unaffected:
BenchmarkBinaryTree17 5491374955 5471024381 -0.37%
BenchmarkFannkuch11 4357101311 4275174828 -1.88%
BenchmarkGobDecode 11029957 11364184 +3.03%
BenchmarkGobEncode 6852205 6784822 -0.98%
BenchmarkGzip 650795967 650152275 -0.10%
BenchmarkGunzip 140962363 141041670 +0.06%
BenchmarkHTTPClientServer 71581 73081 +2.10%
BenchmarkJSONEncode 31928079 31913356 -0.05%
BenchmarkJSONDecode 117470065 113689916 -3.22%
BenchmarkMandelbrot200 6008923 5998712 -0.17%
BenchmarkGoParse 6310917 6327487 +0.26%
BenchmarkRegexpMatchMedium_1K 114568 114763 +0.17%
BenchmarkRegexpMatchHard_1K 168977 169244 +0.16%
BenchmarkRevcomp 935294971 914060918 -2.27%
BenchmarkTemplate 145917123 148186096 +1.55%
Minux previous reported larger variations, but these were caused by
run-to-run noise, not repeatable slowdowns.
Actual code changes by Minux.
I only did the docs and the benchmarking.
LGTM=dvyukov, iant, minux
R=minux, josharian, iant, dave, bradfitz, dvyukov
CC=golang-codereviews
https://golang.org/cl/109050043
2014-06-26 11:54:39 -04:00
|
|
|
setg_gcc((void*)ts.g);
|
2013-03-25 18:14:02 -04:00
|
|
|
|
2010-12-08 14:10:00 -05:00
|
|
|
crosscall_amd64(ts.fn);
|
|
|
|
|
return nil;
|
|
|
|
|
}
|