mirror of
https://github.com/netbirdio/gvisor.git
synced 2026-05-22 17:12:49 -07:00
Plumb monotonic time to netstack
Netstack needs to be portable, so this seems to be preferable to using raw system calls. PiperOrigin-RevId: 212917409 Change-Id: I7b2073e7db4b4bf75300717ca23aea4c15be944c
This commit is contained in:
@@ -943,6 +943,8 @@ func (k *Kernel) SetExitError(err error) {
|
||||
}
|
||||
}
|
||||
|
||||
var _ tcpip.Clock = (*Kernel)(nil)
|
||||
|
||||
// NowNanoseconds implements tcpip.Clock.NowNanoseconds.
|
||||
func (k *Kernel) NowNanoseconds() int64 {
|
||||
now, err := k.timekeeper.GetTime(sentrytime.Realtime)
|
||||
@@ -952,6 +954,15 @@ func (k *Kernel) NowNanoseconds() int64 {
|
||||
return now
|
||||
}
|
||||
|
||||
// NowMonotonic implements tcpip.Clock.NowMonotonic.
|
||||
func (k *Kernel) NowMonotonic() int64 {
|
||||
now, err := k.timekeeper.GetTime(sentrytime.Monotonic)
|
||||
if err != nil {
|
||||
panic("Kernel.NowMonotonic: " + err.Error())
|
||||
}
|
||||
return now
|
||||
}
|
||||
|
||||
// SupervisorContext returns a Context with maximum privileges in k. It should
|
||||
// only be used by goroutines outside the control of the emulated kernel
|
||||
// defined by e.
|
||||
|
||||
+4
-1
@@ -4,7 +4,10 @@ load("//tools/go_stateify:defs.bzl", "go_library", "go_test")
|
||||
|
||||
go_library(
|
||||
name = "tcpip",
|
||||
srcs = ["tcpip.go"],
|
||||
srcs = [
|
||||
"tcpip.go",
|
||||
"time_unsafe.go",
|
||||
],
|
||||
importpath = "gvisor.googlesource.com/gvisor/pkg/tcpip",
|
||||
visibility = ["//visibility:public"],
|
||||
deps = [
|
||||
|
||||
+3
-8
@@ -123,16 +123,11 @@ func (e ErrSaveRejection) Error() string {
|
||||
// time, but never for netstack internal timekeeping.
|
||||
type Clock interface {
|
||||
// NowNanoseconds returns the current real time as a number of
|
||||
// nanoseconds since some epoch.
|
||||
// nanoseconds since the Unix epoch.
|
||||
NowNanoseconds() int64
|
||||
}
|
||||
|
||||
// StdClock implements Clock with the time package.
|
||||
type StdClock struct{}
|
||||
|
||||
// NowNanoseconds implements Clock.NowNanoseconds.
|
||||
func (*StdClock) NowNanoseconds() int64 {
|
||||
return time.Now().UnixNano()
|
||||
// NowMonotonic returns a monotonic time value.
|
||||
NowMonotonic() int64
|
||||
}
|
||||
|
||||
// Address is a byte slice cast as a string that represents the address of a
|
||||
|
||||
@@ -0,0 +1,43 @@
|
||||
// Copyright 2018 Google Inc.
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
|
||||
// +build go1.9
|
||||
// +build !go1.12
|
||||
|
||||
package tcpip
|
||||
|
||||
import (
|
||||
_ "time" // Used with go:linkname.
|
||||
_ "unsafe" // Required for go:linkname.
|
||||
)
|
||||
|
||||
// StdClock implements Clock with the time package.
|
||||
type StdClock struct{}
|
||||
|
||||
var _ Clock = (*StdClock)(nil)
|
||||
|
||||
//go:linkname now time.now
|
||||
func now() (sec int64, nsec int32, mono int64)
|
||||
|
||||
// NowNanoseconds implements Clock.NowNanoseconds.
|
||||
func (*StdClock) NowNanoseconds() int64 {
|
||||
sec, nsec, _ := now()
|
||||
return sec*1e9 + int64(nsec)
|
||||
}
|
||||
|
||||
// NowMonotonic implements Clock.NowMonotonic.
|
||||
func (*StdClock) NowMonotonic() int64 {
|
||||
_, _, mono := now()
|
||||
return mono
|
||||
}
|
||||
Reference in New Issue
Block a user