runtime support for read only TRANSREADS
[IRC.git] / Robust / src / Runtime / STM / tm.h
index 05937ffad83a9f307b7ebf563e9359d4de1fffea..318f6cfb24a3a473f27035162c023c47a2cf63b2 100644 (file)
@@ -8,7 +8,7 @@
 #define TRANS_SOFT_ABORT    12
 #define TRANS_ABORT         13
 #define TRANS_COMMIT        14
-
+#define TRANS_ABORT_RETRY         15
 
 /* ========================
  * Library header files
@@ -107,6 +107,19 @@ typedef struct objheader {
           } while(1); \
         }}
 
+#define TRANSREADRD(x,y) { \
+    void * inputvalue; \
+    if ((inputvalue=y)==NULL) x=NULL;\
+         else { \
+           chashlistnode_t * cnodetmp=&c_table[(((unsigned INTPTR)inputvalue)&c_mask)>>4]; \
+           do { \
+             if (cnodetmp->key==inputvalue) {x=cnodetmp->val; break;} \
+             cnodetmp=cnodetmp->next; \
+             if (cnodetmp==NULL) {if (((struct ___Object___*)inputvalue)->___objstatus___&NEW) {x=inputvalue; break;} else \
+                                   {x=inputvalue;rd_t_chashInsertOnce(inputvalue, ((objheader_t *)inputvalue)[-1].version); break;}} \
+          } while(1); \
+        }}
+
 /* =================================
  * Data structures
  * =================================
@@ -169,6 +182,9 @@ objheader_t *transCreateObj(void * ptr, unsigned int size);
 unsigned int getNewOID(void);
 void *objstrAlloc(unsigned int size);
 __attribute__((pure)) void *transRead(void *, void *);
+#ifdef READSET
+__attribute__((pure)) void *transReadOnly(void *);
+#endif
 #ifdef DELAYCOMP
 int transCommit(void (*commitmethod)(void *, void *, void *), void * primitives, void * locals, void * params);
 int traverseCache(void (*commitmethod)(void *, void *, void *), void * primitives, void * locals, void * params);