tmpa-2017: dl-check: dynamic potential deadlock detection tool for java programs

72
Dl-Check: dynamic potential deadlock detection tool for Java programs Nikita Koval 1,2 Dmitry Tsitelov 2 Roman Elizarov 2 1 ITMO University, Computer Technology Department, St. Petersburg, Russia [email protected] 2 Devexperts, LLC, St. Petersburg, Russia, [email protected] TMPA Conference, March 2017

Upload: iosif-itkin

Post on 05-Apr-2017

117 views

Category:

Technology


0 download

TRANSCRIPT

Dl-Check:dynamicpotentialdeadlockdetectiontoolforJavaprograms

NikitaKoval1,2 DmitryTsitelov2 RomanElizarov2

1ITMOUniversity,ComputerTechnologyDepartment,St.Petersburg,[email protected]

2Devexperts,LLC,St.Petersburg,Russia,

[email protected]

TMPAConference,March2017

Tableofcontents

1. Introduction2. Algorithm3. Implementation4. Evaluation5. Conclusion

Slide2/65. Copyright©2017.DevexpertsLLC.Allrightsreserved.

INTRODUCTION

Multithreadedprogrammingproblems

• Datarace• Starvation• Livelock• Deadlock- Communicationdeadlock- Resourcedeadlock

Slide4/65. Copyright©2017.DevexpertsLLC.Allrightsreserved.

Resourcedeadlockvoid transfer(Account from,

Account to,int amount) {

from.lock()to.lock()// Do transferunlock(from, to)

}transfer(a, b, …):1 a.lock()

4 b.lock()

transfer(b, a, …):

2 b.lock()3 a.lock()

DEADLOCK!

Slide5/65. Copyright©2017.DevexpertsLLC.Allrightsreserved.

Analysisapproaches

• Staticanalysis- Canguaranteedeadlock-freedom- Manyfalsepositives

• Modelchecking- Canguaranteedeadlock-freedom- Requiresalotofcomputationalresources

• Dynamicanalysis- Dependsontheexecution- Producesfewfalsepositives- Applicableforlargeprograms

Slide6/65. Copyright©2017.DevexpertsLLC.Allrightsreserved.

Dynamicanalysis

• Collectingexecutiontraces- Analyzescollectedtracesoff-line- e.g.JCarder,MulticoreSDK

• Detectingimmediatelywhenapotentialdeadlockhappens- Hasallcontextinformation,suchasstacktraces- e.g.VisualThreads

Slide7/65. Copyright©2017.DevexpertsLLC.Allrightsreserved.

ALGORITHM

“Acquiredbefore”relation

• Lock𝒖isacquiredbefore lock𝒗(𝒖 → 𝒗) ifatsomepointlock𝒗isacquiredunderlock𝒖inthesamethread

Thread 1 Thread 21 a.lock()2 b.lock()

3 c.lock()4 d.lock()

𝑎 → 𝑏𝑎 → 𝑐𝑎 → 𝑑𝑏 → 𝑐𝑏 → 𝑑𝑐 → 𝑑

Slide9/65. Copyright©2017.DevexpertsLLC.Allrightsreserved.

Lockhierarchy

• Lockhierarchy isapartialorderonlocks,where𝑢 → 𝑣 ⇒ 𝑜𝑟𝑑 𝑢 < 𝑜𝑟𝑑 𝑣

𝑜𝑟𝑑 𝑎 < 𝑜𝑟𝑑 𝑏𝑜𝑟𝑑 𝑎 < 𝑜𝑟𝑑 𝑐𝑜𝑟𝑑 𝑎 < 𝑜𝑟𝑑 𝑑𝑜𝑟𝑑 𝑏 < 𝑜𝑟𝑑 𝑐𝑜𝑟𝑑 𝑏 < 𝑜𝑟𝑑 𝑑𝑜𝑟𝑑 𝑐 < 𝑜𝑟𝑑(𝑑)

Thread 1 Thread 21 a.lock()2 b.lock()

3 c.lock()4 d.lock()

Slide10/65. Copyright©2017.DevexpertsLLC.Allrightsreserved.

Potentialdeadlock

• Lockhierarchyisaprimarymethodtoavoiddeadlocks• Potentialdeadlockisalockhierarchyviolation

Thread 1 Thread 21 a.lock()2 b.lock()

3 b.lock()4 a.lock()

𝑎 → 𝑏𝑏 → 𝑎

𝑜𝑟𝑑 𝑎 < 𝑜𝑟𝑑 𝑏𝑜𝑟𝑑 𝑏 < 𝑜𝑟𝑑(𝑎)

Slide11/65. Copyright©2017.DevexpertsLLC.Allrightsreserved.

Lock-ordergraph(1)

• Everyvertexisassociatedwithalock• Edge 𝒖, 𝒗 meansthat𝒖 → 𝒗• Cyclesrefertopotentialdeadlocks

Thread 1 Thread 21 a.lock()2 b.lock()3 unlock(a, b)

4 b.lock()5 a.lock()6 unlock(a, b)

Slide12/65. Copyright©2017.DevexpertsLLC.Allrightsreserved.

Lock-ordergraph(2)

Thread 1 Thread 21 a.lock()2 b.lock()3 unlock(a, b)

4 b.lock()5 a.lock()6 unlock(a, b)

• Everyvertexisassociatedwithalock• Edge 𝒖, 𝒗 meansthat𝒖 → 𝒗• Cyclesrefertopotentialdeadlocks

Slide13/65. Copyright©2017.DevexpertsLLC.Allrightsreserved.

Lock-ordergraph(3)

Thread 1 Thread 21 a.lock()2 b.lock()3 unlock(a, b)

4 b.lock()5 a.lock()6 unlock(a, b)

• Everyvertexisassociatedwithalock• Edge 𝒖, 𝒗 meansthat𝒖 → 𝒗• Cyclesrefertopotentialdeadlocks

Slide14/65. Copyright©2017.DevexpertsLLC.Allrightsreserved.

Lock-ordergraph(4)

Thread 1 Thread 21 a.lock()2 b.lock()3 unlock(a, b)

4 b.lock()5 a.lock()6 unlock(a, b)

• Everyvertexisassociatedwithalock• Edge 𝒖, 𝒗 meansthat𝒖 → 𝒗• Cyclesrefertopotentialdeadlocks

Slide15/65. Copyright©2017.DevexpertsLLC.Allrightsreserved.

Minimizationprinciple:problem

• Twocyclesmayrefertothesamepotentialdeadlock

Thread 1 Thread 21 a.lock()2 c.lock()3 b.lock()4 unlock(a,b,c)

5 b.lock()6 a.lock()7 unlock(a,b)

Slide16/65. Copyright©2017.DevexpertsLLC.Allrightsreserved.

Minimizationprinciple:problem(1)

• Twocyclesmayrefertothesamepotentialdeadlock

Thread 1 Thread 21 a.lock()2 c.lock()3 b.lock()4 unlock(a,b,c)

5 b.lock()6 a.lock()7 unlock(a,b)

Slide17/65. Copyright©2017.DevexpertsLLC.Allrightsreserved.

Minimizationprinciple:problem(2)

• Twocyclesmayrefertothesamepotentialdeadlock

Thread 1 Thread 21 a.lock()2 c.lock()3 b.lock()4 unlock(a,b,c)

5 b.lock()6 a.lock()7 unlock(a,b)

Slide18/65. Copyright©2017.DevexpertsLLC.Allrightsreserved.

Minimizationprinciple:problem(3)

• Twocyclesmayrefertothesamepotentialdeadlock

Thread 1 Thread 21 a.lock()2 c.lock()3 b.lock()4 unlock(a,b,c)

5 b.lock()6 a.lock()7 unlock(a,b)

Slide19/65. Copyright©2017.DevexpertsLLC.Allrightsreserved.

Minimizationprinciple:problem(4)

• Twocyclesmayrefertothesamepotentialdeadlock

Thread 1 Thread 21 a.lock()2 c.lock()3 b.lock()4 unlock(a,b,c)

5 b.lock()6 a.lock()7 unlock(a,b)

Slide20/65. Copyright©2017.DevexpertsLLC.Allrightsreserved.

Minimizationprinciple:problem(5)

• Twocyclesmayrefertothesamepotentialdeadlock

Thread 1 Thread 21 a.lock()2 c.lock()3 b.lock()4 unlock(a,b,c)

5 b.lock()6 a.lock()7 unlock(a,b)

Slide21/65. Copyright©2017.DevexpertsLLC.Allrightsreserved.

Minimizationprinciple:problem(6)

• Twocyclesmayrefertothesamepotentialdeadlock

Thread 1 Thread 21 a.lock()2 c.lock()3 b.lock()4 unlock(a,b,c)

5 b.lock()6 a.lock()7 unlock(a,b)

Slide22/65. Copyright©2017.DevexpertsLLC.Allrightsreserved.

Minimizationprinciple:rule

• Theshortercycleismoreuseful• Onlyoneshortestcycleistobeproduced

Slide23/65. Copyright©2017.DevexpertsLLC.Allrightsreserved.

Algorithmlayout

• Capturelockacquireandreleaseoperations• Afterlockacquisition:- Addlocktothemultisetoflocksheldbythecurrentthread- Addnewedgestothelock-ordergraph- Reportnewcycles

• Beforelockrelease:- Removelockfromthemultisetofheldlocks

Slide24/65. Copyright©2017.DevexpertsLLC.Allrightsreserved.

Lockacquisitionandreleasecapturing

Thread 1 Thread 2

4 a.lock()5 c.lock()

7 b.lock()8 a.unlock()9 c.unlock()10 b.unlock()

1 b.lock()2 a.lock()3 a.unlock()

6 b.unlock()

Thread#1

Thread#2

Slide25/65. Copyright©2017.DevexpertsLLC.Allrightsreserved.

Lockacquisitionandreleasecapturing (1)

Thread#1

Thread#2

b

Thread 1 Thread 2

4 a.lock()5 c.lock()

7 b.lock()8 a.unlock()9 c.unlock()10 b.unlock()

1 b.lock()2 a.lock()3 a.unlock()

6 b.unlock()

Slide26/65. Copyright©2017.DevexpertsLLC.Allrightsreserved.

Lockacquisitionandreleasecapturing (2)

Thread#1

Thread#2

ba

Thread 1 Thread 2

4 a.lock()5 c.lock()

7 b.lock()8 a.unlock()9 c.unlock()10 b.unlock()

1 b.lock()2 a.lock()3 a.unlock()

6 b.unlock()

Slide27/65. Copyright©2017.DevexpertsLLC.Allrightsreserved.

Lockacquisitionandreleasecapturing (3)

Thread#1

Thread#2

ba

Thread 1 Thread 2

4 a.lock()5 c.lock()

7 b.lock()8 a.unlock()9 c.unlock()10 b.unlock()

1 b.lock()2 a.lock()3 a.unlock()

6 b.unlock()

Slide28/65. Copyright©2017.DevexpertsLLC.Allrightsreserved.

Lockacquisitionandreleasecapturing (4)

Thread#1

Thread#2

b

a

Thread 1 Thread 2

4 a.lock()5 c.lock()

7 b.lock()8 a.unlock()9 c.unlock()10 b.unlock()

1 b.lock()2 a.lock()3 a.unlock()

6 b.unlock()

Slide29/65. Copyright©2017.DevexpertsLLC.Allrightsreserved.

Lockacquisitionandreleasecapturing (5)

Thread#1

Thread#2

b

ac

Thread 1 Thread 2

4 a.lock()5 c.lock()

7 b.lock()8 a.unlock()9 c.unlock()10 b.unlock()

1 b.lock()2 a.lock()3 a.unlock()

6 b.unlock()

Slide30/65. Copyright©2017.DevexpertsLLC.Allrightsreserved.

Lockacquisitionandreleasecapturing (6)

Thread#1

Thread#2

ac

b

Thread 1 Thread 2

4 a.lock()5 c.lock()

7 b.lock()8 a.unlock()9 c.unlock()10 b.unlock()

1 b.lock()2 a.lock()3 a.unlock()

6 b.unlock()

Slide31/65. Copyright©2017.DevexpertsLLC.Allrightsreserved.

Lockacquisitionandreleasecapturing (7)

Thread#1

Thread#2

acb

Thread 1 Thread 2

4 a.lock()5 c.lock()

7 b.lock()8 a.unlock()9 c.unlock()10 b.unlock()

1 b.lock()2 a.lock()3 a.unlock()

6 b.unlock()

Slide32/65. Copyright©2017.DevexpertsLLC.Allrightsreserved.

Lockacquisitionandreleasecapturing (8)

Thread#1

Thread#2

acb

Thread 1 Thread 2

4 a.lock()5 c.lock()

7 b.lock()8 a.unlock()9 c.unlock()10 b.unlock()

1 b.lock()2 a.lock()3 a.unlock()

6 b.unlock()

Slide33/65. Copyright©2017.DevexpertsLLC.Allrightsreserved.

Lockacquisitionandreleasecapturing (9)

Thread#2

Thread#1

cb

Thread 1 Thread 2

4 a.lock()5 c.lock()

7 b.lock()8 a.unlock()9 c.unlock()10 b.unlock()

1 b.lock()2 a.lock()3 a.unlock()

6 b.unlock()

Slide34/65. Copyright©2017.DevexpertsLLC.Allrightsreserved.

Lockacquisitionandreleasecapturing (10)

Thread#1

Thread#2

b

Thread 1 Thread 2

4 a.lock()5 c.lock()

7 b.lock()8 a.unlock()9 c.unlock()10 b.unlock()

1 b.lock()2 a.lock()3 a.unlock()

6 b.unlock()

Slide35/65. Copyright©2017.DevexpertsLLC.Allrightsreserved.

Multisetofheldlocks

• Commonlockusagepatternssynchronized(o) {// Do something

}

synchronized void f() {// Do something

}

l.lock()try {// Do something

} finally {l.unlock()

}

• LocksareacquiredandreleasedinLIFO(stack)order

Slide36/65. Copyright©2017.DevexpertsLLC.Allrightsreserved.

Multisetofheldlocks

• Stackwithpossibilityofremovingfromthemiddle• Commonlyworksin𝑂 1• Worksin𝑂(𝐵) atworst- 𝐵 – numberoflocksacquiredbythecurrentthread

Slide37/65. Copyright©2017.DevexpertsLLC.Allrightsreserved.

Topologicalorder

• Incrementaltopologicalordermaintenance- MNRalgorithmsuggestedbyMarchetti-Spaccamela etal.

• Theacyclicpartofthelock-ordergraphistobekept• Adding(𝑢, 𝑣) leadstotopologicalorderviolation⇒ theshortestpath𝑣 ↝ 𝑢relatestothecycle

Slide38/65. Copyright©2017.DevexpertsLLC.Allrightsreserved.

Newnodesprocessing

• Typicalpatterninthelock-ordergraph

x

a

bc

d

e

f g

h

• Onelong-livedlockatthecenterandmanyhundredsofshort-livedlocksaroundit

Slide39/65. Copyright©2017.DevexpertsLLC.Allrightsreserved.

Newnodesprocessing

• Lock-freebufferfornewnodes• Initializetopologicalordervalue- ifbufferisfull- whenoutgoingedgeshouldbeadded

Newlocknodesbuffer

Lock-ordergraph

Slide40/65. Copyright©2017.DevexpertsLLC.Allrightsreserved.

Complexity• Onlockacquire- Ifacquisitiondoesnotproducenewcycles• Typicalcase• 𝑂(𝐵 + |𝑉| + |𝐸|)

- Newcycledetected• 𝑂 𝐵 ⋅ 𝑉 + 𝐸

• Onlockrelease- Removesthelockfromthelockmultiset• 𝑂 1 typically• 𝑂 𝐵 atworst

Slide41/65. Copyright©2017.DevexpertsLLC.Allrightsreserved.

Limitations:cycleminimizationvoid transfer(Account from,

Account to,int amount) {

from.lock()to.lock()// Do transferunlock(from, to)

}1 transfer(a, c, …)2 transfer(c, b, …)3 transfer(b, a, …)4 transfer(a, b, …)

Slide42/65. Copyright©2017.DevexpertsLLC.Allrightsreserved.

Limitations:cycleminimization(1)void transfer(Account from,

Account to,int amount) {

from.lock()to.lock()// Do transferunlock(from, to)

}1 transfer(a, c, …)2 transfer(c, b, …)3 transfer(b, a, …)4 transfer(a, b, …)

Slide43/65. Copyright©2017.DevexpertsLLC.Allrightsreserved.

Limitations:cycleminimization(2)void transfer(Account from,

Account to,int amount) {

from.lock()to.lock()// Do transferunlock(from, to)

}1 transfer(a, c, …)2 transfer(c, b, …)3 transfer(b, a, …)4 transfer(a, b, …)

Slide44/65. Copyright©2017.DevexpertsLLC.Allrightsreserved.

Limitations:cycleminimization(3)void transfer(Account from,

Account to,int amount) {

from.lock()to.lock()// Do transferunlock(from, to)

}1 transfer(a, c, …)2 transfer(c, b, …)3 transfer(b, a, …)4 transfer(a, b, …)

Slide45/65. Copyright©2017.DevexpertsLLC.Allrightsreserved.

Limitations:cycleminimization(4)void transfer(Account from,

Account to,int amount) {

from.lock()to.lock()// Do transferunlock(from, to)

}1 transfer(a, c, …)2 transfer(c, b, …)3 transfer(b, a, …)4 transfer(a, b, …)

Slide46/65. Copyright©2017.DevexpertsLLC.Allrightsreserved.

Limitation:cycleminimization(3)

• Edge(𝑣, 𝑢) hasformedacycle• Minimizecycle 𝑢,… , 𝑣 ⇔minimizepath𝑢 ↝ 𝑣- CanbeachievedviaBFS

• Usuallycyclelengthis2or3• Currentimplementationskipsthispart

Slide47/65. Copyright©2017.DevexpertsLLC.Allrightsreserved.

Limitations:independentcycles

• Logicallyindependentcycles:- 𝑎, 𝑐, 𝑏- 𝑎, 𝑏

• Independentcycleisignoredduetominimizationprinciple• OneusefulcycleisbetterJ

Slide48/65. Copyright©2017.DevexpertsLLC.Allrightsreserved.

Limitations:singlethreadedandguardedcycles

• Singlethreadedcycle

Lock a, b

1 a.lock()2 b.lock()3 unlock(a, b)

4 b.lock()5 a.lock()6 unlock(a, b)

Slide49/65. Copyright©2017.DevexpertsLLC.Allrightsreserved.

Limitations:singlethreadedandguardedcycles

• GuardedcycleThread 1 Thread 2

1 g.lock()2 a.lock()3 b.lock()4 unlock(a, b)5 g.unlock()

6 g.lock()7 b.lock()8 a.lock()9 unlock(a, b)10 g.unlock()

Slide50/65. Copyright©2017.DevexpertsLLC.Allrightsreserved.

Limitations:singlethreadedandguardedcycles

• Theyarestilllockhierarchyviolation• Suchpotentialdeadlockmaybecomepossibleaftercoderefactoring

Slide51/65. Copyright©2017.DevexpertsLLC.Allrightsreserved.

IMPLEMENTATION

Dl-Check

• Implementedasjavaagent- java -javaagent:dlcheck.jar -jar your_app.jar

- CanbeusedwithJunit: -Ddlcheck.fail=true

• Insertsanalysiscodeintoclassesatrun-time

Slide53/65. Copyright©2017.DevexpertsLLC.Allrightsreserved.

Dl-Checkoutputexample==========================!!! Potential deadlock !!!==========================### Cycle in lock graph: ###Lock ReentrantLock@75915908 was acquired at:

com/intellij/ide/util/treeView/AbstractTreeUi.acquireLock(AbstractTreeUi.java:2464)com/intellij/ide/util/treeView/AbstractTreeUi.attemptLock(AbstractTreeUi.java:2460)

Lock ProjectViewTreeUpdater@46e87eab was acquired at:com/intellij/ide/util/treeView/AbstractTreeUpdater.reset(AbstractTreeUpdater.java:415)com/intellij/ide/util/treeView/AbstractTreeUpdater.getUpdateCount(AbstractTreeUpdater.java:344)com/intellij/ide/util/treeView/AbstractTreeUpdater.performUpdate(AbstractTreeUpdater.java:242)com/intellij/ide/util/treeView/AbstractTreeUpdater.isEnqueuedToUpdate(AbstractTreeUpdater.java:380)com/intellij/ide/util/treeView/AbstractTreeUpdater.cancelAllRequests(AbstractTreeUpdater.java:326)

### Current lock stack: ###Lock Object@5cbe2bca was acquired at:

com/intellij/openapi/application/impl/LaterInvocator$FlushQueue.a(LaterInvocator.java:320)Lock ReentrantLock@75915908 was acquired at:

com/intellij/ide/util/treeView/AbstractTreeUi.acquireLock(AbstractTreeUi.java:2464)com/intellij/ide/util/treeView/AbstractTreeUi.attemptLock(AbstractTreeUi.java:2460)

### Current stacktrace: ###com.intellij.ide.util.treeView.AbstractTreeUpdater.cancelAllRequests(AbstractTreeUpdater.java:326)com.intellij.ide.util.treeView.AbstractTreeUi.releaseNow(AbstractTreeUi.java:457)com.intellij.ide.util.treeView.AbstractTreeUi.access$1400(AbstractTreeUi.java:66)com.intellij.ide.util.treeView.AbstractTreeUi$12.perform(AbstractTreeUi.java:438)...

Slide54/65. Copyright©2017.DevexpertsLLC.Allrightsreserved.

Byte-codeinstrumentation

• Captureslockacquireandreleaseoperations:- AfterMONITORENTER andbeforeMONITOREXIT instructions- Atthebeginningandtheendofsynchronizedmethod- java.util.concurrent.locks.Lock• Afterlockmethod• AftersuccessfultryLockmethodinvocation• Beforeunlockmethod

Slide55/65. Copyright©2017.DevexpertsLLC.Allrightsreserved.

Scalability

• MNRalgorithmisNOT concurrent• Read-writelock- Readlockforread-onlyoperationsandcurrentnodemodification- Writelockfortopologicalordermodification- SWMR(single-writermulti-reader)datastructures

Slide56/65. Copyright©2017.DevexpertsLLC.Allrightsreserved.

Memorymanagement

• JavahasaGarbageCollector• OldlockinstancesandnodesshouldbecollectedbyGC• WeakReference isusedforinternaldatastructures

Slide57/65. Copyright©2017.DevexpertsLLC.Allrightsreserved.

EVALUATION

Benchmarks

• SpecJVM2008:ApacheDerby(4and40threads)• DaCapo:ApacheLucene• DaCapo:Bankingapplication• Fine-Grained(10threads,100and10’000locks)- Liketransfer(from, to, amount) fromexamples

• …

Slide59/65. Copyright©2017.DevexpertsLLC.Allrightsreserved.

Memoryusageimpact

11,07 1,06

1

1,61

1,34

0,61

1,22

1 1

0,74

1,12

1,35

1

0

0,2

0,4

0,6

0,8

1

1,2

1,4

1,6

1,8

2

Derby1 Derby2 Lucene Bank FG1 FG2

INCR

EASEFA

CTOR

Dl-Check Jcarder MulticoreSDK

Slide60/65. Copyright©2017.DevexpertsLLC.Allrightsreserved.

Performanceimpact

1,53 1,76

1,03

2,6

4,29

18,05

9,7

128,2

1,25

2,6

7,3

120,71

40,33

3,25

1

2

4

8

16

32

64

128

Derby1 Derby2 Lucene Bank FG1 FG2

SLOWDO

WNFA

CTOR

Dl-Check Jcarder MulticoreSDK

Slide61/65. Copyright©2017.DevexpertsLLC.Allrightsreserved.

CONCLUSION

Summary

• Algorithmtodetectpotentialdeadlocksatrun-time• Dl-Check toolhasbeenimplemented• https://github.com/Devexperts/dlcheck• Futurework:- Lockgroupingfeature- Contractstodescribelockacquisitionrules

Slide63/65. Copyright©2017.DevexpertsLLC.Allrightsreserved.

Thankyouforyourattention!

Slide64/65. Copyright©2017.DevexpertsLLC.Allrightsreserved.

Dl-Check:dynamicpotentialdeadlockdetectiontoolforJavaprograms

NikitaKoval1,2 DmitryTsitelov2 RomanElizarov2

1ITMOUniversity,ComputerTechnologyDepartment,St.Petersburg,[email protected]

2Devexperts,LLC,St.Petersburg,Russia,

[email protected]

TMPAConference,March2017

Topologicalorder:extra• Canbemaintainedinasingleiterationincasenocyclesareformed• Alreadyacquiredlocksareorderedalready• Edgefromtherightestnodeshouldbeused

Slide66/65. Copyright©2017.DevexpertsLLC.Allrightsreserved.

...1 a.lock()2 b.lock()3 c.lock()

...Topologicalorder

Topologicalorder:example(0)void transfer(Account from,

Account to,int amount) {

from.lock()to.lock()// Do transferunlock(from, to)

}

1 transfer(d, b)2 transfer(d, c)3 transfer(c, d)4 transfer(e, a)5 transfer(b, a)

Slide67/65. Copyright©2017.DevexpertsLLC.Allrightsreserved.

Topologicalorder:example(1)void transfer(Account from,

Account to,int amount) {

from.lock()to.lock()// Do transferunlock(from, to)

}

1 transfer(d, b)2 transfer(d, c)3 transfer(c, d)4 transfer(e, a)5 transfer(b, a)

Affectedregion

Slide68/65. Copyright©2017.DevexpertsLLC.Allrightsreserved.

Topologicalorder:example(2)void transfer(Account from,

Account to,int amount) {

from.lock()to.lock()// Do transferunlock(from, to)

}

1 transfer(d, b)2 transfer(d, c)3 transfer(c, d)4 transfer(e, a)5 transfer(b, a)

Affectedregion

Slide69/65. Copyright©2017.DevexpertsLLC.Allrightsreserved.

Topologicalorder:example(3)void transfer(Account from,

Account to,int amount) {

from.lock()to.lock()// Do transferunlock(from, to)

}

1 transfer(d, b)2 transfer(d, c)3 transfer(c, d)4 transfer(e, a)5 transfer(b, a)

Affectedregion

Slide70/65. Copyright©2017.DevexpertsLLC.Allrightsreserved.

Topologicalorder:example(4)void transfer(Account from,

Account to,int amount) {

from.lock()to.lock()// Do transferunlock(from, to)

}

1 transfer(d, b)2 transfer(d, c)3 transfer(c, d)4 transfer(e, a)5 transfer(b, a)

Affectedregion

Slide71/65. Copyright©2017.DevexpertsLLC.Allrightsreserved.

Topologicalorder:example(4)void transfer(Account from,

Account to,int amount) {

from.lock()to.lock()// Do transferunlock(from, to)

}

1 transfer(d, b)2 transfer(d, c)3 transfer(c, d)4 transfer(e, a)5 transfer(b, a)

Affectedregion

Slide72/65. Copyright©2017.DevexpertsLLC.Allrightsreserved.