From dbd1f75dd020e19571cc39f956fb00c2d78e16e9 Mon Sep 17 00:00:00 2001
From: bdemsky <bdemsky>
Date: Fri, 10 Apr 2009 19:48:38 +0000
Subject: [PATCH] remove stack overflow bug

---
 Robust/src/Runtime/STM/stm.c | 23 ++++++++++++++++++++---
 1 file changed, 20 insertions(+), 3 deletions(-)

diff --git a/Robust/src/Runtime/STM/stm.c b/Robust/src/Runtime/STM/stm.c
index 5e45a495..abdc0f7e 100644
--- a/Robust/src/Runtime/STM/stm.c
+++ b/Robust/src/Runtime/STM/stm.c
@@ -248,10 +248,20 @@ int traverseCache() {
   /* Create info to keep track of objects that can be locked */
   int numoidrdlocked=0;
   int numoidwrlocked=0;
-  void * oidrdlocked[c_numelements];
-  void * oidwrlocked[c_numelements];
+  void * rdlocked[200];
+  void * wrlocked[200];
   int softabort=0;
   int i;
+  void ** oidrdlocked;
+  void ** oidwrlocked;
+  if (c_numelements<200) {
+    oidrdlocked=rdlocked;
+    oidwrlocked=wrlocked;
+  } else {
+    int size=c_numelements*sizeof(void*);
+    oidrdlocked=malloc(size);
+    oidwrlocked=malloc(size);
+  }
   chashlistnode_t *ptr = c_table;
   /* Represents number of bins in the chash table */
   unsigned int size = c_size;
@@ -342,6 +352,10 @@ int transAbortProcess(void **oidrdlocked, int *numoidrdlocked, void **oidwrlocke
     header = (objheader_t *)(((char *)(oidwrlocked[i])) - sizeof(objheader_t));
     write_unlock(&header->lock);
   }
+  if (c_numelements>=200) {
+    free(oidrdlocked);
+    free(oidwrlocked);
+  }
 }
 
 /* ==================================
@@ -390,7 +404,10 @@ int transCommitProcess(void ** oidrdlocked, int *numoidrdlocked,
     header = (objheader_t *)(((char *)(oidwrlocked[i])) - sizeof(objheader_t)); 
     write_unlock(&header->lock);
   }
-
+  if (c_numelements>=200) {
+    free(oidrdlocked);
+    free(oidwrlocked);
+  }
   return 0;
 }
 
-- 
2.34.1