#include "cmodelint.h"
#include "snapshot-interface.h"
#include "threads-model.h"
+#include "datarace.h"
- memory_order orders[6] = {
+ memory_order orders[8] = {
memory_order_relaxed, memory_order_consume, memory_order_acquire,
- memory_order_release, memory_order_acq_rel, memory_order_seq_cst
+ memory_order_release, memory_order_acq_rel, memory_order_seq_cst,
+ volatile_order
};
static void ensureModel() {
model->switch_to_master(new ModelAction(ATOMIC_RMWC, position, orders[atomic_index], obj));
}
+ // cds volatile loads
+ uint8_t cds_volatile_load8(void * obj, int atomic_index, const char * position) {
+ ensureModel();
+ return (uint8_t) model->switch_to_master(
+ new ModelAction(VOLATILE_READ, position, orders[atomic_index], obj));
+ }
+ uint16_t cds_volatile_load16(void * obj, int atomic_index, const char * position) {
+ ensureModel();
+ return (uint16_t) model->switch_to_master(
+ new ModelAction(VOLATILE_READ, position, orders[atomic_index], obj));
+ }
+ uint32_t cds_volatile_load32(void * obj, int atomic_index, const char * position) {
+ ensureModel();
+ return (uint32_t) model->switch_to_master(
+ new ModelAction(VOLATILE_READ, position, orders[atomic_index], obj)
+ );
+ }
+ uint64_t cds_volatile_load64(void * obj, int atomic_index, const char * position) {
+ ensureModel();
+ return model->switch_to_master(
+ new ModelAction(VOLATILE_READ, position, orders[atomic_index], obj));
+ }
+
+ // cds volatile stores
+ void cds_volatile_store8(void * obj, uint8_t val, int atomic_index, const char * position) {
+ ensureModel();
+ model->switch_to_master(new ModelAction(VOLATILE_WRITE, position, orders[atomic_index], obj, (uint64_t) val));
+ }
+ void cds_volatile_store16(void * obj, uint16_t val, int atomic_index, const char * position) {
+ ensureModel();
+ model->switch_to_master(new ModelAction(VOLATILE_WRITE, position, orders[atomic_index], obj, (uint64_t) val));
+ }
+ void cds_volatile_store32(void * obj, uint32_t val, int atomic_index, const char * position) {
+ ensureModel();
+ model->switch_to_master(new ModelAction(VOLATILE_WRITE, position, orders[atomic_index], obj, (uint64_t) val));
+ }
+ void cds_volatile_store64(void * obj, uint64_t val, int atomic_index, const char * position) {
+ ensureModel();
+ model->switch_to_master(new ModelAction(VOLATILE_WRITE, position, orders[atomic_index], obj, (uint64_t) val));
+ }
+
// cds atomic inits
-void cds_atomic_init8(void * obj, uint8_t val, const char * position) {
- ensureModel();
- model->switch_to_master(new ModelAction(ATOMIC_INIT, position, memory_order_relaxed, obj, (uint64_t) val));
-}
-void cds_atomic_init16(void * obj, uint16_t val, const char * position) {
- ensureModel();
- model->switch_to_master(new ModelAction(ATOMIC_INIT, position, memory_order_relaxed, obj, (uint64_t) val));
-}
-void cds_atomic_init32(void * obj, uint32_t val, const char * position) {
- ensureModel();
- model->switch_to_master(new ModelAction(ATOMIC_INIT, position, memory_order_relaxed, obj, (uint64_t) val));
-}
-void cds_atomic_init64(void * obj, uint64_t val, const char * position) {
- ensureModel();
- model->switch_to_master(new ModelAction(ATOMIC_INIT, position, memory_order_relaxed, obj, val));
-}
+#define CDSATOMICINT(size) \
+ void cds_atomic_init ## size (void * obj, uint ## size ## _t val, const char * position) { \
+ ensureModel(); \
+ model->switch_to_master(new ModelAction(ATOMIC_INIT, position, memory_order_relaxed, obj, (uint64_t) val)); \
+ *((uint ## size ## _t *)obj) = val; \
+ thread_id_t tid = thread_current()->get_id(); \
+ for(int i=0;i < size / 8;i++) { \
+ recordWrite(tid, (void *)(((char *)obj)+i)); \
+ } \
+ }
+CDSATOMICINT(8)
+CDSATOMICINT(16)
+CDSATOMICINT(32)
+CDSATOMICINT(64)
// cds atomic loads
-uint8_t cds_atomic_load8(void * obj, int atomic_index, const char * position) {
- ensureModel();
- return (uint8_t) model->switch_to_master(
- new ModelAction(ATOMIC_READ, position, orders[atomic_index], obj));
-}
-uint16_t cds_atomic_load16(void * obj, int atomic_index, const char * position) {
- ensureModel();
- return (uint16_t) model->switch_to_master(
- new ModelAction(ATOMIC_READ, position, orders[atomic_index], obj));
-}
-uint32_t cds_atomic_load32(void * obj, int atomic_index, const char * position) {
- ensureModel();
- return (uint32_t) model->switch_to_master(
- new ModelAction(ATOMIC_READ, position, orders[atomic_index], obj)
- );
-}
-uint64_t cds_atomic_load64(void * obj, int atomic_index, const char * position) {
- ensureModel();
- return model->switch_to_master(
- new ModelAction(ATOMIC_READ, position, orders[atomic_index], obj));
-}
+#define CDSATOMICLOAD(size) \
+ uint ## size ## _t cds_atomic_load ## size(void * obj, int atomic_index, const char * position) { \
+ ensureModel(); \
+ return (uint ## size ## _t)model->switch_to_master( \
+ new ModelAction(ATOMIC_READ, position, orders[atomic_index], obj)); \
+ }
+
+CDSATOMICLOAD(8)
+CDSATOMICLOAD(16)
+CDSATOMICLOAD(32)
+CDSATOMICLOAD(64)
// cds atomic stores
-void cds_atomic_store8(void * obj, uint8_t val, int atomic_index, const char * position) {
- ensureModel();
- model->switch_to_master(new ModelAction(ATOMIC_WRITE, position, orders[atomic_index], obj, (uint64_t) val));
-}
-void cds_atomic_store16(void * obj, uint16_t val, int atomic_index, const char * position) {
- ensureModel();
- model->switch_to_master(new ModelAction(ATOMIC_WRITE, position, orders[atomic_index], obj, (uint64_t) val));
-}
-void cds_atomic_store32(void * obj, uint32_t val, int atomic_index, const char * position) {
- ensureModel();
- model->switch_to_master(new ModelAction(ATOMIC_WRITE, position, orders[atomic_index], obj, (uint64_t) val));
-}
-void cds_atomic_store64(void * obj, uint64_t val, int atomic_index, const char * position) {
- ensureModel();
- model->switch_to_master(new ModelAction(ATOMIC_WRITE, position, orders[atomic_index], obj, (uint64_t) val));
-}
+#define CDSATOMICSTORE(size) \
+ void cds_atomic_store ## size(void * obj, uint ## size ## _t val, int atomic_index, const char * position) { \
+ ensureModel(); \
+ model->switch_to_master(new ModelAction(ATOMIC_WRITE, position, orders[atomic_index], obj, (uint64_t) val)); \
+ *((uint ## size ## _t *)obj) = val; \
+ thread_id_t tid = thread_current()->get_id(); \
+ for(int i=0;i < size / 8;i++) { \
+ recordWrite(tid, (void *)(((char *)obj)+i)); \
+ } \
+ }
+
+CDSATOMICSTORE(8)
+CDSATOMICSTORE(16)
+CDSATOMICSTORE(32)
+CDSATOMICSTORE(64)
+
#define _ATOMIC_RMW_(__op__, size, addr, val, atomic_index, position) \
({ \