class Bakery { private var flag:Array[Boolean]{self.rank==1}; private var label:Array[Long]{self.rank==1}; public def this(n:Int) { flag = new Array[Boolean](n,false); label = new Array[Long](n,0L); } private def nextLabel() { var max:Long = 0; for (var i:Int = 0; i < label.size; i++) { if (label(i) > max) max = label(i); } return max+1; } private def someoneElseFirst(i:Int) { for (var k:Int = 0; k < label.size; k++) { if (flag(k) && ((label(k) < label(i)) || ((label(k) == label(i)) && (k < i)))) return true; } return false; } public def lock(i:Int) { // doorway section flag(i) = true; label(i) = nextLabel(); // waiting section while (someoneElseFirst(i)) {} } public def unlock(i:Int) { flag(i) = false; } }