< prev index next >

src/os/posix/vm/vmError_posix.cpp

Print this page
rev 12508 : 8166944: Hanging Error Reporting steps may lead to torn error logs.
Reviewed-by: cjplummer, dholmes
Summary: Interupt error reporting if reporting steps hang to enable subsequent reporting steps to run.

*** 1,7 **** /* ! * Copyright (c) 2003, 2016, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. --- 1,7 ---- /* ! * Copyright (c) 2003, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation.
*** 57,66 **** --- 57,81 ---- // Space for our "saved" signal flags and handlers static int resettedSigflags[NUM_SIGNALS]; static address resettedSighandler[NUM_SIGNALS]; + // Needed for cancelable steps. + static volatile pthread_t reporter_thread_id; + + void VMError::reporting_started() { + // record pthread id of reporter thread. + reporter_thread_id = ::pthread_self(); + } + + void VMError::interrupt_reporting_thread() { + // We misuse SIGILL here, but it does not really matter. We need + // a signal which is handled by crash_handler and not likely to + // occurr during error reporting itself. + ::pthread_kill(reporter_thread_id, SIGILL); + } + static void save_signal(int idx, int sig) { struct sigaction sa; sigaction(sig, NULL, &sa); resettedSigflags[idx] = sa.sa_flags;
< prev index next >