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