diff --git a/goid.go b/goid.go new file mode 100644 index 0000000..14c9dc4 --- /dev/null +++ b/goid.go @@ -0,0 +1,7 @@ +// +build !amd64 + +package goid + +func Goid() int64 { + return goidFallback() +} \ No newline at end of file diff --git a/goid_amd64_1_9.s b/goid_amd64_1_9.s index 11d3075..7697977 100644 --- a/goid_amd64_1_9.s +++ b/goid_amd64_1_9.s @@ -1,4 +1,4 @@ -// +build go1.9 +// +build go1.9,amd64 #include "textflag.h" diff --git a/goid_fallback.go b/goid_fallback.go new file mode 100644 index 0000000..995e655 --- /dev/null +++ b/goid_fallback.go @@ -0,0 +1,15 @@ +package goid + +import ( + "bytes" + "runtime" + "strconv" +) + +func goidFallback() int64 { + buf := make([]byte, 20) + buf = buf[:runtime.Stack(buf, false)] + goidStr := string(bytes.Split(buf, []byte(" "))[1]) + result, _ := strconv.ParseInt(goidStr, 10, 64) + return result +} diff --git a/goid_test.go b/goid_test.go index aed8157..86eb85b 100644 --- a/goid_test.go +++ b/goid_test.go @@ -1,9 +1,6 @@ package goid import ( - "bytes" - "fmt" - "runtime" "sync" "testing" ) @@ -13,12 +10,10 @@ func TestGoid(t *testing.T) { wg.Add(10000) for i := 0; i < 10000; i++ { go func() { - buf := make([]byte, 20) - buf = buf[:runtime.Stack(buf, false)] - goidRuntime := string(bytes.Split(buf, []byte(" "))[1]) - goidAsm := fmt.Sprintf("%d", Goid()) - if goidRuntime != goidAsm { - t.Errorf("goid from runtime is %s, goid from asm is %s", goidRuntime, goidAsm) + goidRuntime := goidFallback() + goidAsm := Goid() + if goidAsm == 0 || goidRuntime != goidAsm { + t.Errorf("goid from runtime is %d, goid from asm is %d", goidRuntime, goidAsm) } wg.Done() }()