From 4bccf8848a3410795ab66d7f615fa5b98417afc6 Mon Sep 17 00:00:00 2001 From: Jan Huwald Date: Tue, 4 Jun 2013 12:08:48 +0200 Subject: packed_array: add a little atomic access logic diff --git a/packed_array.hpp b/packed_array.hpp index 9fb2c59..f4fa041 100644 --- a/packed_array.hpp +++ b/packed_array.hpp @@ -18,9 +18,12 @@ struct packed_array { element(word_t *base, uint shift) : base(base), shift(shift) {} T operator= (T val) { - word_t mask = ~(((((word_t) 1) << bit_sz) - 1) << shift); - *base &= mask; - *base ^= val << shift; + word_t old_val, new_val; + do { + word_t mask = ~(((((word_t) 1) << bit_sz) - 1) << shift); + old_val = *((volatile word_t*) base); + new_val = (old_val & mask) ^ (val << shift); + } while (!__sync_bool_compare_and_swap(base, old_val, new_val)); return val; } -- cgit v0.10.1