Source file src/pkg/time/sleep.go
1 // Copyright 2009 The Go Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 package time 6 7 // Sleep pauses the current goroutine for the duration d. 8 func Sleep(d Duration) 9 10 func nano() int64 { 11 sec, nsec := now() 12 return sec*1e9 + int64(nsec) 13 } 14 15 // Interface to timers implemented in package runtime. 16 // Must be in sync with ../runtime/runtime.h:/^struct.Timer$ 17 type runtimeTimer struct { 18 i int32 19 when int64 20 period int64 21 f func(int64, interface{}) 22 arg interface{} 23 } 24 25 func startTimer(*runtimeTimer) 26 func stopTimer(*runtimeTimer) bool 27 28 // The Timer type represents a single event. 29 // When the Timer expires, the current time will be sent on C, 30 // unless the Timer was created by AfterFunc. 31 type Timer struct { 32 C <-chan Time 33 r runtimeTimer 34 } 35 36 // Stop prevents the Timer from firing. 37 // It returns true if the call stops the timer, false if the timer has already 38 // expired or stopped. 39 func (t *Timer) Stop() (ok bool) { 40 return stopTimer(&t.r) 41 } 42 43 // NewTimer creates a new Timer that will send 44 // the current time on its channel after at least duration d. 45 func NewTimer(d Duration) *Timer { 46 c := make(chan Time, 1) 47 t := &Timer{ 48 C: c, 49 r: runtimeTimer{ 50 when: nano() + int64(d), 51 f: sendTime, 52 arg: c, 53 }, 54 } 55 startTimer(&t.r) 56 return t 57 } 58 59 func sendTime(now int64, c interface{}) { 60 // Non-blocking send of time on c. 61 // Used in NewTimer, it cannot block anyway (buffer). 62 // Used in NewTicker, dropping sends on the floor is 63 // the desired behavior when the reader gets behind, 64 // because the sends are periodic. 65 select { 66 case c.(chan Time) <- Unix(0, now): 67 default: 68 } 69 } 70 71 // After waits for the duration to elapse and then sends the current time 72 // on the returned channel. 73 // It is equivalent to NewTimer(d).C. 74 func After(d Duration) <-chan Time { 75 return NewTimer(d).C 76 } 77 78 // AfterFunc waits for the duration to elapse and then calls f 79 // in its own goroutine. It returns a Timer that can 80 // be used to cancel the call using its Stop method. 81 func AfterFunc(d Duration, f func()) *Timer { 82 t := &Timer{ 83 r: runtimeTimer{ 84 when: nano() + int64(d), 85 f: goFunc, 86 arg: f, 87 }, 88 } 89 startTimer(&t.r) 90 return t 91 } 92 93 func goFunc(now int64, arg interface{}) { 94 go arg.(func())() 95 }