Mercurial > hg > truffle
comparison src/share/vm/gc_implementation/g1/g1OopClosures.cpp @ 20225:cd43876f692e
8040977: G1 crashes when run with -XX:-G1DeferredRSUpdate
Summary: When G1 is run with -XX:-G1DeferredRSUpdate, the VM crashes because of wrong initialization order of member variables. The change makes the initalization explicit, not relying on initialization order any more.
Reviewed-by: brutisso, mgerdin
author | tschatzl |
---|---|
date | Mon, 21 Jul 2014 09:41:06 +0200 |
parents | b0c374311c4e |
children |
comparison
equal
deleted
inserted
replaced
20224:a2328cbebb23 | 20225:cd43876f692e |
---|---|
23 */ | 23 */ |
24 | 24 |
25 #include "precompiled.hpp" | 25 #include "precompiled.hpp" |
26 #include "gc_implementation/g1/g1CollectedHeap.inline.hpp" | 26 #include "gc_implementation/g1/g1CollectedHeap.inline.hpp" |
27 #include "gc_implementation/g1/g1OopClosures.inline.hpp" | 27 #include "gc_implementation/g1/g1OopClosures.inline.hpp" |
28 #include "gc_implementation/g1/g1ParScanThreadState.hpp" | |
28 | 29 |
29 G1ParCopyHelper::G1ParCopyHelper(G1CollectedHeap* g1, G1ParScanThreadState* par_scan_state) : | 30 G1ParCopyHelper::G1ParCopyHelper(G1CollectedHeap* g1, G1ParScanThreadState* par_scan_state) : |
30 G1ParClosureSuper(g1, par_scan_state), _scanned_klass(NULL), | 31 G1ParClosureSuper(g1, par_scan_state), _scanned_klass(NULL), |
31 _cm(_g1->concurrent_mark()) {} | 32 _cm(_g1->concurrent_mark()) {} |
32 | 33 |
34 G1ParClosureSuper::G1ParClosureSuper(G1CollectedHeap* g1) : | |
35 _g1(g1), _par_scan_state(NULL), _worker_id(UINT_MAX) { } | |
36 | |
33 G1ParClosureSuper::G1ParClosureSuper(G1CollectedHeap* g1, G1ParScanThreadState* par_scan_state) : | 37 G1ParClosureSuper::G1ParClosureSuper(G1CollectedHeap* g1, G1ParScanThreadState* par_scan_state) : |
34 _g1(g1), _par_scan_state(par_scan_state), | 38 _g1(g1), _par_scan_state(NULL), |
35 _worker_id(par_scan_state->queue_num()) { } | 39 _worker_id(UINT_MAX) { |
40 set_par_scan_thread_state(par_scan_state); | |
41 } | |
42 | |
43 void G1ParClosureSuper::set_par_scan_thread_state(G1ParScanThreadState* par_scan_state) { | |
44 assert(_par_scan_state == NULL, "_par_scan_state must only be set once"); | |
45 assert(par_scan_state != NULL, "Must set par_scan_state to non-NULL."); | |
46 | |
47 _par_scan_state = par_scan_state; | |
48 _worker_id = par_scan_state->queue_num(); | |
49 | |
50 assert(_worker_id < MAX2((uint)ParallelGCThreads, 1u), | |
51 err_msg("The given worker id %u must be less than the number of threads %u", _worker_id, MAX2((uint)ParallelGCThreads, 1u))); | |
52 } |