deadlines.go 1.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. package utp
  2. import (
  3. "time"
  4. "github.com/anacrolix/missinggo"
  5. )
  6. type deadline struct {
  7. t time.Time
  8. passed missinggo.Event
  9. timer *time.Timer
  10. }
  11. func (me *deadline) set(t time.Time) {
  12. me.t = t
  13. me.passed.Clear()
  14. if me.timer != nil {
  15. me.timer.Stop()
  16. }
  17. me.update()
  18. }
  19. func (me *deadline) update() {
  20. if me.t.IsZero() {
  21. return
  22. }
  23. if time.Now().Before(me.t) {
  24. if me.timer == nil {
  25. me.timer = time.AfterFunc(me.t.Sub(time.Now()), me.callback)
  26. } else {
  27. me.timer.Reset(me.t.Sub(time.Now()))
  28. }
  29. return
  30. }
  31. me.passed.Set()
  32. }
  33. func (me *deadline) callback() {
  34. mu.Lock()
  35. defer mu.Unlock()
  36. me.update()
  37. }
  38. // This is embedded in Conn and Socket to provide deadline methods for
  39. // net.Conn.
  40. type connDeadlines struct {
  41. read, write deadline
  42. }
  43. func (c *connDeadlines) SetDeadline(t time.Time) error {
  44. mu.Lock()
  45. defer mu.Unlock()
  46. c.read.set(t)
  47. c.write.set(t)
  48. return nil
  49. }
  50. func (c *connDeadlines) SetReadDeadline(t time.Time) error {
  51. mu.Lock()
  52. defer mu.Unlock()
  53. c.read.set(t)
  54. return nil
  55. }
  56. func (c *connDeadlines) SetWriteDeadline(t time.Time) error {
  57. mu.Lock()
  58. defer mu.Unlock()
  59. c.write.set(t)
  60. return nil
  61. }