detached cf75aa0

fix(daemon): retain sync batches across detach and replace

commit
cf75aa04e71600644d4bd20d8e1f9800c4b78174
author
brice · · 2026-07-11 21:50 UTC
parent
8d4da10
signature
GPG VerifiedCD88F9E564E0102646FB6077A1A07C7C7C3E349D · arch-gpg Verified for the committer email
1 file · +0 -6
M internal/usecase/daemon/render_coordinator.go +0 -6
@@ -607,7 +607,6 @@ func (c *renderCoordinator) wakeCurrent(w renderWake) bool {
607607 func (c *renderCoordinator) noteDetach(ac *attachedClient) {
608608 c.mu.Lock()
609609 var timer ports.Timer
610- var timers []ports.Timer
611610 if c.attachment == ac {
612611 c.advanceAttachmentEpochLocked(ac)
613612 c.attachment = nil
@@ -619,11 +618,9 @@ func (c *renderCoordinator) noteDetach(ac *attachedClient) {
619618 c.generation++
620619 c.armed = false
621620 timer = c.detachNormalTimerLocked()
622- timers = c.detachSyncTimersLocked()
623621 }
624622 c.mu.Unlock()
625623 stopTimer(timer)
626- stopTimers(timers)
627624 }
628625
629626 // noteReplace hands the coordinator from old to replacement; callbacks
@@ -639,7 +636,6 @@ func (c *renderCoordinator) noteReplace(old, replacement *attachedClient, readin
639636 // identity to invalidate, and the replacement becomes the first bound
640637 // attachment atomically with this lifecycle transition.
641638 var timer ports.Timer
642- var timers []ports.Timer
643639 if c.attachment == old || c.attachment == nil {
644640 c.advanceAttachmentEpochLocked(old, replacement)
645641 c.attachment = replacement
@@ -654,11 +650,9 @@ func (c *renderCoordinator) noteReplace(old, replacement *attachedClient, readin
654650 c.generation++
655651 c.armed = false
656652 timer = c.detachNormalTimerLocked()
657- timers = c.detachSyncTimersLocked()
658653 }
659654 c.mu.Unlock()
660655 stopTimer(timer)
661- stopTimers(timers)
662656 }
663657
664658 // notePark invalidates pending wakes when the attachment parks for resume.
@@ -607,7 +607,6 @@ func (c *renderCoordinator) wakeCurrent(w renderWake) bool {
607 func (c *renderCoordinator) noteDetach(ac *attachedClient) {607 func (c *renderCoordinator) noteDetach(ac *attachedClient) {
608 c.mu.Lock()608 c.mu.Lock()
609 var timer ports.Timer609 var timer ports.Timer
610- var timers []ports.Timer
611 if c.attachment == ac {610 if c.attachment == ac {
612 c.advanceAttachmentEpochLocked(ac)611 c.advanceAttachmentEpochLocked(ac)
613 c.attachment = nil612 c.attachment = nil
@@ -619,11 +618,9 @@ func (c *renderCoordinator) noteDetach(ac *attachedClient) {
619 c.generation++618 c.generation++
620 c.armed = false619 c.armed = false
621 timer = c.detachNormalTimerLocked()620 timer = c.detachNormalTimerLocked()
622- timers = c.detachSyncTimersLocked()
623 }621 }
624 c.mu.Unlock()622 c.mu.Unlock()
625 stopTimer(timer)623 stopTimer(timer)
626- stopTimers(timers)
627 }624 }
628 625
629 // noteReplace hands the coordinator from old to replacement; callbacks626 // noteReplace hands the coordinator from old to replacement; callbacks
@@ -639,7 +636,6 @@ func (c *renderCoordinator) noteReplace(old, replacement *attachedClient, readin
639 // identity to invalidate, and the replacement becomes the first bound636 // identity to invalidate, and the replacement becomes the first bound
640 // attachment atomically with this lifecycle transition.637 // attachment atomically with this lifecycle transition.
641 var timer ports.Timer638 var timer ports.Timer
642- var timers []ports.Timer
643 if c.attachment == old || c.attachment == nil {639 if c.attachment == old || c.attachment == nil {
644 c.advanceAttachmentEpochLocked(old, replacement)640 c.advanceAttachmentEpochLocked(old, replacement)
645 c.attachment = replacement641 c.attachment = replacement
@@ -654,11 +650,9 @@ func (c *renderCoordinator) noteReplace(old, replacement *attachedClient, readin
654 c.generation++650 c.generation++
655 c.armed = false651 c.armed = false
656 timer = c.detachNormalTimerLocked()652 timer = c.detachNormalTimerLocked()
657- timers = c.detachSyncTimersLocked()
658 }653 }
659 c.mu.Unlock()654 c.mu.Unlock()
660 stopTimer(timer)655 stopTimer(timer)
661- stopTimers(timers)
662 }656 }
663 657
664 // notePark invalidates pending wakes when the attachment parks for resume.658 // notePark invalidates pending wakes when the attachment parks for resume.

Keyboard shortcuts

Single-key shortcuts are on. ctrl k and esc work whatever this says.

ctrl k :
go to a section, branch, tag, file or repository
?
this list
j k
move the row cursor down / up
enter
open the row under the cursor; on Files, a directory opens or closes in place
↑ ↓ ← → home end
in the file tree (focus on a row): previous / next row, close / open a directory or go to its parent / first entry, first / last row. They never open a file
l h
on Files: open a directory or a file / close a directory or go up to its parent, then to the parent page. Elsewhere: into the side panel (on a merge request, its files) / back to the content; there j k move between its controls
g g G
first / last row
/
filter the list; on Files, find a file anywhere in the repository (esc clears, enter opens the best match)
b
switch branch or tag
g s g f g c g b g m g i g r g a
tabs: summary, files, commits, branches & tags, merge requests, issues, releases, actions (when available)
g h
home
w
wide mode: use the whole width of the screen, or not (remembered)
y
copy a permalink pinned to the commit
d u x
diff: split / unified / collapse or expand all
e E
diff: the whole file in view / every file, with the lines the hunks hide
n
merge request: next note in the diff
esc
close a dialog, leave a field

Branches 12

Tags 11

↑↓ moveenter openesc close