Top Banner
Ownership Types for Safe Programming: Ownership Types for Safe Programming: Preventing Data Races and Deadlocks Preventing Data Races and Deadlocks Chandrasekhar Boyapati Chandrasekhar Boyapati Robert Lee Robert Lee Martin Rinard Martin Rinard Laboratory for Computer Science Laboratory for Computer Science Massachusetts Institute of Technology Massachusetts Institute of Technology {chandra, rhlee, rinard}@lcs.mit.edu {chandra, rhlee, rinard}@lcs.mit.edu
54

Ownership Types for Safe Programming: Preventing Data ...web.eecs.umich.edu/~bchandra/publications/oopsla02_talk.pdf · Java Libraries Program Lines of code Lines changed 6 11 9 3

May 31, 2020

Download

Documents

dariahiddleston
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: Ownership Types for Safe Programming: Preventing Data ...web.eecs.umich.edu/~bchandra/publications/oopsla02_talk.pdf · Java Libraries Program Lines of code Lines changed 6 11 9 3

Ownership Types for Safe Programming:Ownership Types for Safe Programming:Preventing Data Races and DeadlocksPreventing Data Races and Deadlocks

Chandrasekhar BoyapatiChandrasekhar BoyapatiRobert LeeRobert LeeMartin RinardMartin Rinard

Laboratory for Computer ScienceLaboratory for Computer ScienceMassachusetts Institute of TechnologyMassachusetts Institute of Technology{chandra, rhlee, rinard}@lcs.mit.edu{chandra, rhlee, rinard}@lcs.mit.edu

Page 2: Ownership Types for Safe Programming: Preventing Data ...web.eecs.umich.edu/~bchandra/publications/oopsla02_talk.pdf · Java Libraries Program Lines of code Lines changed 6 11 9 3

Thread 1:Thread 1:

x = x + 1; x = x + 1;

Thread 2:Thread 2:

x = x + 2; x = x + 2;

�� Two threads access same dataTwo threads access same data

�� At least one access is a writeAt least one access is a write

�� No synchronization to separate accessesNo synchronization to separate accesses

Data Races in Multithreaded ProgramsData Races in Multithreaded Programs

Page 3: Ownership Types for Safe Programming: Preventing Data ...web.eecs.umich.edu/~bchandra/publications/oopsla02_talk.pdf · Java Libraries Program Lines of code Lines changed 6 11 9 3

Avoiding Data RacesAvoiding Data Races

Thread 1:Thread 1:

x = x + 1; x = x + 1;

Thread 2:Thread 2:

x = x + 2; x = x + 2;

Page 4: Ownership Types for Safe Programming: Preventing Data ...web.eecs.umich.edu/~bchandra/publications/oopsla02_talk.pdf · Java Libraries Program Lines of code Lines changed 6 11 9 3

Avoiding Data RacesAvoiding Data Races

�� Associate locks with shared mutable dataAssociate locks with shared mutable data

�� Acquire lock before data accessAcquire lock before data access

�� Release lock after data accessRelease lock after data access

Thread 1:Thread 1:

lock(l);lock(l);

x = x + 1; x = x + 1;

unlock(l);unlock(l);

Thread 2:Thread 2:

lock(l); lock(l);

x = x + 2; x = x + 2;

unlock(l);unlock(l);

Page 5: Ownership Types for Safe Programming: Preventing Data ...web.eecs.umich.edu/~bchandra/publications/oopsla02_talk.pdf · Java Libraries Program Lines of code Lines changed 6 11 9 3

Thread 1Thread 1

Thread 2Thread 2

Thread nThread n

……

Lock 1Lock 1 Lock nLock n

Lock 2Lock 2 Lock 3Lock 3

�� Cycle of the formCycle of the form

�� Thread 1 holds Lock 1, waits for Lock 2 Thread 1 holds Lock 1, waits for Lock 2

�� Thread 2 holds Lock 2, waits for Lock 3 Thread 2 holds Lock 2, waits for Lock 3 ……

�� Thread n holds Lock n, waits for Lock 1Thread n holds Lock n, waits for Lock 1

Deadlocks in Multithreaded ProgramsDeadlocks in Multithreaded Programs

Page 6: Ownership Types for Safe Programming: Preventing Data ...web.eecs.umich.edu/~bchandra/publications/oopsla02_talk.pdf · Java Libraries Program Lines of code Lines changed 6 11 9 3

Avoiding DeadlocksAvoiding Deadlocks

Thread 1Thread 1

Thread 2Thread 2

Thread nThread n

……

Lock 1Lock 1 Lock nLock n

Lock 2Lock 2 Lock 3Lock 3

Page 7: Ownership Types for Safe Programming: Preventing Data ...web.eecs.umich.edu/~bchandra/publications/oopsla02_talk.pdf · Java Libraries Program Lines of code Lines changed 6 11 9 3

Avoiding DeadlocksAvoiding Deadlocks

Thread 1Thread 1

Thread 2Thread 2

Thread nThread n

……

Lock 1Lock 1 Lock nLock n

Lock 2Lock 2 Lock 3Lock 3

�� Associate a partial order among locksAssociate a partial order among locks

�� Acquire locks in orderAcquire locks in order~~~~

Page 8: Ownership Types for Safe Programming: Preventing Data ...web.eecs.umich.edu/~bchandra/publications/oopsla02_talk.pdf · Java Libraries Program Lines of code Lines changed 6 11 9 3

Problem With Current PracticeProblem With Current Practice

�� Locking discipline is not enforcedLocking discipline is not enforced

�� Inadvertent programming errorsInadvertent programming errors

�� Can cause data races and deadlocksCan cause data races and deadlocks

�� Consequences can be severeConsequences can be severe

�� NonNon--deterministic, timing dependent bugsdeterministic, timing dependent bugs

�� Difficult to detect, reproduce, eliminateDifficult to detect, reproduce, eliminate

Page 9: Ownership Types for Safe Programming: Preventing Data ...web.eecs.umich.edu/~bchandra/publications/oopsla02_talk.pdf · Java Libraries Program Lines of code Lines changed 6 11 9 3

Our SolutionOur Solution

�� Static type systemStatic type system

�� Prevents both data races and deadlocks Prevents both data races and deadlocks

Page 10: Ownership Types for Safe Programming: Preventing Data ...web.eecs.umich.edu/~bchandra/publications/oopsla02_talk.pdf · Java Libraries Program Lines of code Lines changed 6 11 9 3

Our SolutionOur Solution

�� Static type systemStatic type system

�� Prevents both data races and deadlocks Prevents both data races and deadlocks

�� Programmers specifyProgrammers specify

�� How each object is protected from racesHow each object is protected from races

�� Partial order among locksPartial order among locks

�� Type checker statically verifiesType checker statically verifies

�� Objects are used only as specifiedObjects are used only as specified

�� Locks are acquired in orderLocks are acquired in order

Page 11: Ownership Types for Safe Programming: Preventing Data ...web.eecs.umich.edu/~bchandra/publications/oopsla02_talk.pdf · Java Libraries Program Lines of code Lines changed 6 11 9 3

Talk OutlineTalk Outline

�� MotivationMotivation

�� Type systemType system

�� Preventing data racesPreventing data races

�� Preventing deadlocksPreventing deadlocks

�� ExperienceExperience

�� Related workRelated work

�� ConclusionsConclusions

Page 12: Ownership Types for Safe Programming: Preventing Data ...web.eecs.umich.edu/~bchandra/publications/oopsla02_talk.pdf · Java Libraries Program Lines of code Lines changed 6 11 9 3

Preventing Data RacesPreventing Data Races

�� Programmers specify for every objectProgrammers specify for every object

�� Lock protecting the object, orLock protecting the object, or

�� That the object needs no locks becauseThat the object needs no locks because

�� Object is immutable Object is immutable

�� Object is threadObject is thread--locallocal

�� Object has a unique pointerObject has a unique pointer

Page 13: Ownership Types for Safe Programming: Preventing Data ...web.eecs.umich.edu/~bchandra/publications/oopsla02_talk.pdf · Java Libraries Program Lines of code Lines changed 6 11 9 3

Preventing DeadlocksPreventing Deadlocks

�� Programmers specify lock ordering usingProgrammers specify lock ordering using

�� Static lock levelsStatic lock levels

�� Recursive data structuresRecursive data structures

�� Mutable treesMutable trees

�� Monotonic DAGsMonotonic DAGs

�� Runtime orderingRuntime ordering

�� Type checker statically verifiesType checker statically verifies

�� Locks are acquired in descending orderLocks are acquired in descending order

�� Specified order is a partial orderSpecified order is a partial order

Page 14: Ownership Types for Safe Programming: Preventing Data ...web.eecs.umich.edu/~bchandra/publications/oopsla02_talk.pdf · Java Libraries Program Lines of code Lines changed 6 11 9 3

Lock Level Based Partial OrdersLock Level Based Partial Orders

�� Lock levels are partially orderedLock levels are partially ordered

�� Locks belong to lock levelsLocks belong to lock levels

�� Threads must acquire locks in descending Threads must acquire locks in descending order of lock levelsorder of lock levels

Page 15: Ownership Types for Safe Programming: Preventing Data ...web.eecs.umich.edu/~bchandra/publications/oopsla02_talk.pdf · Java Libraries Program Lines of code Lines changed 6 11 9 3

Lock Level Based Partial OrdersLock Level Based Partial Orders

class CombinedAccount {class CombinedAccount {

final Account savingsAccount = new Account();final Account savingsAccount = new Account();

final Accountfinal Account checkingAccount = new Account();checkingAccount = new Account();

int balance() {int balance() {

synchronized (savingsAccount) { synchronized (savingsAccount) {

synchronized (checkingAccount) {synchronized (checkingAccount) {

return savingsAccount.balance + checkingAccount.return savingsAccount.balance + checkingAccount.balance; balance;

}}}}}}

}}

Page 16: Ownership Types for Safe Programming: Preventing Data ...web.eecs.umich.edu/~bchandra/publications/oopsla02_talk.pdf · Java Libraries Program Lines of code Lines changed 6 11 9 3

class CombinedAccountclass CombinedAccount {{

LockLevel savingsLevel;LockLevel savingsLevel;

LockLevel checkingLevel < savingsLevel;LockLevel checkingLevel < savingsLevel;

final Accountfinal Account⟨⟨⟨⟨⟨⟨⟨⟨self : savingsLevelself : savingsLevel⟩⟩⟩⟩⟩⟩⟩⟩ savingsAccount = new Account();savingsAccount = new Account();

final Accountfinal Account⟨⟨⟨⟨⟨⟨⟨⟨self : checkingLevelself : checkingLevel⟩⟩⟩⟩⟩⟩⟩⟩ checkingAccount = new Account();checkingAccount = new Account();

int balance() int balance() locks (savingsLevel) locks (savingsLevel) {{

synchronized (savingsAccount) { synchronized (savingsAccount) {

synchronized (checkingAccount) {synchronized (checkingAccount) {

return savingsAccount.balance + checkingAccount.return savingsAccount.balance + checkingAccount.balance; balance;

}}}}}}

}}

Lock Level Based Partial OrdersLock Level Based Partial Orders

Page 17: Ownership Types for Safe Programming: Preventing Data ...web.eecs.umich.edu/~bchandra/publications/oopsla02_talk.pdf · Java Libraries Program Lines of code Lines changed 6 11 9 3

class CombinedAccountclass CombinedAccount {{

LockLevel savingsLevel;LockLevel savingsLevel;

LockLevel checkingLevel < savingsLevel;LockLevel checkingLevel < savingsLevel;

final Accountfinal Account⟨⟨⟨⟨⟨⟨⟨⟨self : savingsLevelself : savingsLevel⟩⟩⟩⟩⟩⟩⟩⟩ savingsAccount = new Account();savingsAccount = new Account();

final Accountfinal Account⟨⟨⟨⟨⟨⟨⟨⟨self : checkingLevelself : checkingLevel⟩⟩⟩⟩⟩⟩⟩⟩ checkingAccount = new Account();checkingAccount = new Account();

int balance() int balance() locks (savingsLevel) locks (savingsLevel) {{

synchronized (savingsAccount) { synchronized (savingsAccount) {

synchronized (checkingAccount) {synchronized (checkingAccount) {

return savingsAccount.balance + checkingAccount.return savingsAccount.balance + checkingAccount.balance; balance;

}}}}}}

}}

checkingLevel < savingsLevelcheckingLevel < savingsLevel

Lock Level Based Partial OrdersLock Level Based Partial Orders

Page 18: Ownership Types for Safe Programming: Preventing Data ...web.eecs.umich.edu/~bchandra/publications/oopsla02_talk.pdf · Java Libraries Program Lines of code Lines changed 6 11 9 3

class CombinedAccountclass CombinedAccount {{

LockLevel savingsLevel;LockLevel savingsLevel;

LockLevel checkingLevel < savingsLevel;LockLevel checkingLevel < savingsLevel;

final Accountfinal Account⟨⟨⟨⟨⟨⟨⟨⟨self : savingsLevelself : savingsLevel⟩⟩⟩⟩⟩⟩⟩⟩ savingsAccount = new Account();savingsAccount = new Account();

final Accountfinal Account⟨⟨⟨⟨⟨⟨⟨⟨self : checkingLevelself : checkingLevel⟩⟩⟩⟩⟩⟩⟩⟩ checkingAccount = new Account();checkingAccount = new Account();

int balance() int balance() locks (savingsLevel) locks (savingsLevel) {{

synchronized (savingsAccount) { synchronized (savingsAccount) {

synchronized (checkingAccount) {synchronized (checkingAccount) {

return savingsAccount.balance + checkingAccount.return savingsAccount.balance + checkingAccount.balance; balance;

}}}}}}

}}

savingsAccount belongs to savingsLevel savingsAccount belongs to savingsLevel

checkingAccount belongs to checkingLevelcheckingAccount belongs to checkingLevel

Lock Level Based Partial OrdersLock Level Based Partial Orders

Page 19: Ownership Types for Safe Programming: Preventing Data ...web.eecs.umich.edu/~bchandra/publications/oopsla02_talk.pdf · Java Libraries Program Lines of code Lines changed 6 11 9 3

class CombinedAccountclass CombinedAccount {{

LockLevel savingsLevel;LockLevel savingsLevel;

LockLevel checkingLevel < savingsLevel;LockLevel checkingLevel < savingsLevel;

final Accountfinal Account⟨⟨⟨⟨⟨⟨⟨⟨self : savingsLevelself : savingsLevel⟩⟩⟩⟩⟩⟩⟩⟩ savingsAccount = new Account();savingsAccount = new Account();

final Accountfinal Account⟨⟨⟨⟨⟨⟨⟨⟨self : checkingLevelself : checkingLevel⟩⟩⟩⟩⟩⟩⟩⟩ checkingAccount = new Account();checkingAccount = new Account();

int balance() int balance() locks (savingsLevel) locks (savingsLevel) {{

synchronized (savingsAccount) { synchronized (savingsAccount) {

synchronized (checkingAccount) {synchronized (checkingAccount) {

return savingsAccount.balance + checkingAccount.return savingsAccount.balance + checkingAccount.balance; balance;

}}}}}}

}}

locks are acquired in descending orderlocks are acquired in descending order

Lock Level Based Partial OrdersLock Level Based Partial Orders

Page 20: Ownership Types for Safe Programming: Preventing Data ...web.eecs.umich.edu/~bchandra/publications/oopsla02_talk.pdf · Java Libraries Program Lines of code Lines changed 6 11 9 3

class CombinedAccountclass CombinedAccount {{

LockLevel savingsLevel;LockLevel savingsLevel;

LockLevel checkingLevel < savingsLevel;LockLevel checkingLevel < savingsLevel;

final Accountfinal Account⟨⟨⟨⟨⟨⟨⟨⟨self : savingsLevelself : savingsLevel⟩⟩⟩⟩⟩⟩⟩⟩ savingsAccount = new Account();savingsAccount = new Account();

final Accountfinal Account⟨⟨⟨⟨⟨⟨⟨⟨self : checkingLevelself : checkingLevel⟩⟩⟩⟩⟩⟩⟩⟩ checkingAccount = new Account();checkingAccount = new Account();

int balance() int balance() locks (savingsLevel) locks (savingsLevel) {{

synchronized (savingsAccount) { synchronized (savingsAccount) {

synchronized (checkingAccount) {synchronized (checkingAccount) {

return savingsAccount.balance + checkingAccount.return savingsAccount.balance + checkingAccount.balance; balance;

}}}}}}

}}

locks held by callers > savingsLevellocks held by callers > savingsLevel

Lock Level Based Partial OrdersLock Level Based Partial Orders

Page 21: Ownership Types for Safe Programming: Preventing Data ...web.eecs.umich.edu/~bchandra/publications/oopsla02_talk.pdf · Java Libraries Program Lines of code Lines changed 6 11 9 3

class CombinedAccountclass CombinedAccount {{

LockLevel savingsLevel;LockLevel savingsLevel;

LockLevel checkingLevel < savingsLevel;LockLevel checkingLevel < savingsLevel;

final Accountfinal Account⟨⟨⟨⟨⟨⟨⟨⟨self : savingsLevelself : savingsLevel⟩⟩⟩⟩⟩⟩⟩⟩ savingsAccount = new Account();savingsAccount = new Account();

final Accountfinal Account⟨⟨⟨⟨⟨⟨⟨⟨self : checkingLevelself : checkingLevel⟩⟩⟩⟩⟩⟩⟩⟩ checkingAccount = new Account();checkingAccount = new Account();

int balance() int balance() locks (savingsLevel) locks (savingsLevel) {{

synchronized (savingsAccount) { synchronized (savingsAccount) {

synchronized (checkingAccount) {synchronized (checkingAccount) {

return savingsAccount.balance + checkingAccount.return savingsAccount.balance + checkingAccount.balance; balance;

}}}}}}

}}

balance can acquire these locksbalance can acquire these locks

Lock Level Based Partial OrdersLock Level Based Partial Orders

Page 22: Ownership Types for Safe Programming: Preventing Data ...web.eecs.umich.edu/~bchandra/publications/oopsla02_talk.pdf · Java Libraries Program Lines of code Lines changed 6 11 9 3

Types Impose No Dynamic OverheadTypes Impose No Dynamic Overhead

Type Type

checkercheckerTranslatorTranslator

(Removes extra types)(Removes extra types)

CompilerCompiler

JVMJVM

JavaJava

bytecodesbytecodes

+ Extra + Extra

typestypes

JavaJava

Page 23: Ownership Types for Safe Programming: Preventing Data ...web.eecs.umich.edu/~bchandra/publications/oopsla02_talk.pdf · Java Libraries Program Lines of code Lines changed 6 11 9 3

Lock Level Based Partial OrdersLock Level Based Partial Orders

�� Bounded number of lock levelsBounded number of lock levels

�� Unbounded number of locksUnbounded number of locks

�� Lock levels support programs where the Lock levels support programs where the maximum number of locks simultaneously maximum number of locks simultaneously held by a thread is boundedheld by a thread is bounded

�� We use other mechanisms for other casesWe use other mechanisms for other cases

Page 24: Ownership Types for Safe Programming: Preventing Data ...web.eecs.umich.edu/~bchandra/publications/oopsla02_talk.pdf · Java Libraries Program Lines of code Lines changed 6 11 9 3

Type SystemType System

�� Preventing data racesPreventing data races

�� Preventing deadlocks usingPreventing deadlocks using

�� Static lock levelsStatic lock levels

�� Recursive data structuresRecursive data structures

�� Mutable treesMutable trees

�� Monotonic DAGsMonotonic DAGs

�� Runtime orderingRuntime ordering

Page 25: Ownership Types for Safe Programming: Preventing Data ...web.eecs.umich.edu/~bchandra/publications/oopsla02_talk.pdf · Java Libraries Program Lines of code Lines changed 6 11 9 3

Tree Based Partial OrdersTree Based Partial Orders

�� Locks in a level can be treeLocks in a level can be tree--orderedordered

�� Using data structures with tree backbonesUsing data structures with tree backbones

�� Doubly linked listsDoubly linked lists

�� Trees with parent/sibling pointersTrees with parent/sibling pointers

�� Threaded treesThreaded trees……

Page 26: Ownership Types for Safe Programming: Preventing Data ...web.eecs.umich.edu/~bchandra/publications/oopsla02_talk.pdf · Java Libraries Program Lines of code Lines changed 6 11 9 3

class Node {class Node {

Node left;Node left;

Node right;Node right;

synchronized void rotateRight() {synchronized void rotateRight() {

Node x = this.right; synchronized (x) {Node x = this.right; synchronized (x) {

Node v = x.left; synchronized (v) {Node v = x.left; synchronized (v) {

Node w Node w = v.right;= v.right;

v.right = null;v.right = null;

x.left = w;x.left = w;

this.right = v;this.right = v;

v.right = x;v.right = x;

}}}}}}

} }

xx

thisthis

vv

ww yy

thisthis

vv

xx

yy

uu ww

uu

Tree Based Partial OrdersTree Based Partial Orders

Page 27: Ownership Types for Safe Programming: Preventing Data ...web.eecs.umich.edu/~bchandra/publications/oopsla02_talk.pdf · Java Libraries Program Lines of code Lines changed 6 11 9 3

class Nodeclass Node⟨⟨⟨⟨⟨⟨⟨⟨self : lself : l⟩⟩⟩⟩⟩⟩⟩⟩ {{

treetree NodeNode⟨⟨⟨⟨⟨⟨⟨⟨self : lself : l⟩⟩⟩⟩⟩⟩⟩⟩ left;left;

treetree NodeNode⟨⟨⟨⟨⟨⟨⟨⟨self : lself : l⟩⟩⟩⟩⟩⟩⟩⟩ right;right;

synchronized void rotateRight() synchronized void rotateRight() locks (this)locks (this) {{

Node x = this.right; synchronized (x) {Node x = this.right; synchronized (x) {

Node v = x.left; synchronized (v) {Node v = x.left; synchronized (v) {

Node w Node w = v.right;= v.right;

v.right = null;v.right = null;

x.left = w;x.left = w;

this.right = v;this.right = v;

v.right = x;v.right = x;

}}}}}}

} }

xx

thisthis

vv

ww yy

thisthis

vv

xx

yy

uu ww

uu

Tree Based Partial OrdersTree Based Partial Orders

nodes must be locked in tree ordernodes must be locked in tree order

Page 28: Ownership Types for Safe Programming: Preventing Data ...web.eecs.umich.edu/~bchandra/publications/oopsla02_talk.pdf · Java Libraries Program Lines of code Lines changed 6 11 9 3

class Nodeclass Node⟨⟨⟨⟨⟨⟨⟨⟨self : lself : l⟩⟩⟩⟩⟩⟩⟩⟩ {{

treetree NodeNode⟨⟨⟨⟨⟨⟨⟨⟨self : lself : l⟩⟩⟩⟩⟩⟩⟩⟩ left;left;

treetree NodeNode⟨⟨⟨⟨⟨⟨⟨⟨self : lself : l⟩⟩⟩⟩⟩⟩⟩⟩ right;right;

synchronized void rotateRight() synchronized void rotateRight() locks (this)locks (this) {{

Node x = this.right; synchronized (x) {Node x = this.right; synchronized (x) {

Node v = x.left; synchronized (v) {Node v = x.left; synchronized (v) {

Node w Node w = v.right;= v.right;

v.right = null;v.right = null;

x.left = w;x.left = w;

this.right = v;this.right = v;

v.right = x;v.right = x;

}}}}}}

} }

xx

thisthis

vv

ww yy

thisthis

vv

xx

yy

uu ww

uu

nodes are locked in tree ordernodes are locked in tree order

Tree Based Partial OrdersTree Based Partial Orders

Page 29: Ownership Types for Safe Programming: Preventing Data ...web.eecs.umich.edu/~bchandra/publications/oopsla02_talk.pdf · Java Libraries Program Lines of code Lines changed 6 11 9 3

Checking Tree MutationsChecking Tree Mutations

�� A tree edge may be deletedA tree edge may be deleted

�� A tree edge from x to y may be added iffA tree edge from x to y may be added iff

�� y is a Rooty is a Root

�� x is not in Tree(y)x is not in Tree(y)

�� For onstage nodes x & y, analysis tracksFor onstage nodes x & y, analysis tracks

�� If y is a RootIf y is a Root

�� If x is not in Tree(y)If x is not in Tree(y)

�� If x has a tree edge to yIf x has a tree edge to y

�� Lightweight shape analysisLightweight shape analysis

Page 30: Ownership Types for Safe Programming: Preventing Data ...web.eecs.umich.edu/~bchandra/publications/oopsla02_talk.pdf · Java Libraries Program Lines of code Lines changed 6 11 9 3

class Nodeclass Node⟨⟨⟨⟨⟨⟨⟨⟨self : lself : l⟩⟩⟩⟩⟩⟩⟩⟩ {{

treetree NodeNode⟨⟨⟨⟨⟨⟨⟨⟨self : lself : l⟩⟩⟩⟩⟩⟩⟩⟩ left;left;

treetree NodeNode⟨⟨⟨⟨⟨⟨⟨⟨self : lself : l⟩⟩⟩⟩⟩⟩⟩⟩ right;right;

synchronized void rotateRight() synchronized void rotateRight() locks (this)locks (this) {{

Node x = this.right; synchronized (x) {Node x = this.right; synchronized (x) {

Node v = x.left; synchronized (v) {Node v = x.left; synchronized (v) {

Node w Node w = v.right;= v.right;

v.right = null;v.right = null;

x.left = w;x.left = w;

this.right = v;this.right = v;

v.right = x;v.right = x;

}}}}}}

} }

Checking Tree MutationsChecking Tree Mutations

xx

thisthis

vv

ww yy

thisthis

vv

xx

yy

uu ww

uu

Page 31: Ownership Types for Safe Programming: Preventing Data ...web.eecs.umich.edu/~bchandra/publications/oopsla02_talk.pdf · Java Libraries Program Lines of code Lines changed 6 11 9 3

class Nodeclass Node⟨⟨⟨⟨⟨⟨⟨⟨self : lself : l⟩⟩⟩⟩⟩⟩⟩⟩ {{

treetree NodeNode⟨⟨⟨⟨⟨⟨⟨⟨self : lself : l⟩⟩⟩⟩⟩⟩⟩⟩ left;left;

treetree NodeNode⟨⟨⟨⟨⟨⟨⟨⟨self : lself : l⟩⟩⟩⟩⟩⟩⟩⟩ right;right;

synchronized void rotateRight() synchronized void rotateRight() locks (this)locks (this) {{

Node x = this.right; synchronized (x) {Node x = this.right; synchronized (x) {

Node v = x.left; synchronized (v) {Node v = x.left; synchronized (v) {

Node w Node w = v.right;= v.right;

v.right = null;v.right = null;

x.left = w;x.left = w;

this.right = v;this.right = v;

v.right = x;v.right = x;

}}}}}}

} }

Checking Tree MutationsChecking Tree Mutations

thisthis

vv

xx

yy

uu ww

x = this.rightx = this.right

v = x.leftv = x.left

w = v.rightw = v.right

Page 32: Ownership Types for Safe Programming: Preventing Data ...web.eecs.umich.edu/~bchandra/publications/oopsla02_talk.pdf · Java Libraries Program Lines of code Lines changed 6 11 9 3

class Nodeclass Node⟨⟨⟨⟨⟨⟨⟨⟨self : lself : l⟩⟩⟩⟩⟩⟩⟩⟩ {{

treetree NodeNode⟨⟨⟨⟨⟨⟨⟨⟨self : lself : l⟩⟩⟩⟩⟩⟩⟩⟩ left;left;

treetree NodeNode⟨⟨⟨⟨⟨⟨⟨⟨self : lself : l⟩⟩⟩⟩⟩⟩⟩⟩ right;right;

synchronized void rotateRight() synchronized void rotateRight() locks (this)locks (this) {{

Node x = this.right; synchronized (x) {Node x = this.right; synchronized (x) {

Node v = x.left; synchronized (v) {Node v = x.left; synchronized (v) {

Node w Node w = v.right;= v.right;

v.right = null;v.right = null;

x.left = w;x.left = w;

this.right = v;this.right = v;

v.right = x;v.right = x;

}}}}}}

} }

Checking Tree MutationsChecking Tree Mutations

thisthis

vv

xx

yy

uu ww

x = this.rightx = this.right

v = x.leftv = x.left

w is Rootw is Root

v v not in Tree(w)not in Tree(w)

x x not in Tree(w)not in Tree(w)

this not in Tree(w)this not in Tree(w)

Page 33: Ownership Types for Safe Programming: Preventing Data ...web.eecs.umich.edu/~bchandra/publications/oopsla02_talk.pdf · Java Libraries Program Lines of code Lines changed 6 11 9 3

class Nodeclass Node⟨⟨⟨⟨⟨⟨⟨⟨self : lself : l⟩⟩⟩⟩⟩⟩⟩⟩ {{

treetree NodeNode⟨⟨⟨⟨⟨⟨⟨⟨self : lself : l⟩⟩⟩⟩⟩⟩⟩⟩ left;left;

treetree NodeNode⟨⟨⟨⟨⟨⟨⟨⟨self : lself : l⟩⟩⟩⟩⟩⟩⟩⟩ right;right;

synchronized void rotateRight() synchronized void rotateRight() locks (this)locks (this) {{

Node x = this.right; synchronized (x) {Node x = this.right; synchronized (x) {

Node v = x.left; synchronized (v) {Node v = x.left; synchronized (v) {

Node w Node w = v.right;= v.right;

v.right = null;v.right = null;

x.left = w;x.left = w;

this.right = v;this.right = v;

v.right = x;v.right = x;

}}}}}}

} }

Checking Tree MutationsChecking Tree Mutations

thisthis

ww

xx

yy

x = this.rightx = this.right

w = x.leftw = x.left

v is Rootv is Root

x x not in Tree(v)not in Tree(v)

w w not in Tree(v)not in Tree(v)

this not in Tree(v)this not in Tree(v)

vv

uu

Page 34: Ownership Types for Safe Programming: Preventing Data ...web.eecs.umich.edu/~bchandra/publications/oopsla02_talk.pdf · Java Libraries Program Lines of code Lines changed 6 11 9 3

class Nodeclass Node⟨⟨⟨⟨⟨⟨⟨⟨self : lself : l⟩⟩⟩⟩⟩⟩⟩⟩ {{

treetree NodeNode⟨⟨⟨⟨⟨⟨⟨⟨self : lself : l⟩⟩⟩⟩⟩⟩⟩⟩ left;left;

treetree NodeNode⟨⟨⟨⟨⟨⟨⟨⟨self : lself : l⟩⟩⟩⟩⟩⟩⟩⟩ right;right;

synchronized void rotateRight() synchronized void rotateRight() locks (this)locks (this) {{

Node x = this.right; synchronized (x) {Node x = this.right; synchronized (x) {

Node v = x.left; synchronized (v) {Node v = x.left; synchronized (v) {

Node w Node w = v.right;= v.right;

v.right = null;v.right = null;

x.left = w;x.left = w;

this.right = v;this.right = v;

v.right = x;v.right = x;

}}}}}}

} }

Checking Tree MutationsChecking Tree Mutations

thisthis

uu

vv

xx

v = this.rightv = this.right

w = x.leftw = x.left

x is Rootx is Root

this not in Tree(x)this not in Tree(x)

v v not in Tree(x)not in Tree(x)

ww yy

Page 35: Ownership Types for Safe Programming: Preventing Data ...web.eecs.umich.edu/~bchandra/publications/oopsla02_talk.pdf · Java Libraries Program Lines of code Lines changed 6 11 9 3

class Nodeclass Node⟨⟨⟨⟨⟨⟨⟨⟨self : lself : l⟩⟩⟩⟩⟩⟩⟩⟩ {{

treetree NodeNode⟨⟨⟨⟨⟨⟨⟨⟨self : lself : l⟩⟩⟩⟩⟩⟩⟩⟩ left;left;

treetree NodeNode⟨⟨⟨⟨⟨⟨⟨⟨self : lself : l⟩⟩⟩⟩⟩⟩⟩⟩ right;right;

synchronized void rotateRight() synchronized void rotateRight() locks (this)locks (this) {{

Node x = this.right; synchronized (x) {Node x = this.right; synchronized (x) {

Node v = x.left; synchronized (v) {Node v = x.left; synchronized (v) {

Node w Node w = v.right;= v.right;

v.right = null;v.right = null;

x.left = w;x.left = w;

this.right = v;this.right = v;

v.right = x;v.right = x;

}}}}}}

} }

Checking Tree MutationsChecking Tree Mutations

thisthis

uu

vv

xx

v = this.rightv = this.right

w = x.leftw = x.left

x = v.rightx = v.right

ww yy

Page 36: Ownership Types for Safe Programming: Preventing Data ...web.eecs.umich.edu/~bchandra/publications/oopsla02_talk.pdf · Java Libraries Program Lines of code Lines changed 6 11 9 3

Type SystemType System

�� Preventing data racesPreventing data races

�� Preventing deadlocks usingPreventing deadlocks using

�� Static lock levelsStatic lock levels

�� Recursive data structuresRecursive data structures

�� Mutable treesMutable trees

�� Monotonic DAGsMonotonic DAGs

�� Runtime orderingRuntime ordering

Page 37: Ownership Types for Safe Programming: Preventing Data ...web.eecs.umich.edu/~bchandra/publications/oopsla02_talk.pdf · Java Libraries Program Lines of code Lines changed 6 11 9 3

DAG Based Partial OrdersDAG Based Partial Orders

�� Locks in a level can be DAGLocks in a level can be DAG--orderedordered

�� DAGs cannot be arbitrarily modifiedDAGs cannot be arbitrarily modified

�� DAGs can be built bottomDAGs can be built bottom--up byup by

�� Allocating a new nodeAllocating a new node

�� Initializing its DAG fieldsInitializing its DAG fields

class Nodeclass Node⟨⟨⟨⟨⟨⟨⟨⟨self : lself : l⟩⟩⟩⟩⟩⟩⟩⟩ {{

dagdag NodeNode⟨⟨⟨⟨⟨⟨⟨⟨self : lself : l⟩⟩⟩⟩⟩⟩⟩⟩ left;left;

dagdag NodeNode⟨⟨⟨⟨⟨⟨⟨⟨self : lself : l⟩⟩⟩⟩⟩⟩⟩⟩ right;right;

……

} }

Page 38: Ownership Types for Safe Programming: Preventing Data ...web.eecs.umich.edu/~bchandra/publications/oopsla02_talk.pdf · Java Libraries Program Lines of code Lines changed 6 11 9 3

Type SystemType System

�� Preventing data racesPreventing data races

�� Preventing deadlocks usingPreventing deadlocks using

�� Static lock levelsStatic lock levels

�� Recursive data structuresRecursive data structures

�� Mutable treesMutable trees

�� Monotonic DAGsMonotonic DAGs

�� Runtime orderingRuntime ordering

Page 39: Ownership Types for Safe Programming: Preventing Data ...web.eecs.umich.edu/~bchandra/publications/oopsla02_talk.pdf · Java Libraries Program Lines of code Lines changed 6 11 9 3

class Accountclass Account {{

int balance = 0;int balance = 0;

void deposit(int x) void deposit(int x) { balance += x; }{ balance += x; }

void withdraw(int x) { balance void withdraw(int x) { balance --= x; }= x; }

}}

void transfer(Account a1, Account a2, int x) {void transfer(Account a1, Account a2, int x) {

synchronized (a1, a2)synchronized (a1, a2) in { a1.withdraw(x); a2.deposit(x); }in { a1.withdraw(x); a2.deposit(x); }

}}

Runtime Ordering of LocksRuntime Ordering of Locks

Page 40: Ownership Types for Safe Programming: Preventing Data ...web.eecs.umich.edu/~bchandra/publications/oopsla02_talk.pdf · Java Libraries Program Lines of code Lines changed 6 11 9 3

class Accountclass Account implements Dynamic implements Dynamic {{

int balance = 0;int balance = 0;

void deposit(int x) void deposit(int x) requires (this) requires (this) { balance += x; }{ balance += x; }

void withdraw(int x) void withdraw(int x) requires (this) requires (this) { balance { balance --= x; }= x; }

}}

void transfer(Accountvoid transfer(Account⟨⟨⟨⟨⟨⟨⟨⟨self : vself : v⟩⟩⟩⟩⟩⟩⟩⟩ a1, Accounta1, Account⟨⟨⟨⟨⟨⟨⟨⟨self : vself : v⟩⟩⟩⟩⟩⟩⟩⟩ a2, int x) a2, int x) locks(v)locks(v) {{

synchronized (a1, a2)synchronized (a1, a2) in { a1.withdraw(x); a2.deposit(x); }in { a1.withdraw(x); a2.deposit(x); }

}}

Runtime Ordering of LocksRuntime Ordering of Locks

Page 41: Ownership Types for Safe Programming: Preventing Data ...web.eecs.umich.edu/~bchandra/publications/oopsla02_talk.pdf · Java Libraries Program Lines of code Lines changed 6 11 9 3

class Accountclass Account implements Dynamic implements Dynamic {{

int balance = 0;int balance = 0;

void deposit(int x) void deposit(int x) requires (this) requires (this) { balance += x; }{ balance += x; }

void withdraw(int x) void withdraw(int x) requires (this) requires (this) { balance { balance --= x; }= x; }

}}

void transfer(Accountvoid transfer(Account⟨⟨⟨⟨⟨⟨⟨⟨self : vself : v⟩⟩⟩⟩⟩⟩⟩⟩ a1, Accounta1, Account⟨⟨⟨⟨⟨⟨⟨⟨self : vself : v⟩⟩⟩⟩⟩⟩⟩⟩ a2, int x) a2, int x) locks(v)locks(v) {{

synchronized (a1, a2)synchronized (a1, a2) in { a1.withdraw(x); a2.deposit(x); }in { a1.withdraw(x); a2.deposit(x); }

}}

Runtime Ordering of LocksRuntime Ordering of Locks

Account objects are dynamically orderedAccount objects are dynamically ordered

Page 42: Ownership Types for Safe Programming: Preventing Data ...web.eecs.umich.edu/~bchandra/publications/oopsla02_talk.pdf · Java Libraries Program Lines of code Lines changed 6 11 9 3

class Accountclass Account implements Dynamic implements Dynamic {{

int balance = 0;int balance = 0;

void deposit(int x) void deposit(int x) requires (this) requires (this) { balance += x; }{ balance += x; }

void withdraw(int x) void withdraw(int x) requires (this) requires (this) { balance { balance --= x; }= x; }

}}

void transfer(Accountvoid transfer(Account⟨⟨⟨⟨⟨⟨⟨⟨self : vself : v⟩⟩⟩⟩⟩⟩⟩⟩ a1, Accounta1, Account⟨⟨⟨⟨⟨⟨⟨⟨self : vself : v⟩⟩⟩⟩⟩⟩⟩⟩ a2, int x) a2, int x) locks(v)locks(v) {{

synchronized (a1, a2)synchronized (a1, a2) in { a1.withdraw(x); a2.deposit(x); }in { a1.withdraw(x); a2.deposit(x); }

}}

Runtime Ordering of LocksRuntime Ordering of Locks

locks are acquired in runtime orderlocks are acquired in runtime order

Page 43: Ownership Types for Safe Programming: Preventing Data ...web.eecs.umich.edu/~bchandra/publications/oopsla02_talk.pdf · Java Libraries Program Lines of code Lines changed 6 11 9 3

Reducing Programming OverheadReducing Programming Overhead

�� Type inference and default types significantly Type inference and default types significantly reduce programming overheadreduce programming overhead

�� Single threaded programs need no annotationsSingle threaded programs need no annotations

�� Our approach supports separate compilationOur approach supports separate compilation

Page 44: Ownership Types for Safe Programming: Preventing Data ...web.eecs.umich.edu/~bchandra/publications/oopsla02_talk.pdf · Java Libraries Program Lines of code Lines changed 6 11 9 3

ExperienceExperience

Page 45: Ownership Types for Safe Programming: Preventing Data ...web.eecs.umich.edu/~bchandra/publications/oopsla02_talk.pdf · Java Libraries Program Lines of code Lines changed 6 11 9 3

Multithreaded Server ProgramsMultithreaded Server Programs

1515523523elevatorelevator

1010

1111

1212

2222

2626

Lines changedLines changed

302302

8787

242242

308308

563563

Lines of codeLines of codeProgramProgram

phone (database) serverphone (database) server

game servergame server

stock quote serverstock quote server

chat serverchat server

http serverhttp server

Page 46: Ownership Types for Safe Programming: Preventing Data ...web.eecs.umich.edu/~bchandra/publications/oopsla02_talk.pdf · Java Libraries Program Lines of code Lines changed 6 11 9 3

Java LibrariesJava Libraries

Lines changedLines changedLines of codeLines of codeProgramProgram

535310111011java.util.Hashtablejava.util.Hashtable

4646852852java.util.HashMapjava.util.HashMap

1818

3535

533533

992992

java.util.ArrayListjava.util.ArrayList

java.util.Vectorjava.util.Vector

Page 47: Ownership Types for Safe Programming: Preventing Data ...web.eecs.umich.edu/~bchandra/publications/oopsla02_talk.pdf · Java Libraries Program Lines of code Lines changed 6 11 9 3

Java LibrariesJava Libraries

Lines changedLines changedLines of codeLines of codeProgramProgram

66

1111

99

33

177177

266266

253253

134134

java.io.Writerjava.io.Writer

java.io.OutputStreamWriterjava.io.OutputStreamWriter

java.io.BufferedWriterjava.io.BufferedWriter

java.io.OutputStreamjava.io.OutputStream

55

1414

148148

568568

java.io.FilterOutputStreamjava.io.FilterOutputStream

java.io.PrintStreamjava.io.PrintStream

Page 48: Ownership Types for Safe Programming: Preventing Data ...web.eecs.umich.edu/~bchandra/publications/oopsla02_talk.pdf · Java Libraries Program Lines of code Lines changed 6 11 9 3

Related WorkRelated Work

Page 49: Ownership Types for Safe Programming: Preventing Data ...web.eecs.umich.edu/~bchandra/publications/oopsla02_talk.pdf · Java Libraries Program Lines of code Lines changed 6 11 9 3

�� Static toolsStatic tools

�� Korty (Korty (USENIX USENIX ’’8989))

�� Sterling (Sterling (USENIX USENIX ’’9393))

�� Detlefs, Leino, Nelson, Saxe (Detlefs, Leino, Nelson, Saxe (SRC SRC ’’9898))

�� Engler, Chen, Hallem, Chou, Chelf (Engler, Chen, Hallem, Chou, Chelf (SOSP SOSP ’’0101))

�� Dynamic toolsDynamic tools

�� Steele (Steele (POPL POPL ’’9090))

�� Dinning, Schonberg (Dinning, Schonberg (PPoPP PPoPP ’’9090))

�� Savage,Burrows,Nelson,Sobalvarro,Anderson (Savage,Burrows,Nelson,Sobalvarro,Anderson (SOSP SOSP ’’9797))

�� Praun, Gross (Praun, Gross (OOPSLA OOPSLA ’’0101) )

�� Choi,Lee,Loginov,OChoi,Lee,Loginov,O’’Callahan,Sarkar,Sridharan (Callahan,Sarkar,Sridharan (PLDI PLDI ’’0202) )

Related WorkRelated Work

Page 50: Ownership Types for Safe Programming: Preventing Data ...web.eecs.umich.edu/~bchandra/publications/oopsla02_talk.pdf · Java Libraries Program Lines of code Lines changed 6 11 9 3

�� Type systemsType systems

�� Flanagan, Freund (Flanagan, Freund (PLDI PLDI ’’0000))

�� Bacon, Strom, Tarafdar (Bacon, Strom, Tarafdar (OOPSLA OOPSLA ’’0000))

Related WorkRelated Work

Page 51: Ownership Types for Safe Programming: Preventing Data ...web.eecs.umich.edu/~bchandra/publications/oopsla02_talk.pdf · Java Libraries Program Lines of code Lines changed 6 11 9 3

�� Ownership typesOwnership types

�� Clarke, Potter, Noble (Clarke, Potter, Noble (OOPSLA OOPSLA ’’9898), (), (ECOOP ECOOP ’’0101))

�� Clarke, Drossopoulou (Clarke, Drossopoulou (OOPSLA OOPSLA ’’0202))

�� Aldrich, Kostadinov, Chambers (Aldrich, Kostadinov, Chambers (OOPSLA OOPSLA ’’0202))

�� Boyapati, Rinard (Boyapati, Rinard (OOPSLA OOPSLA ’’0101))

�� Boyapati, Lee, Rinard (Boyapati, Lee, Rinard (OOPSLA OOPSLA ’’0202))

�� Boyapati, Liskov, Shrira (Boyapati, Liskov, Shrira (MIT MIT ’’0202))

�� Boyapati, Salcianu, Beebee, Rinard (Boyapati, Salcianu, Beebee, Rinard (MIT MIT ’’0202))

Related WorkRelated Work

Page 52: Ownership Types for Safe Programming: Preventing Data ...web.eecs.umich.edu/~bchandra/publications/oopsla02_talk.pdf · Java Libraries Program Lines of code Lines changed 6 11 9 3

Ownership TypesOwnership Types

�� We have used ownership types forWe have used ownership types for

�� Object encapsulationObject encapsulation

�� Constraining heap aliasingConstraining heap aliasing

�� Modular effects clauses with subtypingModular effects clauses with subtyping

�� Preventing data races and deadlocksPreventing data races and deadlocks

�� Safe lazy upgrades in OODBsSafe lazy upgrades in OODBs

�� Safe regionSafe region--based memory managementbased memory management

�� Ownership types can serve as a Ownership types can serve as a foundation for future OO languagesfoundation for future OO languages

Page 53: Ownership Types for Safe Programming: Preventing Data ...web.eecs.umich.edu/~bchandra/publications/oopsla02_talk.pdf · Java Libraries Program Lines of code Lines changed 6 11 9 3

ConclusionsConclusions

�� Data races and deadlocks make Data races and deadlocks make multithreaded programming difficultmultithreaded programming difficult

�� We presented a static type system that We presented a static type system that prevents data races and deadlocksprevents data races and deadlocks

�� Our type system is expressiveOur type system is expressive

�� Programs can be efficient and reliablePrograms can be efficient and reliable

Page 54: Ownership Types for Safe Programming: Preventing Data ...web.eecs.umich.edu/~bchandra/publications/oopsla02_talk.pdf · Java Libraries Program Lines of code Lines changed 6 11 9 3

Ownership Types for Safe Programming:Ownership Types for Safe Programming:Preventing Data Races and DeadlocksPreventing Data Races and Deadlocks

Chandrasekhar BoyapatiChandrasekhar BoyapatiRobert LeeRobert LeeMartin RinardMartin Rinard

Laboratory for Computer ScienceLaboratory for Computer ScienceMassachusetts Institute of TechnologyMassachusetts Institute of Technology{chandra, rhlee, rinard}@lcs.mit.edu{chandra, rhlee, rinard}@lcs.mit.edu