From 637247010e974bf57aea460684c225bf5f5cd041 Mon Sep 17 00:00:00 2001 From: bdemsky Date: Tue, 9 Nov 2010 07:48:19 +0000 Subject: [PATCH] nasty bug...have to make sure we don't free a task record before it clears the memory queue....otherwise the queue could affect the reused task record --- Robust/src/IR/Flat/BuildCode.java | 16 +++++++++++++--- Robust/src/Runtime/mlp_runtime.h | 8 ++++++++ 2 files changed, 21 insertions(+), 3 deletions(-) diff --git a/Robust/src/IR/Flat/BuildCode.java b/Robust/src/IR/Flat/BuildCode.java index 156dc737..97e09ca0 100644 --- a/Robust/src/IR/Flat/BuildCode.java +++ b/Robust/src/IR/Flat/BuildCode.java @@ -3119,7 +3119,8 @@ public class BuildCode { output.println(" stallrecord->common.unresolvedDependencies=10000;"); output.println(" stallrecord->common.rcrstatus=1;"); output.println(" stallrecord->common.offsetToParamRecords=(INTPTR) & (((SESEstall *)0)->rcrRecords);"); - output.println(" stallrecord->common.refCount = 3;"); + output.println(" stallrecord->common.refCount = 10003;"); + output.println(" int refCount=10000;"); output.println(" int localCount=10000;"); output.println(" stallrecord->rcrRecords[0].index=0;"); output.println(" stallrecord->rcrRecords[0].flag=0;"); @@ -3143,6 +3144,7 @@ public class BuildCode { output.println(" if(ADDRENTRY(runningSESE->memoryQueueArray[" + waitingElement.getQueueID() + "],rentry)==NOTREADY) {"); output.println(" localCount--;"); + output.println(" refCount--;"); output.println(" }"); output.println("#if defined(RCR)&&!defined(OOO_DISABLE_TASKMEMPOOL)"); output.println(" else poolfreeinto(runningSESE->memoryQueueArray["+waitingElement.getQueueID()+"]->rentrypool, rentry);"); @@ -3188,7 +3190,7 @@ public class BuildCode { output.println(" }"); //release our reference to stall record output.println("#ifndef OOO_DISABLE_TASKMEMPOOL"); - output.println(" RELEASE_REFERENCE_TO((SESEcommon *)stallrecord);"); + output.println(" RELEASE_REFERENCES_TO((SESEcommon *)stallrecord, refCount);"); output.println("#endif"); output.println(" }");//exit block } @@ -4108,7 +4110,8 @@ public class BuildCode { if( state.RCR ) { // if we're using RCR, ref count is 3 because the traverser has // a reference, too - output.println(" seseToIssue->common.refCount = 3;"); + output.println(" seseToIssue->common.refCount = 10003;"); + output.println(" int refCount=10000;"); } else { output.println(" seseToIssue->common.refCount = 2;"); } @@ -4585,6 +4588,7 @@ public class BuildCode { output.println(" rentry->queue=runningSESE->memoryQueueArray[" + waitingElement.getQueueID()+"];"); output.println(" if(ADDRENTRY(runningSESE->memoryQueueArray["+ waitingElement.getQueueID()+ "],rentry)==READY) {"); + output.println(" refCount--;"); for(int j=0;mask!=0;j++) { if ((mask&1)==1) output.println(" dispCount"+j+"++;"); @@ -4603,6 +4607,12 @@ public class BuildCode { output.println(" if(!dispCount"+i+" || !atomic_sub_and_test(dispCount"+i+",&(seseToIssue->rcrRecords["+i+"].flag)))"); output.println(" localCount++;"); } + + output.println("#ifndef OOO_DISABLE_TASKMEMPOOL"); + output.println(" RELEASE_REFERENCES_TO((SESEcommon *)seseToIssue, refCount);"); + output.println("#endif"); + + output.println(" }"); } } diff --git a/Robust/src/Runtime/mlp_runtime.h b/Robust/src/Runtime/mlp_runtime.h index 3e1610e0..4e4e343e 100644 --- a/Robust/src/Runtime/mlp_runtime.h +++ b/Robust/src/Runtime/mlp_runtime.h @@ -301,6 +301,14 @@ static inline int RELEASE_REFERENCE_TO( SESEcommon* seseRec ) { return 0; } +static inline int RELEASE_REFERENCES_TO( SESEcommon* seseRec, int refCount) { + if( atomic_sub_and_test( refCount, &(seseRec->refCount) ) ) { + poolfreeinto( seseRec->parent->taskRecordMemPool, seseRec ); + return 1; + } + return 0; +} + #define CHECK_RECORD(x) ; -- 2.34.1