AutoWriteBarrier.cpp [plain text]
#include "AutoConfiguration.h"
#include "AutoDefs.h"
#include "AutoRange.h"
#include "AutoMemoryScanner.h"
#include "AutoWriteBarrier.h"
#include "AutoZone.h"
namespace Auto {
void WriteBarrier::scan_ranges(void *address, const usword_t size, MemoryScanner &scanner) {
void *end = displace(address, size);
void *last = displace(address, size - 1);
usword_t i = card_index(address);
const usword_t j = card_index(last);
WriteBarrier *wb = scanner.zone()->repair_write_barrier() ? this : NULL;
while (true) {
for ( ; i <= j && !is_card_marked(i); i++) {}
if (i > j) break;
usword_t k = i;
for ( ; i <= j && is_card_marked(i); i++) {}
void *range_begin = card_address(k);
void *range_end = card_address(i);
if (range_begin < address) range_begin = address;
if (range_end > end) range_end = end;
Range range(range_begin, range_end);
scanner.scan_range(range, wb);
}
}
void WriteBarrier::mark_cards_untouched() {
for (unsigned char *card = (unsigned char*)address() + _protect, *limit = (unsigned char *)end(); card != limit; ++card) {
if (*card == card_marked_untouched) *card = card_marked_untouched;
}
}
void WriteBarrier::clear_untouched_cards() {
for (unsigned char *card = (unsigned char*)address() + _protect, *limit = (unsigned char *)end(); card != limit; ++card) {
if (*card == card_marked_untouched) *card = card_unmarked;
}
}
};