// Handle any unaligned cards at the start. while (!IsAligned<sizeof(intptr_t)>(card_cur) && card_cur < card_end) {
uint8_t expected, new_value; do {
expected = *card_cur;
new_value = visitor(expected);
} while (expected != new_value && UNLIKELY(!byte_cas(expected, new_value, card_cur))); if (expected != new_value) {
modified(card_cur, expected, new_value);
}
++card_cur;
}
// Handle unaligned cards at the end. while (!IsAligned<sizeof(intptr_t)>(card_end) && card_end > card_cur) {
--card_end;
uint8_t expected, new_value; do {
expected = *card_end;
new_value = visitor(expected);
} while (expected != new_value && UNLIKELY(!byte_cas(expected, new_value, card_end))); if (expected != new_value) {
modified(card_end, expected, new_value);
}
}
// Now we have the words, we can process words in parallel.
uintptr_t* word_cur = reinterpret_cast<uintptr_t*>(card_cur);
uintptr_t* word_end = reinterpret_cast<uintptr_t*>(card_end); // TODO: This is not big endian safe. union {
uintptr_t expected_word;
uint8_t expected_bytes[sizeof(uintptr_t)];
}; union {
uintptr_t new_word;
uint8_t new_bytes[sizeof(uintptr_t)];
};
// TODO: Parallelize. while (word_cur < word_end) { while (true) {
expected_word = *word_cur;
static_assert(kCardClean == 0); if (LIKELY(expected_word == 0/* All kCardClean */ )) { break;
} for (size_t i = 0; i < sizeof(uintptr_t); ++i) {
new_bytes[i] = visitor(expected_bytes[i]);
}
Atomic<uintptr_t>* atomic_word = reinterpret_cast<Atomic<uintptr_t>*>(word_cur); if (LIKELY(atomic_word->CompareAndSetWeakRelaxed(expected_word, new_word))) { for (size_t i = 0; i < sizeof(uintptr_t); ++i) { const uint8_t expected_byte = expected_bytes[i]; const uint8_t new_byte = new_bytes[i]; if (expected_byte != new_byte) {
modified(reinterpret_cast<uint8_t*>(word_cur) + i, expected_byte, new_byte);
}
} break;
}
}
++word_cur;
}
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.