in src/benchmarks/mwcas_benchmark.cc [153:201]
void Main(size_t thread_index) {
CasPtr* address[10] = {0,0,0,0,0,0,0,0,0,0};
CasPtr value[10] = {0,0,0,0,0,0,0,0,0,0};
RandomNumberGenerator rng(FLAGS_seed + thread_index, 0, FLAGS_array_size);
auto s = MwCASMetrics::ThreadInitialize();
RAW_CHECK(s.ok(), "Error initializing thread");
WaitForStart();
const uint64_t kEpochThreshold = 100;
uint64_t epochs = 0;
descriptor_pool_->GetEpoch()->Protect();
uint64_t n_success = 0;
while(!IsShutdown()) {
if(++epochs == kEpochThreshold) {
descriptor_pool_->GetEpoch()->Unprotect();
descriptor_pool_->GetEpoch()->Protect();
epochs = 0;
}
// Pick a random word each time
for(uint32_t i = 0; i < FLAGS_word_count; ++i) {
retry:
uint64_t idx = rng.Generate(FLAGS_array_size);
for(uint32_t j = 0; j < i; ++j) {
if(address[j] == reinterpret_cast<CasPtr*>(&test_array_[idx])) {
goto retry;
}
}
address[i] = reinterpret_cast<CasPtr*>(&test_array_[idx]);
value[i] = test_array_[idx].GetValueProtected();
CHECK(value[i] % (4 * FLAGS_array_size) >= 0 &&
(value[i] % (4 * FLAGS_array_size)) / 4 < FLAGS_array_size);
}
Descriptor* descriptor = descriptor_pool_->AllocateDescriptor();
CHECK_NOTNULL(descriptor);
for(uint64_t i = 0; i < FLAGS_word_count; i++) {
descriptor->AddEntry((uint64_t*)(address[i]), uint64_t(value[i]),
uint64_t(value[FLAGS_word_count - 1 - i] + 4 * FLAGS_array_size));
}
bool status = false;
status = descriptor->MwCAS();
n_success += (status == true);
}
descriptor_pool_->GetEpoch()->Unprotect();
auto n = total_success_.fetch_add(n_success, std::memory_order_seq_cst);
LOG(INFO) << "Thread " << thread_index << " success updates: " <<
n_success << " " << n;
}