blob: ffc8f53848b5a9c6e62e43b6e83e2096f93fd67f [file] [log] [blame] [edit]
/* Copyright (c) 2010 The Regents of the University of California
* Barret Rhoden <brho@cs.berkeley.edu>
* See LICENSE for details.
*
* Locking and atomics that are part of the kernel interface. */
#ifndef ROS_INC_ATOMIC_H
#define ROS_INC_ATOMIC_H
#include <ros/common.h>
#include <ros/arch/membar.h>
typedef void* atomic_t;
/* The seq counters are used by userspace to see if the kernel is updating
* something or if something is valid, such as the vcore->pcore mapping. The
* way a reader can tell nothing has changed is to read the counter before and
* 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;
#define SEQCTR_INITIALIZER 0
static inline bool seq_is_locked(seq_ctr_t seq_ctr);
static inline bool seqctr_retry(seq_ctr_t old_ctr, seq_ctr_t new_ctr);
/* Basic helpers for readers. Ex:
* do {
* seq_ctr_t seq = kernel_maintained_seq_ctr
* read_data_whatever();
* } while (seqctr_retry(seq, kernel_maintained_seq_ctr);
*/
static inline bool seq_is_locked(seq_ctr_t seq_ctr)
{
return seq_ctr % 2;
}
static inline bool seqctr_retry(seq_ctr_t old_ctr, seq_ctr_t new_ctr)
{
rmb(); /* don't allow protected reads to reorder after the check */
return (seq_is_locked(old_ctr)) || (old_ctr != new_ctr);
}
#endif /* ROS_INC_ATOMIC_H */