< prev index next >
src/share/vm/gc/shared/workgroup.cpp
Print this page
rev 11036 : 6858051: Create GC worker threads dynamically
Reviewed-by:
*** 23,32 ****
--- 23,33 ----
*/
#include "precompiled.hpp"
#include "gc/shared/gcId.hpp"
#include "gc/shared/workgroup.hpp"
+ #include "gc/shared/adaptiveSizePolicy.inline.hpp"
#include "memory/allocation.hpp"
#include "memory/allocation.inline.hpp"
#include "runtime/atomic.inline.hpp"
#include "runtime/os.hpp"
#include "runtime/semaphore.hpp"
*** 44,73 ****
_workers = NEW_C_HEAP_ARRAY(AbstractGangWorker*, total_workers(), mtInternal);
if (_workers == NULL) {
vm_exit_out_of_memory(0, OOM_MALLOC_ERROR, "Cannot create GangWorker array.");
return false;
}
os::ThreadType worker_type;
if (are_ConcurrentGC_threads()) {
worker_type = os::cgc_thread;
} else {
worker_type = os::pgc_thread;
}
! for (uint worker = 0; worker < total_workers(); worker += 1) {
! AbstractGangWorker* new_worker = allocate_worker(worker);
! assert(new_worker != NULL, "Failed to allocate GangWorker");
! _workers[worker] = new_worker;
! if (new_worker == NULL || !os::create_thread(new_worker, worker_type)) {
! vm_exit_out_of_memory(0, OOM_MALLOC_ERROR,
! "Cannot create worker GC thread. Out of system resources.");
! return false;
! }
! if (!DisableStartThread) {
! os::start_thread(new_worker);
! }
! }
! return true;
}
AbstractGangWorker* AbstractWorkGang::worker(uint i) const {
// Array index bounds checking.
AbstractGangWorker* result = NULL;
--- 45,81 ----
_workers = NEW_C_HEAP_ARRAY(AbstractGangWorker*, total_workers(), mtInternal);
if (_workers == NULL) {
vm_exit_out_of_memory(0, OOM_MALLOC_ERROR, "Cannot create GangWorker array.");
return false;
}
+
+ _active_workers = AdaptiveSizePolicy::initial_number_of_workers();
+ return add_workers(true);
+ }
+
+
+ AbstractGangWorker* AbstractWorkGang::install_worker(uint worker_id) {
+ AbstractGangWorker* new_worker = allocate_worker(worker_id);
+ set_thread(worker_id, new_worker);
+ return new_worker;
+ }
+
+ bool AbstractWorkGang::add_workers(bool initializing) {
+
os::ThreadType worker_type;
if (are_ConcurrentGC_threads()) {
worker_type = os::cgc_thread;
} else {
worker_type = os::pgc_thread;
}
!
! return AdaptiveSizePolicy::add_workers(this,
! _active_workers,
! _total_workers,
! _created_workers,
! worker_type,
! initializing);
}
AbstractGangWorker* AbstractWorkGang::worker(uint i) const {
// Array index bounds checking.
AbstractGangWorker* result = NULL;
*** 77,96 ****
assert(result != NULL, "Indexing to null worker");
return result;
}
void AbstractWorkGang::print_worker_threads_on(outputStream* st) const {
! uint workers = total_workers();
for (uint i = 0; i < workers; i++) {
worker(i)->print_on(st);
st->cr();
}
}
void AbstractWorkGang::threads_do(ThreadClosure* tc) const {
assert(tc != NULL, "Null ThreadClosure");
! uint workers = total_workers();
for (uint i = 0; i < workers; i++) {
tc->do_thread(worker(i));
}
}
--- 85,104 ----
assert(result != NULL, "Indexing to null worker");
return result;
}
void AbstractWorkGang::print_worker_threads_on(outputStream* st) const {
! uint workers = created_workers();
for (uint i = 0; i < workers; i++) {
worker(i)->print_on(st);
st->cr();
}
}
void AbstractWorkGang::threads_do(ThreadClosure* tc) const {
assert(tc != NULL, "Null ThreadClosure");
! uint workers = created_workers();
for (uint i = 0; i < workers; i++) {
tc->do_thread(worker(i));
}
}
< prev index next >