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: