bool doHeapRegion(HeapRegion* r) { assert(r->in_collection_set(), "should only be called on elements of CS."); HeapRegionRemSet* hrrs = r->rem_set(); if (hrrs->iter_is_complete()) return false; // All done. if (!_try_claimed && !hrrs->claim_iter()) return false; _g1h->push_dirty_cards_region(r); // If we didn't return above, then // _try_claimed || r->claim_iter() // is true: either we're supposed to work on claimed-but-not-complete // regions, or we successfully claimed the region. HeapRegionRemSetIterator* iter = _g1h->rem_set_iterator(_worker_i); hrrs->init_iterator(iter); size_t card_index; // We claim cards in block so as to recude the contention. The block size is determined by // the G1RSetScanBlockSize parameter. size_t jump_to_card = hrrs->iter_claimed_next(_block_size); for (size_t current_card = 0; iter->has_next(card_index); current_card++) { if (current_card >= jump_to_card + _block_size) { jump_to_card = hrrs->iter_claimed_next(_block_size); } if (current_card < jump_to_card) continue; HeapWord* card_start = _g1h->bot_shared()->address_for_index(card_index); #if 0 gclog_or_tty->print("Rem set iteration yielded card [" PTR_FORMAT ", " PTR_FORMAT ").\n", card_start, card_start + CardTableModRefBS::card_size_in_words); #endif HeapRegion* card_region = _g1h->heap_region_containing(card_start); assert(card_region != NULL, "Yielding cards not in the heap?"); _cards++; if (!card_region->is_on_dirty_cards_region_list()) { _g1h->push_dirty_cards_region(card_region); } // If the card is dirty, then we will scan it during updateRS. if (!card_region->in_collection_set() && !_ct_bs->is_card_dirty(card_index)) { // We make the card as "claimed" lazily (so races are possible but they're benign), // which reduces the number of duplicate scans (the rsets of the regions in the cset // can intersect). if (!_ct_bs->is_card_claimed(card_index)) { _ct_bs->set_card_claimed(card_index); scanCard(card_index, card_region); } } } if (!_try_claimed) { hrrs->set_iter_complete(); } return false; }
bool doHeapRegion(HeapRegion* r) { assert(r->in_collection_set(), "should only be called on elements of CS."); HeapRegionRemSet* hrrs = r->rem_set(); if (hrrs->iter_is_complete()) return false; // All done. if (!_try_claimed && !hrrs->claim_iter()) return false; // If we ever free the collection set concurrently, we should also // clear the card table concurrently therefore we won't need to // add regions of the collection set to the dirty cards region. _g1h->push_dirty_cards_region(r); // If we didn't return above, then // _try_claimed || r->claim_iter() // is true: either we're supposed to work on claimed-but-not-complete // regions, or we successfully claimed the region. HeapRegionRemSetIterator iter(hrrs); size_t card_index; // We claim cards in block so as to reduce the contention. The block size is determined by // the G1RSetScanBlockSize parameter. size_t jump_to_card = hrrs->iter_claimed_next(_block_size); for (size_t current_card = 0; iter.has_next(card_index); current_card++) { if (current_card >= jump_to_card + _block_size) { jump_to_card = hrrs->iter_claimed_next(_block_size); } if (current_card < jump_to_card) continue; HeapWord* card_start = _g1h->bot_shared()->address_for_index(card_index); #if 0 gclog_or_tty->print("Rem set iteration yielded card [" PTR_FORMAT ", " PTR_FORMAT ").\n", card_start, card_start + CardTableModRefBS::card_size_in_words); #endif HeapRegion* card_region = _g1h->heap_region_containing(card_start); _cards++; if (!card_region->is_on_dirty_cards_region_list()) { _g1h->push_dirty_cards_region(card_region); } // If the card is dirty, then we will scan it during updateRS. if (!card_region->in_collection_set() && !_ct_bs->is_card_dirty(card_index)) { scanCard(card_index, card_region); } } if (!_try_claimed) { // Scan the strong code root list attached to the current region scan_strong_code_roots(r); hrrs->set_iter_complete(); } return false; }
int main(int argc, char* argv[]){ hd44780 lcd(14, 15, 24, 25, 8, 7); lcd.init(20, 4); lcd.setAutoscroll(hd44780::HSCROLL_LINE | hd44780::VSCROLL); rpihw::gpio &io = rpihw::gpio::get(); io.setup(23, rpihw::OUTPUT); io.write(23, rpihw::HIGH); bool *backlight = new bool(true); uint8_t blank[8] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; lcd.defChar(hd44780::CCHAR2, blank); getDatabaseDetails(&DBHOST, &USER, &PASSWORD, &DATABASE); retrieveSQL(entries, lcd); entries.erase(0); int card = 0; lcd.move(0,2); printfl("DeltaPi ver. 0.9.0",lcd); do{ moveAndClearLine(0,0,lcd); lcd.write("Retrieving database"); retrieveSQL(entries, lcd); scanCard(entries, card, lcd); if (!(*backlight)) changeBacklight(io, backlight, lcd); if (card > 10){ moveAndClearLine(0,1,lcd); lcd.write("Retrieving database"); retrieveSQL(entries, lcd); printInfo(entries, card, lcd); transaction(entries, card, lcd); } else if (card == 0){ printHelp(lcd); }else if (card == 1){ lcd.write("Retrieving database"); retrieveSQL(entries, lcd); printSummary(entries, lcd); } else if (card == 3){ lcd.clear(); lcd.move(0,1); printfl("Retrieving database", lcd); retrieveSQL(entries, lcd); } else if (card == 4){ printTime(lcd); } else if (card == 6){ printLastCoffee(lcd); } else if (card == 9){ changeBacklight(io, backlight, lcd); } }while (card != -1); lcd.clear(); printfl(" Closing DeltaPi", lcd); lcd.move(6,2); lcd.write("Goodbye! .",128); io.write(23, rpihw::LOW); delete backlight; return 0; }