From 1f51fd64a9d725ed875d89a6ee50dc1116f19e7e Mon Sep 17 00:00:00 2001 From: adash Date: Fri, 9 Jan 2009 02:14:10 +0000 Subject: [PATCH] add more changes for server side changes..needs some more testing --- Robust/src/Runtime/DSTM/interface/dstm.h | 1 + .../src/Runtime/DSTM/interface/dstmserver.c | 6 +- Robust/src/Runtime/DSTM/interface/prefetch.c | 363 +++++++++++------- Robust/src/Runtime/DSTM/interface/prefetch.h | 6 +- 4 files changed, 240 insertions(+), 136 deletions(-) diff --git a/Robust/src/Runtime/DSTM/interface/dstm.h b/Robust/src/Runtime/DSTM/interface/dstm.h index 2c7867ca..05dc2be6 100644 --- a/Robust/src/Runtime/DSTM/interface/dstm.h +++ b/Robust/src/Runtime/DSTM/interface/dstm.h @@ -296,6 +296,7 @@ void *transPrefetch(void *); void *mcqProcess(void *); prefetchpile_t *foundLocal(char *); // returns node with prefetch elements(oids, offsets) int lookupObject(unsigned int * oid, short offset); +int checkoid(unsigned int oid); int transPrefetchProcess(transrecord_t *, int **, short); void sendPrefetchReq(prefetchpile_t*, int); void sendPrefetchReqnew(prefetchpile_t*, int); diff --git a/Robust/src/Runtime/DSTM/interface/dstmserver.c b/Robust/src/Runtime/DSTM/interface/dstmserver.c index 578886e1..79351126 100644 --- a/Robust/src/Runtime/DSTM/interface/dstmserver.c +++ b/Robust/src/Runtime/DSTM/interface/dstmserver.c @@ -825,10 +825,10 @@ int prefetchReq(int acceptfd) { control = TRANS_PREFETCH_RESPONSE; sendPrefetchResponse(sd, &control, sendbuffer, &size); } - } + } //end of for } - } - //Release socket + } //end of while + //Release socket if (mid!=-1) freeSockWithLock(transPResponseSocketPool, mid, sd); diff --git a/Robust/src/Runtime/DSTM/interface/prefetch.c b/Robust/src/Runtime/DSTM/interface/prefetch.c index 4bb74e97..93800030 100644 --- a/Robust/src/Runtime/DSTM/interface/prefetch.c +++ b/Robust/src/Runtime/DSTM/interface/prefetch.c @@ -1,10 +1,13 @@ #include "prefetch.h" #include "prelookup.h" #include "sockpool.h" +#include "gCollect.h" extern sockPoolHashTable_t *transPrefetchSockPool; extern unsigned int myIpAddr; extern sockPoolHashTable_t *transPResponseSocketPool; +extern pthread_mutex_t prefetchcache_mutex; +extern prehashtable_t pflookup; // Function for new prefetch call void rangePrefetch(unsigned int oid, short numoffset, short *offsets) { @@ -73,7 +76,6 @@ perMcPrefetchList_t* checkIfLocal(char *ptr) { int numLocal = 0; perMcPrefetchList_t * head=NULL; - //printf("Inside %s()\n", __func__); // Iterate for the object int noffset = (int) numoffsets; @@ -84,12 +86,10 @@ perMcPrefetchList_t* checkIfLocal(char *ptr) { tmpobjset[l] = GET_RANGE(offsets[2*l+1]); } int maxChldOids = getsize(tmpobjset, sizetmpObjSet)+1; - //printf("%s() maxChldOids = %d\n", __func__, maxChldOids); unsigned int chldOffstFrmBase[maxChldOids]; chldOffstFrmBase[0] = oid; int tovisit = 0, visited = -1; // Iterate for each element of offsets - //printf("%s() noffset = %d, sizetmpObjSet= %d, visited = %d, tovisit= %d\n", __func__, noffset, sizetmpObjSet, visited, tovisit); for (j = 0; j < noffset; j++) { // Iterate over each element to be visited while (visited != tovisit) { @@ -97,13 +97,11 @@ perMcPrefetchList_t* checkIfLocal(char *ptr) { visited++; continue; } - - if (!isOidAvail(chldOffstFrmBase[visited+1])) { + if (!checkoid(chldOffstFrmBase[visited+1])) { // Add to remote requests unsigned int oid = chldOffstFrmBase[visited+1]; int machinenum = lhashSearch(oid); //TODO Group a bunch of oids to send in one prefetch request - //printf("Oid Not Found, send Prefetch for oid = %d, noffset-j= %d j should point to the new offset = %d\n", oid, noffset-j, j); insertPrefetch(machinenum, oid, noffset-j, &offsets[j], &head); goto tuple; } else { @@ -116,9 +114,7 @@ perMcPrefetchList_t* checkIfLocal(char *ptr) { return NULL; } } - //printf("%s() visited = %d, tovisit= %d\n", __func__, visited, tovisit); visited++; - fflush(stdout); } } // end iterate for each element of offsets @@ -129,25 +125,11 @@ perMcPrefetchList_t* checkIfLocal(char *ptr) { } tuple: ; - return head; } -int isOidAvail(unsigned int oid) { - objheader_t * header; - if((header=(objheader_t *)mhashSearch(oid))!=NULL) { - //Found on machine - return 1; - } else if ((header=(objheader_t *)prehashSearch(oid))!=NULL) { - return 1; - } else { - return 0; - } -} - int lookForObjs(int *chldOffstFrmBase, short *offsets, int *index, int *visited, int *tovisit, int *noffset) { - //printf("Inside %s()\n", __func__); objheader_t *header; unsigned int oid = chldOffstFrmBase[*visited+1]; if((header = (objheader_t *)mhashSearch(oid))!= NULL) { @@ -157,7 +139,7 @@ int lookForObjs(int *chldOffstFrmBase, short *offsets, //Found in prefetch cache ; } else { - printf("DEBUG->%s()THIS SHOULD NOR HAPPEN\n", __func__); + printf("%s() Error: THIS SHOULD NOT HAPPEN\n", __func__); return -1; } @@ -168,7 +150,6 @@ int lookForObjs(int *chldOffstFrmBase, short *offsets, /* Check if array out of bounds */ int startindex = offsets[*index]; int range = GET_RANGE(offsets[(*index)+1]); - //printf("%s() Array range = %d\n", __func__, range); if(range > 0 && range < length) { short stride = GET_STRIDE(offsets[(*index)+1]); stride = stride + 1; //NOTE bit pattern 000 => stride = 1, 001 => stride = 2 @@ -217,27 +198,23 @@ int lookForObjs(int *chldOffstFrmBase, short *offsets, } else { //linked list int startindex = offsets[*index]; int range = GET_RANGE(offsets[(*index)+1]); - //printf("%s() LinkedList range = %d\n", __func__, range); unsigned int oid = *((unsigned int *)(((char *)header) + sizeof(objheader_t) + startindex)); - //printf("Oid = %d\n", oid); if (range == 0) { chldOffstFrmBase[*tovisit+1] = oid; - if(isOidAvail(oid)) { + if(checkoid(oid)) { *visited = *visited + 1; *tovisit = *tovisit + 1; *index = *index + 2; - //printf("%s() Found visited = %d, tovisit=%d, index=%d\n", __func__, *visited, *tovisit, *index); return 1; } else { *tovisit = *tovisit + 1; - //printf("%s() Not Found visited = %d, tovisit=%d, index=%d\n", __func__, *visited, *tovisit, *index); return 1; } } else { int i; for(i = 0; iversion <= ((objheader_t *)ptr)->version) { + prehashRemove(oid); + prehashInsert(oid, ptr); + } + } else { + prehashInsert(oid, ptr); + } + pthread_mutex_lock(&pflookup.lock); + pthread_cond_broadcast(&pflookup.cond); + pthread_mutex_unlock(&pflookup.lock); + } else if(control == OBJECT_NOT_FOUND) { + oid = *((unsigned int *)(recvbuffer + sizeof(char))); + //printf("%s() Error: OBJ NOT FOUND.. THIS SHOULD NOT HAPPEN\n", __func__); + } else { + printf("%s() Error: in Decoding the control value %d, %s\n", __func__, __LINE__, __FILE__); + } return 0; } - int rangePrefetchReq(int acceptfd) { int numoffset, sd = -1; unsigned int oid, mid = -1; oidmidpair_t oidmid; - //printf("Inside %s()\n", __func__); while (1) { recv_data(acceptfd, &numoffset, sizeof(int)); @@ -424,7 +437,7 @@ int rangePrefetchReq(int acceptfd) { short offsetsarry[numoffset]; recv_data(acceptfd, offsetsarry, numoffset*sizeof(short)); - /*Process each oid */ + /* Obj not found */ objheader_t *header; if((header = (objheader_t *)mhashSearch(oid)) == NULL) { int size = sizeof(int) + sizeof(char) + sizeof(unsigned int); @@ -437,22 +450,20 @@ int rangePrefetchReq(int acceptfd) { break; } else { //Obj found int retval; - if((retval = processOidFound(header, offsetsarry, 0, sd)) != 0) { + if((retval = processOidFound(header, offsetsarry, 0, sd, numoffset)) != 0) { printf("%s() Error: in processOidFound() at line %d in %s()\n", __func__, __LINE__, __FILE__); return -1; } } } - //Release socket if(mid!=-1) freeSockWithLock(transPResponseSocketPool, mid, sd); - return 0; } -int processOidFound(objheader_t *header, short * offsetsarry, int index, int sd) { +int processOidFound(objheader_t *header, short * offsetsarry, int index, int sd, int numoffset) { int objsize; GETSIZE(objsize, header); int size = sizeof(int) + sizeof(char) + sizeof(unsigned int) + @@ -470,106 +481,194 @@ int processOidFound(objheader_t *header, short * offsetsarry, int index, int sd) char control = TRANS_PREFETCH_RESPONSE; sendPrefetchResponse(sd, &control, sendbuffer, &size); - if(TYPE(header) > NUMCLASSES) { - int elementsize = classsize[TYPE(header)]; - struct ArrayObject *ao = (struct ArrayObject *) (((char *)header) + sizeof(objheader_t)); - int length = ao->___length___; - /* Check if array out of bounds */ - int startindex = offsetsarry[index]; - int range = GET_RANGE(offsetsarry[index+1]); - //printf("%s() Array range = %d\n", __func__, range); - if(range > 0 && range < length) { - short stride = GET_STRIDE(offsets[index+1]); - stride = stride + 1; //NOTE bit pattern 000 => stride = 1, 001 => stride = 2 - int i; - //check is stride +ve or negative - if(GET_STRIDEINC(offsets[index]+1)) { //-ve stride - for(i = startindex; i <= range+1; i = i - stride) { - unsigned int oid = 0; - if((i < 0 || i >= length)) { - //if yes treat the object as found - oid = 0; - continue; - } else { - // compute new object - oid = *((unsigned int *)(((char *)ao) + sizeof(struct ArrayObject) + (elementsize*i))); - } - if(oid == 0) - goto end; - } - } else { //+ve stride - for(i = startindex; i <= range; i = i + stride) { - unsigned int oid = 0; - if(i < 0 || i >= length) { - //if yes treat the object as found - oid = 0; - continue; - } else { - // compute new object - oid = *((unsigned int *)(((char *)ao) + sizeof(struct ArrayObject) + (elementsize*i))); - } - // add new object - chldOffstFrmBase[*tovisit] = oid; - *tovisit = *tovisit + 1; - } + /* Calculate the oid corresponding to the offset value */ + int i; + for(i = 0; i NUMCLASSES) { + int retval; + if((retval = processArrayOids(offsetsarry, header, &i, sd)) != 0) { + printf("%s() Error: in processArrayOids() at line %d for %s()\n", __func__, __LINE__, __FILE__); + return -1; } - } else if(range == 0) { - if(startindex >=0 || startindex < length) { - unsigned int oid = *((unsigned int *)(((char *)ao) + sizeof(struct ArrayObject) + (elementsize*startindex))); - // add new object - chldOffstFrmBase[*tovisit] = oid; - *tovisit = *tovisit + 1; + } else { //linked list + int retval; + if((retval = processLinkedListOids(offsetsarry, header, &i, sd)) != 0) { + printf("%s() Error: in processLinkedListOids() at line %d for %s()\n", __func__, __LINE__, __FILE__); + return -1; } } - *index = *index + 2; - } else { //linked list - int startindex = offsets[*index]; - int range = GET_RANGE(offsets[(*index)+1]); - //printf("%s() LinkedList range = %d\n", __func__, range); - unsigned int oid = *((unsigned int *)(((char *)header) + sizeof(objheader_t) + startindex)); - //printf("Oid = %d\n", oid); - if (range == 0) { - chldOffstFrmBase[*tovisit+1] = oid; - if(isOidAvail(oid)) { - *visited = *visited + 1; - *tovisit = *tovisit + 1; - *index = *index + 2; - //printf("%s() Found visited = %d, tovisit=%d, index=%d\n", __func__, *visited, *tovisit, *index); - return 1; + } + return 0; +} + +int findOidinStride(short * offsets, struct ArrayObject *ao, int index, int elementsize, + int startindex, int range, int length, int sd) { + short stride = GET_STRIDE(offsets[index+1]); + stride = stride + 1; //NOTE bit pattern 000 => stride = 1, 001 => stride = 2 + int i; + //check is stride +ve or negative + unsigned int oid; + if(GET_STRIDEINC(offsets[index]+1)) { //-ve stride + for(i = startindex; i <= range+1; i = i - stride) { + if((i < 0 || i >= length)) { + //if yes treat the object as found + oid = 0; + continue; } else { - *tovisit = *tovisit + 1; - //printf("%s() Not Found visited = %d, tovisit=%d, index=%d\n", __func__, *visited, *tovisit, *index); - return 1; + // compute new object + oid = *((unsigned int *)(((char *)ao) + sizeof(struct ArrayObject) + (elementsize*i))); + } + if(oid == 0) + break; + if(checkoid(oid)) { + int retval; + if((retval = sendOidFound(oid, sd)) != 0) { + printf("%s() Error in sendOidFound() at line %d in %s()\n", __func__, __LINE__, __FILE__); + return -1; + } + } + } + } else { //+ve stride + for(i = startindex; i <= range; i = i + stride) { + if(i < 0 || i >= length) { + //if yes treat the object as found + oid = 0; + continue; + } else { + // compute new object + oid = *((unsigned int *)(((char *)ao) + sizeof(struct ArrayObject) + (elementsize*i))); + } + if(oid == 0) + break; + if(checkoid(oid)) { + int retval; + if((retval = sendOidFound(oid, sd)) != 0) { + printf("%s() Error in sendOidFound() at line %d in %s()\n", __func__, __LINE__, __FILE__); + return -1; + } + } + } + } + return 0; +} + +int sendOidFound(unsigned int oid, int sd) { + objheader_t *header; + if((header = (objheader_t *) mhashSearch(oid)) != NULL) { + ; + } else if((header = (objheader_t *) prehashSearch(oid))!=NULL) { + ; + } else { + printf("%s() Error: THIS SHOULD NOT HAPPEN at line %d in %s()\n", __func__, __LINE__, __FILE__); + return -1; + } + + int incr = 0; + int objsize; + GETSIZE(objsize, header); + int size = sizeof(int) + sizeof(char) + sizeof(unsigned int) + sizeof(objheader_t) + objsize; + char sendbuffer[size]; + *((int *)(sendbuffer + incr)) = size; + incr += sizeof(int); + *((char *)(sendbuffer + incr)) = OBJECT_FOUND; + incr += sizeof(char); + *((unsigned int *)(sendbuffer + incr)) = oid; + incr += sizeof(unsigned int); + memcpy(sendbuffer + incr, header, objsize + sizeof(objheader_t)); + + char control = TRANS_PREFETCH_RESPONSE; + sendPrefetchResponse(sd, &control, sendbuffer, &size); + return 0; +} + +int processArrayOids(short *offsetsarry, objheader_t *header, int *index, int sd) { + int elementsize = classsize[TYPE(header)]; + struct ArrayObject *ao = (struct ArrayObject *) (((char *)header) + sizeof(objheader_t)); + int length = ao->___length___; + /* Check if array out of bounds */ + int startindex = offsetsarry[*index]; + int range = GET_RANGE(offsetsarry[*index+1]); + if(range > 0 && range < length) { + int retval; + if((retval = findOidinStride(offsetsarry, ao, *index, elementsize, startindex, range, length, sd)) != 0) { + printf("%s() Error: in findOidinStride in line %d at file %s\n", __func__, __LINE__, __FILE__); + return -1; + } + } else if(range == 0) { + unsigned int oid; + if(startindex >=0 || startindex < length) { + oid = *((unsigned int *)(((char *)ao) + sizeof(struct ArrayObject) + (elementsize*startindex))); + } + if(oid == 0) + return 0; + if(checkoid(oid)) { + int retval; + if((retval = sendOidFound(oid, sd)) != 0) { + printf("%s() Error: in sendOidFound() at line %d in %s()\n", __func__, __LINE__, __FILE__); + return -1; } } else { - int i; - for(i = 0; i