44 static uint64_t store_generation = 0; |
44 static uint64_t store_generation = 0; |
45 static uint64_t serialized_generation = 0; |
45 static uint64_t serialized_generation = 0; |
46 |
46 |
47 inline void set_generation(uint64_t value, uint64_t* const dest) { |
47 inline void set_generation(uint64_t value, uint64_t* const dest) { |
48 assert(dest != NULL, "invariant"); |
48 assert(dest != NULL, "invariant"); |
49 OrderAccess::release_store(dest, value); |
49 Atomic::release_store(dest, value); |
50 } |
50 } |
51 static void increment_store_generation() { |
51 static void increment_store_generation() { |
52 const uint64_t current_serialized = OrderAccess::load_acquire(&serialized_generation); |
52 const uint64_t current_serialized = Atomic::load_acquire(&serialized_generation); |
53 const uint64_t current_stored = OrderAccess::load_acquire(&store_generation); |
53 const uint64_t current_stored = Atomic::load_acquire(&store_generation); |
54 if (current_serialized == current_stored) { |
54 if (current_serialized == current_stored) { |
55 set_generation(current_serialized + 1, &store_generation); |
55 set_generation(current_serialized + 1, &store_generation); |
56 } |
56 } |
57 } |
57 } |
58 |
58 |
59 static bool increment_serialized_generation() { |
59 static bool increment_serialized_generation() { |
60 const uint64_t current_stored = OrderAccess::load_acquire(&store_generation); |
60 const uint64_t current_stored = Atomic::load_acquire(&store_generation); |
61 const uint64_t current_serialized = OrderAccess::load_acquire(&serialized_generation); |
61 const uint64_t current_serialized = Atomic::load_acquire(&serialized_generation); |
62 if (current_stored != current_serialized) { |
62 if (current_stored != current_serialized) { |
63 set_generation(current_stored, &serialized_generation); |
63 set_generation(current_stored, &serialized_generation); |
64 return true; |
64 return true; |
65 } |
65 } |
66 return false; |
66 return false; |