status-go/vendor/github.com/anacrolix/utp/deadlines.go

72 lines
1.1 KiB
Go

package utp
import (
"time"
"github.com/anacrolix/missinggo"
)
type deadline struct {
t time.Time
passed missinggo.Event
timer *time.Timer
}
func (me *deadline) set(t time.Time) {
me.t = t
me.passed.Clear()
if me.timer != nil {
me.timer.Stop()
}
me.update()
}
func (me *deadline) update() {
if me.t.IsZero() {
return
}
if time.Now().Before(me.t) {
if me.timer == nil {
me.timer = time.AfterFunc(me.t.Sub(time.Now()), me.callback)
} else {
me.timer.Reset(me.t.Sub(time.Now()))
}
return
}
me.passed.Set()
}
func (me *deadline) callback() {
mu.Lock()
defer mu.Unlock()
me.update()
}
// This is embedded in Conn and Socket to provide deadline methods for
// net.Conn.
type connDeadlines struct {
read, write deadline
}
func (c *connDeadlines) SetDeadline(t time.Time) error {
mu.Lock()
defer mu.Unlock()
c.read.set(t)
c.write.set(t)
return nil
}
func (c *connDeadlines) SetReadDeadline(t time.Time) error {
mu.Lock()
defer mu.Unlock()
c.read.set(t)
return nil
}
func (c *connDeadlines) SetWriteDeadline(t time.Time) error {
mu.Lock()
defer mu.Unlock()
c.write.set(t)
return nil
}