From: adash Date: Fri, 21 Mar 2008 22:45:37 +0000 (+0000) Subject: bug fix for OBJECT_NOT_FOUND error in prefetch cache due to unknown oid X-Git-Tag: preEdgeChange~218 X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=dd72e8b5c40b43ef6b796f7b481528c5d6af380e;p=IRC.git bug fix for OBJECT_NOT_FOUND error in prefetch cache due to unknown oid computation using offsets for array elements --- diff --git a/Robust/src/Runtime/DSTM/interface/trans.c b/Robust/src/Runtime/DSTM/interface/trans.c index 485e7121..eb25ff50 100644 --- a/Robust/src/Runtime/DSTM/interface/trans.c +++ b/Robust/src/Runtime/DSTM/interface/trans.c @@ -1342,10 +1342,10 @@ prefetchpile_t *foundLocal(prefetchqelem_t *node) { if(isArray == 1) { int elementsize = classsize[TYPE(objheader)]; struct ArrayObject *ao = (struct ArrayObject *) (tmp + sizeof(objheader_t)); - unsigned short length = ao->___length___; + int length = ao->___length___; /* Check if array out of bounds */ - if(arryfields[arryfieldindex] < 0 || arryfields[arryfieldindex]>= length) { - break; + if(arryfields[arryfieldindex] < 0 || arryfields[arryfieldindex] >= length) { + break; //if yes then treat the object as found } objoid = *((unsigned int *)(tmp + sizeof(objheader_t) + sizeof(struct ArrayObject) + (elementsize*arryfields[arryfieldindex]))); } else { @@ -1381,6 +1381,7 @@ prefetchpile_t *foundLocal(prefetchqelem_t *node) { /* Look in Prefetch cache */ checkPreCache(node, numoffset, oid[i],i); } + flag = 0; } /* Make machine groups */ @@ -1422,8 +1423,15 @@ void checkPreCache(prefetchqelem_t *node, int *numoffset, unsigned int objoid, i if(TYPE(header) > NUMCLASSES) { isArray = 1; } + if(isArray == 1) { int elementsize = classsize[TYPE(header)]; + struct ArrayObject *ao = (struct ArrayObject *) (tmp + sizeof(objheader_t)); + int length = ao->___length___; + /* Check if array out of bounds */ + if(arryfields[arryfieldindex] < 0 || arryfields[arryfieldindex] >= length) { + break; //if yes treat the object as found + } objoid = *((unsigned int *)(tmp + sizeof(objheader_t) + sizeof(struct ArrayObject) + (elementsize*arryfields[arryfieldindex]))); } else { objoid = *((unsigned int *)(tmp + sizeof(objheader_t) + arryfields[arryfieldindex])); @@ -1641,6 +1649,7 @@ int getPrefetchResponse(int sd) { printf("%s() Calloc error at %s,%d\n", __func__, __FILE__, __LINE__); return -1; } + recv_data((int)sd, recvbuffer, size); control = *((char *) recvbuffer);