From 8b31dc79bfb3b2c71b3af48cd311155add5b9a3f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6ran=20Karl?= <3951388+JoeKar@users.noreply.github.com> Date: Mon, 24 Jun 2024 19:12:47 +0200 Subject: [PATCH] config: Rework `autosave` to be rearmed upon change --- cmd/micro/micro.go | 2 +- internal/action/command.go | 1 - internal/config/autosave.go | 42 ++++++++++++++++++++++++------------- 3 files changed, 28 insertions(+), 17 deletions(-) diff --git a/cmd/micro/micro.go b/cmd/micro/micro.go index 0e616cad..4445a348 100644 --- a/cmd/micro/micro.go +++ b/cmd/micro/micro.go @@ -356,9 +356,9 @@ func main() { log.Println(clipErr, " or change 'clipboard' option") } + config.StartAutoSave() if a := config.GetGlobalOption("autosave").(float64); a > 0 { config.SetAutoTime(a) - config.StartAutoSave() } screen.Events = make(chan tcell.Event) diff --git a/internal/action/command.go b/internal/action/command.go index fda55542..5f56fcdb 100644 --- a/internal/action/command.go +++ b/internal/action/command.go @@ -553,7 +553,6 @@ func doSetGlobalOptionNative(option string, nativeValue interface{}) error { } else if option == "autosave" { if nativeValue.(float64) > 0 { config.SetAutoTime(nativeValue.(float64)) - config.StartAutoSave() } else { config.SetAutoTime(0) } diff --git a/internal/config/autosave.go b/internal/config/autosave.go index 2a19da36..0dbb2989 100644 --- a/internal/config/autosave.go +++ b/internal/config/autosave.go @@ -1,37 +1,49 @@ package config import ( - "sync" "time" ) var Autosave chan bool -var autotime float64 - -// lock for autosave -var autolock sync.Mutex +var autotime chan float64 func init() { Autosave = make(chan bool) + autotime = make(chan float64) } func SetAutoTime(a float64) { - autolock.Lock() - autotime = a - autolock.Unlock() + autotime <- a } func StartAutoSave() { go func() { + var a float64 + var t *time.Timer + var elapsed <-chan time.Time for { - autolock.Lock() - a := autotime - autolock.Unlock() - if a <= 0 { - break + select { + case a = <-autotime: + if t != nil { + t.Stop() + for len(elapsed) > 0 { + <-elapsed + } + } + if a > 0 { + if t != nil { + t.Reset(time.Duration(a * float64(time.Second))) + } else { + t = time.NewTimer(time.Duration(a * float64(time.Second))) + elapsed = t.C + } + } + case <-elapsed: + if a > 0 { + t.Reset(time.Duration(a * float64(time.Second))) + Autosave <- true + } } - time.Sleep(time.Duration(a * float64(time.Second))) - Autosave <- true } }() }