Eliminate call to uname on FreeBSD

Improve performance by eliminating the fork out to uname on FreeBSD which also helps prevent crashes / hangs due to the outstanding fork crash bug:
golang/go#15658

Also added a test for PlatformInformation.
This commit is contained in:
Steven Hartland 2018-03-11 23:08:04 +00:00
parent 5776ff9c7c
commit f846eda923
2 changed files with 17 additions and 14 deletions

View File

@ -8,7 +8,6 @@ import (
"encoding/binary"
"io/ioutil"
"os"
"os/exec"
"runtime"
"strings"
"sync/atomic"
@ -168,25 +167,17 @@ func PlatformInformation() (string, string, string, error) {
}
func PlatformInformationWithContext(ctx context.Context) (string, string, string, error) {
platform := ""
family := ""
version := ""
uname, err := exec.LookPath("uname")
platform, err := unix.Sysctl("kern.ostype")
if err != nil {
return "", "", "", err
}
out, err := invoke.Command(uname, "-s")
if err == nil {
platform = strings.ToLower(strings.TrimSpace(string(out)))
version, err := unix.Sysctl("kern.osrelease")
if err != nil {
return "", "", "", err
}
out, err = invoke.Command(uname, "-r")
if err == nil {
version = strings.ToLower(strings.TrimSpace(string(out)))
}
return platform, family, version, nil
return strings.ToLower(platform), "", strings.ToLower(version), nil
}
func Virtualization() (string, string, error) {

View File

@ -148,3 +148,15 @@ func TestKernelVersion(t *testing.T) {
t.Logf("KernelVersion(): %s", version)
}
func TestPlatformInformation(t *testing.T) {
platform, family, version, err := PlatformInformation()
if err != nil {
t.Errorf("PlatformInformation() failed, %v", err)
}
if platform == "" {
t.Errorf("PlatformInformation() retuns empty: %v", platform)
}
t.Logf("PlatformInformation(): %v, %v, %v", platform, family, version)
}