return liveinto;
}
+ //This method computes which temps are live out of the second part
+ public Set<TempDescriptor> liveoutvirtualread(LocalityBinding lb, FlatAtomicEnterNode faen) {
+ MethodDescriptor md=lb.getMethod();
+ FlatMethod fm=state.getMethodFlat(md);
+ Set<FlatNode> exits=faen.getExits();
+ Hashtable<FlatNode, Set<TempDescriptor>> livemap=Liveness.computeLiveTemps(fm);
+ Hashtable<FlatNode, Hashtable<TempDescriptor, Set<FlatNode>>> reachingdefs=ReachingDefs.computeReachingDefs(fm);
+
+ Set<FlatNode> atomicnodes=faen.getReachableSet(faen.getExits());
+
+ Set<FlatNode> secondpart=new HashSet<FlatNode>(getNotReady(lb));
+ secondpart.retainAll(atomicnodes);
+
+ Set<TempDescriptor> liveset=new HashSet<TempDescriptor>();
+ //Have list of all live temps
+
+ for(Iterator<FlatNode> fnit=exits.iterator();fnit.hasNext();) {
+ FlatNode fn=fnit.next();
+ Set<TempDescriptor> tempset=livemap.get(fn);
+ Hashtable<TempDescriptor, Set<FlatNode>> reachmap=reachingdefs.get(fn);
+ //Look for reaching defs for all live variables that are in the secondpart
+
+ for(Iterator<TempDescriptor> tmpit=tempset.iterator();tmpit.hasNext();) {
+ TempDescriptor tmp=tmpit.next();
+ Set<FlatNode> fnset=reachmap.get(tmp);
+ boolean outsidenode=false;
+ boolean insidenode=false;
+
+ for(Iterator<FlatNode> fnit2=fnset.iterator();fnit2.hasNext();) {
+ FlatNode fn2=fnit2.next();
+ if (secondpart.contains(fn2)) {
+ insidenode=true;
+ } else {
+ outsidenode=true;
+ }
+ if (outsidenode&&insidenode) {
+ liveset.add(tmp);
+ break;
+ }
+ }
+ }
+ }
+ return liveset;
+ }
//This method computes which temps are live out of the second part
public Set<TempDescriptor> liveout(LocalityBinding lb, FlatAtomicEnterNode faen) {
String name;
Set<TempDescriptor> livein;
Set<TempDescriptor> liveout;
+ Set<TempDescriptor> liveoutvirtualread;
-}
\ No newline at end of file
+}
Set<FlatNode> recordset=delaycomp.livecode(lb);
Set<TempDescriptor> liveinto=delaycomp.liveinto(lb, faen, recordset);
Set<TempDescriptor> liveout=delaycomp.liveout(lb, faen);
+ Set<TempDescriptor> liveoutvirtualread=delaycomp.liveoutvirtualread(lb, faen);
ar.livein=liveinto;
ar.liveout=liveout;
+ ar.liveoutvirtualread=liveoutvirtualread;
for(Iterator<TempDescriptor> it=liveinto.iterator(); it.hasNext();) {
TempDescriptor tmp=it.next();
for(Iterator<TempDescriptor> tmpit=alltemps.iterator();tmpit.hasNext();) {
TempDescriptor tmp=tmpit.next();
if (!tmp.getType().isPtr()) {
- if (liveinto.contains(tmp)) {
+ if (liveinto.contains(tmp)||liveoutvirtualread.contains(tmp)) {
//read from live into set
output.println(tmp.getType().getSafeSymbol()+" "+tmp.getSafeSymbol()+"=primitives->"+tmp.getSafeSymbol()+";");
} else {
TempDescriptor tmp=tmpit.next();
output.println("primitives."+tmp.getSafeSymbol()+"="+tmp.getSafeSymbol()+";");
}
+
+ //copy outs that depend on path
+ for(Iterator<TempDescriptor> tmpit=ar.liveoutvirtualread.iterator();tmpit.hasNext();) {
+ TempDescriptor tmp=tmpit.next();
+ if (!ar.livein.contains(tmp))
+ output.println("primitives."+tmp.getSafeSymbol()+"="+tmp.getSafeSymbol()+";");
+ }
+
//do call
output.println("if (transCommit((void (*)(void *, void *, void *))&"+ar.name+", &primitives, &"+localsprefix+", "+paramsprefix+")) {");
} else
/* Insert into cache's lookup table */
STATUS(objcopy)=0;
if (((unsigned int)oid)<((unsigned int ) curr_heapbase)|| ((unsigned int)oid) >((unsigned int) curr_heapptr))
- printf("ERROR!\n");
+ printf("ERROR! Bad object address!\n");
t_chashInsert(oid, &objcopy[1]);
return &objcopy[1];
}
#ifdef DELAYCOMP
//acquire other locks
+ unsigned int numoidwrtotal=numoidwrlocked;
+
chashlistnode_t *dc_curr = dc_c_list;
/* Inner loop to traverse the linked list of the cache lookupTable */
while(likely(dc_curr != NULL)) {
objheader_t * headeraddr=&((objheader_t *) dc_curr->val)[-1];
objheader_t *header=(objheader_t *)(((char *)dc_curr->key)-sizeof(objheader_t));
if(write_trylock(&header->lock)) { //can aquire write lock
- oidwrlocked[numoidwrlocked++] = header;
+ oidwrlocked[numoidwrtotal++] = header;
} else {
//maybe we already have lock
void * key=dc_curr->key;
/* Decide the final response */
#ifdef DELAYCOMP
- transCommitProcess(oidwrlocked, numoidwrlocked, commitmethod, primitives, locals, params);
+ transCommitProcess(oidwrlocked, numoidwrlocked, numoidwrtotal, commitmethod, primitives, locals, params);
#else
transCommitProcess(oidwrlocked, numoidwrlocked);
#endif
#ifdef DELAYCOMP
//acquire other locks
+ unsigned int numoidwrtotal=numoidwrlocked;
chashlistnode_t *dc_curr = dc_c_list;
/* Inner loop to traverse the linked list of the cache lookupTable */
while(likely(dc_curr != NULL)) {
objheader_t * headeraddr=&((objheader_t *) dc_curr->val)[-1];
objheader_t *header=(objheader_t *)(((char *)dc_curr->key)-sizeof(objheader_t));
if(write_trylock(&header->lock)) { //can aquire write lock
- oidwrlocked[numoidwrlocked++] = header;
+ oidwrlocked[numoidwrtotal++] = header;
} else {
//maybe we already have lock
void * key=dc_curr->key;
/* Decide the final response */
#ifdef DELAYCOMP
- transCommitProcess(oidwrlocked, numoidwrlocked, commitmethod, primitives, locals, params);
+ transCommitProcess(oidwrlocked, numoidwrlocked, numoidwrtotal, commitmethod, primitives, locals, params);
#else
transCommitProcess(oidwrlocked, numoidwrlocked);
#endif
* =================================
*/
#ifdef DELAYCOMP
- void transCommitProcess(void ** oidwrlocked, int numoidwrlocked, void (*commitmethod)(void *, void *, void *), void * primitives, void * locals, void * params) {
+ void transCommitProcess(void ** oidwrlocked, int numoidwrlocked, int numoidwrtotal, void (*commitmethod)(void *, void *, void *), void * primitives, void * locals, void * params) {
#else
void transCommitProcess(void ** oidwrlocked, int numoidwrlocked) {
#endif
#ifdef DELAYCOMP
// call commit method
- commitmethod(primitives, locals, params);
+ commitmethod(params, locals, primitives);
#endif
/* Release write locks */
- for(i=numoidwrlocked-1; i>=0; i--) {
+ for(i=numoidwrtotal-1; i>=0; i--) {
header = (objheader_t *)oidwrlocked[i];
write_unlock(&header->lock);
}
int transCommit(void (*commitmethod)(void *, void *, void *), void * primitives, void * locals, void * params);
int traverseCache(void (*commitmethod)(void *, void *, void *), void * primitives, void * locals, void * params);
int alttraverseCache(void (*commitmethod)(void *, void *, void *), void * primitives, void * locals, void * params);
-void transCommitProcess(void **, int, void (*commitmethod)(void *, void *, void *), void * primitives, void * locals, void * params);
+void transCommitProcess(void **, int, int, void (*commitmethod)(void *, void *, void *), void * primitives, void * locals, void * params);
#else
int transCommit();
int traverseCache();
t_cache = objstrCreate(1048576);
t_reserve=NULL;
t_chashCreate(CHASH_SIZE, CLOADFACTOR);
+#ifdef DELAYCOMP
+ dc_t_chashCreate(CHASH_SIZE, CLOADFACTOR);
+#endif
#ifdef STMSTATS
trec=calloc(1, sizeof(threadrec_t));
trec->blocked = 0;
t_cache = objstrCreate(1048576);
t_reserve=NULL;
t_chashCreate(CHASH_SIZE, CLOADFACTOR);
+#ifdef DELAYCOMP
+ dc_t_chashCreate(CHASH_SIZE, CLOADFACTOR);
+#endif
___Thread____NNR____staticStart____L___Thread___((struct ___Thread____NNR____staticStart____L___Thread____params *)p);
objstrDelete(t_cache);
objstrDelete(t_reserve);