signal handlers not async signal safe
Summary
Signal handlers are highly constrained in what functions they can call. In particular, they can't malloc or free because mutexes in glibc may already be held by the interrupted thread, resulting in a deadlock. See https://man7.org/linux/man-pages/man7/signal-safety.7.html.
Our signal handlers (in Signals.c) end up calling fprintf and vfprintf in at least rtsSysErrorMsgFn and the libdw backtrace code. I think in practice this is fine, so long as you don't try to format floats.
Chromium have a BSD-ish licensed safe_sprintf in C++ here: https://chromium.googlesource.com/chromium/src/base/+/master/strings/safe_sprintf.h
I understand mysql has one too, but I haven't looked for it.
EDIT: On further investigation, the dwarf backtrace (in Libdw.c) code calls malloc/free. I haven't investigated whether libdw call's malloc internally.
Environment
- GHC version used: master
Optional:
- Operating System: Linux
- System Architecture: