Describe the bug
When my model returns tea.Quit, sometimes, maybe 10% of the time, it won't actually quit. I was able to dump the goroutine stacks when it was hanging by sending it the ABRT signal and saw that it was blocking on this line:
Setup
Please complete the following information along with version numbers, if applicable.
- OS [MacOS Ventura]
- Shell [zsh]
- Terminal Emulator [kitty]
- Terminal Multiplexer [tmux]
To Reproduce
Run the following program. As soon as it starts, you can hit q to quit it. You might need to do this 10-20 times to get it to eventually hang when quitting.
go.mod
module gol
go 1.20
require (
github.com/aymanbagabas/go-osc52/v2 v2.0.1 // indirect
github.com/charmbracelet/bubbletea v0.24.0 // indirect
github.com/containerd/console v1.0.4-0.20230313162750-1ae8d489ac81 // indirect
github.com/lucasb-eyer/go-colorful v1.2.0 // indirect
github.com/mattn/go-isatty v0.0.18 // indirect
github.com/mattn/go-localereader v0.0.1 // indirect
github.com/mattn/go-runewidth v0.0.14 // indirect
github.com/muesli/ansi v0.0.0-20211018074035-2e021307bc4b // indirect
github.com/muesli/cancelreader v0.2.2 // indirect
github.com/muesli/reflow v0.3.0 // indirect
github.com/muesli/termenv v0.15.1 // indirect
github.com/rivo/uniseg v0.2.0 // indirect
golang.org/x/sync v0.1.0 // indirect
golang.org/x/sys v0.6.0 // indirect
golang.org/x/term v0.6.0 // indirect
golang.org/x/text v0.3.8 // indirect
)
main.go
package main
import (
"bytes"
"math/rand"
"time"
tea "github.com/charmbracelet/bubbletea"
)
const fps = 20
const alive = "😂"
const dead = "🌊"
func main() {
model := model{}
p := tea.NewProgram(model)
p.Run()
}
type board [][]bool
type model struct {
board board
ready bool
lastUpdate time.Time
ticked bool
last tea.Msg
}
type TickMsg time.Time
// Init implements tea.Model
func (m model) Init() tea.Cmd {
return doTick()
}
func doTick() tea.Cmd {
return tea.Tick(time.Second/fps, func(t time.Time) tea.Msg {
return TickMsg(t)
})
}
// Update implements tea.Model
func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
m.last = msg
m.lastUpdate = time.Now()
m.ticked = false
switch msg := msg.(type) {
case tea.WindowSizeMsg:
m.board = make([][]bool, msg.Height)
for i := range m.board {
m.board[i] = make([]bool, msg.Width)
}
m.seed()
m.ready = true
case TickMsg:
if m.ready {
m.board = m.tick()
}
m.ticked = true
return m, doTick()
case tea.KeyMsg:
switch msg.String() {
case "q", "esc", "ctrl+c":
return m, tea.Quit
default:
m.seed()
}
}
return m, nil
}
func (m model) seed() {
liveRatio := .50 + rand.Float64()*0.25
for i := range m.board {
for j := range m.board[i] {
if rand.Float64() < liveRatio {
m.board[i][j] = true
} else {
m.board[i][j] = false
}
}
}
}
func (m model) tick() board {
res := make([][]bool, len(m.board))
for i := range res {
res[i] = make([]bool, len(m.board[i]))
}
for i := range m.board {
for j := range m.board[i] {
alive := m.board[i][j]
res[i][j] = m.board[i][j]
switch {
case alive:
n := m.countLiveNeighbors(i, j)
if n < 2 || n > 3 {
res[i][j] = false
}
default:
n := m.countLiveNeighbors(i, j)
if n == 3 {
res[i][j] = true
}
}
}
}
return res
}
func (m model) countLiveNeighbors(i, j int) int {
var count int
for x := i - 1; x <= i+1; x++ {
for y := j - 1; y <= j+1; y++ {
if x == i && y == j {
continue
}
cx, cy := x, y
if cx < 0 {
cx = len(m.board) - 1
}
if cx >= len(m.board) {
cx = 0
}
if cy < 0 {
cy = len(m.board[cx]) - 1
}
if cy >= len(m.board[cx]) {
cy = 0
}
if m.board[cx][cy] {
count++
}
}
}
return count
}
// View implements tea.Model
func (m model) View() string {
if !m.ready {
return ""
}
buf := new(bytes.Buffer)
for i := range m.board {
for j := range m.board[i] {
if m.board[i][j] {
buf.WriteString(alive)
} else {
buf.WriteString(dead)
}
}
if i != len(m.board)-1 {
buf.WriteString("\n")
}
}
return buf.String()
}
stack.txt
goroutine 0 [idle]:
runtime.kevent(0x5, 0x0, 0x0, 0x16fd720c8, 0x40, 0x16fd720a0)
/usr/local/go/src/runtime/sys_darwin.go:453 +0x20 fp=0x16fd72040 sp=0x16fd72020 pc=0x1000db180
runtime.netpoll(0xf6c9c6)
/usr/local/go/src/runtime/netpoll_kqueue.go:130 +0xfc fp=0x16fd728d0 sp=0x16fd72040 pc=0x1000b978c
runtime.findRunnable()
/usr/local/go/src/runtime/proc.go:2971 +0x840 fp=0x16fd729d0 sp=0x16fd728d0 pc=0x1000c49d0
runtime.schedule()
/usr/local/go/src/runtime/proc.go:3360 +0x98 fp=0x16fd72a10 sp=0x16fd729d0 pc=0x1000c5cf8
runtime.goexit0(0x14000106d00)
/usr/local/go/src/runtime/proc.go:3687 +0x2ec fp=0x16fd72a50 sp=0x16fd72a10 pc=0x1000c6c2c
runtime.mcall()
/usr/local/go/src/runtime/asm_arm64.s:192 +0x54 fp=0x16fd72a60 sp=0x16fd72a50 pc=0x1000e9a24
goroutine 1 [chan send]:
runtime.gopark(0x4?, 0x8?, 0x0?, 0x0?, 0x4?)
/usr/local/go/src/runtime/proc.go:381 +0xe0 fp=0x140000cb9b0 sp=0x140000cb990 pc=0x1000bf3a0
runtime.chansend(0x1400008c2a0, 0x140000cba88, 0x1, 0x10001400009e340?)
/usr/local/go/src/runtime/chan.go:259 +0x42c fp=0x140000cba40 sp=0x140000cb9b0 pc=0x10009087c
runtime.chansend1(0x4?, 0x1001a76e0?)
/usr/local/go/src/runtime/chan.go:145 +0x18 fp=0x140000cba70 sp=0x140000cba40 pc=0x100090438
github.com/charmbracelet/bubbletea.(*standardRenderer).stop.func1()
/Users/collin/go/pkg/mod/github.com/charmbracelet/bubbletea@v0.24.0/standard_renderer.go:99 +0x28 fp=0x140000cba90 sp=0x140000cba70 pc=0x10014c5a8
sync.(*Once).doSlow(0x1001ad418?, 0x140000a4010?)
/usr/local/go/src/sync/once.go:74 +0x100 fp=0x140000cbaf0 sp=0x140000cba90 pc=0x1000f0530
sync.(*Once).Do(...)
/usr/local/go/src/sync/once.go:65
github.com/charmbracelet/bubbletea.(*standardRenderer).stop(0x140000d60b0)
/Users/collin/go/pkg/mod/github.com/charmbracelet/bubbletea@v0.24.0/standard_renderer.go:98 +0x140 fp=0x140000cbc30 sp=0x140000cbaf0 pc=0x10014c4d0
github.com/charmbracelet/bubbletea.(*Program).shutdown(0x140000e8000, 0x4?)
/Users/collin/go/pkg/mod/github.com/charmbracelet/bubbletea@v0.24.0/tea.go:592 +0x48 fp=0x140000cbc50 sp=0x140000cbc30 pc=0x100152228
github.com/charmbracelet/bubbletea.(*Program).Run(0x140000e8000)
/Users/collin/go/pkg/mod/github.com/charmbracelet/bubbletea@v0.24.0/tea.go:524 +0x838 fp=0x140000cbee0 sp=0x140000cbc50 pc=0x100151d08
main.main()
/Users/collin/code/bubble-text/main.go:18 +0x64 fp=0x140000cbf70 sp=0x140000cbee0 pc=0x100153894
runtime.main()
/usr/local/go/src/runtime/proc.go:250 +0x200 fp=0x140000cbfd0 sp=0x140000cbf70 pc=0x1000bef90
runtime.goexit()
/usr/local/go/src/runtime/asm_arm64.s:1172 +0x4 fp=0x140000cbfd0 sp=0x140000cbfd0 pc=0x1000ebf04
goroutine 2 [force gc (idle)]:
runtime.gopark(0x0?, 0x0?, 0x0?, 0x0?, 0x0?)
/usr/local/go/src/runtime/proc.go:381 +0xe0 fp=0x1400004afa0 sp=0x1400004af80 pc=0x1000bf3a0
runtime.goparkunlock(...)
/usr/local/go/src/runtime/proc.go:387
runtime.forcegchelper()
/usr/local/go/src/runtime/proc.go:305 +0xb0 fp=0x1400004afd0 sp=0x1400004afa0 pc=0x1000bf1f0
runtime.goexit()
/usr/local/go/src/runtime/asm_arm64.s:1172 +0x4 fp=0x1400004afd0 sp=0x1400004afd0 pc=0x1000ebf04
created by runtime.init.6
/usr/local/go/src/runtime/proc.go:293 +0x24
goroutine 3 [GC sweep wait]:
runtime.gopark(0x1?, 0x0?, 0x0?, 0x0?, 0x0?)
/usr/local/go/src/runtime/proc.go:381 +0xe0 fp=0x1400004b760 sp=0x1400004b740 pc=0x1000bf3a0
runtime.goparkunlock(...)
/usr/local/go/src/runtime/proc.go:387
runtime.bgsweep(0x0?)
/usr/local/go/src/runtime/mgcsweep.go:319 +0x100 fp=0x1400004b7b0 sp=0x1400004b760 pc=0x1000acdc0
runtime.gcenable.func1()
/usr/local/go/src/runtime/mgc.go:178 +0x28 fp=0x1400004b7d0 sp=0x1400004b7b0 pc=0x1000a2038
runtime.goexit()
/usr/local/go/src/runtime/asm_arm64.s:1172 +0x4 fp=0x1400004b7d0 sp=0x1400004b7d0 pc=0x1000ebf04
created by runtime.gcenable
/usr/local/go/src/runtime/mgc.go:178 +0x6c
goroutine 4 [GC scavenge wait]:
runtime.gopark(0x20d5be48?, 0x20ca53a8?, 0x0?, 0x0?, 0x0?)
/usr/local/go/src/runtime/proc.go:381 +0xe0 fp=0x1400004bf50 sp=0x1400004bf30 pc=0x1000bf3a0
runtime.goparkunlock(...)
/usr/local/go/src/runtime/proc.go:387
runtime.(*scavengerState).park(0x10025b240)
/usr/local/go/src/runtime/mgcscavenge.go:400 +0x5c fp=0x1400004bf80 sp=0x1400004bf50 pc=0x1000aac8c
runtime.bgscavenge(0x0?)
/usr/local/go/src/runtime/mgcscavenge.go:633 +0xa8 fp=0x1400004bfb0 sp=0x1400004bf80 pc=0x1000ab248
runtime.gcenable.func2()
/usr/local/go/src/runtime/mgc.go:179 +0x28 fp=0x1400004bfd0 sp=0x1400004bfb0 pc=0x1000a1fd8
runtime.goexit()
/usr/local/go/src/runtime/asm_arm64.s:1172 +0x4 fp=0x1400004bfd0 sp=0x1400004bfd0 pc=0x1000ebf04
created by runtime.gcenable
/usr/local/go/src/runtime/mgc.go:179 +0xac
goroutine 17 [finalizer wait]:
runtime.gopark(0x1400004a5a8?, 0x6000010009ffe8?, 0x48?, 0x5a?, 0x1?)
/usr/local/go/src/runtime/proc.go:381 +0xe0 fp=0x1400004a580 sp=0x1400004a560 pc=0x1000bf3a0
runtime.runfinq()
/usr/local/go/src/runtime/mfinal.go:193 +0x100 fp=0x1400004a7d0 sp=0x1400004a580 pc=0x1000a1100
runtime.goexit()
/usr/local/go/src/runtime/asm_arm64.s:1172 +0x4 fp=0x1400004a7d0 sp=0x1400004a7d0 pc=0x1000ebf04
created by runtime.createfing
/usr/local/go/src/runtime/mfinal.go:163 +0x80
goroutine 26 [GC worker (idle)]:
runtime.gopark(0x14000046fa8?, 0x14000046f78?, 0x0?, 0x0?, 0x1?)
/usr/local/go/src/runtime/proc.go:381 +0xe0 fp=0x14000046f40 sp=0x14000046f20 pc=0x1000bf3a0
runtime.gcBgMarkWorker()
/usr/local/go/src/runtime/mgc.go:1275 +0xe4 fp=0x14000046fd0 sp=0x14000046f40 pc=0x1000a3b94
runtime.goexit()
/usr/local/go/src/runtime/asm_arm64.s:1172 +0x4 fp=0x14000046fd0 sp=0x14000046fd0 pc=0x1000ebf04
created by runtime.gcBgMarkStartWorkers
/usr/local/go/src/runtime/mgc.go:1199 +0x28
goroutine 5 [select, locked to thread]:
runtime.gopark(0x1400004c7a0?, 0x2?, 0x88?, 0xc6?, 0x1400004c79c?)
/usr/local/go/src/runtime/proc.go:381 +0xe0 fp=0x1400004c640 sp=0x1400004c620 pc=0x1000bf3a0
runtime.selectgo(0x1400004c7a0, 0x1400004c798, 0x0?, 0x0, 0x0?, 0x1)
/usr/local/go/src/runtime/select.go:327 +0x68c fp=0x1400004c750 sp=0x1400004c640 pc=0x1000cef1c
runtime.ensureSigM.func1()
/usr/local/go/src/runtime/signal_unix.go:1000 +0x168 fp=0x1400004c7d0 sp=0x1400004c750 pc=0x1000e5688
runtime.goexit()
/usr/local/go/src/runtime/asm_arm64.s:1172 +0x4 fp=0x1400004c7d0 sp=0x1400004c7d0 pc=0x1000ebf04
created by runtime.ensureSigM
/usr/local/go/src/runtime/signal_unix.go:983 +0xd8
goroutine 20 [sync.Mutex.Lock]:
runtime.gopark(0x1002626a0?, 0x1000db59c?, 0x20?, 0x21?, 0x1000daf04?)
/usr/local/go/src/runtime/proc.go:381 +0xe0 fp=0x140000957f0 sp=0x140000957d0 pc=0x1000bf3a0
runtime.goparkunlock(...)
/usr/local/go/src/runtime/proc.go:387
runtime.semacquire1(0x140000aa13c, 0x7d?, 0x3, 0x1, 0x7f?)
/usr/local/go/src/runtime/sema.go:160 +0x20c fp=0x14000095850 sp=0x140000957f0 pc=0x1000cfdfc
sync.runtime_SemacquireMutex(0x0?, 0x0?, 0x0?)
/usr/local/go/src/runtime/sema.go:77 +0x28 fp=0x14000095890 sp=0x14000095850 pc=0x1000e8128
sync.(*Mutex).lockSlow(0x140000aa138)
/usr/local/go/src/sync/mutex.go:171 +0x174 fp=0x140000958e0 sp=0x14000095890 pc=0x1000f0124
sync.(*Mutex).Lock(...)
/usr/local/go/src/sync/mutex.go:90
github.com/charmbracelet/bubbletea.(*standardRenderer).flush(0x140000d60b0?)
/Users/collin/go/pkg/mod/github.com/charmbracelet/bubbletea@v0.24.0/standard_renderer.go:136 +0x88 fp=0x14000095f40 sp=0x140000958e0 pc=0x10014c968
github.com/charmbracelet/bubbletea.(*standardRenderer).listen(0x140000d60b0)
/Users/collin/go/pkg/mod/github.com/charmbracelet/bubbletea@v0.24.0/standard_renderer.go:129 +0x28 fp=0x14000095fb0 sp=0x14000095f40 pc=0x10014c868
github.com/charmbracelet/bubbletea.(*standardRenderer).start.func1()
/Users/collin/go/pkg/mod/github.com/charmbracelet/bubbletea@v0.24.0/standard_renderer.go:86 +0x28 fp=0x14000095fd0 sp=0x14000095fb0 pc=0x10014c358
runtime.goexit()
/usr/local/go/src/runtime/asm_arm64.s:1172 +0x4 fp=0x14000095fd0 sp=0x14000095fd0 pc=0x1000ebf04
created by github.com/charmbracelet/bubbletea.(*standardRenderer).start
/Users/collin/go/pkg/mod/github.com/charmbracelet/bubbletea@v0.24.0/standard_renderer.go:86 +0xb4
goroutine 34 [syscall]:
runtime.sigNoteSleep(0x0)
/usr/local/go/src/runtime/os_darwin.go:123 +0x20 fp=0x1400010c790 sp=0x1400010c750 pc=0x1000b9d70
os/signal.signal_recv()
/usr/local/go/src/runtime/sigqueue.go:149 +0x2c fp=0x1400010c7b0 sp=0x1400010c790 pc=0x1000e835c
os/signal.loop()
/usr/local/go/src/os/signal/signal_unix.go:23 +0x1c fp=0x1400010c7d0 sp=0x1400010c7b0 pc=0x10014716c
runtime.goexit()
/usr/local/go/src/runtime/asm_arm64.s:1172 +0x4 fp=0x1400010c7d0 sp=0x1400010c7d0 pc=0x1000ebf04
created by os/signal.Notify.func1.1
/usr/local/go/src/os/signal/signal.go:151 +0x28
goroutine 25 [GC worker (idle)]:
runtime.gopark(0x140000d60b0?, 0x14000047780?, 0x0?, 0x0?, 0x0?)
/usr/local/go/src/runtime/proc.go:381 +0xe0 fp=0x14000047740 sp=0x14000047720 pc=0x1000bf3a0
runtime.gcBgMarkWorker()
/usr/local/go/src/runtime/mgc.go:1275 +0xe4 fp=0x140000477d0 sp=0x14000047740 pc=0x1000a3b94
runtime.goexit()
/usr/local/go/src/runtime/asm_arm64.s:1172 +0x4 fp=0x140000477d0 sp=0x140000477d0 pc=0x1000ebf04
created by runtime.gcBgMarkStartWorkers
/usr/local/go/src/runtime/mgc.go:1199 +0x28
goroutine 51 [GC worker (idle)]:
runtime.gopark(0x0?, 0x0?, 0x0?, 0x0?, 0x0?)
/usr/local/go/src/runtime/proc.go:381 +0xe0 fp=0x140001f6740 sp=0x140001f6720 pc=0x1000bf3a0
runtime.gcBgMarkWorker()
/usr/local/go/src/runtime/mgc.go:1275 +0xe4 fp=0x140001f67d0 sp=0x140001f6740 pc=0x1000a3b94
runtime.goexit()
/usr/local/go/src/runtime/asm_arm64.s:1172 +0x4 fp=0x140001f67d0 sp=0x140001f67d0 pc=0x1000ebf04
created by runtime.gcBgMarkStartWorkers
/usr/local/go/src/runtime/mgc.go:1199 +0x28
goroutine 6 [GC worker (idle)]:
runtime.gopark(0x140000e8000?, 0x1400008c240?, 0x0?, 0x0?, 0x0?)
/usr/local/go/src/runtime/proc.go:381 +0xe0 fp=0x14000046740 sp=0x14000046720 pc=0x1000bf3a0
runtime.gcBgMarkWorker()
/usr/local/go/src/runtime/mgc.go:1275 +0xe4 fp=0x140000467d0 sp=0x14000046740 pc=0x1000a3b94
runtime.goexit()
/usr/local/go/src/runtime/asm_arm64.s:1172 +0x4 fp=0x140000467d0 sp=0x140000467d0 pc=0x1000ebf04
created by runtime.gcBgMarkStartWorkers
/usr/local/go/src/runtime/mgc.go:1199 +0x28
goroutine 7 [GC worker (idle)]:
runtime.gopark(0x0?, 0x0?, 0x0?, 0x0?, 0x0?)
/usr/local/go/src/runtime/proc.go:381 +0xe0 fp=0x1400004cf40 sp=0x1400004cf20 pc=0x1000bf3a0
runtime.gcBgMarkWorker()
/usr/local/go/src/runtime/mgc.go:1275 +0xe4 fp=0x1400004cfd0 sp=0x1400004cf40 pc=0x1000a3b94
runtime.goexit()
/usr/local/go/src/runtime/asm_arm64.s:1172 +0x4 fp=0x1400004cfd0 sp=0x1400004cfd0 pc=0x1000ebf04
created by runtime.gcBgMarkStartWorkers
/usr/local/go/src/runtime/mgc.go:1199 +0x28
goroutine 8 [GC worker (idle)]:
runtime.gopark(0x4cdd7e72e0c20?, 0x0?, 0x0?, 0x0?, 0x0?)
/usr/local/go/src/runtime/proc.go:381 +0xe0 fp=0x1400004d740 sp=0x1400004d720 pc=0x1000bf3a0
runtime.gcBgMarkWorker()
/usr/local/go/src/runtime/mgc.go:1275 +0xe4 fp=0x1400004d7d0 sp=0x1400004d740 pc=0x1000a3b94
runtime.goexit()
/usr/local/go/src/runtime/asm_arm64.s:1172 +0x4 fp=0x1400004d7d0 sp=0x1400004d7d0 pc=0x1000ebf04
created by runtime.gcBgMarkStartWorkers
/usr/local/go/src/runtime/mgc.go:1199 +0x28
goroutine 52 [GC worker (idle)]:
runtime.gopark(0x4cdd7e72df362?, 0x0?, 0x0?, 0x0?, 0x0?)
/usr/local/go/src/runtime/proc.go:381 +0xe0 fp=0x140001f6f40 sp=0x140001f6f20 pc=0x1000bf3a0
runtime.gcBgMarkWorker()
/usr/local/go/src/runtime/mgc.go:1275 +0xe4 fp=0x140001f6fd0 sp=0x140001f6f40 pc=0x1000a3b94
runtime.goexit()
/usr/local/go/src/runtime/asm_arm64.s:1172 +0x4 fp=0x140001f6fd0 sp=0x140001f6fd0 pc=0x1000ebf04
created by runtime.gcBgMarkStartWorkers
/usr/local/go/src/runtime/mgc.go:1199 +0x28
goroutine 9 [GC worker (idle)]:
runtime.gopark(0x4cdd7e72d8b8b?, 0x0?, 0x0?, 0x0?, 0x0?)
/usr/local/go/src/runtime/proc.go:381 +0xe0 fp=0x1400004df40 sp=0x1400004df20 pc=0x1000bf3a0
runtime.gcBgMarkWorker()
/usr/local/go/src/runtime/mgc.go:1275 +0xe4 fp=0x1400004dfd0 sp=0x1400004df40 pc=0x1000a3b94
runtime.goexit()
/usr/local/go/src/runtime/asm_arm64.s:1172 +0x4 fp=0x1400004dfd0 sp=0x1400004dfd0 pc=0x1000ebf04
created by runtime.gcBgMarkStartWorkers
/usr/local/go/src/runtime/mgc.go:1199 +0x28
r0 0x4
r1 0x0
r2 0x0
r3 0x16fd720c8
r4 0x40
r5 0x16fd720a0
r6 0x0
r7 0x4cdda3d4f89b0
r8 0x10025b9e0
r9 0x1
r10 0x1
r11 0x5
r12 0x0
r13 0x16fd71fd0
r14 0x100
r15 0x0
r16 0x16b
r17 0x1a6396058
r18 0x0
r19 0x16fd728b8
r20 0x16fd72040
r21 0x3
r22 0x1000ebf04
r23 0x140000cbe30
r24 0x16fd72b60
r25 0x1
r26 0x1001acba8
r27 0x10023c000
r28 0x10025b3c0
r29 0x16fd71fb8
lr 0x1000ed0a8
sp 0x16fd71fc0
pc 0x1a6396060
fault 0x1a6396060
Describe the bug
When my model returns
tea.Quit, sometimes, maybe 10% of the time, it won't actually quit. I was able to dump the goroutine stacks when it was hanging by sending it the ABRT signal and saw that it was blocking on this line:bubbletea/standard_renderer.go
Line 99 in d1a16bd
Setup
Please complete the following information along with version numbers, if applicable.
To Reproduce
Run the following program. As soon as it starts, you can hit q to quit it. You might need to do this 10-20 times to get it to eventually hang when quitting.
goroutine 0 [idle]: runtime.kevent(0x5, 0x0, 0x0, 0x16fd720c8, 0x40, 0x16fd720a0) /usr/local/go/src/runtime/sys_darwin.go:453 +0x20 fp=0x16fd72040 sp=0x16fd72020 pc=0x1000db180 runtime.netpoll(0xf6c9c6) /usr/local/go/src/runtime/netpoll_kqueue.go:130 +0xfc fp=0x16fd728d0 sp=0x16fd72040 pc=0x1000b978c runtime.findRunnable() /usr/local/go/src/runtime/proc.go:2971 +0x840 fp=0x16fd729d0 sp=0x16fd728d0 pc=0x1000c49d0 runtime.schedule() /usr/local/go/src/runtime/proc.go:3360 +0x98 fp=0x16fd72a10 sp=0x16fd729d0 pc=0x1000c5cf8 runtime.goexit0(0x14000106d00) /usr/local/go/src/runtime/proc.go:3687 +0x2ec fp=0x16fd72a50 sp=0x16fd72a10 pc=0x1000c6c2c runtime.mcall() /usr/local/go/src/runtime/asm_arm64.s:192 +0x54 fp=0x16fd72a60 sp=0x16fd72a50 pc=0x1000e9a24 goroutine 1 [chan send]: runtime.gopark(0x4?, 0x8?, 0x0?, 0x0?, 0x4?) /usr/local/go/src/runtime/proc.go:381 +0xe0 fp=0x140000cb9b0 sp=0x140000cb990 pc=0x1000bf3a0 runtime.chansend(0x1400008c2a0, 0x140000cba88, 0x1, 0x10001400009e340?) /usr/local/go/src/runtime/chan.go:259 +0x42c fp=0x140000cba40 sp=0x140000cb9b0 pc=0x10009087c runtime.chansend1(0x4?, 0x1001a76e0?) /usr/local/go/src/runtime/chan.go:145 +0x18 fp=0x140000cba70 sp=0x140000cba40 pc=0x100090438 github.com/charmbracelet/bubbletea.(*standardRenderer).stop.func1() /Users/collin/go/pkg/mod/github.com/charmbracelet/bubbletea@v0.24.0/standard_renderer.go:99 +0x28 fp=0x140000cba90 sp=0x140000cba70 pc=0x10014c5a8 sync.(*Once).doSlow(0x1001ad418?, 0x140000a4010?) /usr/local/go/src/sync/once.go:74 +0x100 fp=0x140000cbaf0 sp=0x140000cba90 pc=0x1000f0530 sync.(*Once).Do(...) /usr/local/go/src/sync/once.go:65 github.com/charmbracelet/bubbletea.(*standardRenderer).stop(0x140000d60b0) /Users/collin/go/pkg/mod/github.com/charmbracelet/bubbletea@v0.24.0/standard_renderer.go:98 +0x140 fp=0x140000cbc30 sp=0x140000cbaf0 pc=0x10014c4d0 github.com/charmbracelet/bubbletea.(*Program).shutdown(0x140000e8000, 0x4?) /Users/collin/go/pkg/mod/github.com/charmbracelet/bubbletea@v0.24.0/tea.go:592 +0x48 fp=0x140000cbc50 sp=0x140000cbc30 pc=0x100152228 github.com/charmbracelet/bubbletea.(*Program).Run(0x140000e8000) /Users/collin/go/pkg/mod/github.com/charmbracelet/bubbletea@v0.24.0/tea.go:524 +0x838 fp=0x140000cbee0 sp=0x140000cbc50 pc=0x100151d08 main.main() /Users/collin/code/bubble-text/main.go:18 +0x64 fp=0x140000cbf70 sp=0x140000cbee0 pc=0x100153894 runtime.main() /usr/local/go/src/runtime/proc.go:250 +0x200 fp=0x140000cbfd0 sp=0x140000cbf70 pc=0x1000bef90 runtime.goexit() /usr/local/go/src/runtime/asm_arm64.s:1172 +0x4 fp=0x140000cbfd0 sp=0x140000cbfd0 pc=0x1000ebf04 goroutine 2 [force gc (idle)]: runtime.gopark(0x0?, 0x0?, 0x0?, 0x0?, 0x0?) /usr/local/go/src/runtime/proc.go:381 +0xe0 fp=0x1400004afa0 sp=0x1400004af80 pc=0x1000bf3a0 runtime.goparkunlock(...) /usr/local/go/src/runtime/proc.go:387 runtime.forcegchelper() /usr/local/go/src/runtime/proc.go:305 +0xb0 fp=0x1400004afd0 sp=0x1400004afa0 pc=0x1000bf1f0 runtime.goexit() /usr/local/go/src/runtime/asm_arm64.s:1172 +0x4 fp=0x1400004afd0 sp=0x1400004afd0 pc=0x1000ebf04 created by runtime.init.6 /usr/local/go/src/runtime/proc.go:293 +0x24 goroutine 3 [GC sweep wait]: runtime.gopark(0x1?, 0x0?, 0x0?, 0x0?, 0x0?) /usr/local/go/src/runtime/proc.go:381 +0xe0 fp=0x1400004b760 sp=0x1400004b740 pc=0x1000bf3a0 runtime.goparkunlock(...) /usr/local/go/src/runtime/proc.go:387 runtime.bgsweep(0x0?) /usr/local/go/src/runtime/mgcsweep.go:319 +0x100 fp=0x1400004b7b0 sp=0x1400004b760 pc=0x1000acdc0 runtime.gcenable.func1() /usr/local/go/src/runtime/mgc.go:178 +0x28 fp=0x1400004b7d0 sp=0x1400004b7b0 pc=0x1000a2038 runtime.goexit() /usr/local/go/src/runtime/asm_arm64.s:1172 +0x4 fp=0x1400004b7d0 sp=0x1400004b7d0 pc=0x1000ebf04 created by runtime.gcenable /usr/local/go/src/runtime/mgc.go:178 +0x6c goroutine 4 [GC scavenge wait]: runtime.gopark(0x20d5be48?, 0x20ca53a8?, 0x0?, 0x0?, 0x0?) /usr/local/go/src/runtime/proc.go:381 +0xe0 fp=0x1400004bf50 sp=0x1400004bf30 pc=0x1000bf3a0 runtime.goparkunlock(...) /usr/local/go/src/runtime/proc.go:387 runtime.(*scavengerState).park(0x10025b240) /usr/local/go/src/runtime/mgcscavenge.go:400 +0x5c fp=0x1400004bf80 sp=0x1400004bf50 pc=0x1000aac8c runtime.bgscavenge(0x0?) /usr/local/go/src/runtime/mgcscavenge.go:633 +0xa8 fp=0x1400004bfb0 sp=0x1400004bf80 pc=0x1000ab248 runtime.gcenable.func2() /usr/local/go/src/runtime/mgc.go:179 +0x28 fp=0x1400004bfd0 sp=0x1400004bfb0 pc=0x1000a1fd8 runtime.goexit() /usr/local/go/src/runtime/asm_arm64.s:1172 +0x4 fp=0x1400004bfd0 sp=0x1400004bfd0 pc=0x1000ebf04 created by runtime.gcenable /usr/local/go/src/runtime/mgc.go:179 +0xac goroutine 17 [finalizer wait]: runtime.gopark(0x1400004a5a8?, 0x6000010009ffe8?, 0x48?, 0x5a?, 0x1?) /usr/local/go/src/runtime/proc.go:381 +0xe0 fp=0x1400004a580 sp=0x1400004a560 pc=0x1000bf3a0 runtime.runfinq() /usr/local/go/src/runtime/mfinal.go:193 +0x100 fp=0x1400004a7d0 sp=0x1400004a580 pc=0x1000a1100 runtime.goexit() /usr/local/go/src/runtime/asm_arm64.s:1172 +0x4 fp=0x1400004a7d0 sp=0x1400004a7d0 pc=0x1000ebf04 created by runtime.createfing /usr/local/go/src/runtime/mfinal.go:163 +0x80 goroutine 26 [GC worker (idle)]: runtime.gopark(0x14000046fa8?, 0x14000046f78?, 0x0?, 0x0?, 0x1?) /usr/local/go/src/runtime/proc.go:381 +0xe0 fp=0x14000046f40 sp=0x14000046f20 pc=0x1000bf3a0 runtime.gcBgMarkWorker() /usr/local/go/src/runtime/mgc.go:1275 +0xe4 fp=0x14000046fd0 sp=0x14000046f40 pc=0x1000a3b94 runtime.goexit() /usr/local/go/src/runtime/asm_arm64.s:1172 +0x4 fp=0x14000046fd0 sp=0x14000046fd0 pc=0x1000ebf04 created by runtime.gcBgMarkStartWorkers /usr/local/go/src/runtime/mgc.go:1199 +0x28 goroutine 5 [select, locked to thread]: runtime.gopark(0x1400004c7a0?, 0x2?, 0x88?, 0xc6?, 0x1400004c79c?) /usr/local/go/src/runtime/proc.go:381 +0xe0 fp=0x1400004c640 sp=0x1400004c620 pc=0x1000bf3a0 runtime.selectgo(0x1400004c7a0, 0x1400004c798, 0x0?, 0x0, 0x0?, 0x1) /usr/local/go/src/runtime/select.go:327 +0x68c fp=0x1400004c750 sp=0x1400004c640 pc=0x1000cef1c runtime.ensureSigM.func1() /usr/local/go/src/runtime/signal_unix.go:1000 +0x168 fp=0x1400004c7d0 sp=0x1400004c750 pc=0x1000e5688 runtime.goexit() /usr/local/go/src/runtime/asm_arm64.s:1172 +0x4 fp=0x1400004c7d0 sp=0x1400004c7d0 pc=0x1000ebf04 created by runtime.ensureSigM /usr/local/go/src/runtime/signal_unix.go:983 +0xd8 goroutine 20 [sync.Mutex.Lock]: runtime.gopark(0x1002626a0?, 0x1000db59c?, 0x20?, 0x21?, 0x1000daf04?) /usr/local/go/src/runtime/proc.go:381 +0xe0 fp=0x140000957f0 sp=0x140000957d0 pc=0x1000bf3a0 runtime.goparkunlock(...) /usr/local/go/src/runtime/proc.go:387 runtime.semacquire1(0x140000aa13c, 0x7d?, 0x3, 0x1, 0x7f?) /usr/local/go/src/runtime/sema.go:160 +0x20c fp=0x14000095850 sp=0x140000957f0 pc=0x1000cfdfc sync.runtime_SemacquireMutex(0x0?, 0x0?, 0x0?) /usr/local/go/src/runtime/sema.go:77 +0x28 fp=0x14000095890 sp=0x14000095850 pc=0x1000e8128 sync.(*Mutex).lockSlow(0x140000aa138) /usr/local/go/src/sync/mutex.go:171 +0x174 fp=0x140000958e0 sp=0x14000095890 pc=0x1000f0124 sync.(*Mutex).Lock(...) /usr/local/go/src/sync/mutex.go:90 github.com/charmbracelet/bubbletea.(*standardRenderer).flush(0x140000d60b0?) /Users/collin/go/pkg/mod/github.com/charmbracelet/bubbletea@v0.24.0/standard_renderer.go:136 +0x88 fp=0x14000095f40 sp=0x140000958e0 pc=0x10014c968 github.com/charmbracelet/bubbletea.(*standardRenderer).listen(0x140000d60b0) /Users/collin/go/pkg/mod/github.com/charmbracelet/bubbletea@v0.24.0/standard_renderer.go:129 +0x28 fp=0x14000095fb0 sp=0x14000095f40 pc=0x10014c868 github.com/charmbracelet/bubbletea.(*standardRenderer).start.func1() /Users/collin/go/pkg/mod/github.com/charmbracelet/bubbletea@v0.24.0/standard_renderer.go:86 +0x28 fp=0x14000095fd0 sp=0x14000095fb0 pc=0x10014c358 runtime.goexit() /usr/local/go/src/runtime/asm_arm64.s:1172 +0x4 fp=0x14000095fd0 sp=0x14000095fd0 pc=0x1000ebf04 created by github.com/charmbracelet/bubbletea.(*standardRenderer).start /Users/collin/go/pkg/mod/github.com/charmbracelet/bubbletea@v0.24.0/standard_renderer.go:86 +0xb4 goroutine 34 [syscall]: runtime.sigNoteSleep(0x0) /usr/local/go/src/runtime/os_darwin.go:123 +0x20 fp=0x1400010c790 sp=0x1400010c750 pc=0x1000b9d70 os/signal.signal_recv() /usr/local/go/src/runtime/sigqueue.go:149 +0x2c fp=0x1400010c7b0 sp=0x1400010c790 pc=0x1000e835c os/signal.loop() /usr/local/go/src/os/signal/signal_unix.go:23 +0x1c fp=0x1400010c7d0 sp=0x1400010c7b0 pc=0x10014716c runtime.goexit() /usr/local/go/src/runtime/asm_arm64.s:1172 +0x4 fp=0x1400010c7d0 sp=0x1400010c7d0 pc=0x1000ebf04 created by os/signal.Notify.func1.1 /usr/local/go/src/os/signal/signal.go:151 +0x28 goroutine 25 [GC worker (idle)]: runtime.gopark(0x140000d60b0?, 0x14000047780?, 0x0?, 0x0?, 0x0?) /usr/local/go/src/runtime/proc.go:381 +0xe0 fp=0x14000047740 sp=0x14000047720 pc=0x1000bf3a0 runtime.gcBgMarkWorker() /usr/local/go/src/runtime/mgc.go:1275 +0xe4 fp=0x140000477d0 sp=0x14000047740 pc=0x1000a3b94 runtime.goexit() /usr/local/go/src/runtime/asm_arm64.s:1172 +0x4 fp=0x140000477d0 sp=0x140000477d0 pc=0x1000ebf04 created by runtime.gcBgMarkStartWorkers /usr/local/go/src/runtime/mgc.go:1199 +0x28 goroutine 51 [GC worker (idle)]: runtime.gopark(0x0?, 0x0?, 0x0?, 0x0?, 0x0?) /usr/local/go/src/runtime/proc.go:381 +0xe0 fp=0x140001f6740 sp=0x140001f6720 pc=0x1000bf3a0 runtime.gcBgMarkWorker() /usr/local/go/src/runtime/mgc.go:1275 +0xe4 fp=0x140001f67d0 sp=0x140001f6740 pc=0x1000a3b94 runtime.goexit() /usr/local/go/src/runtime/asm_arm64.s:1172 +0x4 fp=0x140001f67d0 sp=0x140001f67d0 pc=0x1000ebf04 created by runtime.gcBgMarkStartWorkers /usr/local/go/src/runtime/mgc.go:1199 +0x28 goroutine 6 [GC worker (idle)]: runtime.gopark(0x140000e8000?, 0x1400008c240?, 0x0?, 0x0?, 0x0?) /usr/local/go/src/runtime/proc.go:381 +0xe0 fp=0x14000046740 sp=0x14000046720 pc=0x1000bf3a0 runtime.gcBgMarkWorker() /usr/local/go/src/runtime/mgc.go:1275 +0xe4 fp=0x140000467d0 sp=0x14000046740 pc=0x1000a3b94 runtime.goexit() /usr/local/go/src/runtime/asm_arm64.s:1172 +0x4 fp=0x140000467d0 sp=0x140000467d0 pc=0x1000ebf04 created by runtime.gcBgMarkStartWorkers /usr/local/go/src/runtime/mgc.go:1199 +0x28 goroutine 7 [GC worker (idle)]: runtime.gopark(0x0?, 0x0?, 0x0?, 0x0?, 0x0?) /usr/local/go/src/runtime/proc.go:381 +0xe0 fp=0x1400004cf40 sp=0x1400004cf20 pc=0x1000bf3a0 runtime.gcBgMarkWorker() /usr/local/go/src/runtime/mgc.go:1275 +0xe4 fp=0x1400004cfd0 sp=0x1400004cf40 pc=0x1000a3b94 runtime.goexit() /usr/local/go/src/runtime/asm_arm64.s:1172 +0x4 fp=0x1400004cfd0 sp=0x1400004cfd0 pc=0x1000ebf04 created by runtime.gcBgMarkStartWorkers /usr/local/go/src/runtime/mgc.go:1199 +0x28 goroutine 8 [GC worker (idle)]: runtime.gopark(0x4cdd7e72e0c20?, 0x0?, 0x0?, 0x0?, 0x0?) /usr/local/go/src/runtime/proc.go:381 +0xe0 fp=0x1400004d740 sp=0x1400004d720 pc=0x1000bf3a0 runtime.gcBgMarkWorker() /usr/local/go/src/runtime/mgc.go:1275 +0xe4 fp=0x1400004d7d0 sp=0x1400004d740 pc=0x1000a3b94 runtime.goexit() /usr/local/go/src/runtime/asm_arm64.s:1172 +0x4 fp=0x1400004d7d0 sp=0x1400004d7d0 pc=0x1000ebf04 created by runtime.gcBgMarkStartWorkers /usr/local/go/src/runtime/mgc.go:1199 +0x28 goroutine 52 [GC worker (idle)]: runtime.gopark(0x4cdd7e72df362?, 0x0?, 0x0?, 0x0?, 0x0?) /usr/local/go/src/runtime/proc.go:381 +0xe0 fp=0x140001f6f40 sp=0x140001f6f20 pc=0x1000bf3a0 runtime.gcBgMarkWorker() /usr/local/go/src/runtime/mgc.go:1275 +0xe4 fp=0x140001f6fd0 sp=0x140001f6f40 pc=0x1000a3b94 runtime.goexit() /usr/local/go/src/runtime/asm_arm64.s:1172 +0x4 fp=0x140001f6fd0 sp=0x140001f6fd0 pc=0x1000ebf04 created by runtime.gcBgMarkStartWorkers /usr/local/go/src/runtime/mgc.go:1199 +0x28 goroutine 9 [GC worker (idle)]: runtime.gopark(0x4cdd7e72d8b8b?, 0x0?, 0x0?, 0x0?, 0x0?) /usr/local/go/src/runtime/proc.go:381 +0xe0 fp=0x1400004df40 sp=0x1400004df20 pc=0x1000bf3a0 runtime.gcBgMarkWorker() /usr/local/go/src/runtime/mgc.go:1275 +0xe4 fp=0x1400004dfd0 sp=0x1400004df40 pc=0x1000a3b94 runtime.goexit() /usr/local/go/src/runtime/asm_arm64.s:1172 +0x4 fp=0x1400004dfd0 sp=0x1400004dfd0 pc=0x1000ebf04 created by runtime.gcBgMarkStartWorkers /usr/local/go/src/runtime/mgc.go:1199 +0x28 r0 0x4 r1 0x0 r2 0x0 r3 0x16fd720c8 r4 0x40 r5 0x16fd720a0 r6 0x0 r7 0x4cdda3d4f89b0 r8 0x10025b9e0 r9 0x1 r10 0x1 r11 0x5 r12 0x0 r13 0x16fd71fd0 r14 0x100 r15 0x0 r16 0x16b r17 0x1a6396058 r18 0x0 r19 0x16fd728b8 r20 0x16fd72040 r21 0x3 r22 0x1000ebf04 r23 0x140000cbe30 r24 0x16fd72b60 r25 0x1 r26 0x1001acba8 r27 0x10023c000 r28 0x10025b3c0 r29 0x16fd71fb8 lr 0x1000ed0a8 sp 0x16fd71fc0 pc 0x1a6396060 fault 0x1a6396060