Merge branch 'master' of ssh://demsky.eecs.uci.edu/home/git/model-checker
[model-checker.git] / libatomic.h
index f861445cb0789b547a708150eb598547d59e78d3..71482c3d0a505d050fafc912951d8c084ee7fac6 100644 (file)
@@ -1,22 +1,38 @@
+/** @file libatomic.h
+ *  @brief Basic atomic operations to be exposed to user program.
+ */
+
 #ifndef __LIBATOMIC_H__
 #define __LIBATOMIC_H__
 
-typedef enum memory_order {
-       memory_order_relaxed,
-       memory_order_consume,
-       memory_order_acquire,
-       memory_order_release,
-       memory_order_acq_rel,
-       memory_order_seq_cst
-} memory_order;
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+       /** @brief The memory orders specified by the C11/C++11 memory models */
+       typedef enum memory_order {
+               memory_order_relaxed,
+               memory_order_consume,
+               memory_order_acquire,
+               memory_order_release,
+               memory_order_acq_rel,
+               memory_order_seq_cst
+       } memory_order;
 
-typedef struct atomic_object {
-} atomic_int;
+       typedef struct atomic_object {
+               int value;
+       } atomic_int;
 
-void atomic_store_explicit(struct atomic_object *obj, int value, memory_order order);
+       void atomic_store_explicit(struct atomic_object *obj, int value, memory_order order);
 #define atomic_store(A, B) atomic_store_explicit((A), (B), memory_order_seq_cst)
 
-int atomic_load_explicit(struct atomic_object *obj, memory_order order);
+       int atomic_load_explicit(struct atomic_object *obj, memory_order order);
 #define atomic_load(A) atomic_load_explicit((A), memory_order_seq_cst)
 
+       void atomic_init(struct atomic_object *obj, int value);
+
+#ifdef __cplusplus
+}
+#endif
+
 #endif /* __LIBATOMIC_H__ */