From: bdemsky <bdemsky>
Date: Thu, 29 Jan 2009 22:29:42 +0000 (+0000)
Subject: cleaned up code
X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=4d5772865ca167ba3caeb40b1c1ca7fd0d7861f5;p=IRC.git

cleaned up code
fixed random bugs in the search for the halting bug
defined pure attribute for transRead method...see if gcc can help us
more now
---

diff --git a/Robust/src/Runtime/DSTM/interface/dstm.h b/Robust/src/Runtime/DSTM/interface/dstm.h
index 05dc2be6..5532d6bc 100644
--- a/Robust/src/Runtime/DSTM/interface/dstm.h
+++ b/Robust/src/Runtime/DSTM/interface/dstm.h
@@ -279,7 +279,7 @@ void mapObjMethod(unsigned short);
 
 void randomdelay();
 transrecord_t *transStart();
-objheader_t *transRead(transrecord_t *, unsigned int);
+__attribute__((pure)) objheader_t *transRead(transrecord_t *, unsigned int);
 objheader_t *transCreateObj(transrecord_t *, unsigned int); //returns oid header
 int transCommit(transrecord_t *record); //return 0 if successful
 void *transRequest(void *);     //the C routine that the thread will execute when TRANS_REQUEST begins
diff --git a/Robust/src/Runtime/DSTM/interface/dstmserver.c b/Robust/src/Runtime/DSTM/interface/dstmserver.c
index 79351126..f2e5f161 100644
--- a/Robust/src/Runtime/DSTM/interface/dstmserver.c
+++ b/Robust/src/Runtime/DSTM/interface/dstmserver.c
@@ -464,8 +464,7 @@ char handleTransReq(fixed_data_t *fixed, trans_commit_data_t *transinfo, unsigne
                                &v_matchnolock, &v_matchlock, &v_nomatch, &numBytes, &control, oid, version);
     } else {  //Objs modified
       if(i == fixed->numread) {
-	oidlocked[objlocked] = -1;
-	objlocked++;
+	oidlocked[objlocked++] = -1;
       }
       int tmpsize;
       headptr = (objheader_t *) ptr;
@@ -563,8 +562,7 @@ void getCommitCountForObjMod(unsigned int *oidnotfound, unsigned int *oidlocked,
 	//printf("%s() oid = %d, type = %d\t", __func__, OID(mobj), TYPE((objheader_t *)mobj));
       }
       //Keep track of oid locked
-      oidlocked[*objlocked] = OID(((objheader_t *)mobj));
-      (*objlocked)++;
+      oidlocked[(*objlocked)++] = OID(((objheader_t *)mobj));
     } else {  //we are locked
       if (version == ((objheader_t *)mobj)->version) {     /* Check if versions match */
 	(*v_matchlock)++;
@@ -600,8 +598,7 @@ void getCommitCountForObjRead(unsigned int *oidnotfound, unsigned int *oidlocked
 	(*v_matchnolock)++;
       } else { /* If versions don't match ...HARD ABORT */
 	(*v_nomatch)++;
-	oidvernotmatch[*objvernotmatch] = oid;
-	(*objvernotmatch)++;
+	oidvernotmatch[(*objvernotmatch)++] = oid;
 	int size;
 	GETSIZE(size, mobj);
 	size += sizeof(objheader_t);
@@ -611,8 +608,7 @@ void getCommitCountForObjRead(unsigned int *oidnotfound, unsigned int *oidlocked
 	//printf("%s() oid = %d, type = %d\t", __func__, OID(mobj), TYPE((objheader_t *)mobj));
       }
       //Keep track of oid locked
-      oidlocked[*objlocked] = OID(((objheader_t *)mobj));
-      (*objlocked)++;
+      oidlocked[(*objlocked)++] = OID(((objheader_t *)mobj));
     } else { /* Some other transaction has aquired a write lock on this object */
       if (version == ((objheader_t *)mobj)->version) { /* Check if versions match */
 	(*v_matchlock)++;
@@ -689,7 +685,15 @@ int transCommitProcess(void *modptr, unsigned int *oidmod, unsigned int *oidlock
       return 1;
     }
     GETSIZE(tmpsize,header);
-    memcpy((char*)header + sizeof(objheader_t), ((char *)modptr + sizeof(objheader_t) + offset), tmpsize);
+    
+    {
+      struct ___Object___ *dst=(struct ___Object___*)((char*)header+sizeof(objheader_t));
+      struct ___Object___ *src=(struct ___Object___*)((char*)modptr+sizeof(objheader_t)+offset);
+      dst->type=src->type;
+      dst->___cachedCode___=src->___cachedCode___;
+      dst->___cachedHash___=src->___cachedHash___;
+      memcpy(&dst[1], &src[1], tmpsize-sizeof(struct ___Object___));
+    }
     header->version += 1;
     /* If threads are waiting on this object to be updated, notify them */
     if(header->notifylist != NULL) {
diff --git a/Robust/src/Runtime/DSTM/interface/trans.c b/Robust/src/Runtime/DSTM/interface/trans.c
index 27e61f7e..bfa25fbf 100644
--- a/Robust/src/Runtime/DSTM/interface/trans.c
+++ b/Robust/src/Runtime/DSTM/interface/trans.c
@@ -354,7 +354,7 @@ INLINE void * chashSearchI(chashtable_t *table, unsigned int key) {
 
 /* This function finds the location of the objects involved in a transaction
  * and returns the pointer to the object if found in a remote location */
-objheader_t *transRead(transrecord_t *record, unsigned int oid) {
+__attribute__((pure)) objheader_t *transRead(transrecord_t *record, unsigned int oid) {
   unsigned int machinenumber;
   objheader_t *tmp, *objheader;
   objheader_t *objcopy;
@@ -818,8 +818,7 @@ void handleLocalReq(trans_req_data_t *tdata, trans_commit_data_t *transinfo, tra
       commitCountForObjRead(getReplyCtrl, oidnotfound, oidlocked, &numoidnotfound, &numoidlocked, &v_nomatch, &v_matchlock, &v_matchnolock, oid, version);
     } else { // Objects Modified
       if(i == tdata->f.numread) {
-	oidlocked[numoidlocked] = -1;
-	numoidlocked++;
+	oidlocked[numoidlocked++] = -1;
       }
       int tmpsize;
       objheader_t *headptr;
@@ -875,6 +874,8 @@ void doLocalProcess(char finalResponse, trans_req_data_t *tdata, trans_commit_da
       fflush(stdout);
       return;
     }
+  } else {
+    printf("ERROR...No Decision\n");
   }
 
   /* Free memory */
@@ -985,16 +986,14 @@ void commitCountForObjMod(char *getReplyCtrl, unsigned int *oidnotfound, unsigne
       if (version == ((objheader_t *)mobj)->version) {      /* match versions */
 	(*v_matchnolock)++;
 	//Keep track of what is locked
-	oidlocked[*numoidlocked] = OID(((objheader_t *)mobj));
-	(*numoidlocked)++;
+	oidlocked[(*numoidlocked)++] = OID(((objheader_t *)mobj));
       } else { /* If versions don't match ...HARD ABORT */
 	(*v_nomatch)++;
 	/* Send TRANS_DISAGREE to Coordinator */
 	*getReplyCtrl = TRANS_DISAGREE;
 
 	//Keep track of what is locked
-	oidlocked[*numoidlocked] = OID(((objheader_t *)mobj));
-	(*numoidlocked)++;
+	oidlocked[(*numoidlocked)++] = OID(((objheader_t *)mobj));
 	//printf("%s() oid = %d, type = %d\t", __func__, OID(mobj), TYPE((objheader_t *)mobj));
 	return;
       }
@@ -1028,15 +1027,13 @@ void commitCountForObjRead(char *getReplyCtrl, unsigned int *oidnotfound, unsign
       if (version == ((objheader_t *)mobj)->version) {      /* If locked then match versions */
 	(*v_matchnolock)++;
 	//Keep track of what is locked
-	oidlocked[*numoidlocked] = OID(((objheader_t *)mobj));
-	(*numoidlocked)++;
+	oidlocked[(*numoidlocked)++] = OID(((objheader_t *)mobj));
       } else { /* If versions don't match ...HARD ABORT */
 	(*v_nomatch)++;
 	/* Send TRANS_DISAGREE to Coordinator */
 	*getReplyCtrl = TRANS_DISAGREE;
 	//Keep track of what is locked
-	oidlocked[*numoidlocked] = OID(((objheader_t *)mobj));
-	(*numoidlocked)++;
+	oidlocked[(*numoidlocked)++] = OID(((objheader_t *)mobj));
 	//printf("%s() oid = %d, type = %d\t", __func__, OID(mobj), TYPE((objheader_t *)mobj));
 	return;
       }
@@ -1110,7 +1107,15 @@ int transComProcess(trans_req_data_t *tdata, trans_commit_data_t *transinfo, tra
     }
     GETSIZE(tmpsize, header);
     char *tmptcptr = (char *) tcptr;
-    memcpy((char*)header+sizeof(objheader_t), (char *)tmptcptr+ sizeof(objheader_t), tmpsize);
+    {
+      struct ___Object___ *dst=(struct ___Object___*)((char*)header+sizeof(objheader_t));
+      struct ___Object___ *src=(struct ___Object___*)((char*)tmptcptr+sizeof(objheader_t));
+      dst->___cachedCode___=src->___cachedCode___;
+      dst->___cachedHash___=src->___cachedHash___;
+
+      memcpy(&dst[1], &src[1], tmpsize-sizeof(struct ___Object___));
+    }
+
     header->version += 1;
     if(header->notifylist != NULL) {
       notifyAll(&header->notifylist, OID(header), header->version);
@@ -1648,29 +1653,21 @@ int reqNotify(unsigned int *oidarry, unsigned short *versionarry, unsigned int n
     *((unsigned int *)(&msg[1])) = numoid;
     /* Send array of oids  */
     size = sizeof(unsigned int);
-    {
-      i = 0;
-      while(i < numoid) {
-	oid = oidarry[i];
-	*((unsigned int *)(&msg[1] + size)) = oid;
-	size += sizeof(unsigned int);
-	i++;
-      }
+
+    for(i = 0;i < numoid; i++) {
+      oid = oidarry[i];
+      *((unsigned int *)(&msg[1] + size)) = oid;
+      size += sizeof(unsigned int);
     }
 
     /* Send array of version  */
-    {
-      i = 0;
-      while(i < numoid) {
-	version = versionarry[i];
-	*((unsigned short *)(&msg[1] + size)) = version;
-	size += sizeof(unsigned short);
-	i++;
-      }
+    for(i = 0;i < numoid; i++) {
+      version = versionarry[i];
+      *((unsigned short *)(&msg[1] + size)) = version;
+      size += sizeof(unsigned short);
     }
 
-    *((unsigned int *)(&msg[1] + size)) = myIpAddr;
-    size += sizeof(unsigned int);
+    *((unsigned int *)(&msg[1] + size)) = myIpAddr; size += sizeof(unsigned int);
     *((unsigned int *)(&msg[1] + size)) = threadid;
     pthread_mutex_lock(&(ndata->threadnotify));
     size = 1 + numoid * (sizeof(unsigned int) + sizeof(unsigned short)) + 3 * sizeof(unsigned int);
@@ -1716,7 +1713,9 @@ void threadNotify(unsigned int oid, unsigned short version, unsigned int tid) {
 	  prehashRemove(oid);
 	}
 #endif
+	pthread_mutex_lock(&(ndata->threadnotify));
 	pthread_cond_signal(&(ndata->threadcond));
+	pthread_mutex_unlock(&(ndata->threadnotify));
       }
     }
   }