"github.com/sjmudd/pstop/lib"
"github.com/sjmudd/pstop/state"
"github.com/sjmudd/pstop/version"
+ "github.com/sjmudd/pstop/wait_info"
)
const (
}
var state state.State
- interval := time.Second
+ var wi wait_info.WaitInfo
+ wi.SetWaitInterval(time.Second)
+
sigChan := make(chan os.Signal, 1)
done := make(chan struct{})
defer close(done)
signal.Notify(sigChan, syscall.SIGINT, syscall.SIGTERM)
- ticker := time.NewTicker(interval) // generate a periodic signal
-
state.Setup(dbh)
finished := false
case sig := <-sigChan:
fmt.Println("Caught a signal", sig)
done <- struct{}{}
- case <-ticker.C:
+ case <-wi.WaitNextPeriod():
state.Collect()
+ wi.CollectedNow()
state.Display()
case event := <-termboxChan:
// switch on event type
}
switch event.Ch {
case '-': // decrease the interval if > 1
- if interval > time.Second {
- ticker.Stop()
- interval -= time.Second
- ticker = time.NewTicker(interval)
+ if wi.WaitInterval() > time.Second {
+ wi.SetWaitInterval(wi.WaitInterval() - time.Second)
}
case '+': // increase interval by creating a new ticker
- ticker.Stop()
- interval += time.Second
- ticker = time.NewTicker(interval)
+ wi.SetWaitInterval(wi.WaitInterval() + time.Second)
case 'h': // help
state.SetHelp(!state.Help())
case 'q': // quit
}
}
state.Cleanup()
- ticker.Stop()
lib.Logger.Println("Terminating " + lib.MyName())
}
--- /dev/null
+package wait_info
+
+import (
+ "github.com/sjmudd/pstop/lib"
+ "time"
+)
+
+const extra_delay = 200 * time.Millisecond
+
+// used to record when we need to wa
+type WaitInfo struct {
+ last_collected time.Time
+ collect_interval time.Duration
+}
+
+// return the configured wait interval
+func (wi *WaitInfo) WaitInterval() time.Duration {
+ return wi.collect_interval
+}
+
+// recognise we've done a collection
+func (wi *WaitInfo) CollectedNow() {
+ wi.SetCollected(time.Now())
+}
+
+// change the configured wait interval
+func (wi *WaitInfo) SetWaitInterval(required_interval time.Duration) {
+ wi.collect_interval = required_interval
+}
+
+// set the time the last collection happened
+func (wi *WaitInfo) SetCollected(collect_time time.Time) {
+ wi.last_collected = collect_time
+ lib.Logger.Println("WaitInfo.SetCollected() last_collected=", wi.last_collected)
+}
+
+// return the time the last collection happened
+func (wi WaitInfo) LastCollected() time.Time {
+ return wi.last_collected
+}
+
+// return the amount of time to wait before doing the next collection
+func (wi WaitInfo) TimeToWait() time.Duration {
+ now := time.Now()
+ lib.Logger.Println("WaitInfo.TimeToWait() now: ", now)
+
+ next_time := wi.last_collected.Add(wi.collect_interval)
+ lib.Logger.Println("WaitInfo.TimeToWait() next_time: ", next_time)
+ if next_time.Before(now) {
+ lib.Logger.Println("WaitInfo.TimeToWait() next_time scheduled time in the past, so schedule", extra_delay, "after", now)
+ next_time = now
+ next_time.Add(extra_delay) // add a deliberate tiny delay
+ lib.Logger.Println("WaitInfo.TimeToWait() next_time: ", next_time, "(corrected)")
+ }
+ wait_time := next_time.Sub(now)
+ lib.Logger.Println("WaitInfo.TimeToWait() returning wait_time:", wait_time)
+
+ return wait_time
+}
+
+// behave like time.After()
+func (wi WaitInfo) WaitNextPeriod() <-chan time.Time {
+ return time.After(wi.TimeToWait())
+}