提交 2a297901 编写于 作者: T tschatzl

8147910: Cache initial active_processor_count

Summary: Introduce and initialize active_processor_count variable in VM.
Reviewed-by: dholmes, jprovino
上级 4be998e6
/* /*
* Copyright (c) 1997, 2014, 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. * 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
...@@ -78,6 +78,7 @@ volatile int32_t* os::_mem_serialize_page = NULL; ...@@ -78,6 +78,7 @@ volatile int32_t* os::_mem_serialize_page = NULL;
uintptr_t os::_serialize_page_mask = 0; uintptr_t os::_serialize_page_mask = 0;
long os::_rand_seed = 1; long os::_rand_seed = 1;
int os::_processor_count = 0; int os::_processor_count = 0;
int os::_initial_active_processor_count = 0;
size_t os::_page_sizes[os::page_sizes_max]; size_t os::_page_sizes[os::page_sizes_max];
#ifndef PRODUCT #ifndef PRODUCT
...@@ -322,6 +323,7 @@ static void signal_thread_entry(JavaThread* thread, TRAPS) { ...@@ -322,6 +323,7 @@ static void signal_thread_entry(JavaThread* thread, TRAPS) {
} }
void os::init_before_ergo() { void os::init_before_ergo() {
initialize_initial_active_processor_count();
// We need to initialize large page support here because ergonomics takes some // We need to initialize large page support here because ergonomics takes some
// decisions depending on large page support and the calculated large page size. // decisions depending on large page support and the calculated large page size.
large_page_init(); large_page_init();
...@@ -835,7 +837,11 @@ void os::print_cpu_info(outputStream* st) { ...@@ -835,7 +837,11 @@ void os::print_cpu_info(outputStream* st) {
st->print("CPU:"); st->print("CPU:");
st->print("total %d", os::processor_count()); st->print("total %d", os::processor_count());
// It's not safe to query number of active processors after crash // It's not safe to query number of active processors after crash
// st->print("(active %d)", os::active_processor_count()); // st->print("(active %d)", os::active_processor_count()); but we can
// print the initial number of active processors.
// We access the raw value here because the assert in the accessor will
// fail if the crash occurs before initialization of this value.
st->print(" (initial active %d)", _initial_active_processor_count);
st->print(" %s", VM_Version::cpu_features()); st->print(" %s", VM_Version::cpu_features());
st->cr(); st->cr();
pd_print_cpu_info(st); pd_print_cpu_info(st);
...@@ -1418,6 +1424,11 @@ bool os::is_server_class_machine() { ...@@ -1418,6 +1424,11 @@ bool os::is_server_class_machine() {
return result; return result;
} }
void os::initialize_initial_active_processor_count() {
assert(_initial_active_processor_count == 0, "Initial active processor count already set.");
_initial_active_processor_count = active_processor_count();
}
void os::SuspendedThreadTask::run() { void os::SuspendedThreadTask::run() {
assert(Threads_lock->owned_by_self() || (_thread == VMThread::vm_thread()), "must have threads lock to call this"); assert(Threads_lock->owned_by_self() || (_thread == VMThread::vm_thread()), "must have threads lock to call this");
internal_do_task(); internal_do_task();
......
...@@ -151,6 +151,7 @@ class os: AllStatic { ...@@ -151,6 +151,7 @@ class os: AllStatic {
static size_t page_size_for_region(size_t region_size, size_t min_pages, bool must_be_aligned); static size_t page_size_for_region(size_t region_size, size_t min_pages, bool must_be_aligned);
static void initialize_initial_active_processor_count();
public: public:
static void init(void); // Called before command line parsing static void init(void); // Called before command line parsing
static void init_before_ergo(void); // Called after command line parsing static void init_before_ergo(void); // Called after command line parsing
...@@ -238,6 +239,13 @@ class os: AllStatic { ...@@ -238,6 +239,13 @@ class os: AllStatic {
// Note that on some OSes this can change dynamically. // Note that on some OSes this can change dynamically.
static int active_processor_count(); static int active_processor_count();
// At startup the number of active CPUs this process is allowed to run on.
// This value does not change dynamically. May be different from active_processor_count().
static int initial_active_processor_count() {
assert(_initial_active_processor_count > 0, "Initial active processor count not set yet.");
return _initial_active_processor_count;
}
// Bind processes to processors. // Bind processes to processors.
// This is a two step procedure: // This is a two step procedure:
// first you generate a distribution of processes to processors, // first you generate a distribution of processes to processors,
...@@ -975,8 +983,9 @@ class os: AllStatic { ...@@ -975,8 +983,9 @@ class os: AllStatic {
protected: protected:
static long _rand_seed; // seed for random number generator static long _rand_seed; // seed for random number generator
static int _processor_count; // number of processors static int _processor_count; // number of processors
static int _initial_active_processor_count; // number of active processors during initialization.
static char* format_boot_path(const char* format_string, static char* format_boot_path(const char* format_string,
const char* home, const char* home,
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册