more changes
authorbdemsky <bdemsky>
Tue, 13 Oct 2009 23:39:11 +0000 (23:39 +0000)
committerbdemsky <bdemsky>
Tue, 13 Oct 2009 23:39:11 +0000 (23:39 +0000)
Robust/src/Runtime/STM/array.h [new file with mode: 0644]
Robust/src/Runtime/STM/stm.c
Robust/src/Runtime/STM/tm.h
Robust/src/Runtime/runtime.c

diff --git a/Robust/src/Runtime/STM/array.h b/Robust/src/Runtime/STM/array.h
new file mode 100644 (file)
index 0000000..9040724
--- /dev/null
@@ -0,0 +1,15 @@
+#ifndef ARRAY_H
+#define ARRAY_H
+
+/* Array layout */
+#define INDEXSHIFT 4   //must be at least 3 for doubles
+#define DBLINDEXSHIFT INDEXSHIFT-1   //must be at least 3 for doubles
+
+#define GETLOCKPTR(lock, array, byteindex) {                           \
+    lock=(int *)((char *)array-sizeof(objheader_t)-sizeof(int)*(byteindex>>DBLINDEXSHIFT)); \
+  }
+
+#define GETVERSIONPTR(version, array, byteindex) {                     \
+    version=(int *)((char *)array-sizeof(objheader_t)-sizeof(int)*(byteindex>>DBLINDEXSHIFT)-sizeof(int)); \
+  }
+#endif
index 4699540f1871e28cbd2f8234f8002695603a0cc7..0ced99c40752a2832e9d43da70fc390d59e7b7a2 100644 (file)
@@ -89,9 +89,15 @@ void transStart() {
  * This function creates objects in the transaction record
  * =======================================================
  */
+#ifdef STMARRAY
+objheader_t *transCreateObj(void * ptr, unsigned int size, int bytelength) {
+  int *tmpint = mygcmalloc(ptr, (sizeof(objheader_t) + size));
+  objheader_t *tmp = (objheader_t *) (tmpint+(bytelength>>DBLINDEXSHIFT));
+#else
 objheader_t *transCreateObj(void * ptr, unsigned int size) {
   objheader_t *tmp = mygcmalloc(ptr, (sizeof(objheader_t) + size));
-  objheader_t *retval=&tmp[1];
+#endif
+  objheader_t *retval=tmp+1;
   tmp->lock=RW_LOCK_BIAS;
   tmp->version = 1;
   //initialize obj lock to the header
index 89a7b442d692b131c3822be715843e2fed9200bb..2384b30cc8fd53465fc640da96a4b37673b40d4e 100644 (file)
@@ -260,4 +260,8 @@ struct fixedlist {
   void * array[200];
 };
 
+#ifdef STMARRAY
+#include "array.h"
+#endif
+
 #endif
index c4502f55006bb0944df477cfeb5d28f65c11743a..b8240d22ef7d44db277961c944d2c6d604e0dd9b 100644 (file)
@@ -469,7 +469,11 @@ __attribute__((malloc)) void * allocate_newtrans(void * ptr, int type) {
 
 /* Array allocation function */
 __attribute__((malloc)) struct ArrayObject * allocate_newarraytrans(void * ptr, int type, int length) {
+#ifdef STMARRAY
+  struct ArrayObject * v=(struct ArrayObject *)transCreateObj(ptr, sizeof(struct ArrayObject)+length*classsize[type]+sizeof(int)*(((length*classsize[type])>>DBLINDEXSHIFT)), (length*classsize[type])>>DBLINDEXSHIFT);
+#else
   struct ArrayObject * v=(struct ArrayObject *)transCreateObj(ptr, sizeof(struct ArrayObject)+length*classsize[type]);
+#endif
   if (length<0) {
     printf("ERROR: negative array\n");
     return NULL;
@@ -479,6 +483,7 @@ __attribute__((malloc)) struct ArrayObject * allocate_newarraytrans(void * ptr,
   v->___length___=length;
   return v;
 }
+
 __attribute__((malloc)) void * allocate_new(void * ptr, int type) {
   objheader_t *tmp=mygcmalloc((struct garbagelist *) ptr, classsize[type]+sizeof(objheader_t));
   struct ___Object___ * v=(struct ___Object___ *) &tmp[1];
@@ -492,7 +497,12 @@ __attribute__((malloc)) void * allocate_new(void * ptr, int type) {
 /* Array allocation function */
 
 __attribute__((malloc)) struct ArrayObject * allocate_newarray(void * ptr, int type, int length) {
+#ifdef STMARRAY
+  int *tmpint=mygcmalloc((struct garbagelist *) ptr, sizeof(struct ArrayObject)+length*classsize[type]+sizeof(objheader_t)+sizeof(int)*(((length*classsize[type])>>DBLINDEXSHIFT)));
+  objheader_t *tmp=(objheader_t *)(tmpint+((length*classsize[type])>>DBLINDEXSHIFT));
+#else
   objheader_t *tmp=mygcmalloc((struct garbagelist *) ptr, sizeof(struct ArrayObject)+length*classsize[type]+sizeof(objheader_t));
+#endif
   struct ArrayObject * v=(struct ArrayObject *) &tmp[1];
   initdsmlocks(&tmp->lock);
   tmp->version=1;