schollz / miti

miti is a musical instrument textual interface. Basically, its MIDI, but with human-readable text. :musical_note:
https://schollz.com/blog/miti/
MIT License
168 stars 4 forks source link

Panic and segfault on macOS ctrl-C #12

Closed mkb218 closed 3 years ago

mkb218 commented 3 years ago

This is a really cool project! I love the low effort needed to get everything in my studio to make noise!

When I try the demo on macOS, I get a panic and the below stack trace when I ctrl-C to quit. If any notes are playing, they're stuck on:

^C[debug]   07:32:00 play.go:123: interrupt
[info]  2020/08/25 07:32:00 shutting down
[debug] 07:32:00 metronome.go:61: ..ticker stopped!
fatal error: unexpected signal during runtime execution
[signal SIGSEGV: segmentation violation code=0x1 addr=0x320 pc=0x42a4905]

runtime stack:
runtime.throw(0x41221a9, 0x2a)
    /usr/local/go/src/runtime/panic.go:1116 +0x72
runtime.sigpanic()
    /usr/local/go/src/runtime/signal_unix.go:704 +0x48c

goroutine 38 [syscall]:
runtime.cgocall(0x40e8140, 0xc000093950, 0xc000186900)
    /usr/local/go/src/runtime/cgocall.go:133 +0x5b fp=0xc000093920 sp=0xc0000938e8 pc=0x40051db
github.com/schollz/miti/src/portmidi._Cfunc_Pm_Write(0x4402b20, 0xc000158148, 0x1, 0x0)
    _cgo_gotypes.go:297 +0x4d fp=0xc000093950 sp=0xc000093920 pc=0x40dce0d
github.com/schollz/miti/src/portmidi.(*Stream).Write.func1(0xc00009c000, 0xc000158148, 0x1, 0x1, 0x1, 0xc0000939c8)
    /Users/mkb/go/src/github.com/schollz/miti/src/portmidi/stream.go:120 +0x73 fp=0xc000093988 sp=0xc000093950 pc=0x40dded3
github.com/schollz/miti/src/portmidi.(*Stream).Write(0xc00009c000, 0xc0000939f8, 0x1, 0x1, 0x0, 0x40fca20)
    /Users/mkb/go/src/github.com/schollz/miti/src/portmidi/stream.go:120 +0xca fp=0xc0000939c8 sp=0xc000093988 pc=0x40dd74a
github.com/schollz/miti/src/portmidi.(*Stream).WriteShort(0xc00009c000, 0x80, 0x40, 0x0, 0x0, 0x0)
    /Users/mkb/go/src/github.com/schollz/miti/src/portmidi/stream.go:131 +0x85 fp=0xc000093a28 sp=0xc0000939c8 pc=0x40dd845
github.com/schollz/miti/src/midi.Init.func2(0xc0001ae1a8, 0x4, 0xc, 0x3)
    /Users/mkb/go/src/github.com/schollz/miti/src/midi/midi.go:77 +0x25d fp=0xc000093fc0 sp=0xc000093a28 pc=0x40df5bd
runtime.goexit()
    /usr/local/go/src/runtime/asm_amd64.s:1374 +0x1 fp=0xc000093fc8 sp=0xc000093fc0 pc=0x4068841
created by github.com/schollz/miti/src/midi.Init
    /Users/mkb/go/src/github.com/schollz/miti/src/midi/midi.go:50 +0x41b

goroutine 1 [chan receive]:
github.com/schollz/miti/src/play.Play(0xc0000a8000, 0x24, 0x4123500, 0x66, 0xc00003ef58)
    /Users/mkb/go/src/github.com/schollz/miti/src/play/play.go:151 +0x5c5
main.main()
    /Users/mkb/go/src/github.com/schollz/miti/main.go:55 +0x218

goroutine 35 [semacquire]:
sync.runtime_SemacquireMutex(0x421a6d4, 0x400c700, 0x1)
    /usr/local/go/src/runtime/sema.go:71 +0x47
sync.(*Mutex).lockSlow(0x421a6d0)
    /usr/local/go/src/sync/mutex.go:138 +0x105
sync.(*Mutex).Lock(...)
    /usr/local/go/src/sync/mutex.go:81
github.com/schollz/miti/src/midi.Init.func2(0xc0001ae160, 0x10, 0x9, 0x0)
    /Users/mkb/go/src/github.com/schollz/miti/src/midi/midi.go:74 +0xafe
created by github.com/schollz/miti/src/midi.Init
    /Users/mkb/go/src/github.com/schollz/miti/src/midi/midi.go:50 +0x41b

goroutine 36 [semacquire]:
sync.runtime_SemacquireMutex(0x421a6d4, 0x400c700, 0x1)
    /usr/local/go/src/runtime/sema.go:71 +0x47
sync.(*Mutex).lockSlow(0x421a6d0)
    /usr/local/go/src/sync/mutex.go:138 +0x105
sync.(*Mutex).Lock(...)
    /usr/local/go/src/sync/mutex.go:81
github.com/schollz/miti/src/midi.Init.func2(0xc0001ae178, 0x4, 0xa, 0x1)
    /Users/mkb/go/src/github.com/schollz/miti/src/midi/midi.go:74 +0xafe
created by github.com/schollz/miti/src/midi.Init
    /Users/mkb/go/src/github.com/schollz/miti/src/midi/midi.go:50 +0x41b

goroutine 37 [semacquire]:
sync.runtime_SemacquireMutex(0x421a6d4, 0x400c700, 0x1)
    /usr/local/go/src/runtime/sema.go:71 +0x47
sync.(*Mutex).lockSlow(0x421a6d0)
    /usr/local/go/src/sync/mutex.go:138 +0x105
sync.(*Mutex).Lock(...)
    /usr/local/go/src/sync/mutex.go:81
github.com/schollz/miti/src/midi.Init.func2(0xc0001ae190, 0x4, 0xb, 0x2)
    /Users/mkb/go/src/github.com/schollz/miti/src/midi/midi.go:74 +0xafe
created by github.com/schollz/miti/src/midi.Init
    /Users/mkb/go/src/github.com/schollz/miti/src/midi/midi.go:50 +0x41b

goroutine 39 [semacquire]:
sync.runtime_SemacquireMutex(0x421a6d4, 0x400c700, 0x1)
    /usr/local/go/src/runtime/sema.go:71 +0x47
sync.(*Mutex).lockSlow(0x421a6d0)
    /usr/local/go/src/sync/mutex.go:138 +0x105
sync.(*Mutex).Lock(...)
    /usr/local/go/src/sync/mutex.go:81
github.com/schollz/miti/src/midi.Init.func2(0xc0001ae1c0, 0x6, 0xd, 0x4)
    /Users/mkb/go/src/github.com/schollz/miti/src/midi/midi.go:74 +0xafe
created by github.com/schollz/miti/src/midi.Init
    /Users/mkb/go/src/github.com/schollz/miti/src/midi/midi.go:50 +0x41b

goroutine 40 [semacquire]:
sync.runtime_SemacquireMutex(0x421a6d4, 0x400c700, 0x1)
    /usr/local/go/src/runtime/sema.go:71 +0x47
sync.(*Mutex).lockSlow(0x421a6d0)
    /usr/local/go/src/sync/mutex.go:138 +0x105
sync.(*Mutex).Lock(...)
    /usr/local/go/src/sync/mutex.go:81
github.com/schollz/miti/src/midi.Init.func2(0xc0001ae1d8, 0x2, 0xe, 0x5)
    /Users/mkb/go/src/github.com/schollz/miti/src/midi/midi.go:74 +0xafe
created by github.com/schollz/miti/src/midi.Init
    /Users/mkb/go/src/github.com/schollz/miti/src/midi/midi.go:50 +0x41b

goroutine 41 [semacquire]:
sync.runtime_SemacquireMutex(0x421a6d4, 0x400c700, 0x1)
    /usr/local/go/src/runtime/sema.go:71 +0x47
sync.(*Mutex).lockSlow(0x421a6d0)
    /usr/local/go/src/sync/mutex.go:138 +0x105
sync.(*Mutex).Lock(...)
    /usr/local/go/src/sync/mutex.go:81
github.com/schollz/miti/src/midi.Init.func2(0xc0001b0100, 0x12, 0xf, 0x6)
    /Users/mkb/go/src/github.com/schollz/miti/src/midi/midi.go:74 +0xafe
created by github.com/schollz/miti/src/midi.Init
    /Users/mkb/go/src/github.com/schollz/miti/src/midi/midi.go:50 +0x41b

goroutine 42 [semacquire]:
sync.runtime_SemacquireMutex(0x421a6d4, 0x400c700, 0x1)
    /usr/local/go/src/runtime/sema.go:71 +0x47
sync.(*Mutex).lockSlow(0x421a6d0)
    /usr/local/go/src/sync/mutex.go:138 +0x105
sync.(*Mutex).Lock(...)
    /usr/local/go/src/sync/mutex.go:81
github.com/schollz/miti/src/midi.Init.func2(0xc0001ae200, 0xf, 0x10, 0x7)
    /Users/mkb/go/src/github.com/schollz/miti/src/midi/midi.go:74 +0xafe
created by github.com/schollz/miti/src/midi.Init
    /Users/mkb/go/src/github.com/schollz/miti/src/midi/midi.go:50 +0x41b

goroutine 51 [syscall]:
os/signal.signal_recv(0x4143ae0)
    /usr/local/go/src/runtime/sigqueue.go:144 +0x9d
os/signal.loop()
    /usr/local/go/src/os/signal/signal_unix.go:23 +0x25
created by os/signal.Notify.func1.1
    /usr/local/go/src/os/signal/signal.go:150 +0x45

goroutine 52 [sleep]:
time.Sleep(0x2faf080)
    /usr/local/go/src/runtime/time.go:188 +0xbf
github.com/schollz/miti/src/play.Play.func2(0xc0000a2180, 0xc000098048, 0xc0000c0000, 0xc0000be060, 0xc0000be000)
    /Users/mkb/go/src/github.com/schollz/miti/src/play/play.go:128 +0xd9
created by github.com/schollz/miti/src/play.Play
    /Users/mkb/go/src/github.com/schollz/miti/src/play/play.go:120 +0x486

goroutine 53 [select]:
github.com/schollz/miti/src/play.hotReloadFile(0xc0000c0000, 0xc0000a8000, 0x24, 0xc0000be060, 0x0, 0x0)
    /Users/mkb/go/src/github.com/schollz/miti/src/play/play.go:159 +0x125
github.com/schollz/miti/src/play.Play.func3(0xc0000c0000, 0xc0000a8000, 0x24, 0xc0000be060, 0xc000192340)
    /Users/mkb/go/src/github.com/schollz/miti/src/play/play.go:143 +0x4d
created by github.com/schollz/miti/src/play.Play
    /Users/mkb/go/src/github.com/schollz/miti/src/play/play.go:142 +0x54d

I can try to dig more, but my Go and PortMIDI skills are a little rusty and time is short.

schollz commented 3 years ago

Thanks, I've seen this bug too. I think it has something to do with how portmidi is handling the graceful shutdown (I.e., its not).

Ideally, everything should gracefully shutdown on Ctl+C: https://github.com/schollz/miti/blob/4c3fddb98a0ef7eea85aec234f4affdfffda64a8/src/play/play.go#L117-L133

But its not happening sometimes and I haven't figured out why...yet... will keep you updated.

schollz commented 3 years ago

This is fixed now