1
0
mirror of https://github.com/AvengeMedia/DankMaterialShell.git synced 2026-06-27 05:25:19 -04:00

sysupdate: fix check scheduling

- deadline-based, fixes the issue before that would reset the interval
  without accounting for prior time waited
This commit is contained in:
bbedward
2026-06-23 09:55:39 -04:00
parent 63feabf517
commit 73f3a72d00
+22 -5
View File
@@ -131,7 +131,9 @@ func (m *Manager) SetInterval(seconds int) {
} }
m.mu.Lock() m.mu.Lock()
m.state.IntervalSeconds = seconds m.state.IntervalSeconds = seconds
m.state.NextCheckUnix = time.Now().Unix() + int64(seconds)
m.mu.Unlock() m.mu.Unlock()
m.wake()
m.markDirty() m.markDirty()
} }
@@ -182,10 +184,12 @@ func (m *Manager) Cancel() {
func (m *Manager) Acquire() { func (m *Manager) Acquire() {
atomic.AddInt32(&m.acquireCount, 1) atomic.AddInt32(&m.acquireCount, 1)
select { m.mu.Lock()
case m.wakeSched <- struct{}{}: if m.state.NextCheckUnix == 0 {
default: m.state.NextCheckUnix = time.Now().Unix() + int64(m.state.IntervalSeconds)
} }
m.mu.Unlock()
m.wake()
} }
func (m *Manager) Release() { func (m *Manager) Release() {
@@ -194,6 +198,13 @@ func (m *Manager) Release() {
} }
} }
func (m *Manager) wake() {
select {
case m.wakeSched <- struct{}{}:
default:
}
}
func (m *Manager) scheduler() { func (m *Manager) scheduler() {
defer m.schedulerWG.Done() defer m.schedulerWG.Done()
for { for {
@@ -208,11 +219,17 @@ func (m *Manager) scheduler() {
m.mu.RLock() m.mu.RLock()
interval := m.state.IntervalSeconds interval := m.state.IntervalSeconds
next := m.state.NextCheckUnix
m.mu.RUnlock() m.mu.RUnlock()
if interval < minIntervalSeconds { if interval < minIntervalSeconds {
interval = minIntervalSeconds interval = minIntervalSeconds
} }
t := time.NewTimer(time.Duration(interval) * time.Second) now := time.Now().Unix()
if next == 0 {
next = now + int64(interval)
}
wait := max(time.Duration(next-now)*time.Second, 0)
t := time.NewTimer(wait)
select { select {
case <-m.stopChan: case <-m.stopChan:
t.Stop() t.Stop()
@@ -279,13 +296,13 @@ func (m *Manager) runRefresh(parent context.Context) {
m.state.Packages = append(m.state.Packages, r.pkgs...) m.state.Packages = append(m.state.Packages, r.pkgs...)
} }
m.state.Count = len(m.state.Packages) m.state.Count = len(m.state.Packages)
m.state.NextCheckUnix = now + int64(m.state.IntervalSeconds)
if firstErr != nil { if firstErr != nil {
m.state.Phase = PhaseError m.state.Phase = PhaseError
m.state.Error = &ErrorInfo{Code: ErrCodeBackendFailed, Message: firstErr.Error()} m.state.Error = &ErrorInfo{Code: ErrCodeBackendFailed, Message: firstErr.Error()}
} else { } else {
m.state.Phase = PhaseIdle m.state.Phase = PhaseIdle
m.state.LastSuccessUnix = now m.state.LastSuccessUnix = now
m.state.NextCheckUnix = now + int64(m.state.IntervalSeconds)
} }
m.mu.Unlock() m.mu.Unlock()
m.markDirty() m.markDirty()