From 7c709cc76b8e205a08c674a4fbdc91d8fa814c44 Mon Sep 17 00:00:00 2001 From: yeom Date: Fri, 9 Apr 2010 17:57:58 +0000 Subject: [PATCH] fixes in handling unresolved pointer. --- Robust/src/IR/Flat/BuildCode.java | 181 ++++++++++++++++-------------- Robust/src/Runtime/mlp_runtime.c | 67 +++++------ Robust/src/Runtime/mlp_runtime.h | 1 - 3 files changed, 127 insertions(+), 122 deletions(-) diff --git a/Robust/src/IR/Flat/BuildCode.java b/Robust/src/IR/Flat/BuildCode.java index 7f061e87..1aa30566 100644 --- a/Robust/src/IR/Flat/BuildCode.java +++ b/Robust/src/IR/Flat/BuildCode.java @@ -3386,88 +3386,6 @@ public class BuildCode { output.println(" seseToIssue->"+srcPair+" = "+srcPair+";"); } - //////////////// - // count up memory conflict dependencies, - // eom - ConflictGraph graph = null; - FlatSESEEnterNode parent = fsen.getParent(); - if (parent != null) { - if (parent.isCallerSESEplaceholder) { - graph = mlpa.getConflictGraphResults().get(parent.getfmEnclosing()); - } else { - graph = mlpa.getConflictGraphResults().get(parent); - } - } - if (graph != null && graph.hasConflictEdge()) { - HashSet seseLockSet = mlpa.getConflictGraphLockMap() - .get(graph); - output.println(); - output.println(" //add memory queue element"); - Set waitingQueueSet = graph - .getWaitingElementSetBySESEID(fsen.getIdentifier(), - seseLockSet); - if (waitingQueueSet.size() > 0) { - output.println(" {"); - output.println(" REntry* rentry=NULL;"); - output.println(" seseToIssue->common.rentryIdx=0;"); - for (Iterator iterator = waitingQueueSet.iterator(); iterator - .hasNext();) { - WaitingElement waitingElement = (WaitingElement) iterator - .next(); - - if (waitingElement.getStatus() >= ConflictNode.COARSE) { - output.println(" rentry=mlpCreateREntry(" - + waitingElement.getStatus() - + ", seseToIssue);"); - } else { - TempDescriptor td = waitingElement.getTempDesc(); - output - .println(" rentry=mlpCreateFineREntry(" - + waitingElement.getStatus() - + ", seseToIssue, seseToIssue->" - + waitingElement.getDynID() - + ");"); - if (td != null) { - VariableSourceToken vst = fsen - .getStaticInVarSrc(td); - String srcId = "SESE_" - + vst.getSESE().getPrettyIdentifier() - + vst.getSESE().getIdentifier() + "_" - + vst.getAge(); - output.println(" if(seseToIssue->" - + waitingElement.getDynID() - + " == NULL) {"); - output - .println(" rentry->pointer=(void*)&seseToIssue->" - + srcId - + "->" - + waitingElement.getDynID() - + ";"); - output - .println(" seseToIssue->common.unresolvedRentryArray[seseToIssue->common.unresolvedRentryIdx++]=rentry;"); - output.println(" }"); - } - } - output - .println(" rentry->queue=parentCommon->memoryQueueArray[" - + waitingElement.getQueueID() + "];"); - output - .println(" seseToIssue->common.rentryArray[seseToIssue->common.rentryIdx++]=rentry;"); - output - .println(" if(ADDRENTRY(parentCommon->memoryQueueArray[" - + waitingElement.getQueueID() - + "],rentry)==NOTREADY){"); - output.println(" ++(localCount);"); - output.println(" } "); - output.println(); - } - output.println(" }"); - } - output.println(); - } - - //////////////// - // dynamic sources might already be accounted for in the static list, // so only add them to forwarding lists if they're not already there Iterator dynVarsItr = fsen.getDynamicInVarSet().iterator(); @@ -3531,6 +3449,97 @@ public class BuildCode { } output.println(" "+pair+" = seseToIssue;"); } + + //////////////// + // count up memory conflict dependencies, + // eom + ConflictGraph graph = null; + FlatSESEEnterNode parent = fsen.getParent(); + if (parent != null) { + if (parent.isCallerSESEplaceholder) { + graph = mlpa.getConflictGraphResults().get(parent.getfmEnclosing()); + } else { + graph = mlpa.getConflictGraphResults().get(parent); + } + } + if (graph != null && graph.hasConflictEdge()) { + HashSet seseLockSet = mlpa.getConflictGraphLockMap() + .get(graph); + output.println(); + output.println(" //add memory queue element"); + Set waitingQueueSet = graph + .getWaitingElementSetBySESEID(fsen.getIdentifier(), + seseLockSet); + if (waitingQueueSet.size() > 0) { + output.println(" {"); + output.println(" REntry* rentry=NULL;"); + output.println(" INTPTR* pointer=NULL;"); + output.println(" seseToIssue->common.rentryIdx=0;"); + for (Iterator iterator = waitingQueueSet.iterator(); iterator + .hasNext();) { + WaitingElement waitingElement = (WaitingElement) iterator + .next(); + + if (waitingElement.getStatus() >= ConflictNode.COARSE) { + output.println(" rentry=mlpCreateREntry(" + + waitingElement.getStatus() + + ", seseToIssue);"); + } else { + TempDescriptor td = waitingElement.getTempDesc(); + // decide whether waiting element is dynamic or + // static + if(fsen.getDynamicInVarSet().contains(td)){ + // dynamic in-var case + output.println(" pointer=seseToIssue->"+ waitingElement.getDynID()+"_srcSESE+seseToIssue->"+ waitingElement.getDynID()+"_srcOffset;"); + output.println(" rentry=mlpCreateFineREntry(" + + waitingElement.getStatus() + + ", seseToIssue, pointer );"); + }else if(fsen.getStaticInVarSet().contains(td)){ + // static in-var case + VariableSourceToken vst = fsen.getStaticInVarSrc(td); + if (vst != null) { + String srcId = "SESE_" + + vst.getSESE() + .getPrettyIdentifier() + + vst.getSESE().getIdentifier() + + "_" + vst.getAge(); + output + .println(" pointer=(void*)&seseToIssue->" + + srcId + + "->" + + waitingElement.getDynID() + + ";"); + output.println(" rentry=mlpCreateFineREntry(" + + waitingElement.getStatus() + + ", seseToIssue, pointer );"); + } + }else{ + output.println(" rentry=mlpCreateFineREntry(" + + waitingElement.getStatus() + + ", seseToIssue, (void*)&seseToIssue->" + + waitingElement.getDynID() + ");"); + } + } + output + .println(" rentry->queue=parentCommon->memoryQueueArray[" + + waitingElement.getQueueID() + "];"); + output + .println(" seseToIssue->common.rentryArray[seseToIssue->common.rentryIdx++]=rentry;"); + output + .println(" if(ADDRENTRY(parentCommon->memoryQueueArray[" + + waitingElement.getQueueID() + + "],rentry)==NOTREADY){"); + output.println(" ++(localCount);"); + output.println(" } "); + output.println(); + } + output.println(" }"); + } + output.println(); + } + + //////////////// + } @@ -3635,14 +3644,16 @@ public class BuildCode { output.println(" while( !isEmpty( "+com+".forwardList ) ) {"); output.println(" SESEcommon* consumer = (SESEcommon*) getItem( "+com+".forwardList );"); - output.println(" if(consumer->unresolvedRentryIdx>0){"); + + output.println(" if(consumer->rentryIdx>0){"); output.println(" // resolved null pointer"); output.println(" int idx;"); - output.println(" for(idx=0;idxunresolvedRentryIdx;idx++){"); - output.println(" resolvePointer(consumer->unresolvedRentryArray[idx]);"); + output.println(" for(idx=0;idxrentryIdx;idx++){"); + output.println(" resolvePointer(consumer->rentryArray[idx]);"); output.println(" }"); output.println(" }"); + // output.println(" pthread_mutex_lock( &(consumer->lock) );"); // output.println(" --(consumer->unresolvedDependencies);"); // output.println(" if( consumer->unresolvedDependencies == 0 ) {"); diff --git a/Robust/src/Runtime/mlp_runtime.c b/Robust/src/Runtime/mlp_runtime.c index 7f931d6f..fc0fcef3 100644 --- a/Robust/src/Runtime/mlp_runtime.c +++ b/Robust/src/Runtime/mlp_runtime.c @@ -51,7 +51,7 @@ REntry* mlpCreateFineREntry(int type, void* seseToIssue, void* dynID){ REntry* newREntry=(REntry*)RUNMALLOC(sizeof(REntry)); newREntry->type=type; newREntry->seseRec=seseToIssue; - newREntry->dynID=dynID; + newREntry->pointer=dynID; return newREntry; } @@ -239,44 +239,35 @@ int ADDTABLE(MemoryQueue *q, REntry *r) { //at this point, have table Hashtable* table=(Hashtable*)q->tail; - r->hashtable=table; - if(r->pointer!=0 && (*(r->pointer)==0 || (*(r->pointer)!=0 && table->unresolvedQueue!=NULL))){ - struct Queue* val; + r->hashtable=table; // set rentry's hashtable + if((*(r->pointer)==0 || (*(r->pointer)!=0 && BARRIER() && table->unresolvedQueue!=NULL))){ + struct Queue* val; // grab lock on the queue do { val=(struct Queue*)0x1; val=(struct Queue*)LOCKXCHG((unsigned INTPTR*)&(table->unresolvedQueue), (unsigned INTPTR)val); - } while(val==(struct Queue*)0x1); - + } while(val==(struct Queue*)0x1); if(val==NULL){ - //first case + //queue is null, first case if(*(r->pointer)!=0){ - // pointer is already resolved. - table->unresolvedQueue=val; //released lock; - return ADDTABLE(q,r); + // check whether pointer is already resolved, or not. + table->unresolvedQueue=NULL; //released lock; + return ADDTABLEITEM(table,r,TRUE); } - table->unresolvedQueue=(struct Queue*)0x1; struct Queue* queue=createQueue(); - addNewItem(queue,r); + addNewItemBack(queue,r); atomic_inc(&table->item.total); table->unresolvedQueue=queue; // expose new queue - }else{ - if(val==NULL){ - // someone else has already cleared all queue stuff - table->unresolvedQueue=val; // released lock - return ADDTABLE(q,r); - } + }else{ + // add unresolved rentry at the end of the queue. addNewItemBack(val,r); atomic_inc(&table->item.total); table->unresolvedQueue=val; // released lock } return NOTREADY; } - if(r->pointer!=0){ - r->dynID=(void*)*(r->pointer); // interim fix. - } BinItem * val; - int key=generateKey((unsigned int)(unsigned INTPTR)r->dynID); + int key=generateKey((unsigned int)(unsigned INTPTR)*(r->pointer)); do { val=(BinItem*)0x1; BinElement* bin=table->array[key]; @@ -294,22 +285,23 @@ int ADDTABLE(MemoryQueue *q, REntry *r) { } } -int ADDTABLEITEM(Hashtable* table, REntry* r){ +int ADDTABLEITEM(Hashtable* table, REntry* r, int inc){ + BinItem * val; - int key=generateKey((unsigned int)(unsigned INTPTR)r->dynID); + int key=generateKey((unsigned int)(unsigned INTPTR)*(r->pointer)); do { val=(BinItem*)0x1; BinElement* bin=table->array[key]; - val=(BinItem*)LOCKXCHG((unsigned INTPTR*)&(bin->head), (unsigned INTPTR)val);//note...talk to me about optimizations here. + val=(BinItem*)LOCKXCHG((unsigned INTPTR*)&(bin->head), (unsigned INTPTR)val); } while(val==(BinItem*)0x1); //at this point have locked bin if (val==NULL) { - return EMPTYBINCASE(table, table->array[key], r, FALSE); + return EMPTYBINCASE(table, table->array[key], r, inc); } else { if (isFineWrite(r)) { - return WRITEBINCASE(table, r, val, key, FALSE); + return WRITEBINCASE(table, r, val, key, inc); } else if (isFineRead(r)) { - return READBINCASE(table, r, val, key, FALSE); + return READBINCASE(table, r, val, key, inc); } } } @@ -388,9 +380,9 @@ int WRITEBINCASE(Hashtable *T, REntry *r, BinItem *val, int key, int inc) { READBINCASE(Hashtable *T, REntry *r, BinItem *val, int key, int inc) { BinItem * bintail=T->array[key]->tail; if (isReadBinItem(bintail)) { - return TAILREADCASE(T, r, val, bintail, key); + return TAILREADCASE(T, r, val, bintail, key, inc); } else if (!isReadBinItem(bintail)) { - TAILWRITECASE(T, r, val, bintail, key); + TAILWRITECASE(T, r, val, bintail, key, inc); return NOTREADY; } } @@ -572,7 +564,7 @@ RETIREHASHTABLE(MemoryQueue *q, REntry *r) { } RETIREBIN(Hashtable *T, REntry *r, BinItem *b) { - int key=generateKey((unsigned int)(unsigned INTPTR)r->dynID); + int key=generateKey((unsigned int)(unsigned INTPTR)*(r->pointer)); if(isFineRead(r)) { atomic_dec(&b->total); } @@ -776,8 +768,12 @@ resolveDependencies(REntry* rentry){ } resolvePointer(REntry* rentry){ - rentry->dynID=(void*)*(rentry->pointer); // interim. + Hashtable* table=rentry->hashtable; + if(table==NULL){ + //resolved already before related rentry is enqueued to the waiting queue + return; + } struct Queue* val; do { val=(struct Queue*)0x1; @@ -796,9 +792,8 @@ resolvePointer(REntry* rentry){ break; } removeItem(val,head); - if(ADDTABLEITEM(table, rentry)==READY){ - SESEcommon* seseCommon=(SESEcommon*)rentry->seseRec; - atomic_sub_and_test(1, &(seseCommon->unresolvedDependencies)); + if(ADDTABLEITEM(table, rentry, FALSE)==READY){ + resolveDependencies(rentry); } }else{ table->unresolvedQueue=NULL; // set hashtable as normal-mode. @@ -806,7 +801,7 @@ resolvePointer(REntry* rentry){ } }while(TRUE); }else{ + // resolved rentry is not head of queue table->unresolvedQueue=val;//released lock; } } - diff --git a/Robust/src/Runtime/mlp_runtime.h b/Robust/src/Runtime/mlp_runtime.h index 489d388f..4348cd5c 100644 --- a/Robust/src/Runtime/mlp_runtime.h +++ b/Robust/src/Runtime/mlp_runtime.h @@ -57,7 +57,6 @@ typedef struct REntry_t{ struct MemoryQueue_t* queue; psemaphore parentStallSem; void* seseRec; - void* dynID; INTPTR* pointer; } REntry; -- 2.34.1