diff options
author | Josh Bleecher Snyder <josharian@gmail.com> | 2016-08-04 12:21:05 -0700 |
---|---|---|
committer | Josh Bleecher Snyder <josharian@gmail.com> | 2016-10-23 03:47:36 +0000 |
commit | 02118ad0a0cacb00c1d834b3b5e7a01d8b6327d4 (patch) | |
tree | 4fce1086c7f75fd13b8ecbacd8bfd0d7dd9d1461 | |
parent | 524c67d0d6cd8d4b96d1272ff0a705ab80ff341a (diff) | |
download | go-02118ad0a0cacb00c1d834b3b5e7a01d8b6327d4.tar.gz go-02118ad0a0cacb00c1d834b3b5e7a01d8b6327d4.zip |
syscall: fix Gettimeofday on macOS Sierra
This is a cherry-pick of https://go-review.googlesource.com/25495
to the release-branch-go1.4
Fixes #16606
Change-Id: I7b7fc8677153065ee608eb94c4c72be0b273b28d
Reviewed-on: https://go-review.googlesource.com/31751
Reviewed-by: Rob Pike <r@golang.org>
-rw-r--r-- | src/syscall/syscall_darwin_386.go | 21 | ||||
-rw-r--r-- | src/syscall/syscall_darwin_amd64.go | 21 | ||||
-rw-r--r-- | src/syscall/syscall_darwin_test.go | 23 |
3 files changed, 51 insertions, 14 deletions
diff --git a/src/syscall/syscall_darwin_386.go b/src/syscall/syscall_darwin_386.go index 2074e7ac2e..f75de000bd 100644 --- a/src/syscall/syscall_darwin_386.go +++ b/src/syscall/syscall_darwin_386.go @@ -26,14 +26,21 @@ func NsecToTimeval(nsec int64) (tv Timeval) { } //sysnb gettimeofday(tp *Timeval) (sec int32, usec int32, err error) -func Gettimeofday(tv *Timeval) (err error) { - // The tv passed to gettimeofday must be non-nil - // but is otherwise unused. The answers come back - // in the two registers. +func Gettimeofday(tv *Timeval) error { + // The tv passed to gettimeofday must be non-nil. + // Before macOS Sierra (10.12), tv was otherwise unused and + // the answers came back in the two registers. + // As of Sierra, gettimeofday return zeros and populates + // tv itself. sec, usec, err := gettimeofday(tv) - tv.Sec = int32(sec) - tv.Usec = int32(usec) - return err + if err != nil { + return err + } + if sec != 0 || usec != 0 { + tv.Sec = int32(sec) + tv.Usec = int32(usec) + } + return nil } func SetKevent(k *Kevent_t, fd, mode, flags int) { diff --git a/src/syscall/syscall_darwin_amd64.go b/src/syscall/syscall_darwin_amd64.go index 81b1fd3d2b..711d08d2ff 100644 --- a/src/syscall/syscall_darwin_amd64.go +++ b/src/syscall/syscall_darwin_amd64.go @@ -26,14 +26,21 @@ func NsecToTimeval(nsec int64) (tv Timeval) { } //sysnb gettimeofday(tp *Timeval) (sec int64, usec int32, err error) -func Gettimeofday(tv *Timeval) (err error) { - // The tv passed to gettimeofday must be non-nil - // but is otherwise unused. The answers come back - // in the two registers. +func Gettimeofday(tv *Timeval) error { + // The tv passed to gettimeofday must be non-nil. + // Before macOS Sierra (10.12), tv was otherwise unused and + // the answers came back in the two registers. + // As of Sierra, gettimeofday return zeros and populates + // tv itself. sec, usec, err := gettimeofday(tv) - tv.Sec = sec - tv.Usec = usec - return err + if err != nil { + return err + } + if sec != 0 || usec != 0 { + tv.Sec = sec + tv.Usec = usec + } + return nil } func SetKevent(k *Kevent_t, fd, mode, flags int) { diff --git a/src/syscall/syscall_darwin_test.go b/src/syscall/syscall_darwin_test.go new file mode 100644 index 0000000000..dd0e32b968 --- /dev/null +++ b/src/syscall/syscall_darwin_test.go @@ -0,0 +1,23 @@ +// Copyright 2016 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. + +// +build darwin +// +build amd64 386 + +package syscall_test + +import ( + "syscall" + "testing" +) + +func TestDarwinGettimeofday(t *testing.T) { + tv := &syscall.Timeval{} + if err := syscall.Gettimeofday(tv); err != nil { + t.Fatal(err) + } + if tv.Sec == 0 && tv.Usec == 0 { + t.Fatal("Sec and Usec both zero") + } +} |