Mercurial > hg > truffle
comparison src/share/vm/memory/cardTableRS.cpp @ 12030:330dfb0476f4
8022800: Use specific generations rather than generation iteration
Reviewed-by: jmasa, ehelin
author | brutisso |
---|---|
date | Wed, 14 Aug 2013 09:02:32 +0200 |
parents | f9be75d21404 |
children | bd902affe102 |
comparison
equal
deleted
inserted
replaced
12009:39127bb12d32 | 12030:330dfb0476f4 |
---|---|
319 // There's a bit of subtlety in the clear() and invalidate() | 319 // There's a bit of subtlety in the clear() and invalidate() |
320 // methods that we exploit here and in invalidate_or_clear() | 320 // methods that we exploit here and in invalidate_or_clear() |
321 // below to avoid missing cards at the fringes. If clear() or | 321 // below to avoid missing cards at the fringes. If clear() or |
322 // invalidate() are changed in the future, this code should | 322 // invalidate() are changed in the future, this code should |
323 // be revisited. 20040107.ysr | 323 // be revisited. 20040107.ysr |
324 Generation* g = gen; | 324 Generation* old_gen = gen; |
325 for(Generation* prev_gen = gch->prev_gen(g); | 325 clear(old_gen->prev_used_region()); |
326 prev_gen != NULL; | 326 Generation* young_gen = gch->prev_gen(old_gen); |
327 g = prev_gen, prev_gen = gch->prev_gen(g)) { | 327 clear(young_gen->prev_used_region()); |
328 MemRegion to_be_cleared_mr = g->prev_used_region(); | 328 } |
329 clear(to_be_cleared_mr); | 329 |
330 } | 330 void CardTableRS::invalidate_or_clear(Generation* gen) { |
331 } | 331 // For generation gen invalidate the cards for the currently |
332 | 332 // occupied part of that generation and clear the cards for the |
333 void CardTableRS::invalidate_or_clear(Generation* gen, bool younger) { | |
334 GenCollectedHeap* gch = GenCollectedHeap::heap(); | |
335 // For each generation gen (and younger) | |
336 // invalidate the cards for the currently occupied part | |
337 // of that generation and clear the cards for the | |
338 // unoccupied part of the generation (if any, making use | 333 // unoccupied part of the generation (if any, making use |
339 // of that generation's prev_used_region to determine that | 334 // of that generation's prev_used_region to determine that |
340 // region). No need to do anything for the youngest | 335 // region). No need to do anything for the youngest |
341 // generation. Also see note#20040107.ysr above. | 336 // generation. Also see note#20040107.ysr above. |
342 Generation* g = gen; | 337 MemRegion used_mr = gen->used_region(); |
343 for(Generation* prev_gen = gch->prev_gen(g); prev_gen != NULL; | 338 MemRegion to_be_cleared_mr = gen->prev_used_region().minus(used_mr); |
344 g = prev_gen, prev_gen = gch->prev_gen(g)) { | 339 if (!to_be_cleared_mr.is_empty()) { |
345 MemRegion used_mr = g->used_region(); | 340 clear(to_be_cleared_mr); |
346 MemRegion to_be_cleared_mr = g->prev_used_region().minus(used_mr); | 341 } |
347 if (!to_be_cleared_mr.is_empty()) { | 342 invalidate(used_mr); |
348 clear(to_be_cleared_mr); | |
349 } | |
350 invalidate(used_mr); | |
351 if (!younger) break; | |
352 } | |
353 } | 343 } |
354 | 344 |
355 | 345 |
356 class VerifyCleanCardClosure: public OopClosure { | 346 class VerifyCleanCardClosure: public OopClosure { |
357 private: | 347 private: |