From: bdemsky Date: Mon, 14 Sep 2009 23:59:06 +0000 (+0000) Subject: add support for alokika's locking scheme to simulator X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=70b157e37a9c15fdccb972d3a9101c9594214681;p=IRC.git add support for alokika's locking scheme to simulator --- diff --git a/Robust/TransSim/FlexScheduler.java b/Robust/TransSim/FlexScheduler.java index 6e19ba25..3aa06b75 100644 --- a/Robust/TransSim/FlexScheduler.java +++ b/Robust/TransSim/FlexScheduler.java @@ -13,16 +13,26 @@ public class FlexScheduler { r=new Random(100); eq=new PriorityQueue(); backoff=new int[e.numThreads()]; + objtoinfo=new Hashtable(); + threadinfo=new ThreadInfo[e.numThreads()]; + blocked=new boolean[e.numThreads()]; + for(int i=0;i1||trans.getEvent(0)!=Transaction.DELAY) { commitcount++; } - backoff[ev.getThread()]=1; + //Reset our backoff counter + backoff[ev.getThread()]=BACKOFFSTART; + + //abort the other threads for(int i=0;iev.getTransaction().getTime(ev.getEvent())) { //kill ourself reschedule(ev.getThread(), time+r.nextInt(backoff[ev.getThread()])); - backoff[ev.getThread()]*=2; abortcount++; return false; } else { @@ -249,7 +289,6 @@ public class FlexScheduler { for(Iterator thit=threadstokill.iterator();thit.hasNext();) { Integer thread=(Integer)thit.next(); reschedule(thread, time+r.nextInt(backoff[thread.intValue()])); - backoff[thread.intValue()]*=2; abortcount++; } return true; @@ -260,6 +299,9 @@ public class FlexScheduler { return true; } + //Handle current event (read, write, delay) in a transaction and + //enqueue the next one + public void enqueueEvent(Event ev, Transaction trans) { //just enqueue next event int event=ev.getEvent(); @@ -269,10 +311,33 @@ public class FlexScheduler { //process the current event if (operation==Transaction.READ) { Integer obj=new Integer(object); + + //check for lock based approach + if (isLock()) { + if (!objtoinfo.containsKey(obj)) { + objtoinfo.put(obj, new ObjectInfo(this)); + } + ObjectInfo oi=(ObjectInfo)objtoinfo.get(obj); + if (oi.isOwned()&&oi.getOwner()!=ev.getThread()) { + //we're going to wait + if (!threadinfo[oi.getOwner()].isStalled()) { + //don't wait on stalled threads, we could deadlock + threadinfo[ev.getThread()].setStall(true); + oi.addWaiter(ev); + return; + } + } else { + //we have object + oi.setOwner(ev.getThread()); + } + } + + //record read event if (!rdobjmap.containsKey(obj)) rdobjmap.put(obj,new HashSet()); ((Set)rdobjmap.get(obj)).add(new Integer(ev.getThread())); if (isEager()) { + //do eager contention management Set conflicts=rdConflictSet(ev.getThread(), object); if (conflicts!=null) if (!handleConflicts(ev, conflicts, currtime)) @@ -280,9 +345,32 @@ public class FlexScheduler { } } else if (operation==Transaction.WRITE) { Integer obj=new Integer(object); + + //grab lock + if (isLock()) { + if (!objtoinfo.containsKey(obj)) { + objtoinfo.put(obj, new ObjectInfo(this)); + } + ObjectInfo oi=(ObjectInfo)objtoinfo.get(obj); + if (oi.isOwned()&&oi.getOwner()!=ev.getThread()) { + //we're going to wait + if (!threadinfo[oi.getOwner()].isStalled()) { + //don't wait on stalled threads, we could deadlock + threadinfo[ev.getThread()].setStall(true); + oi.addWaiter(ev); + return; + } + } else { + //we have object + oi.setOwner(ev.getThread()); + } + } + + //record write event if (!wrobjmap.containsKey(obj)) wrobjmap.put(obj,new HashSet()); ((Set)wrobjmap.get(obj)).add(new Integer(ev.getThread())); + if (isEager()) { Set conflicts=wrConflictSet(ev.getThread(), object); if (conflicts!=null) @@ -330,6 +418,10 @@ public class FlexScheduler { public int getTime() { return time; } + + public void setTime(int time) { + this.time=time; + } public int getThread() { return threadid; @@ -344,6 +436,7 @@ public class FlexScheduler { valid=true; } + //break ties to allow commits to occur earliest public int compareTo(Object o) { Event e=(Event)o; int delta=time-e.time; @@ -358,7 +451,4 @@ public class FlexScheduler { return 0; } } - - - } \ No newline at end of file diff --git a/Robust/TransSim/TransSim.java b/Robust/TransSim/TransSim.java index 0e27a9a7..4d439913 100644 --- a/Robust/TransSim/TransSim.java +++ b/Robust/TransSim/TransSim.java @@ -1,12 +1,12 @@ public class TransSim { public static void main(String[] args) { - int numThreads=32; - int numTrans=100; + int numThreads=16; + int numTrans=20; int deltaTrans=0; - int numObjects=500; + int numObjects=4000; int numAccesses=20; int deltaAccesses=5; - int readPercent=30; + int readPercent=20; //time for operation int delay=20; int deltaDelay=4; @@ -25,6 +25,15 @@ public class TransSim { int besttime=ls.getTime(); tlazy+=ls.getTime(); + //Lock object accesses + ls=new FlexScheduler(e, FlexScheduler.LOCK); + ls.dosim(); + System.out.println("Lock Abort="+ls.getTime()); + System.out.println("Aborts="+ls.getAborts()+" Commit="+ls.getCommits()); + if (ls.getTime()