#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:
+ ;
+ }
+ }
+
+}