AutoThreadLocalScanner.cpp [plain text]
#include "AutoThreadLocalScanner.h"
#include "AutoSubzone.h"
#include "AutoZone.h"
namespace Auto {
void ThreadLocalScanner::check_block(void **reference, void *block) {
if (_zone->in_subzone_memory(block)) {
Subzone *subzone = Subzone::subzone(block);
if (subzone->is_thread_local(block)) {
int32_t blockIndex = _localBlocks.slotIndex(block);
if (blockIndex != -1 && !_localBlocks.testAndSetMarked(blockIndex)) {
++_markedBlocksCounter;
if (_markedBlocksBuffer)
_markedBlocksBuffer->push(block);
}
}
}
else {
}
}
void ThreadLocalScanner::scan_range(const Range &range, WriteBarrier *wb) {
void ** reference = (void **)range.address();
void ** const end = (void **)range.end();
_amount_scanned += (char *)end - (char *)reference;
uintptr_t valid_lowest = (uintptr_t)_zone->coverage().address();
uintptr_t valid_size = (uintptr_t)_zone->coverage().end() - valid_lowest;
void *last_valid_pointer = end - 1;
for ( ; reference <= last_valid_pointer; ++reference) {
void *referent = *reference;
if (((intptr_t)referent - valid_lowest) < valid_size && _zone->block_is_start(referent)) {
check_block(reference, referent);
}
}
}
};