Heavily concurrent pipelines sometimes corrupt memory while detaching signal handlers.
- Go 1.22 installed
- pkg-config installed
- gstreamer and glib installed where pkg-config can find them
go run .
This may compile a while (because of cgo) and then runs the program. This crashes pretty quickly on my machine.
After the first compilation, the cgo part is cached and it will compile faster.
(issue94:80736): GLib-GObject-CRITICAL **: 13:35:53.239: g_closure_ref: assertion 'closure->ref_count > 0' failed
(issue94:80736): GLib-GObject-CRITICAL **: 13:35:53.239: g_closure_unref: assertion 'closure->ref_count > 0' failed
.corrupted size vs. prev_size
SIGABRT: abort
PC=0x7fed51605e44 m=3 sigcode=18446744073709551610
signal arrived during cgo execution
(issue94:83391): GLib-GObject-CRITICAL **: 13:45:17.790: ../glib/gobject/gsignal.c:2685: instance '0x7bfd841e70f0' has no handler with id '3639'
The unreffing/invalidation of the closures is pretty complicated and a bit obfuscated by the fact that CGo calls the unrefs on our side. On closure invalidation (either by disconnecting the handler or other ways) cgo calls the attached finalizer (defined in the C part) that removes the closure from our map.