Add the 'current_kthread' helper
[akaros.git] / kern / include / ros / atomic.h
index 1bf4c69..b37a50f 100644 (file)
@@ -17,7 +17,7 @@ typedef void* atomic_t;
  * after.  If the value has changed, the reader needs to re-read.  If the value
  * is odd, a write is in progress or it is otherwise invalid/locked. */
 
-typedef uint8_t seq_ctr_t;
+typedef uint32_t seq_ctr_t;
 #define SEQCTR_INITIALIZER 0
 
 static inline bool seq_is_locked(seq_ctr_t seq_ctr);
@@ -31,11 +31,16 @@ static inline bool seqctr_retry(seq_ctr_t old_ctr, seq_ctr_t new_ctr);
  */
 static inline bool seq_is_locked(seq_ctr_t seq_ctr)
 {
-       return seq_ctr % 2;
+       return READ_ONCE(seq_ctr) % 2;
 }
 
 static inline bool seqctr_retry(seq_ctr_t old_ctr, seq_ctr_t new_ctr)
 {
+       seq_ctr_t old_val;
+
        rmb();  /* don't allow protected reads to reorder after the check */
-       return (seq_is_locked(old_ctr)) || (old_ctr != new_ctr);        
+       /* Even though old_ctr is passed in, we might be inlined and can't guarantee
+        * old_ctr was in a register or otherwise won't be re-read. */
+       old_val = READ_ONCE(old_ctr);
+       return (seq_is_locked(old_val)) || (old_val != new_ctr);
 }