+
+ // aquire the read version for txn.
+ do {
+ txn->rv = version_;
+
+ uint64_t old_count;
+ uint64_t temp = 0;
+ do {
+ old_count = temp;
+ temp = (uint64_t)map_cas(active_, (void *)txn->rv, old_count, old_count + 1);
+ } while (temp != old_count);
+
+ if (txn->rv == version_)
+ break;
+
+ temp = 1;
+ do {
+ old_count = temp;
+ temp = map_cas(active_, (void *)txn->rv, old_count, old_count - 1);
+ } while (temp != old_count);
+ } while (1);
+