start of new file
[IRC.git] / Robust / src / Runtime / DSTM / interface / machinepile.c
index ec5e9ba9cbff19c1bebd2d0ad6b92b8a808ab274..10b5aed87e0956789feed8b8a360fcbf9d8bd518 100644 (file)
@@ -1,49 +1,80 @@
 #include "machinepile.h"
 
-int insertPile(int mid, unsigned int oid, short numoffset, short *offset, prefetchpile_t **head) {
-       prefetchpile_t *tmp = *head;
-       objpile_t *objnode;
-       unsigned int *oidarray;
-       int ntuples;
-       char found = 0;
+void insertPile(int mid, unsigned int oid, short numoffset, short *offset, prefetchpile_t **head) {
+  prefetchpile_t *ptr;
+  objpile_t *objnode;
+  unsigned int *oidarray;
+  objpile_t **tmp;
 
-       while (tmp != NULL) {
-               if (tmp->mid == mid) { // Found a match with exsisting machine id
-                       if ((objnode = (objpile_t *) calloc(1, sizeof(objpile_t))) == NULL) {
-                               printf("Calloc error: %s %d\n", __FILE__, __LINE__);
-                               return -1;
-                       }
-                       /* Fill objpiles DS */
-                       objnode->oid = oid;
-                       objnode->numoffset = numoffset;
-                       objnode->offset = offset;
-                       objnode->next = tmp->objpiles;
-                       tmp->objpiles = objnode;
-                       found = 1;
-                       break;
-               }
-               tmp = tmp->next;
+  //Loop through the machines
+  for(;1;head=&((*head)->next)) {
+    int tmid;
+    if ((*head)==NULL||(tmid=(*head)->mid)>mid) {
+      prefetchpile_t * tmp = (prefetchpile_t *) malloc(sizeof(prefetchpile_t));
+      tmp->mid = mid;
+      objnode =  malloc(sizeof(objpile_t));
+      objnode->offset = offset;
+      objnode->oid = oid;
+      objnode->numoffset = numoffset;
+      objnode->next = NULL;
+      tmp->objpiles = objnode;
+      tmp->next = *head;
+      *head=tmp;
+      return;
+    }
+
+    //keep looking
+    if (tmid < mid)
+      continue;
+    
+    //found mid list
+    for(tmp=&((*head)->objpiles);1;tmp=&((*tmp)->next)) {
+      int toid;
+      int matchstatus;
+
+      if ((*tmp)==NULL||((toid=(*tmp)->oid)>oid)) {
+       objnode = (objpile_t *) malloc(sizeof(objpile_t));
+       objnode->offset = offset;
+       objnode->oid = oid;
+       objnode->numoffset = numoffset;
+       objnode->next = *tmp;
+       *tmp = objnode;
+       return;
+      }
+      if (toid < oid)
+       continue;
+      
+      /* Fill objpiles DS */
+      int i;
+      int onumoffset=(*tmp)->numoffset;
+      short * ooffset=(*tmp)->offset;
+
+      for(i=0;i<numoffset;i++) {
+       if (i>onumoffset) {
+         //We've matched, let's just extend the current prefetch
+         (*tmp)->numoffset=numoffset;
+         (*tmp)->offset=offset;
+         return;
        }
-       if (!found) {// Not found => insert new mid DS
-               if ((tmp = (prefetchpile_t *) calloc(1, sizeof(prefetchpile_t))) == NULL) {
-                       printf("Calloc error: %s %d\n", __FILE__, __LINE__);
-                       return -1;
-               }
-               tmp->mid = mid;
-               if ((objnode = (objpile_t *) calloc(1, sizeof(objpile_t))) == NULL) {
-                       printf("Calloc error: %s %d\n", __FILE__, __LINE__);
-                       return -1;
-               }
-               /* Fill objpiles DS */
-               objnode->oid = oid;
-               objnode->numoffset = numoffset;
-               objnode->offset = offset;
-               objnode->next = tmp->objpiles; // i.e., objnode->next = NULL;
-               tmp->objpiles = objnode;
-               tmp->next = *head;
-               *head = tmp;
+       if (ooffset[i]<offset[i]) {
+         goto oidloop;
+       } else if (ooffset[i]>offset[i]) {
+         //Place item before the current one
+         objnode = (objpile_t *) malloc(sizeof(objpile_t));
+         objnode->offset = offset;
+         objnode->oid = oid;
+         objnode->numoffset = numoffset;
+         objnode->next = *tmp;
+         *tmp = objnode;
+         return;
        }
-       return 0;
-}
-
+      }
+      //if we get to the end, we're already covered by this prefetch
+      return;
+    oidloop:
+      ;
+    }
+  }
+  
 
+}