提交 3e0b31ef 编写于 作者: F fparain

7060111: race condition in VMError::report_and_die()

Reviewed-by: zgu, coleenp
Contributed-by: volker.simonis@gmail.com
上级 f14bfa3b
/* /*
* Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
...@@ -799,6 +799,14 @@ void VMError::report(outputStream* st) { ...@@ -799,6 +799,14 @@ void VMError::report(outputStream* st) {
VMError* volatile VMError::first_error = NULL; VMError* volatile VMError::first_error = NULL;
volatile jlong VMError::first_error_tid = -1; volatile jlong VMError::first_error_tid = -1;
// An error could happen before tty is initialized or after it has been
// destroyed. Here we use a very simple unbuffered fdStream for printing.
// Only out.print_raw() and out.print_raw_cr() should be used, as other
// printing methods need to allocate large buffer on stack. To format a
// string, use jio_snprintf() with a static buffer or use staticBufferStream.
fdStream VMError::out(defaultStream::output_fd());
fdStream VMError::log; // error log used by VMError::report_and_die()
/** Expand a pattern into a buffer starting at pos and open a file using constructed path */ /** Expand a pattern into a buffer starting at pos and open a file using constructed path */
static int expand_and_open(const char* pattern, char* buf, size_t buflen, size_t pos) { static int expand_and_open(const char* pattern, char* buf, size_t buflen, size_t pos) {
int fd = -1; int fd = -1;
...@@ -853,13 +861,6 @@ void VMError::report_and_die() { ...@@ -853,13 +861,6 @@ void VMError::report_and_die() {
// Don't allocate large buffer on stack // Don't allocate large buffer on stack
static char buffer[O_BUFLEN]; static char buffer[O_BUFLEN];
// An error could happen before tty is initialized or after it has been
// destroyed. Here we use a very simple unbuffered fdStream for printing.
// Only out.print_raw() and out.print_raw_cr() should be used, as other
// printing methods need to allocate large buffer on stack. To format a
// string, use jio_snprintf() with a static buffer or use staticBufferStream.
static fdStream out(defaultStream::output_fd());
// How many errors occurred in error handler when reporting first_error. // How many errors occurred in error handler when reporting first_error.
static int recursive_error_count; static int recursive_error_count;
...@@ -868,7 +869,6 @@ void VMError::report_and_die() { ...@@ -868,7 +869,6 @@ void VMError::report_and_die() {
static bool out_done = false; // done printing to standard out static bool out_done = false; // done printing to standard out
static bool log_done = false; // done saving error log static bool log_done = false; // done saving error log
static bool transmit_report_done = false; // done error reporting static bool transmit_report_done = false; // done error reporting
static fdStream log; // error log
// disble NMT to avoid further exception // disble NMT to avoid further exception
MemTracker::shutdown(MemTracker::NMT_error_reporting); MemTracker::shutdown(MemTracker::NMT_error_reporting);
......
/* /*
* Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
...@@ -96,6 +96,9 @@ class VMError : public StackObj { ...@@ -96,6 +96,9 @@ class VMError : public StackObj {
return (id != OOM_MALLOC_ERROR) && (id != OOM_MMAP_ERROR); return (id != OOM_MALLOC_ERROR) && (id != OOM_MMAP_ERROR);
} }
static fdStream out;
static fdStream log; // error log used by VMError::report_and_die()
public: public:
// Constructor for crashes // Constructor for crashes
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册