diff options
author | Takashi Kokubun <takashikkbn@gmail.com> | 2020-11-26 20:08:20 -0800 |
---|---|---|
committer | Takashi Kokubun <takashikkbn@gmail.com> | 2020-11-26 20:09:57 -0800 |
commit | 4dbf6f1e515bd6a3b03ba9edccabccb780c3f789 (patch) | |
tree | d4d946ab3de0380997fb06da0039d2341d007f25 | |
parent | 82541df081393198dd9265ed12d6cc7cc32915a0 (diff) |
Call rb_bug_without_die on CI
when GC.compact's SEGV handler is installed
-rw-r--r-- | error.c | 12 | ||||
-rw-r--r-- | gc.c | 7 |
2 files changed, 16 insertions, 3 deletions
@@ -733,17 +733,25 @@ die(void) } void -rb_bug(const char *fmt, ...) +rb_bug_without_die(const char *fmt, ...) { const char *file = NULL; int line = 0; if (GET_EC()) { - file = rb_source_location_cstr(&line); + file = rb_source_location_cstr(&line); } report_bug(file, line, fmt, NULL); +} +void +rb_bug(const char *fmt, ...) +{ + va_list args; + va_start(args, fmt); + rb_bug_without_die(fmt, args); + va_end(args); die(); } @@ -4597,7 +4597,12 @@ static struct sigaction old_sigsegv_handler; static void read_barrier_signal(int sig, siginfo_t * info, void * data) { - read_barrier_handler((intptr_t)info->si_addr); + extern int ruby_on_ci; + if (ruby_on_ci) { // read_barrier_handler may crash. Report a backtrace first on CI. + extern void rb_bug_without_die(const char *fmt, ...); + rb_bug_without_die("died with read_barrier_signal installed"); + } + read_barrier_handler((intptr_t)info->si_addr); } static void uninstall_handlers(void) |