From 13ce1c28b4839468ea8544d154997af40e6f1f4a Mon Sep 17 00:00:00 2001 From: Hajime Hoshi Date: Sat, 1 Jun 2019 01:27:04 +0900 Subject: [PATCH] uidriver/mobile: Use timer.NewTimer instead of time.After timer.NewTimer is much better than time.After in terms of memory usage. See also https://golang.org/pkg/time/#After --- audio/mp3/decode_js.go | 4 +++- internal/uidriver/mobile/ui.go | 11 +++++++++-- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/audio/mp3/decode_js.go b/audio/mp3/decode_js.go index 38080d7ea..3d0434f17 100644 --- a/audio/mp3/decode_js.go +++ b/audio/mp3/decode_js.go @@ -232,13 +232,15 @@ func decode(context *audio.Context, buf []byte, try int) (*Stream, error) { u8.Release() timeout := time.Duration(math.Pow(2, float64(try))) * time.Second + t := time.NewTimer(timeout) + defer t.Stop() select { case err := <-ch: if err != nil { return nil, err } - case <-time.After(timeout): + case <-t.C: // Sometimes decode fails without calling the callbacks (#464). // Let's just try again in this case. return nil, errTimeout diff --git a/internal/uidriver/mobile/ui.go b/internal/uidriver/mobile/ui.go index 902c2e341..2a6834a36 100644 --- a/internal/uidriver/mobile/ui.go +++ b/internal/uidriver/mobile/ui.go @@ -63,12 +63,16 @@ func (u *UserInterface) Render(chError <-chan error) error { return errors.New("ui: chError must not be nil") } // TODO: Check this is called on the rendering thread + + t := time.NewTimer(500 * time.Millisecond) + defer t.Stop() + select { case err := <-chError: return err case renderCh <- struct{}{}: return opengl.Get().DoWork(renderEndCh) - case <-time.After(500 * time.Millisecond): + case <-t.C: // This function must not be blocked. We need to break for timeout. return nil } @@ -247,10 +251,13 @@ func (u *UserInterface) scaleImpl() float64 { func (u *UserInterface) update(context driver.UIContext) error { render: for { + t := time.NewTimer(500 * time.Millisecond) + defer t.Stop() + select { case <-renderCh: break render - case <-time.After(500 * time.Millisecond): + case <-t.C: context.SuspendAudio() continue }