# HG changeset patch # User erikj # Date 1458120537 -3600 # Node ID ad6eb2d954b9702350f552f73b7df690124e3860 # Parent f9c20e87f9ec6c8ad9cbfb4c1a8509be2036d1a1# Parent f9047a59010f03071de3edee798994a9af66ede7 Merge diff -r f9c20e87f9ec -r ad6eb2d954b9 hotspot/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/gc/shared/GCCause.java --- a/hotspot/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/gc/shared/GCCause.java Tue Mar 15 13:55:23 2016 +0100 +++ b/hotspot/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/gc/shared/GCCause.java Wed Mar 16 10:28:57 2016 +0100 @@ -35,6 +35,10 @@ _gc_locker ("GCLocker Initiated GC"), _heap_inspection ("Heap Inspection Initiated GC"), _heap_dump ("Heap Dump Initiated GC"), + _wb_young_gc ("WhiteBox Initiated Young GC"), + _wb_conc_mark ("WhiteBox Initiated Concurrent Mark"), + _update_allocation_context_stats_inc ("Update Allocation Context Stats"), + _update_allocation_context_stats_full ("Update Allocation Context Stats"), _no_gc ("No GC"), _no_cause_specified ("Unknown GCCause"), @@ -56,6 +60,9 @@ _g1_humongous_allocation ("G1 Humongous Allocation"), _last_ditch_collection ("Last ditch collection"), + + _dcmd_gc_run ("Diagnostic Command"), + _last_gc_cause ("ILLEGAL VALUE - last gc cause - ILLEGAL VALUE"); private final String value; diff -r f9c20e87f9ec -r ad6eb2d954b9 hotspot/src/os/aix/vm/os_aix.cpp --- a/hotspot/src/os/aix/vm/os_aix.cpp Tue Mar 15 13:55:23 2016 +0100 +++ b/hotspot/src/os/aix/vm/os_aix.cpp Wed Mar 16 10:28:57 2016 +0100 @@ -910,8 +910,8 @@ log_info(os, thread)("Thread started (pthread id: " UINTX_FORMAT ", attributes: %s). ", (uintx) tid, os::Posix::describe_pthread_attr(buf, sizeof(buf), &attr)); } else { - log_warning(os, thread)("Failed to start thread - pthread_create failed (%s) for attributes: %s.", - strerror(ret), os::Posix::describe_pthread_attr(buf, sizeof(buf), &attr)); + log_warning(os, thread)("Failed to start thread - pthread_create failed (%d=%s) for attributes: %s.", + ret, os::errno_name(ret), os::Posix::describe_pthread_attr(buf, sizeof(buf), &attr)); } pthread_attr_destroy(&attr); @@ -1178,7 +1178,7 @@ size_t os::lasterror(char *buf, size_t len) { if (errno == 0) return 0; - const char *s = ::strerror(errno); + const char *s = os::strerror(errno); size_t n = ::strlen(s); if (n >= len) { n = len - 1; @@ -1714,14 +1714,14 @@ if (os::Aix::on_aix()) { int rc = ::sem_post(&sig_sem); if (rc == -1 && !warn_only_once) { - trcVerbose("sem_post failed (errno = %d, %s)", errno, strerror(errno)); + trcVerbose("sem_post failed (errno = %d, %s)", errno, os::errno_name(errno)); warn_only_once = true; } } else { guarantee0(p_sig_msem != NULL); int rc = ::msem_unlock(p_sig_msem, 0); if (rc == -1 && !warn_only_once) { - trcVerbose("msem_unlock failed (errno = %d, %s)", errno, strerror(errno)); + trcVerbose("msem_unlock failed (errno = %d, %s)", errno, os::errno_name(errno)); warn_only_once = true; } } @@ -1732,14 +1732,14 @@ if (os::Aix::on_aix()) { int rc = ::sem_wait(&sig_sem); if (rc == -1 && !warn_only_once) { - trcVerbose("sem_wait failed (errno = %d, %s)", errno, strerror(errno)); + trcVerbose("sem_wait failed (errno = %d, %s)", errno, os::errno_name(errno)); warn_only_once = true; } } else { guarantee0(p_sig_msem != NULL); // must init before use int rc = ::msem_lock(p_sig_msem, 0); if (rc == -1 && !warn_only_once) { - trcVerbose("msem_lock failed (errno = %d, %s)", errno, strerror(errno)); + trcVerbose("msem_lock failed (errno = %d, %s)", errno, os::errno_name(errno)); warn_only_once = true; } } @@ -2203,7 +2203,7 @@ int err) { warning("INFO: os::commit_memory(" PTR_FORMAT ", " SIZE_FORMAT ", %d) failed; error='%s' (errno=%d)", addr, size, exec, - strerror(err), err); + os::errno_name(err), err); } #endif @@ -2412,7 +2412,7 @@ bool rc = ::mprotect(addr, size, prot) == 0 ? true : false; if (!rc) { - const char* const s_errno = strerror(errno); + const char* const s_errno = os::errno_name(errno); warning("mprotect(" PTR_FORMAT "-" PTR_FORMAT ", 0x%X) failed (%s).", addr, addr + size, prot, s_errno); return false; } @@ -2634,7 +2634,7 @@ if (ret != 0) { trcVerbose("Could not change priority for thread %d to %d (error %d, %s)", - (int)thr, newpri, ret, strerror(ret)); + (int)thr, newpri, ret, os::errno_name(ret)); } return (ret == 0) ? OS_OK : OS_ERR; } diff -r f9c20e87f9ec -r ad6eb2d954b9 hotspot/src/os/aix/vm/perfMemory_aix.cpp --- a/hotspot/src/os/aix/vm/perfMemory_aix.cpp Tue Mar 15 13:55:23 2016 +0100 +++ b/hotspot/src/os/aix/vm/perfMemory_aix.cpp Wed Mar 16 10:28:57 2016 +0100 @@ -30,6 +30,7 @@ #include "oops/oop.inline.hpp" #include "os_aix.inline.hpp" #include "runtime/handles.inline.hpp" +#include "runtime/os.hpp" #include "runtime/perfMemory.hpp" #include "services/memTracker.hpp" #include "utilities/exceptions.hpp" @@ -101,7 +102,7 @@ if (result == OS_ERR) { if (PrintMiscellaneous && Verbose) { warning("Could not create Perfdata save file: %s: %s\n", - destfile, strerror(errno)); + destfile, os::strerror(errno)); } } else { int fd = result; @@ -112,7 +113,7 @@ if (result == OS_ERR) { if (PrintMiscellaneous && Verbose) { warning("Could not write Perfdata save file: %s: %s\n", - destfile, strerror(errno)); + destfile, os::strerror(errno)); } break; } @@ -124,7 +125,7 @@ result = ::close(fd); if (PrintMiscellaneous && Verbose) { if (result == OS_ERR) { - warning("Could not close %s: %s\n", destfile, strerror(errno)); + warning("Could not close %s: %s\n", destfile, os::strerror(errno)); } } } @@ -397,7 +398,7 @@ if (errno == ELOOP) { warning("directory %s is a symlink and is not secure\n", dirname); } else { - warning("could not open directory %s: %s\n", dirname, strerror(errno)); + warning("could not open directory %s: %s\n", dirname, os::strerror(errno)); } } return dirp; @@ -507,7 +508,7 @@ RESTARTABLE(::fstat(fd, &statbuf), result); if (result == OS_ERR) { if (PrintMiscellaneous && Verbose) { - warning("fstat failed on %s: %s\n", filename, strerror(errno)); + warning("fstat failed on %s: %s\n", filename, os::strerror(errno)); } return false; } @@ -543,7 +544,7 @@ if (PrintMiscellaneous && Verbose) { if (result != 0) { warning("Could not retrieve passwd entry: %s\n", - strerror(result)); + os::strerror(result)); } else if (p == NULL) { // this check is added to protect against an observed problem @@ -557,7 +558,7 @@ // Bug Id 89052 was opened with RedHat. // warning("Could not retrieve passwd entry: %s\n", - strerror(errno)); + os::strerror(errno)); } else { warning("Could not determine user name: %s\n", @@ -593,7 +594,7 @@ "Process not found"); } else /* EPERM */ { - THROW_MSG_0(vmSymbols::java_io_IOException(), strerror(errno)); + THROW_MSG_0(vmSymbols::java_io_IOException(), os::strerror(errno)); } } @@ -746,7 +747,7 @@ if (PrintMiscellaneous && Verbose && result == OS_ERR) { if (errno != ENOENT) { warning("Could not unlink shared memory backing" - " store file %s : %s\n", path, strerror(errno)); + " store file %s : %s\n", path, os::strerror(errno)); } } } @@ -849,7 +850,7 @@ // if (PrintMiscellaneous && Verbose) { warning("could not create directory %s: %s\n", - dirname, strerror(errno)); + dirname, os::strerror(errno)); } return false; } @@ -900,7 +901,7 @@ if (errno == ELOOP) { warning("file %s is a symlink and is not secure\n", filename); } else { - warning("could not create file %s: %s\n", filename, strerror(errno)); + warning("could not create file %s: %s\n", filename, os::strerror(errno)); } } // Close the directory and reset the current working directory. @@ -924,7 +925,7 @@ RESTARTABLE(::ftruncate(fd, (off_t)0), result); if (result == OS_ERR) { if (PrintMiscellaneous && Verbose) { - warning("could not truncate shared memory file: %s\n", strerror(errno)); + warning("could not truncate shared memory file: %s\n", os::strerror(errno)); } ::close(fd); return -1; @@ -933,7 +934,7 @@ RESTARTABLE(::ftruncate(fd, (off_t)size), result); if (result == OS_ERR) { if (PrintMiscellaneous && Verbose) { - warning("could not set shared memory file size: %s\n", strerror(errno)); + warning("could not set shared memory file size: %s\n", os::strerror(errno)); } ::close(fd); return -1; @@ -968,7 +969,7 @@ "Permission denied"); } else { - THROW_MSG_0(vmSymbols::java_io_IOException(), strerror(errno)); + THROW_MSG_0(vmSymbols::java_io_IOException(), os::strerror(errno)); } } int fd = result; @@ -1041,7 +1042,7 @@ if (mapAddress == MAP_FAILED) { if (PrintMiscellaneous && Verbose) { - warning("mmap failed - %s\n", strerror(errno)); + warning("mmap failed - %s\n", os::strerror(errno)); } remove_file(filename); FREE_C_HEAP_ARRAY(char, filename); @@ -1109,7 +1110,7 @@ RESTARTABLE(::fstat(fd, &statbuf), result); if (result == OS_ERR) { if (PrintMiscellaneous && Verbose) { - warning("fstat failed: %s\n", strerror(errno)); + warning("fstat failed: %s\n", os::strerror(errno)); } THROW_MSG_0(vmSymbols::java_io_IOException(), "Could not determine PerfMemory size"); @@ -1231,7 +1232,7 @@ if (mapAddress == MAP_FAILED) { if (PrintMiscellaneous && Verbose) { - warning("mmap failed: %s\n", strerror(errno)); + warning("mmap failed: %s\n", os::strerror(errno)); } THROW_MSG(vmSymbols::java_lang_OutOfMemoryError(), "Could not map PerfMemory"); diff -r f9c20e87f9ec -r ad6eb2d954b9 hotspot/src/os/bsd/vm/os_bsd.cpp --- a/hotspot/src/os/bsd/vm/os_bsd.cpp Tue Mar 15 13:55:23 2016 +0100 +++ b/hotspot/src/os/bsd/vm/os_bsd.cpp Wed Mar 16 10:28:57 2016 +0100 @@ -789,7 +789,7 @@ (uintx) tid, os::Posix::describe_pthread_attr(buf, sizeof(buf), &attr)); } else { log_warning(os, thread)("Failed to start thread - pthread_create failed (%s) for attributes: %s.", - strerror(ret), os::Posix::describe_pthread_attr(buf, sizeof(buf), &attr)); + os::errno_name(ret), os::Posix::describe_pthread_attr(buf, sizeof(buf), &attr)); } pthread_attr_destroy(&attr); @@ -1122,7 +1122,7 @@ size_t os::lasterror(char *buf, size_t len) { if (errno == 0) return 0; - const char *s = ::strerror(errno); + const char *s = os::strerror(errno); size_t n = ::strlen(s); if (n >= len) { n = len - 1; @@ -2141,7 +2141,7 @@ int err) { warning("INFO: os::commit_memory(" PTR_FORMAT ", " SIZE_FORMAT ", %d) failed; error='%s' (errno=%d)", addr, size, exec, - strerror(err), err); + os::errno_name(err), err); } // NOTE: Bsd kernel does not really reserve the pages for us. @@ -3422,7 +3422,7 @@ Bsd::set_page_size(getpagesize()); if (Bsd::page_size() == -1) { - fatal("os_bsd.cpp: os::init: sysconf failed (%s)", strerror(errno)); + fatal("os_bsd.cpp: os::init: sysconf failed (%s)", os::strerror(errno)); } init_page_sizes((size_t) Bsd::page_size()); diff -r f9c20e87f9ec -r ad6eb2d954b9 hotspot/src/os/bsd/vm/perfMemory_bsd.cpp --- a/hotspot/src/os/bsd/vm/perfMemory_bsd.cpp Tue Mar 15 13:55:23 2016 +0100 +++ b/hotspot/src/os/bsd/vm/perfMemory_bsd.cpp Wed Mar 16 10:28:57 2016 +0100 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 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 @@ -29,6 +29,7 @@ #include "oops/oop.inline.hpp" #include "os_bsd.inline.hpp" #include "runtime/handles.inline.hpp" +#include "runtime/os.hpp" #include "runtime/perfMemory.hpp" #include "services/memTracker.hpp" #include "utilities/exceptions.hpp" @@ -100,7 +101,7 @@ if (result == OS_ERR) { if (PrintMiscellaneous && Verbose) { warning("Could not create Perfdata save file: %s: %s\n", - destfile, strerror(errno)); + destfile, os::strerror(errno)); } } else { int fd = result; @@ -111,7 +112,7 @@ if (result == OS_ERR) { if (PrintMiscellaneous && Verbose) { warning("Could not write Perfdata save file: %s: %s\n", - destfile, strerror(errno)); + destfile, os::strerror(errno)); } break; } @@ -123,7 +124,7 @@ result = ::close(fd); if (PrintMiscellaneous && Verbose) { if (result == OS_ERR) { - warning("Could not close %s: %s\n", destfile, strerror(errno)); + warning("Could not close %s: %s\n", destfile, os::strerror(errno)); } } } @@ -309,7 +310,7 @@ if (errno == ELOOP) { warning("directory %s is a symlink and is not secure\n", dirname); } else { - warning("could not open directory %s: %s\n", dirname, strerror(errno)); + warning("could not open directory %s: %s\n", dirname, os::strerror(errno)); } } return dirp; @@ -420,7 +421,7 @@ RESTARTABLE(::fstat(fd, &statbuf), result); if (result == OS_ERR) { if (PrintMiscellaneous && Verbose) { - warning("fstat failed on %s: %s\n", filename, strerror(errno)); + warning("fstat failed on %s: %s\n", filename, os::strerror(errno)); } return false; } @@ -459,7 +460,7 @@ if (PrintMiscellaneous && Verbose) { if (result != 0) { warning("Could not retrieve passwd entry: %s\n", - strerror(result)); + os::strerror(result)); } else if (p == NULL) { // this check is added to protect against an observed problem @@ -473,7 +474,7 @@ // Bug Id 89052 was opened with RedHat. // warning("Could not retrieve passwd entry: %s\n", - strerror(errno)); + os::strerror(errno)); } else { warning("Could not determine user name: %s\n", @@ -509,7 +510,7 @@ "Process not found"); } else /* EPERM */ { - THROW_MSG_0(vmSymbols::java_io_IOException(), strerror(errno)); + THROW_MSG_0(vmSymbols::java_io_IOException(), os::strerror(errno)); } } @@ -652,7 +653,7 @@ if (PrintMiscellaneous && Verbose && result == OS_ERR) { if (errno != ENOENT) { warning("Could not unlink shared memory backing" - " store file %s : %s\n", path, strerror(errno)); + " store file %s : %s\n", path, os::strerror(errno)); } } } @@ -762,7 +763,7 @@ // if (PrintMiscellaneous && Verbose) { warning("could not create directory %s: %s\n", - dirname, strerror(errno)); + dirname, os::strerror(errno)); } return false; } @@ -804,7 +805,7 @@ if (errno == ELOOP) { warning("file %s is a symlink and is not secure\n", filename); } else { - warning("could not create file %s: %s\n", filename, strerror(errno)); + warning("could not create file %s: %s\n", filename, os::strerror(errno)); } } // close the directory and reset the current working directory @@ -828,7 +829,7 @@ RESTARTABLE(::ftruncate(fd, (off_t)0), result); if (result == OS_ERR) { if (PrintMiscellaneous && Verbose) { - warning("could not truncate shared memory file: %s\n", strerror(errno)); + warning("could not truncate shared memory file: %s\n", os::strerror(errno)); } ::close(fd); return -1; @@ -837,7 +838,7 @@ RESTARTABLE(::ftruncate(fd, (off_t)size), result); if (result == OS_ERR) { if (PrintMiscellaneous && Verbose) { - warning("could not set shared memory file size: %s\n", strerror(errno)); + warning("could not set shared memory file size: %s\n", os::strerror(errno)); } ::close(fd); return -1; @@ -887,7 +888,7 @@ "Permission denied", OS_ERR); } else { - THROW_MSG_(vmSymbols::java_io_IOException(), strerror(errno), OS_ERR); + THROW_MSG_(vmSymbols::java_io_IOException(), os::strerror(errno), OS_ERR); } } int fd = result; @@ -961,7 +962,7 @@ if (mapAddress == MAP_FAILED) { if (PrintMiscellaneous && Verbose) { - warning("mmap failed - %s\n", strerror(errno)); + warning("mmap failed - %s\n", os::strerror(errno)); } remove_file(filename); FREE_C_HEAP_ARRAY(char, filename); @@ -1025,7 +1026,7 @@ RESTARTABLE(::fstat(fd, &statbuf), result); if (result == OS_ERR) { if (PrintMiscellaneous && Verbose) { - warning("fstat failed: %s\n", strerror(errno)); + warning("fstat failed: %s\n", os::strerror(errno)); } THROW_MSG_0(vmSymbols::java_io_IOException(), "Could not determine PerfMemory size"); @@ -1136,7 +1137,7 @@ if (mapAddress == MAP_FAILED) { if (PrintMiscellaneous && Verbose) { - warning("mmap failed: %s\n", strerror(errno)); + warning("mmap failed: %s\n", os::strerror(errno)); } THROW_MSG(vmSymbols::java_lang_OutOfMemoryError(), "Could not map PerfMemory"); diff -r f9c20e87f9ec -r ad6eb2d954b9 hotspot/src/os/linux/vm/os_linux.cpp --- a/hotspot/src/os/linux/vm/os_linux.cpp Tue Mar 15 13:55:23 2016 +0100 +++ b/hotspot/src/os/linux/vm/os_linux.cpp Wed Mar 16 10:28:57 2016 +0100 @@ -760,7 +760,7 @@ (uintx) tid, os::Posix::describe_pthread_attr(buf, sizeof(buf), &attr)); } else { log_warning(os, thread)("Failed to start thread - pthread_create failed (%s) for attributes: %s.", - strerror(ret), os::Posix::describe_pthread_attr(buf, sizeof(buf), &attr)); + os::errno_name(ret), os::Posix::describe_pthread_attr(buf, sizeof(buf), &attr)); } pthread_attr_destroy(&attr); @@ -1393,7 +1393,7 @@ size_t os::lasterror(char *buf, size_t len) { if (errno == 0) return 0; - const char *s = ::strerror(errno); + const char *s = os::strerror(errno); size_t n = ::strlen(s); if (n >= len) { n = len - 1; @@ -2599,7 +2599,7 @@ int err) { warning("INFO: os::commit_memory(" PTR_FORMAT ", " SIZE_FORMAT ", %d) failed; error='%s' (errno=%d)", p2i(addr), size, exec, - strerror(err), err); + os::strerror(err), err); } static void warn_fail_commit_memory(char* addr, size_t size, @@ -2607,7 +2607,7 @@ int err) { warning("INFO: os::commit_memory(" PTR_FORMAT ", " SIZE_FORMAT ", " SIZE_FORMAT ", %d) failed; error='%s' (errno=%d)", p2i(addr), size, - alignment_hint, exec, strerror(err), err); + alignment_hint, exec, os::strerror(err), err); } // NOTE: Linux kernel does not really reserve the pages for us. @@ -4573,7 +4573,7 @@ Linux::set_page_size(sysconf(_SC_PAGESIZE)); if (Linux::page_size() == -1) { fatal("os_linux.cpp: os::init: sysconf failed (%s)", - strerror(errno)); + os::strerror(errno)); } init_page_sizes((size_t) Linux::page_size()); @@ -4589,7 +4589,7 @@ int status; pthread_condattr_t* _condattr = os::Linux::condAttr(); if ((status = pthread_condattr_init(_condattr)) != 0) { - fatal("pthread_condattr_init: %s", strerror(status)); + fatal("pthread_condattr_init: %s", os::strerror(status)); } // Only set the clock if CLOCK_MONOTONIC is available if (os::supports_monotonic_clock()) { @@ -4598,7 +4598,7 @@ warning("Unable to use monotonic clock with relative timed-waits" \ " - changes to the time-of-day clock may have adverse affects"); } else { - fatal("pthread_condattr_setclock: %s", strerror(status)); + fatal("pthread_condattr_setclock: %s", os::strerror(status)); } } } @@ -4844,7 +4844,7 @@ log_trace(os)("active_processor_count: " "CPU_ALLOC failed (%s) - using " "online processor count: %d", - strerror(errno), online_cpus); + os::strerror(errno), online_cpus); return online_cpus; } } @@ -4874,7 +4874,7 @@ else { cpu_count = ::sysconf(_SC_NPROCESSORS_ONLN); warning("sched_getaffinity failed (%s)- using online processor count (%d) " - "which may exceed available processors", strerror(errno), cpu_count); + "which may exceed available processors", os::strerror(errno), cpu_count); } if (cpus_p != &cpus) { // can only be true when CPU_ALLOC used diff -r f9c20e87f9ec -r ad6eb2d954b9 hotspot/src/os/linux/vm/perfMemory_linux.cpp --- a/hotspot/src/os/linux/vm/perfMemory_linux.cpp Tue Mar 15 13:55:23 2016 +0100 +++ b/hotspot/src/os/linux/vm/perfMemory_linux.cpp Wed Mar 16 10:28:57 2016 +0100 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 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 @@ -29,6 +29,7 @@ #include "oops/oop.inline.hpp" #include "os_linux.inline.hpp" #include "runtime/handles.inline.hpp" +#include "runtime/os.hpp" #include "runtime/perfMemory.hpp" #include "services/memTracker.hpp" #include "utilities/exceptions.hpp" @@ -100,7 +101,7 @@ if (result == OS_ERR) { if (PrintMiscellaneous && Verbose) { warning("Could not create Perfdata save file: %s: %s\n", - destfile, strerror(errno)); + destfile, os::strerror(errno)); } } else { int fd = result; @@ -111,7 +112,7 @@ if (result == OS_ERR) { if (PrintMiscellaneous && Verbose) { warning("Could not write Perfdata save file: %s: %s\n", - destfile, strerror(errno)); + destfile, os::strerror(errno)); } break; } @@ -123,7 +124,7 @@ result = ::close(fd); if (PrintMiscellaneous && Verbose) { if (result == OS_ERR) { - warning("Could not close %s: %s\n", destfile, strerror(errno)); + warning("Could not close %s: %s\n", destfile, os::strerror(errno)); } } } @@ -308,7 +309,7 @@ if (errno == ELOOP) { warning("directory %s is a symlink and is not secure\n", dirname); } else { - warning("could not open directory %s: %s\n", dirname, strerror(errno)); + warning("could not open directory %s: %s\n", dirname, os::strerror(errno)); } } return dirp; @@ -419,7 +420,7 @@ RESTARTABLE(::fstat(fd, &statbuf), result); if (result == OS_ERR) { if (PrintMiscellaneous && Verbose) { - warning("fstat failed on %s: %s\n", filename, strerror(errno)); + warning("fstat failed on %s: %s\n", filename, os::strerror(errno)); } return false; } @@ -459,7 +460,7 @@ if (PrintMiscellaneous && Verbose) { if (result != 0) { warning("Could not retrieve passwd entry: %s\n", - strerror(result)); + os::strerror(result)); } else if (p == NULL) { // this check is added to protect against an observed problem @@ -473,7 +474,7 @@ // Bug Id 89052 was opened with RedHat. // warning("Could not retrieve passwd entry: %s\n", - strerror(errno)); + os::strerror(errno)); } else { warning("Could not determine user name: %s\n", @@ -509,7 +510,7 @@ "Process not found"); } else /* EPERM */ { - THROW_MSG_0(vmSymbols::java_io_IOException(), strerror(errno)); + THROW_MSG_0(vmSymbols::java_io_IOException(), os::strerror(errno)); } } @@ -664,7 +665,7 @@ if (PrintMiscellaneous && Verbose && result == OS_ERR) { if (errno != ENOENT) { warning("Could not unlink shared memory backing" - " store file %s : %s\n", path, strerror(errno)); + " store file %s : %s\n", path, os::strerror(errno)); } } } @@ -772,7 +773,7 @@ // if (PrintMiscellaneous && Verbose) { warning("could not create directory %s: %s\n", - dirname, strerror(errno)); + dirname, os::strerror(errno)); } return false; } @@ -814,7 +815,7 @@ if (errno == ELOOP) { warning("file %s is a symlink and is not secure\n", filename); } else { - warning("could not create file %s: %s\n", filename, strerror(errno)); + warning("could not create file %s: %s\n", filename, os::strerror(errno)); } } // close the directory and reset the current working directory @@ -838,7 +839,7 @@ RESTARTABLE(::ftruncate(fd, (off_t)0), result); if (result == OS_ERR) { if (PrintMiscellaneous && Verbose) { - warning("could not truncate shared memory file: %s\n", strerror(errno)); + warning("could not truncate shared memory file: %s\n", os::strerror(errno)); } ::close(fd); return -1; @@ -847,7 +848,7 @@ RESTARTABLE(::ftruncate(fd, (off_t)size), result); if (result == OS_ERR) { if (PrintMiscellaneous && Verbose) { - warning("could not set shared memory file size: %s\n", strerror(errno)); + warning("could not set shared memory file size: %s\n", os::strerror(errno)); } ::close(fd); return -1; @@ -897,7 +898,7 @@ "Permission denied", OS_ERR); } else { - THROW_MSG_(vmSymbols::java_io_IOException(), strerror(errno), OS_ERR); + THROW_MSG_(vmSymbols::java_io_IOException(), os::strerror(errno), OS_ERR); } } int fd = result; @@ -970,7 +971,7 @@ if (mapAddress == MAP_FAILED) { if (PrintMiscellaneous && Verbose) { - warning("mmap failed - %s\n", strerror(errno)); + warning("mmap failed - %s\n", os::strerror(errno)); } remove_file(filename); FREE_C_HEAP_ARRAY(char, filename); @@ -1034,7 +1035,7 @@ RESTARTABLE(::fstat(fd, &statbuf), result); if (result == OS_ERR) { if (PrintMiscellaneous && Verbose) { - warning("fstat failed: %s\n", strerror(errno)); + warning("fstat failed: %s\n", os::strerror(errno)); } THROW_MSG_0(vmSymbols::java_io_IOException(), "Could not determine PerfMemory size"); @@ -1151,7 +1152,7 @@ if (mapAddress == MAP_FAILED) { if (PrintMiscellaneous && Verbose) { - warning("mmap failed: %s\n", strerror(errno)); + warning("mmap failed: %s\n", os::strerror(errno)); } THROW_MSG(vmSymbols::java_lang_OutOfMemoryError(), "Could not map PerfMemory"); diff -r f9c20e87f9ec -r ad6eb2d954b9 hotspot/src/os/posix/vm/os_posix.cpp --- a/hotspot/src/os/posix/vm/os_posix.cpp Tue Mar 15 13:55:23 2016 +0100 +++ b/hotspot/src/os/posix/vm/os_posix.cpp Wed Mar 16 10:28:57 2016 +0100 @@ -1144,7 +1144,8 @@ #define check_with_errno(check_type, cond, msg) \ do { \ int err = errno; \ - check_type(cond, "%s; error='%s' (errno=%d)", msg, strerror(err), err); \ + check_type(cond, "%s; error='%s' (errno=%s)", msg, os::strerror(err), \ + os::errno_name(err)); \ } while (false) #define assert_with_errno(cond, msg) check_with_errno(assert, cond, msg) diff -r f9c20e87f9ec -r ad6eb2d954b9 hotspot/src/os/solaris/vm/attachListener_solaris.cpp --- a/hotspot/src/os/solaris/vm/attachListener_solaris.cpp Tue Mar 15 13:55:23 2016 +0100 +++ b/hotspot/src/os/solaris/vm/attachListener_solaris.cpp Wed Mar 16 10:28:57 2016 +0100 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 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 @@ -461,7 +461,7 @@ while ((res = ::sema_wait(wakeup())) == EINTR) ; if (res) { - warning("sema_wait failed: %s", strerror(res)); + warning("sema_wait failed: %s", os::strerror(res)); return NULL; } diff -r f9c20e87f9ec -r ad6eb2d954b9 hotspot/src/os/solaris/vm/os_solaris.cpp --- a/hotspot/src/os/solaris/vm/os_solaris.cpp Tue Mar 15 13:55:23 2016 +0100 +++ b/hotspot/src/os/solaris/vm/os_solaris.cpp Wed Mar 16 10:28:57 2016 +0100 @@ -1009,7 +1009,7 @@ (uintx) tid, describe_thr_create_attributes(buf, sizeof(buf), stack_size, flags)); } else { log_warning(os, thread)("Failed to start thread - thr_create failed (%s) for attributes: %s.", - strerror(status), describe_thr_create_attributes(buf, sizeof(buf), stack_size, flags)); + os::errno_name(status), describe_thr_create_attributes(buf, sizeof(buf), stack_size, flags)); } if (status != 0) { @@ -1354,7 +1354,7 @@ jlong os::javaTimeMillis() { timeval t; if (gettimeofday(&t, NULL) == -1) { - fatal("os::javaTimeMillis: gettimeofday (%s)", strerror(errno)); + fatal("os::javaTimeMillis: gettimeofday (%s)", os::strerror(errno)); } return jlong(t.tv_sec) * 1000 + jlong(t.tv_usec) / 1000; } @@ -1362,7 +1362,7 @@ void os::javaTimeSystemUTC(jlong &seconds, jlong &nanos) { timeval t; if (gettimeofday(&t, NULL) == -1) { - fatal("os::javaTimeSystemUTC: gettimeofday (%s)", strerror(errno)); + fatal("os::javaTimeSystemUTC: gettimeofday (%s)", os::strerror(errno)); } seconds = jlong(t.tv_sec); nanos = jlong(t.tv_usec) * 1000; @@ -2161,7 +2161,7 @@ size_t os::lasterror(char *buf, size_t len) { if (errno == 0) return 0; - const char *s = ::strerror(errno); + const char *s = os::strerror(errno); size_t n = ::strlen(s); if (n >= len) { n = len - 1; @@ -2370,7 +2370,7 @@ int err) { warning("INFO: os::commit_memory(" PTR_FORMAT ", " SIZE_FORMAT ", %d) failed; error='%s' (errno=%d)", addr, bytes, exec, - strerror(err), err); + os::strerror(err), err); } static void warn_fail_commit_memory(char* addr, size_t bytes, @@ -2378,7 +2378,7 @@ int err) { warning("INFO: os::commit_memory(" PTR_FORMAT ", " SIZE_FORMAT ", " SIZE_FORMAT ", %d) failed; error='%s' (errno=%d)", addr, bytes, - alignment_hint, exec, strerror(err), err); + alignment_hint, exec, os::strerror(err), err); } int os::Solaris::commit_memory_impl(char* addr, size_t bytes, bool exec) { @@ -2759,7 +2759,7 @@ char buf[256]; buf[0] = '\0'; if (addr == NULL) { - jio_snprintf(buf, sizeof(buf), ": %s", strerror(err)); + jio_snprintf(buf, sizeof(buf), ": %s", os::strerror(err)); } warning("attempt_reserve_memory_at: couldn't reserve " SIZE_FORMAT " bytes at " PTR_FORMAT ": reserve_memory_helper returned " PTR_FORMAT @@ -4373,7 +4373,7 @@ page_size = sysconf(_SC_PAGESIZE); if (page_size == -1) { - fatal("os_solaris.cpp: os::init: sysconf failed (%s)", strerror(errno)); + fatal("os_solaris.cpp: os::init: sysconf failed (%s)", os::strerror(errno)); } init_page_sizes((size_t) page_size); @@ -4385,7 +4385,7 @@ int fd = ::open("/dev/zero", O_RDWR); if (fd < 0) { - fatal("os::init: cannot open /dev/zero (%s)", strerror(errno)); + fatal("os::init: cannot open /dev/zero (%s)", os::strerror(errno)); } else { Solaris::set_dev_zero_fd(fd); @@ -5626,7 +5626,7 @@ if (pid < 0) { // fork failed - warning("fork failed: %s", strerror(errno)); + warning("fork failed: %s", os::strerror(errno)); return -1; } else if (pid == 0) { diff -r f9c20e87f9ec -r ad6eb2d954b9 hotspot/src/os/solaris/vm/perfMemory_solaris.cpp --- a/hotspot/src/os/solaris/vm/perfMemory_solaris.cpp Tue Mar 15 13:55:23 2016 +0100 +++ b/hotspot/src/os/solaris/vm/perfMemory_solaris.cpp Wed Mar 16 10:28:57 2016 +0100 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 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 @@ -102,7 +102,7 @@ if (result == OS_ERR) { if (PrintMiscellaneous && Verbose) { warning("Could not create Perfdata save file: %s: %s\n", - destfile, strerror(errno)); + destfile, os::strerror(errno)); } } else { @@ -114,7 +114,7 @@ if (result == OS_ERR) { if (PrintMiscellaneous && Verbose) { warning("Could not write Perfdata save file: %s: %s\n", - destfile, strerror(errno)); + destfile, os::strerror(errno)); } break; } @@ -125,7 +125,7 @@ result = ::close(fd); if (PrintMiscellaneous && Verbose) { if (result == OS_ERR) { - warning("Could not close %s: %s\n", destfile, strerror(errno)); + warning("Could not close %s: %s\n", destfile, os::strerror(errno)); } } } @@ -311,7 +311,7 @@ if (errno == ELOOP) { warning("directory %s is a symlink and is not secure\n", dirname); } else { - warning("could not open directory %s: %s\n", dirname, strerror(errno)); + warning("could not open directory %s: %s\n", dirname, os::strerror(errno)); } } return dirp; @@ -422,7 +422,7 @@ RESTARTABLE(::fstat(fd, &statbuf), result); if (result == OS_ERR) { if (PrintMiscellaneous && Verbose) { - warning("fstat failed on %s: %s\n", filename, strerror(errno)); + warning("fstat failed on %s: %s\n", filename, os::strerror(errno)); } return false; } @@ -464,7 +464,7 @@ if (PrintMiscellaneous && Verbose) { if (p == NULL) { warning("Could not retrieve passwd entry: %s\n", - strerror(errno)); + os::strerror(errno)); } else { warning("Could not determine user name: %s\n", @@ -500,7 +500,7 @@ "Process not found"); } else /* EPERM */ { - THROW_MSG_0(vmSymbols::java_io_IOException(), strerror(errno)); + THROW_MSG_0(vmSymbols::java_io_IOException(), os::strerror(errno)); } } @@ -657,7 +657,7 @@ // In this case, the psinfo file for the process id existed, // but we didn't have permission to access it. THROW_MSG_0(vmSymbols::java_lang_IllegalArgumentException(), - strerror(errno)); + os::strerror(errno)); } // at this point, we don't know if the process id itself doesn't @@ -703,7 +703,7 @@ if (PrintMiscellaneous && Verbose && result == OS_ERR) { if (errno != ENOENT) { warning("Could not unlink shared memory backing" - " store file %s : %s\n", path, strerror(errno)); + " store file %s : %s\n", path, os::strerror(errno)); } } } @@ -813,7 +813,7 @@ // if (PrintMiscellaneous && Verbose) { warning("could not create directory %s: %s\n", - dirname, strerror(errno)); + dirname, os::strerror(errno)); } return false; } @@ -855,7 +855,7 @@ if (errno == ELOOP) { warning("file %s is a symlink and is not secure\n", filename); } else { - warning("could not create file %s: %s\n", filename, strerror(errno)); + warning("could not create file %s: %s\n", filename, os::strerror(errno)); } } // close the directory and reset the current working directory @@ -879,7 +879,7 @@ RESTARTABLE(::ftruncate(fd, (off_t)0), result); if (result == OS_ERR) { if (PrintMiscellaneous && Verbose) { - warning("could not truncate shared memory file: %s\n", strerror(errno)); + warning("could not truncate shared memory file: %s\n", os::strerror(errno)); } ::close(fd); return -1; @@ -888,7 +888,7 @@ RESTARTABLE(::ftruncate(fd, (off_t)size), result); if (result == OS_ERR) { if (PrintMiscellaneous && Verbose) { - warning("could not set shared memory file size: %s\n", strerror(errno)); + warning("could not set shared memory file size: %s\n", os::strerror(errno)); } ::close(fd); return -1; @@ -916,7 +916,7 @@ "Permission denied", OS_ERR); } else { - THROW_MSG_(vmSymbols::java_io_IOException(), strerror(errno), OS_ERR); + THROW_MSG_(vmSymbols::java_io_IOException(), os::strerror(errno), OS_ERR); } } int fd = result; @@ -990,7 +990,7 @@ if (mapAddress == MAP_FAILED) { if (PrintMiscellaneous && Verbose) { - warning("mmap failed - %s\n", strerror(errno)); + warning("mmap failed - %s\n", os::strerror(errno)); } remove_file(filename); FREE_C_HEAP_ARRAY(char, filename); @@ -1055,7 +1055,7 @@ RESTARTABLE(::fstat(fd, &statbuf), result); if (result == OS_ERR) { if (PrintMiscellaneous && Verbose) { - warning("fstat failed: %s\n", strerror(errno)); + warning("fstat failed: %s\n", os::strerror(errno)); } THROW_MSG_0(vmSymbols::java_io_IOException(), "Could not determine PerfMemory size"); @@ -1172,7 +1172,7 @@ if (mapAddress == MAP_FAILED) { if (PrintMiscellaneous && Verbose) { - warning("mmap failed: %s\n", strerror(errno)); + warning("mmap failed: %s\n", os::strerror(errno)); } THROW_MSG(vmSymbols::java_lang_OutOfMemoryError(), "Could not map PerfMemory"); diff -r f9c20e87f9ec -r ad6eb2d954b9 hotspot/src/os/solaris/vm/threadCritical_solaris.cpp --- a/hotspot/src/os/solaris/vm/threadCritical_solaris.cpp Tue Mar 15 13:55:23 2016 +0100 +++ b/hotspot/src/os/solaris/vm/threadCritical_solaris.cpp Wed Mar 16 10:28:57 2016 +0100 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 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 @@ -23,6 +23,7 @@ */ #include "precompiled.hpp" +#include "runtime/os.hpp" #include "runtime/thread.inline.hpp" #include "runtime/threadCritical.hpp" @@ -49,7 +50,7 @@ if (global_mut_owner != owner) { if (os::Solaris::mutex_lock(&global_mut)) fatal("ThreadCritical::ThreadCritical: mutex_lock failed (%s)", - strerror(errno)); + os::strerror(errno)); assert(global_mut_count == 0, "must have clean count"); assert(global_mut_owner == -1, "must have clean owner"); } @@ -68,7 +69,7 @@ if (global_mut_count == 0) { global_mut_owner = -1; if (os::Solaris::mutex_unlock(&global_mut)) - fatal("ThreadCritical::~ThreadCritical: mutex_unlock failed (%s)", strerror(errno)); + fatal("ThreadCritical::~ThreadCritical: mutex_unlock failed (%s)", os::strerror(errno)); } } else { assert (Threads::number_of_threads() == 0, "valid only during initialization"); diff -r f9c20e87f9ec -r ad6eb2d954b9 hotspot/src/os/windows/vm/os_windows.cpp --- a/hotspot/src/os/windows/vm/os_windows.cpp Tue Mar 15 13:55:23 2016 +0100 +++ b/hotspot/src/os/windows/vm/os_windows.cpp Wed Mar 16 10:28:57 2016 +0100 @@ -642,7 +642,7 @@ thread_id, describe_beginthreadex_attributes(buf, sizeof(buf), stack_size, initflag)); } else { log_warning(os, thread)("Failed to start thread - _beginthreadex failed (%s) for attributes: %s.", - strerror(errno), describe_beginthreadex_attributes(buf, sizeof(buf), stack_size, initflag)); + os::errno_name(errno), describe_beginthreadex_attributes(buf, sizeof(buf), stack_size, initflag)); } if (thread_handle == NULL) { @@ -1898,7 +1898,7 @@ if (errno != 0) { // C runtime error that has no corresponding DOS error code - const char* s = strerror(errno); + const char* s = os::strerror(errno); size_t n = strlen(s); if (n >= len) n = len - 1; strncpy(buf, s, n); @@ -2441,7 +2441,7 @@ jio_snprintf(buf, sizeof(buf), "Execution protection violation " "at " INTPTR_FORMAT ", unguarding " INTPTR_FORMAT ": %s", addr, - page_start, (res ? "success" : strerror(errno))); + page_start, (res ? "success" : os::strerror(errno))); tty->print_raw_cr(buf); } diff -r f9c20e87f9ec -r ad6eb2d954b9 hotspot/src/os/windows/vm/perfMemory_windows.cpp --- a/hotspot/src/os/windows/vm/perfMemory_windows.cpp Tue Mar 15 13:55:23 2016 +0100 +++ b/hotspot/src/os/windows/vm/perfMemory_windows.cpp Wed Mar 16 10:28:57 2016 +0100 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 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 @@ -96,7 +96,7 @@ if (fd == OS_ERR) { if (PrintMiscellaneous && Verbose) { warning("Could not create Perfdata save file: %s: %s\n", - destfile, strerror(errno)); + destfile, os::strerror(errno)); } } else { for (size_t remaining = size; remaining > 0;) { @@ -105,7 +105,7 @@ if (nbytes == OS_ERR) { if (PrintMiscellaneous && Verbose) { warning("Could not write Perfdata save file: %s: %s\n", - destfile, strerror(errno)); + destfile, os::strerror(errno)); } break; } @@ -117,7 +117,7 @@ int result = ::_close(fd); if (PrintMiscellaneous && Verbose) { if (result == OS_ERR) { - warning("Could not close %s: %s\n", destfile, strerror(errno)); + warning("Could not close %s: %s\n", destfile, os::strerror(errno)); } } } @@ -497,7 +497,7 @@ if (PrintMiscellaneous && Verbose) { if (errno != ENOENT) { warning("Could not unlink shared memory backing" - " store file %s : %s\n", path, strerror(errno)); + " store file %s : %s\n", path, os::strerror(errno)); } } } @@ -1358,7 +1358,7 @@ if (ret_code == OS_ERR) { if (PrintMiscellaneous && Verbose) { warning("Could not get status information from file %s: %s\n", - filename, strerror(errno)); + filename, os::strerror(errno)); } CloseHandle(fmh); CloseHandle(fh); @@ -1553,7 +1553,7 @@ // if (::stat(filename, &statbuf) == OS_ERR) { if (PrintMiscellaneous && Verbose) { - warning("stat %s failed: %s\n", filename, strerror(errno)); + warning("stat %s failed: %s\n", filename, os::strerror(errno)); } THROW_MSG_0(vmSymbols::java_io_IOException(), "Could not determine PerfMemory size"); diff -r f9c20e87f9ec -r ad6eb2d954b9 hotspot/src/share/vm/gc/g1/dirtyCardQueue.cpp --- a/hotspot/src/share/vm/gc/g1/dirtyCardQueue.cpp Tue Mar 15 13:55:23 2016 +0100 +++ b/hotspot/src/share/vm/gc/g1/dirtyCardQueue.cpp Wed Mar 16 10:28:57 2016 +0100 @@ -110,46 +110,6 @@ } } -bool DirtyCardQueue::apply_closure(CardTableEntryClosure* cl, - bool consume, - uint worker_i) { - bool res = true; - if (_buf != NULL) { - BufferNode* node = BufferNode::make_node_from_buffer(_buf, _index); - res = apply_closure_to_buffer(cl, node, _sz, consume, worker_i); - if (res && consume) { - _index = _sz; - } - } - return res; -} - -bool DirtyCardQueue::apply_closure_to_buffer(CardTableEntryClosure* cl, - BufferNode* node, - size_t buffer_size, - bool consume, - uint worker_i) { - if (cl == NULL) return true; - void** buf = BufferNode::make_buffer_from_node(node); - size_t limit = byte_index_to_index(buffer_size); - for (size_t i = byte_index_to_index(node->index()); i < limit; ++i) { - jbyte* card_ptr = static_cast(buf[i]); - assert(card_ptr != NULL, "invariant"); - if (!cl->do_card_ptr(card_ptr, worker_i)) { - if (consume) { - size_t new_index = index_to_byte_index(i + 1); - assert(new_index <= buffer_size, "invariant"); - node->set_index(new_index); - } - return false; - } - } - if (consume) { - node->set_index(buffer_size); - } - return true; -} - DirtyCardQueueSet::DirtyCardQueueSet(bool notify_when_complete) : PtrQueueSet(notify_when_complete), _mut_process_closure(NULL), @@ -190,15 +150,39 @@ t->dirty_card_queue().handle_zero_index(); } +bool DirtyCardQueueSet::apply_closure_to_buffer(CardTableEntryClosure* cl, + BufferNode* node, + bool consume, + uint worker_i) { + if (cl == NULL) return true; + void** buf = BufferNode::make_buffer_from_node(node); + size_t limit = DirtyCardQueue::byte_index_to_index(buffer_size()); + size_t start = DirtyCardQueue::byte_index_to_index(node->index()); + for (size_t i = start; i < limit; ++i) { + jbyte* card_ptr = static_cast(buf[i]); + assert(card_ptr != NULL, "invariant"); + if (!cl->do_card_ptr(card_ptr, worker_i)) { + if (consume) { + size_t new_index = DirtyCardQueue::index_to_byte_index(i + 1); + assert(new_index <= buffer_size(), "invariant"); + node->set_index(new_index); + } + return false; + } + } + if (consume) { + node->set_index(buffer_size()); + } + return true; +} + bool DirtyCardQueueSet::mut_process_buffer(BufferNode* node) { guarantee(_free_ids != NULL, "must be"); // claim a par id uint worker_i = _free_ids->claim_par_id(); - bool b = DirtyCardQueue::apply_closure_to_buffer(_mut_process_closure, - node, _sz, - true, worker_i); + bool b = apply_closure_to_buffer(_mut_process_closure, node, true, worker_i); if (b) { Atomic::inc(&_processed_buffers_mut); } @@ -242,7 +226,7 @@ if (nd == NULL) { return false; } else { - if (DirtyCardQueue::apply_closure_to_buffer(cl, nd, _sz, true, worker_i)) { + if (apply_closure_to_buffer(cl, nd, true, worker_i)) { // Done with fully processed buffer. deallocate_buffer(nd); Atomic::inc(&_processed_buffers_rs_thread); @@ -261,7 +245,7 @@ BufferNode* next = nd->next(); void* actual = Atomic::cmpxchg_ptr(next, &_cur_par_buffer_node, nd); if (actual == nd) { - bool b = DirtyCardQueue::apply_closure_to_buffer(cl, nd, _sz, false); + bool b = apply_closure_to_buffer(cl, nd, false); guarantee(b, "Should not stop early."); nd = next; } else { diff -r f9c20e87f9ec -r ad6eb2d954b9 hotspot/src/share/vm/gc/g1/dirtyCardQueue.hpp --- a/hotspot/src/share/vm/gc/g1/dirtyCardQueue.hpp Tue Mar 15 13:55:23 2016 +0100 +++ b/hotspot/src/share/vm/gc/g1/dirtyCardQueue.hpp Wed Mar 16 10:28:57 2016 +0100 @@ -37,7 +37,7 @@ public: // Process the card whose card table entry is "card_ptr". If returns // "false", terminate the iteration early. - virtual bool do_card_ptr(jbyte* card_ptr, uint worker_i = 0) = 0; + virtual bool do_card_ptr(jbyte* card_ptr, uint worker_i) = 0; }; // A ptrQueue whose elements are "oops", pointers to object heads. @@ -52,26 +52,6 @@ // Process queue entries and release resources. void flush() { flush_impl(); } - // Apply the closure to the elements from _index to _sz. If all - // closure applications return true, then returns true. Stops - // processing after the first closure application that returns - // false, and returns false from this function. If "consume" is - // true, _index is updated to follow the last processed element. - bool apply_closure(CardTableEntryClosure* cl, - bool consume = true, - uint worker_i = 0); - - // Apply the closure to the elements of "node" from it's index to - // buffer_size. If all closure applications return true, then - // returns true. Stops processing after the first closure - // application that returns false, and returns false from this - // function. If "consume" is true, the node's index is updated to - // follow the last processed element. - static bool apply_closure_to_buffer(CardTableEntryClosure* cl, - BufferNode* node, - size_t buffer_size, - bool consume = true, - uint worker_i = 0); void **get_buf() { return _buf;} size_t get_index() { return _index;} void reinitialize() { _buf = 0; _sz = 0; _index = 0;} @@ -97,6 +77,17 @@ DirtyCardQueue _shared_dirty_card_queue; + // Apply the closure to the elements of "node" from it's index to + // buffer_size. If all closure applications return true, then + // returns true. Stops processing after the first closure + // application that returns false, and returns false from this + // function. If "consume" is true, the node's index is updated to + // follow the last processed element. + bool apply_closure_to_buffer(CardTableEntryClosure* cl, + BufferNode* node, + bool consume, + uint worker_i = 0); + bool mut_process_buffer(BufferNode* node); // Protected by the _cbl_mon. diff -r f9c20e87f9ec -r ad6eb2d954b9 hotspot/src/share/vm/gc/g1/g1MarkSweep.cpp --- a/hotspot/src/share/vm/gc/g1/g1MarkSweep.cpp Tue Mar 15 13:55:23 2016 +0100 +++ b/hotspot/src/share/vm/gc/g1/g1MarkSweep.cpp Wed Mar 16 10:28:57 2016 +0100 @@ -220,12 +220,6 @@ } }; -class G1AlwaysTrueClosure: public BoolObjectClosure { -public: - bool do_object_b(oop p) { return true; } -}; -static G1AlwaysTrueClosure always_true; - void G1MarkSweep::mark_sweep_phase3() { G1CollectedHeap* g1h = G1CollectedHeap::heap(); @@ -248,7 +242,7 @@ // Now adjust pointers in remaining weak roots. (All of which should // have been cleared if they pointed to non-surviving objects.) - JNIHandles::weak_oops_do(&always_true, &GenMarkSweep::adjust_pointer_closure); + JNIHandles::weak_oops_do(&GenMarkSweep::adjust_pointer_closure); if (G1StringDedup::is_enabled()) { G1StringDedup::oops_do(&GenMarkSweep::adjust_pointer_closure); diff -r f9c20e87f9ec -r ad6eb2d954b9 hotspot/src/share/vm/gc/parallel/psMarkSweep.cpp --- a/hotspot/src/share/vm/gc/parallel/psMarkSweep.cpp Tue Mar 15 13:55:23 2016 +0100 +++ b/hotspot/src/share/vm/gc/parallel/psMarkSweep.cpp Wed Mar 16 10:28:57 2016 +0100 @@ -570,13 +570,6 @@ old_gen->precompact(); } -// This should be moved to the shared markSweep code! -class PSAlwaysTrueClosure: public BoolObjectClosure { -public: - bool do_object_b(oop p) { return true; } -}; -static PSAlwaysTrueClosure always_true; - void PSMarkSweep::mark_sweep_phase3() { // Adjust the pointers to reflect the new locations GCTraceTime(Trace, gc) tm("Phase 3: Adjust pointers", _gc_timer); @@ -603,7 +596,7 @@ // Now adjust pointers in remaining weak roots. (All of which should // have been cleared if they pointed to non-surviving objects.) // Global (weak) JNI handles - JNIHandles::weak_oops_do(&always_true, adjust_pointer_closure()); + JNIHandles::weak_oops_do(adjust_pointer_closure()); CodeBlobToOopClosure adjust_from_blobs(adjust_pointer_closure(), CodeBlobToOopClosure::FixRelocations); CodeCache::blobs_do(&adjust_from_blobs); diff -r f9c20e87f9ec -r ad6eb2d954b9 hotspot/src/share/vm/gc/parallel/psParallelCompact.cpp --- a/hotspot/src/share/vm/gc/parallel/psParallelCompact.cpp Tue Mar 15 13:55:23 2016 +0100 +++ b/hotspot/src/share/vm/gc/parallel/psParallelCompact.cpp Wed Mar 16 10:28:57 2016 +0100 @@ -2125,13 +2125,6 @@ _gc_tracer.report_object_count_after_gc(is_alive_closure()); } -// This should be moved to the shared markSweep code! -class PSAlwaysTrueClosure: public BoolObjectClosure { -public: - bool do_object_b(oop p) { return true; } -}; -static PSAlwaysTrueClosure always_true; - void PSParallelCompact::adjust_roots(ParCompactionManager* cm) { // Adjust the pointers to reflect the new locations GCTraceTime(Trace, gc, phases) tm("Adjust Roots", &_gc_timer); @@ -2157,7 +2150,7 @@ // Now adjust pointers in remaining weak roots. (All of which should // have been cleared if they pointed to non-surviving objects.) // Global (weak) JNI handles - JNIHandles::weak_oops_do(&always_true, &oop_closure); + JNIHandles::weak_oops_do(&oop_closure); CodeBlobToOopClosure adjust_from_blobs(&oop_closure, CodeBlobToOopClosure::FixRelocations); CodeCache::blobs_do(&adjust_from_blobs); diff -r f9c20e87f9ec -r ad6eb2d954b9 hotspot/src/share/vm/gc/shared/gcCause.hpp --- a/hotspot/src/share/vm/gc/shared/gcCause.hpp Tue Mar 15 13:55:23 2016 +0100 +++ b/hotspot/src/share/vm/gc/shared/gcCause.hpp Wed Mar 16 10:28:57 2016 +0100 @@ -33,6 +33,9 @@ // use of this class grows, we should split it into public // and implementation-private "causes". // +// The definitions in the SA code should be kept in sync +// with the definitions here. +// class GCCause : public AllStatic { public: diff -r f9c20e87f9ec -r ad6eb2d954b9 hotspot/src/share/vm/gc/shared/genCollectedHeap.cpp --- a/hotspot/src/share/vm/gc/shared/genCollectedHeap.cpp Tue Mar 15 13:55:23 2016 +0100 +++ b/hotspot/src/share/vm/gc/shared/genCollectedHeap.cpp Wed Mar 16 10:28:57 2016 +0100 @@ -684,15 +684,8 @@ _process_strong_tasks->all_tasks_completed(scope->n_threads()); } - -class AlwaysTrueClosure: public BoolObjectClosure { -public: - bool do_object_b(oop p) { return true; } -}; -static AlwaysTrueClosure always_true; - void GenCollectedHeap::gen_process_weak_roots(OopClosure* root_closure) { - JNIHandles::weak_oops_do(&always_true, root_closure); + JNIHandles::weak_oops_do(root_closure); _young_gen->ref_processor()->weak_oops_do(root_closure); _old_gen->ref_processor()->weak_oops_do(root_closure); } diff -r f9c20e87f9ec -r ad6eb2d954b9 hotspot/src/share/vm/gc/shared/referenceProcessor.cpp --- a/hotspot/src/share/vm/gc/shared/referenceProcessor.cpp Tue Mar 15 13:55:23 2016 +0100 +++ b/hotspot/src/share/vm/gc/shared/referenceProcessor.cpp Wed Mar 16 10:28:57 2016 +0100 @@ -266,11 +266,6 @@ #ifndef PRODUCT // Calculate the number of jni handles. size_t ReferenceProcessor::count_jni_refs() { - class AlwaysAliveClosure: public BoolObjectClosure { - public: - virtual bool do_object_b(oop obj) { return true; } - }; - class CountHandleClosure: public OopClosure { private: size_t _count; @@ -281,8 +276,7 @@ size_t count() { return _count; } }; CountHandleClosure global_handle_count; - AlwaysAliveClosure always_alive; - JNIHandles::weak_oops_do(&always_alive, &global_handle_count); + JNIHandles::weak_oops_do(&global_handle_count); return global_handle_count.count(); } #endif diff -r f9c20e87f9ec -r ad6eb2d954b9 hotspot/src/share/vm/logging/log.cpp --- a/hotspot/src/share/vm/logging/log.cpp Tue Mar 15 13:55:23 2016 +0100 +++ b/hotspot/src/share/vm/logging/log.cpp Wed Mar 16 10:28:57 2016 +0100 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 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 @@ -136,4 +136,27 @@ LogConfiguration::parse_log_arguments("stdout", saved_config, NULL, NULL, log.error_stream()); os::free(saved_config); } + +static int Test_logconfiguration_subscribe_triggered = 0; + +static void Test_logconfiguration_subscribe_helper() { + Test_logconfiguration_subscribe_triggered++; +} + +void Test_logconfiguration_subscribe() { + ResourceMark rm; + LogHandle(logging) log; + + LogConfiguration::register_update_listener(&Test_logconfiguration_subscribe_helper); + + LogConfiguration::parse_log_arguments("stdout", "logging=trace", NULL, NULL, log.error_stream()); + assert(Test_logconfiguration_subscribe_triggered == 1, "subscription not triggered (1)"); + + LogConfiguration::configure_stdout(LogLevel::Debug, true, LOG_TAGS(gc)); + assert(Test_logconfiguration_subscribe_triggered == 2, "subscription not triggered (2)"); + + LogConfiguration::disable_logging(); + assert(Test_logconfiguration_subscribe_triggered == 3, "subscription not triggered (3)"); +} + #endif // PRODUCT diff -r f9c20e87f9ec -r ad6eb2d954b9 hotspot/src/share/vm/logging/logConfiguration.cpp --- a/hotspot/src/share/vm/logging/logConfiguration.cpp Tue Mar 15 13:55:23 2016 +0100 +++ b/hotspot/src/share/vm/logging/logConfiguration.cpp Wed Mar 16 10:28:57 2016 +0100 @@ -40,6 +40,9 @@ LogOutput** LogConfiguration::_outputs = NULL; size_t LogConfiguration::_n_outputs = 0; +LogConfiguration::UpdateListenerFunction* LogConfiguration::_listener_callbacks = NULL; +size_t LogConfiguration::_n_listener_callbacks = 0; + // Stack object to take the lock for configuring the logging. // Should only be held during the critical parts of the configuration // (when calling configure_output or reading/modifying the outputs array). @@ -254,6 +257,7 @@ for (size_t i = 0; i < _n_outputs; i++) { disable_output(i); } + notify_update_listeners(); } void LogConfiguration::configure_stdout(LogLevelType level, bool exact_match, ...) { @@ -282,6 +286,7 @@ // Apply configuration to stdout (output #0), with the same decorators as before. ConfigurationLock cl; configure_output(0, expr, LogOutput::Stdout->decorators()); + notify_update_listeners(); } bool LogConfiguration::parse_command_line_arguments(const char* opts) { @@ -373,6 +378,7 @@ } } configure_output(idx, expr, decorators); + notify_update_listeners(); return true; } @@ -471,3 +477,20 @@ } } +void LogConfiguration::register_update_listener(UpdateListenerFunction cb) { + assert(cb != NULL, "Should not register NULL as listener"); + ConfigurationLock cl; + size_t idx = _n_listener_callbacks++; + _listener_callbacks = REALLOC_C_HEAP_ARRAY(UpdateListenerFunction, + _listener_callbacks, + _n_listener_callbacks, + mtLogging); + _listener_callbacks[idx] = cb; +} + +void LogConfiguration::notify_update_listeners() { + assert(ConfigurationLock::current_thread_has_lock(), "notify_update_listeners must be called in ConfigurationLock scope (lock held)"); + for (size_t i = 0; i < _n_listener_callbacks; i++) { + _listener_callbacks[i](); + } +} diff -r f9c20e87f9ec -r ad6eb2d954b9 hotspot/src/share/vm/logging/logConfiguration.hpp --- a/hotspot/src/share/vm/logging/logConfiguration.hpp Tue Mar 15 13:55:23 2016 +0100 +++ b/hotspot/src/share/vm/logging/logConfiguration.hpp Wed Mar 16 10:28:57 2016 +0100 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 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 @@ -37,10 +37,26 @@ // kept implicitly in the LogTagSets and their LogOutputLists. During configuration the tagsets // are iterated over and updated accordingly. class LogConfiguration : public AllStatic { + public: + // Function for listeners + typedef void (*UpdateListenerFunction)(void); + + // Register callback for config change. + // The callback is always called with ConfigurationLock held, + // hence doing log reconfiguration from the callback will deadlock. + // The main Java thread may call this callback if there is an early registration + // else the attach listener JavaThread, started via diagnostic command, will be executing thread. + // The main purpose of this callback is to see if a loglevel have been changed. + // There is no way to unregister. + static void register_update_listener(UpdateListenerFunction cb); + private: static LogOutput** _outputs; static size_t _n_outputs; + static UpdateListenerFunction* _listener_callbacks; + static size_t _n_listener_callbacks; + // Create a new output. Returns NULL if failed. static LogOutput* new_output(char* name, const char* options, outputStream* errstream); @@ -60,6 +76,9 @@ // Configure output (add or update existing configuration) to log on tag-level combination using specified decorators. static void configure_output(size_t idx, const LogTagLevelExpression& tag_level_expression, const LogDecorators& decorators); + // This should be called after any configuration change while still holding ConfigurationLock + static void notify_update_listeners(); + public: // Initialization and finalization of log configuration, to be run at vm startup and shutdown respectively. static void initialize(jlong vm_start_time); diff -r f9c20e87f9ec -r ad6eb2d954b9 hotspot/src/share/vm/logging/logFileOutput.cpp --- a/hotspot/src/share/vm/logging/logFileOutput.cpp Tue Mar 15 13:55:23 2016 +0100 +++ b/hotspot/src/share/vm/logging/logFileOutput.cpp Wed Mar 16 10:28:57 2016 +0100 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 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 @@ -64,7 +64,7 @@ } if (fclose(_stream) != 0) { jio_fprintf(defaultStream::error_stream(), "Could not close log file '%s' (%s).\n", - _file_name, strerror(errno)); + _file_name, os::strerror(errno)); } } os::free(_archive_name); @@ -139,7 +139,7 @@ } _stream = fopen(_file_name, FileOpenMode); if (_stream == NULL) { - log_error(logging)("Could not open log file '%s' (%s).\n", _file_name, strerror(errno)); + log_error(logging)("Could not open log file '%s' (%s).\n", _file_name, os::strerror(errno)); return false; } return true; @@ -176,7 +176,7 @@ // Rename the file from ex hotspot.log to hotspot.log.2 if (rename(_file_name, _archive_name) == -1) { jio_fprintf(defaultStream::error_stream(), "Could not rename log file '%s' to '%s' (%s).\n", - _file_name, _archive_name, strerror(errno)); + _file_name, _archive_name, os::strerror(errno)); } } @@ -194,7 +194,7 @@ if (fclose(_stream)) { jio_fprintf(defaultStream::error_stream(), "Error closing file '%s' during log rotation (%s).\n", - _file_name, strerror(errno)); + _file_name, os::strerror(errno)); } // Archive the current log file @@ -204,7 +204,7 @@ _stream = fopen(_file_name, FileOpenMode); if (_stream == NULL) { jio_fprintf(defaultStream::error_stream(), "Could not reopen file '%s' during log rotation (%s).\n", - _file_name, strerror(errno)); + _file_name, os::strerror(errno)); return; } diff -r f9c20e87f9ec -r ad6eb2d954b9 hotspot/src/share/vm/memory/filemap.cpp --- a/hotspot/src/share/vm/memory/filemap.cpp Tue Mar 15 13:55:23 2016 +0100 +++ b/hotspot/src/share/vm/memory/filemap.cpp Wed Mar 16 10:28:57 2016 +0100 @@ -363,7 +363,7 @@ fail_continue("Specified shared archive not found."); } else { fail_continue("Failed to open shared archive file (%s).", - strerror(errno)); + os::strerror(errno)); } return false; } @@ -393,7 +393,7 @@ int fd = open(_full_path, O_RDWR | O_CREAT | O_TRUNC | O_BINARY, 0444); if (fd < 0) { fail_stop("Unable to create shared archive file %s: (%s).", _full_path, - strerror(errno)); + os::strerror(errno)); } _fd = fd; _file_offset = 0; diff -r f9c20e87f9ec -r ad6eb2d954b9 hotspot/src/share/vm/memory/iterator.hpp --- a/hotspot/src/share/vm/memory/iterator.hpp Tue Mar 15 13:55:23 2016 +0100 +++ b/hotspot/src/share/vm/memory/iterator.hpp Wed Mar 16 10:28:57 2016 +0100 @@ -213,6 +213,16 @@ virtual bool do_object_b(oop obj) = 0; }; +class AlwaysTrueClosure: public BoolObjectClosure { + public: + bool do_object_b(oop p) { return true; } +}; + +class AlwaysFalseClosure : public BoolObjectClosure { + public: + bool do_object_b(oop p) { return false; } +}; + // Applies an oop closure to all ref fields in objects iterated over in an // object iteration. class ObjectToOopClosure: public ObjectClosure { diff -r f9c20e87f9ec -r ad6eb2d954b9 hotspot/src/share/vm/prims/whitebox.cpp --- a/hotspot/src/share/vm/prims/whitebox.cpp Tue Mar 15 13:55:23 2016 +0100 +++ b/hotspot/src/share/vm/prims/whitebox.cpp Wed Mar 16 10:28:57 2016 +0100 @@ -33,6 +33,7 @@ #include "jvmtifiles/jvmtiEnv.hpp" #include "memory/metadataFactory.hpp" #include "memory/metaspaceShared.hpp" +#include "memory/iterator.hpp" #include "memory/universe.hpp" #include "oops/constantPool.hpp" #include "oops/oop.inline.hpp" @@ -711,11 +712,6 @@ return result; WB_END -class AlwaysFalseClosure : public BoolObjectClosure { - public: - bool do_object_b(oop p) { return false; } -}; - static AlwaysFalseClosure always_false; WB_ENTRY(void, WB_ClearMethodState(JNIEnv* env, jobject o, jobject method)) diff -r f9c20e87f9ec -r ad6eb2d954b9 hotspot/src/share/vm/runtime/globals.hpp --- a/hotspot/src/share/vm/runtime/globals.hpp Tue Mar 15 13:55:23 2016 +0100 +++ b/hotspot/src/share/vm/runtime/globals.hpp Wed Mar 16 10:28:57 2016 +0100 @@ -1466,9 +1466,6 @@ develop(bool, TraceCompiledIC, false, \ "Trace changes of compiled IC") \ \ - develop(bool, TraceClearedExceptions, false, \ - "Print when an exception is forcibly cleared") \ - \ /* gc */ \ \ product(bool, UseSerialGC, false, \ diff -r f9c20e87f9ec -r ad6eb2d954b9 hotspot/src/share/vm/runtime/jniHandles.cpp --- a/hotspot/src/share/vm/runtime/jniHandles.cpp Tue Mar 15 13:55:23 2016 +0100 +++ b/hotspot/src/share/vm/runtime/jniHandles.cpp Wed Mar 16 10:28:57 2016 +0100 @@ -25,6 +25,7 @@ #include "precompiled.hpp" #include "classfile/systemDictionary.hpp" #include "logging/log.hpp" +#include "memory/iterator.hpp" #include "oops/oop.inline.hpp" #include "prims/jvmtiExport.hpp" #include "runtime/jniHandles.hpp" @@ -128,6 +129,12 @@ } +void JNIHandles::weak_oops_do(OopClosure* f) { + AlwaysTrueClosure always_true; + weak_oops_do(&always_true, f); +} + + void JNIHandles::initialize() { _global_handles = JNIHandleBlock::allocate_block(); _weak_global_handles = JNIHandleBlock::allocate_block(); @@ -185,11 +192,6 @@ } -class AlwaysAliveClosure: public BoolObjectClosure { -public: - bool do_object_b(oop obj) { return true; } -}; - class CountHandleClosure: public OopClosure { private: int _count; @@ -211,9 +213,8 @@ "JNIHandles not initialized"); CountHandleClosure global_handle_count; - AlwaysAliveClosure always_alive; oops_do(&global_handle_count); - weak_oops_do(&always_alive, &global_handle_count); + weak_oops_do(&global_handle_count); st->print_cr("JNI global references: %d", global_handle_count.count()); st->cr(); @@ -230,10 +231,9 @@ void JNIHandles::verify() { VerifyHandleClosure verify_handle; - AlwaysAliveClosure always_alive; oops_do(&verify_handle); - weak_oops_do(&always_alive, &verify_handle); + weak_oops_do(&verify_handle); } diff -r f9c20e87f9ec -r ad6eb2d954b9 hotspot/src/share/vm/runtime/jniHandles.hpp --- a/hotspot/src/share/vm/runtime/jniHandles.hpp Tue Mar 15 13:55:23 2016 +0100 +++ b/hotspot/src/share/vm/runtime/jniHandles.hpp Wed Mar 16 10:28:57 2016 +0100 @@ -86,6 +86,8 @@ static void oops_do(OopClosure* f); // Traversal of weak global handles. Unreachable oops are cleared. static void weak_oops_do(BoolObjectClosure* is_alive, OopClosure* f); + // Traversal of weak global handles. + static void weak_oops_do(OopClosure* f); }; diff -r f9c20e87f9ec -r ad6eb2d954b9 hotspot/src/share/vm/runtime/os.cpp --- a/hotspot/src/share/vm/runtime/os.cpp Tue Mar 15 13:55:23 2016 +0100 +++ b/hotspot/src/share/vm/runtime/os.cpp Wed Mar 16 10:28:57 2016 +0100 @@ -61,6 +61,7 @@ #include "utilities/events.hpp" # include +# include OSThread* os::_starting_thread = NULL; address os::_polling_page = NULL; @@ -1427,6 +1428,131 @@ return page_size_for_region(region_size, min_pages, false); } +static const char* errno_to_string (int e, bool short_text) { + #define ALL_SHARED_ENUMS(X) \ + X(E2BIG, "Argument list too long") \ + X(EACCES, "Permission denied") \ + X(EADDRINUSE, "Address in use") \ + X(EADDRNOTAVAIL, "Address not available") \ + X(EAFNOSUPPORT, "Address family not supported") \ + X(EAGAIN, "Resource unavailable, try again") \ + X(EALREADY, "Connection already in progress") \ + X(EBADF, "Bad file descriptor") \ + X(EBADMSG, "Bad message") \ + X(EBUSY, "Device or resource busy") \ + X(ECANCELED, "Operation canceled") \ + X(ECHILD, "No child processes") \ + X(ECONNABORTED, "Connection aborted") \ + X(ECONNREFUSED, "Connection refused") \ + X(ECONNRESET, "Connection reset") \ + X(EDEADLK, "Resource deadlock would occur") \ + X(EDESTADDRREQ, "Destination address required") \ + X(EDOM, "Mathematics argument out of domain of function") \ + X(EEXIST, "File exists") \ + X(EFAULT, "Bad address") \ + X(EFBIG, "File too large") \ + X(EHOSTUNREACH, "Host is unreachable") \ + X(EIDRM, "Identifier removed") \ + X(EILSEQ, "Illegal byte sequence") \ + X(EINPROGRESS, "Operation in progress") \ + X(EINTR, "Interrupted function") \ + X(EINVAL, "Invalid argument") \ + X(EIO, "I/O error") \ + X(EISCONN, "Socket is connected") \ + X(EISDIR, "Is a directory") \ + X(ELOOP, "Too many levels of symbolic links") \ + X(EMFILE, "Too many open files") \ + X(EMLINK, "Too many links") \ + X(EMSGSIZE, "Message too large") \ + X(ENAMETOOLONG, "Filename too long") \ + X(ENETDOWN, "Network is down") \ + X(ENETRESET, "Connection aborted by network") \ + X(ENETUNREACH, "Network unreachable") \ + X(ENFILE, "Too many files open in system") \ + X(ENOBUFS, "No buffer space available") \ + X(ENODATA, "No message is available on the STREAM head read queue") \ + X(ENODEV, "No such device") \ + X(ENOENT, "No such file or directory") \ + X(ENOEXEC, "Executable file format error") \ + X(ENOLCK, "No locks available") \ + X(ENOLINK, "Reserved") \ + X(ENOMEM, "Not enough space") \ + X(ENOMSG, "No message of the desired type") \ + X(ENOPROTOOPT, "Protocol not available") \ + X(ENOSPC, "No space left on device") \ + X(ENOSR, "No STREAM resources") \ + X(ENOSTR, "Not a STREAM") \ + X(ENOSYS, "Function not supported") \ + X(ENOTCONN, "The socket is not connected") \ + X(ENOTDIR, "Not a directory") \ + X(ENOTEMPTY, "Directory not empty") \ + X(ENOTSOCK, "Not a socket") \ + X(ENOTSUP, "Not supported") \ + X(ENOTTY, "Inappropriate I/O control operation") \ + X(ENXIO, "No such device or address") \ + X(EOPNOTSUPP, "Operation not supported on socket") \ + X(EOVERFLOW, "Value too large to be stored in data type") \ + X(EPERM, "Operation not permitted") \ + X(EPIPE, "Broken pipe") \ + X(EPROTO, "Protocol error") \ + X(EPROTONOSUPPORT, "Protocol not supported") \ + X(EPROTOTYPE, "Protocol wrong type for socket") \ + X(ERANGE, "Result too large") \ + X(EROFS, "Read-only file system") \ + X(ESPIPE, "Invalid seek") \ + X(ESRCH, "No such process") \ + X(ETIME, "Stream ioctl() timeout") \ + X(ETIMEDOUT, "Connection timed out") \ + X(ETXTBSY, "Text file busy") \ + X(EWOULDBLOCK, "Operation would block") \ + X(EXDEV, "Cross-device link") + + #define DEFINE_ENTRY(e, text) { e, #e, text }, + + static const struct { + int v; + const char* short_text; + const char* long_text; + } table [] = { + + ALL_SHARED_ENUMS(DEFINE_ENTRY) + + // The following enums are not defined on all platforms. + #ifdef ESTALE + DEFINE_ENTRY(ESTALE, "Reserved") + #endif + #ifdef EDQUOT + DEFINE_ENTRY(EDQUOT, "Reserved") + #endif + #ifdef EMULTIHOP + DEFINE_ENTRY(EMULTIHOP, "Reserved") + #endif + + // End marker. + { -1, "Unknown errno", "Unknown error" } + + }; + + #undef DEFINE_ENTRY + #undef ALL_FLAGS + + int i = 0; + while (table[i].v != -1 && table[i].v != e) { + i ++; + } + + return short_text ? table[i].short_text : table[i].long_text; + +} + +const char* os::strerror(int e) { + return errno_to_string(e, false); +} + +const char* os::errno_name(int e) { + return errno_to_string(e, true); +} + #ifndef PRODUCT void os::trace_page_sizes(const char* str, const size_t* page_sizes, int count) { diff -r f9c20e87f9ec -r ad6eb2d954b9 hotspot/src/share/vm/runtime/os.hpp --- a/hotspot/src/share/vm/runtime/os.hpp Tue Mar 15 13:55:23 2016 +0100 +++ b/hotspot/src/share/vm/runtime/os.hpp Wed Mar 16 10:28:57 2016 +0100 @@ -617,6 +617,22 @@ static size_t lasterror(char *buf, size_t len); static int get_last_error(); + // Replacement for strerror(). + // Will return the english description of the error (e.g. "File not found", as + // suggested in the POSIX standard. + // Will return "Unknown error" for an unknown errno value. + // Will not attempt to localize the returned string. + // Will always return a valid string which is a static constant. + // Will not change the value of errno. + static const char* strerror(int e); + + // Will return the literalized version of the given errno (e.g. "EINVAL" + // for EINVAL). + // Will return "Unknown error" for an unknown errno value. + // Will always return a valid string which is a static constant. + // Will not change the value of errno. + static const char* errno_name(int e); + // Determines whether the calling process is being debugged by a user-mode debugger. static bool is_debugger_attached(); diff -r f9c20e87f9ec -r ad6eb2d954b9 hotspot/src/share/vm/services/heapDumper.cpp --- a/hotspot/src/share/vm/services/heapDumper.cpp Tue Mar 15 13:55:23 2016 +0100 +++ b/hotspot/src/share/vm/services/heapDumper.cpp Wed Mar 16 10:28:57 2016 +0100 @@ -459,7 +459,7 @@ // if the open failed we record the error if (_fd < 0) { - _error = (char*)os::strdup(strerror(errno)); + _error = (char*)os::strdup(os::strerror(errno)); } } @@ -509,7 +509,7 @@ if (n < 0) { // EINTR cannot happen here, os::write will take care of that - set_error(strerror(errno)); + set_error(os::strerror(errno)); os::close(file_descriptor()); set_file_descriptor(-1); return; diff -r f9c20e87f9ec -r ad6eb2d954b9 hotspot/src/share/vm/utilities/debug.cpp --- a/hotspot/src/share/vm/utilities/debug.cpp Tue Mar 15 13:55:23 2016 +0100 +++ b/hotspot/src/share/vm/utilities/debug.cpp Wed Mar 16 10:28:57 2016 +0100 @@ -224,6 +224,11 @@ va_end(detail_args); } +void report_vm_status_error(const char* file, int line, const char* error_msg, + int status, const char* detail) { + report_vm_error(file, line, error_msg, "error %s(%d), %s", os::errno_name(status), status, detail); +} + void report_fatal(const char* file, int line, const char* detail_fmt, ...) { if (Debugging || error_is_suppressed(file, line)) return; diff -r f9c20e87f9ec -r ad6eb2d954b9 hotspot/src/share/vm/utilities/debug.hpp --- a/hotspot/src/share/vm/utilities/debug.hpp Tue Mar 15 13:55:23 2016 +0100 +++ b/hotspot/src/share/vm/utilities/debug.hpp Wed Mar 16 10:28:57 2016 +0100 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 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 @@ -137,7 +137,13 @@ // an extra arg and use strerror to convert it to a meaningful string // like "Invalid argument", "out of memory" etc #define vmassert_status(p, status, msg) \ - vmassert(p, "error %s(%d), %s", strerror(status), status, msg) +do { \ + if (!(p)) { \ + report_vm_status_error(__FILE__, __LINE__, "assert(" #p ") failed", \ + status, msg); \ + BREAKPOINT; \ + } \ +} while (0) // For backward compatibility. #define assert_status(p, status, msg) vmassert_status(p, status, msg) @@ -209,6 +215,8 @@ void report_vm_error(const char* file, int line, const char* error_msg, const char* detail_fmt, ...); #endif +void report_vm_status_error(const char* file, int line, const char* error_msg, + int status, const char* detail); void report_fatal(const char* file, int line, const char* detail_fmt, ...) ATTRIBUTE_PRINTF(3, 4); void report_vm_out_of_memory(const char* file, int line, size_t size, VMErrorType vm_err_type, const char* detail_fmt, ...) ATTRIBUTE_PRINTF(5, 6); diff -r f9c20e87f9ec -r ad6eb2d954b9 hotspot/src/share/vm/utilities/exceptions.cpp --- a/hotspot/src/share/vm/utilities/exceptions.cpp Tue Mar 15 13:55:23 2016 +0100 +++ b/hotspot/src/share/vm/utilities/exceptions.cpp Wed Mar 16 10:28:57 2016 +0100 @@ -52,11 +52,11 @@ } void ThreadShadow::clear_pending_exception() { - if (TraceClearedExceptions) { - if (_pending_exception != NULL) { - tty->print_cr("Thread::clear_pending_exception: cleared exception:"); - _pending_exception->print(); - } + if (_pending_exception != NULL && log_is_enabled(Debug, exceptions)) { + ResourceMark rm; + outputStream* logst = LogHandle(exceptions)::debug_stream(); + logst->print("Thread::clear_pending_exception: cleared exception:"); + _pending_exception->print_on(logst); } _pending_exception = NULL; _exception_file = NULL; diff -r f9c20e87f9ec -r ad6eb2d954b9 hotspot/src/share/vm/utilities/internalVMTests.cpp --- a/hotspot/src/share/vm/utilities/internalVMTests.cpp Tue Mar 15 13:55:23 2016 +0100 +++ b/hotspot/src/share/vm/utilities/internalVMTests.cpp Wed Mar 16 10:28:57 2016 +0100 @@ -69,6 +69,7 @@ run_unit_test(JSON_test); run_unit_test(Test_log_length); run_unit_test(Test_configure_stdout); + run_unit_test(Test_logconfiguration_subscribe); run_unit_test(DirectivesParser_test); run_unit_test(Test_TempNewSymbol); #if INCLUDE_VM_STRUCTS diff -r f9c20e87f9ec -r ad6eb2d954b9 hotspot/src/share/vm/utilities/ostream.cpp --- a/hotspot/src/share/vm/utilities/ostream.cpp Tue Mar 15 13:55:23 2016 +0100 +++ b/hotspot/src/share/vm/utilities/ostream.cpp Wed Mar 16 10:28:57 2016 +0100 @@ -504,7 +504,7 @@ if (_file != NULL) { _need_close = true; } else { - warning("Cannot open file %s due to %s\n", file_name, strerror(errno)); + warning("Cannot open file %s due to %s\n", file_name, os::strerror(errno)); _need_close = false; } } @@ -514,7 +514,7 @@ if (_file != NULL) { _need_close = true; } else { - warning("Cannot open file %s due to %s\n", file_name, strerror(errno)); + warning("Cannot open file %s due to %s\n", file_name, os::strerror(errno)); _need_close = false; } } diff -r f9c20e87f9ec -r ad6eb2d954b9 hotspot/src/share/vm/utilities/vmError.cpp --- a/hotspot/src/share/vm/utilities/vmError.cpp Tue Mar 15 13:55:23 2016 +0100 +++ b/hotspot/src/share/vm/utilities/vmError.cpp Wed Mar 16 10:28:57 2016 +0100 @@ -1260,8 +1260,9 @@ out.print_raw("#\n# Compiler replay data is saved as:\n# "); out.print_raw_cr(buffer); } else { + int e = errno; out.print_raw("#\n# Can't open file to dump replay data. Error: "); - out.print_raw_cr(strerror(os::get_last_error())); + out.print_raw_cr(os::strerror(e)); } } } @@ -1301,7 +1302,8 @@ out.print_raw_cr("\" ..."); if (os::fork_and_exec(cmd) < 0) { - out.print_cr("os::fork_and_exec failed: %s (%d)", strerror(errno), errno); + out.print_cr("os::fork_and_exec failed: %s (%s=%d)", + os::strerror(errno), os::errno_name(errno), errno); } } @@ -1359,7 +1361,8 @@ tty->print_cr("\"%s\"...", cmd); if (os::fork_and_exec(cmd) < 0) { - tty->print_cr("os::fork_and_exec failed: %s (%d)", strerror(errno), errno); + tty->print_cr("os::fork_and_exec failed: %s (%s=%d)", + os::strerror(errno), os::errno_name(errno), errno); } } } diff -r f9c20e87f9ec -r ad6eb2d954b9 hotspot/test/gc/arguments/TestSelectDefaultGC.java --- a/hotspot/test/gc/arguments/TestSelectDefaultGC.java Tue Mar 15 13:55:23 2016 +0100 +++ b/hotspot/test/gc/arguments/TestSelectDefaultGC.java Wed Mar 16 10:28:57 2016 +0100 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 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 @@ -27,9 +27,9 @@ * @bug 8068582 * @key gc * @library /testlibrary + * @requires vm.gc=="null" * @modules java.base/sun.misc * java.management - * @ignore 8148239 * @run driver TestSelectDefaultGC */ @@ -41,24 +41,40 @@ output.shouldMatch(" " + option + " .*=.* " + value + " "); } - public static void main(String[] args) throws Exception { + public static void testDefaultGC(boolean actAsServer) throws Exception { + String[] args = new String[] { + "-XX:" + (actAsServer ? "+" : "-") + "AlwaysActAsServerClassMachine", + "-XX:" + (actAsServer ? "-" : "+") + "NeverActAsServerClassMachine", + "-XX:+PrintFlagsFinal", + "-version" + }; + // Start VM without specifying GC - ProcessBuilder pb = ProcessTools.createJavaProcessBuilder("-XX:+PrintFlagsFinal", "-version"); + ProcessBuilder pb = ProcessTools.createJavaProcessBuilder(args); OutputAnalyzer output = new OutputAnalyzer(pb.start()); output.shouldHaveExitValue(0); - boolean isServerVM = Platform.isServer(); - boolean isEmbeddedVM = Platform.isEmbedded(); + final boolean isServer = actAsServer; + final boolean isEmbedded = Platform.isEmbedded(); // Verify GC selection - // G1 is default for non-embedded server VMs - assertVMOption(output, "UseG1GC", isServerVM && !isEmbeddedVM); - // Parallel is default for embedded server VMs - assertVMOption(output, "UseParallelGC", isServerVM && isEmbeddedVM); - assertVMOption(output, "UseParallelOldGC", isServerVM && isEmbeddedVM); - // Serial is default for non-server VMs - assertVMOption(output, "UseSerialGC", !isServerVM); + // G1 is default for non-embedded server class machines + assertVMOption(output, "UseG1GC", isServer && !isEmbedded); + // Parallel is default for embedded server class machines + assertVMOption(output, "UseParallelGC", isServer && isEmbedded); + assertVMOption(output, "UseParallelOldGC", isServer && isEmbedded); + // Serial is default for non-server class machines + assertVMOption(output, "UseSerialGC", !isServer); + // CMS is never default assertVMOption(output, "UseConcMarkSweepGC", false); assertVMOption(output, "UseParNewGC", false); } + + public static void main(String[] args) throws Exception { + // Test server class machine + testDefaultGC(false); + + // Test non-server class machine + testDefaultGC(true); + } }