comparison src/share/vm/memory/cardTableModRefBS.cpp @ 342:37f87013dfd8

6711316: Open source the Garbage-First garbage collector Summary: First mercurial integration of the code for the Garbage-First garbage collector. Reviewed-by: apetrusenko, iveresov, jmasa, sgoldman, tonyp, ysr
author ysr
date Thu, 05 Jun 2008 15:57:56 -0700
parents ba764ed4b6f2
children bb254e57d2f4
comparison
equal deleted inserted replaced
189:0b27f3512f9e 342:37f87013dfd8
296 296
297 void CardTableModRefBS::write_ref_field_work(void* field, oop newVal) { 297 void CardTableModRefBS::write_ref_field_work(void* field, oop newVal) {
298 inline_write_ref_field(field, newVal); 298 inline_write_ref_field(field, newVal);
299 } 299 }
300 300
301
302 bool CardTableModRefBS::claim_card(size_t card_index) {
303 jbyte val = _byte_map[card_index];
304 if (val != claimed_card_val()) {
305 jbyte res = Atomic::cmpxchg((jbyte) claimed_card_val(), &_byte_map[card_index], val);
306 if (res == val)
307 return true;
308 else return false;
309 }
310 return false;
311 }
301 312
302 void CardTableModRefBS::non_clean_card_iterate(Space* sp, 313 void CardTableModRefBS::non_clean_card_iterate(Space* sp,
303 MemRegion mr, 314 MemRegion mr,
304 DirtyCardToOopClosure* dcto_cl, 315 DirtyCardToOopClosure* dcto_cl,
305 MemRegionClosure* cl, 316 MemRegionClosure* cl,
396 *cur = dirty_card; 407 *cur = dirty_card;
397 cur++; 408 cur++;
398 } 409 }
399 } 410 }
400 411
401 void CardTableModRefBS::invalidate(MemRegion mr) { 412 void CardTableModRefBS::invalidate(MemRegion mr, bool whole_heap) {
402 for (int i = 0; i < _cur_covered_regions; i++) { 413 for (int i = 0; i < _cur_covered_regions; i++) {
403 MemRegion mri = mr.intersection(_covered[i]); 414 MemRegion mri = mr.intersection(_covered[i]);
404 if (!mri.is_empty()) dirty_MemRegion(mri); 415 if (!mri.is_empty()) dirty_MemRegion(mri);
405 } 416 }
406 } 417 }
424 MemRegion mri = mr.intersection(_covered[i]); 435 MemRegion mri = mr.intersection(_covered[i]);
425 if (!mri.is_empty()) clear_MemRegion(mri); 436 if (!mri.is_empty()) clear_MemRegion(mri);
426 } 437 }
427 } 438 }
428 439
440 void CardTableModRefBS::dirty(MemRegion mr) {
441 jbyte* first = byte_for(mr.start());
442 jbyte* last = byte_after(mr.last());
443 memset(first, dirty_card, last-first);
444 }
445
429 // NOTES: 446 // NOTES:
430 // (1) Unlike mod_oop_in_space_iterate() above, dirty_card_iterate() 447 // (1) Unlike mod_oop_in_space_iterate() above, dirty_card_iterate()
431 // iterates over dirty cards ranges in increasing address order. 448 // iterates over dirty cards ranges in increasing address order.
432 // (2) Unlike, e.g., dirty_card_range_after_preclean() below,
433 // this method does not make the dirty cards prelceaned.
434 void CardTableModRefBS::dirty_card_iterate(MemRegion mr, 449 void CardTableModRefBS::dirty_card_iterate(MemRegion mr,
435 MemRegionClosure* cl) { 450 MemRegionClosure* cl) {
436 for (int i = 0; i < _cur_covered_regions; i++) { 451 for (int i = 0; i < _cur_covered_regions; i++) {
437 MemRegion mri = mr.intersection(_covered[i]); 452 MemRegion mri = mr.intersection(_covered[i]);
438 if (!mri.is_empty()) { 453 if (!mri.is_empty()) {
454 } 469 }
455 } 470 }
456 } 471 }
457 } 472 }
458 473
459 MemRegion CardTableModRefBS::dirty_card_range_after_preclean(MemRegion mr) { 474 MemRegion CardTableModRefBS::dirty_card_range_after_reset(MemRegion mr,
475 bool reset,
476 int reset_val) {
460 for (int i = 0; i < _cur_covered_regions; i++) { 477 for (int i = 0; i < _cur_covered_regions; i++) {
461 MemRegion mri = mr.intersection(_covered[i]); 478 MemRegion mri = mr.intersection(_covered[i]);
462 if (!mri.is_empty()) { 479 if (!mri.is_empty()) {
463 jbyte* cur_entry, *next_entry, *limit; 480 jbyte* cur_entry, *next_entry, *limit;
464 for (cur_entry = byte_for(mri.start()), limit = byte_for(mri.last()); 481 for (cur_entry = byte_for(mri.start()), limit = byte_for(mri.last());
471 for (dirty_cards = 1; 488 for (dirty_cards = 1;
472 next_entry <= limit && *next_entry == dirty_card; 489 next_entry <= limit && *next_entry == dirty_card;
473 dirty_cards++, next_entry++); 490 dirty_cards++, next_entry++);
474 MemRegion cur_cards(addr_for(cur_entry), 491 MemRegion cur_cards(addr_for(cur_entry),
475 dirty_cards*card_size_in_words); 492 dirty_cards*card_size_in_words);
476 for (size_t i = 0; i < dirty_cards; i++) { 493 if (reset) {
477 cur_entry[i] = precleaned_card; 494 for (size_t i = 0; i < dirty_cards; i++) {
495 cur_entry[i] = reset_val;
496 }
478 } 497 }
479 return cur_cards; 498 return cur_cards;
480 } 499 }
481 } 500 }
482 } 501 }