< 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 >