|
[#564] |
project: compiler |
priority: high |
category: bug |
|
submitter |
assigned to |
status |
date submitted |
|
Martin |
Iulian |
fixed |
2006-04-05 18:37:45.0 |
subject |
Invalid index for: variable monitor4 |
code |
package scala.concurrent;
class AbortException extends RuntimeException;
object Transaction {
private var cnt = 0L
def nextId: long = synchronized {
cnt = cnt + 1; cnt
}
// Transaction status constants
val Running = 0
val Committed = 1
val Abortable = 2
val Aborted = 3
val Compound = 4
def atomic[T](b: Transaction => T): Option[T] =
(new Transaction).run(b)
}
class Transaction {
var status: int = _
var id: long = _ // only for real transactions
var head: Transaction = this
var next: Transaction = null
def this(hd: Transaction, tl: Transaction) = { this(); this.head = head; this.next = next }
def makeAbort() = synchronized {
while (status != Transaction.Aborted && status != Transaction.Committed) {
status = Transaction.Abortable
wait()
}
}
private def abort() = synchronized { status = Transaction.Aborted; notifyAll() }
private def commit() = synchronized { status = Transaction.Committed; notifyAll() }
def run[T](b: Transaction => T): Option[T] =
try {
status = Transaction.Running
id = Transaction.nextId
val result = Some(b(this))
commit()
result
} catch {
case ex: AbortException => abort(); None
case ex: Throwable => abort(); throw ex
}
}
trait Transactional {
/** create a new snapshot */
def checkPoint(): unit
/** copy back snapshot */
def rollBack(): unit
var readers: Transaction
var writer: Transaction
def currentWriter(): Transaction = null
if (writer == null) null
else if (writer.status == Transaction.Running) writer
else {
if (writer.status != Transaction.Committed) rollBack();
writer = null;
null
}
def getter(thisTrans: Transaction): unit = {
if (writer == thisTrans) return
var r = readers
while (r != null && r.head.status != Transaction.Running) { r = r.next; readers = r }
while (r != null) {
if (r.head == thisTrans) return
val last = r
r = r.next
while (r != null && r.head.status != Transaction.Running) { r = r.next; last.next = r }
}
synchronized {
if (thisTrans.status == Transaction.Abortable) throw new AbortException
val w = currentWriter()
if (w != null)
if (thisTrans.id < w.id) { w.makeAbort(); rollBack(); writer = null }
else throw new AbortException
readers = if (readers == null) thisTrans else new Transaction(thisTrans, readers)
}
}
def setter(thisTrans: Transaction): unit = {
if (writer == thisTrans) return
synchronized {
val w = currentWriter()
if (w != null)
if (thisTrans.id < w.id) { w.makeAbort(); rollBack() }
else throw new AbortException
var r = readers
while (r != null && r.head.status != Transaction.Running) { r = r.next; readers = r }
while (r != null) {
if (r.id < thisTrans.id) throw new AbortException
else w.makeAbort()
val last = r
r = r.next
while (r != null && r.head.status != Transaction.Running) { r = r.next; last.next = r }
}
checkPoint()
}
}
}
|
what happened |
Exception in thread "main" java.lang.Error: assertion failed: Invalid index for: variable monitor0
at scala.Predef$.assert(Predef.scala:171)
at scala.tools.nsc.backend.jvm.GenJVM$BytecodeGenerator.indexOf(GenJVM.scala:919)
at scala.tools.nsc.backend.jvm.GenJVM$BytecodeGenerator$$anonfun$27.apply(GenJVM.scala:460)
at scala.tools.nsc.backend.jvm.GenJVM$BytecodeGenerator$$anonfun$27.apply(GenJVM.scala:429)
at scala.Iterator$class.foreach(Iterator.scala:285)
at scala.runtime.BoxedArray$$anon$0.foreach(BoxedArray.scala:32)
at scala.Iterable$class.foreach(Iterable.scala:91)
at scala.runtime.BoxedArray.foreach(BoxedArray.scala:14)
at scala.tools.nsc.backend.icode.BasicBlocks$BasicBlock.traverse(BasicBlocks.scala:70)
at scala.tools.nsc.backend.jvm.GenJVM$BytecodeGenerator.genBlock(GenJVM.scala:429)
at scala.tools.nsc.backend.jvm.GenJVM$BytecodeGenerator.genBlocks(GenJVM.scala:355)
at scala.tools.nsc.backend.jvm.GenJVM$BytecodeGenerator.genBlocks(GenJVM.scala:355)
at scala.tools.nsc.backend.jvm.GenJVM$BytecodeGenerator.genBlocks(GenJVM.scala:355)
at scala.tools.nsc.backend.jvm.GenJVM$BytecodeGenerator.genBlocks(GenJVM.scala:355)
at scala.tools.nsc.backend.jvm.GenJVM$BytecodeGenerator.genBlocks(GenJVM.scala:355)
at scala.tools.nsc.backend.jvm.GenJVM$BytecodeGenerator.genBlocks(GenJVM.scala:355)
at scala.tools.nsc.backend.jvm.GenJVM$BytecodeGenerator.genBlocks(GenJVM.scala:355)
at scala.tools.nsc.backend.jvm.GenJVM$BytecodeGenerator.genBlocks(GenJVM.scala:355)
at scala.tools.nsc.backend.jvm.GenJVM$BytecodeGenerator.genBlocks(GenJVM.scala:355)
at scala.tools.nsc.backend.jvm.GenJVM$BytecodeGenerator.genBlocks(GenJVM.scala:355)
at scala.tools.nsc.backend.jvm.GenJVM$BytecodeGenerator.genBlocks(GenJVM.scala:355)
at scala.tools.nsc.backend.jvm.GenJVM$BytecodeGenerator.genBlocks(GenJVM.scala:355)
at scala.tools.nsc.backend.jvm.GenJVM$BytecodeGenerator.genBlocks(GenJVM.scala:355)
at scala.tools.nsc.backend.jvm.GenJVM$BytecodeGenerator.genBlocks(GenJVM.scala:355)
at scala.tools.nsc.backend.jvm.GenJVM$BytecodeGenerator.genBlocks(GenJVM.scala:355)
at scala.tools.nsc.backend.jvm.GenJVM$BytecodeGenerator.genBlocks(GenJVM.scala:355)
at scala.tools.nsc.backend.jvm.GenJVM$BytecodeGenerator.genBlocks(GenJVM.scala:355)
at scala.tools.nsc.backend.jvm.GenJVM$BytecodeGenerator.genBlocks(GenJVM.scala:355)
at scala.tools.nsc.backend.jvm.GenJVM$BytecodeGenerator.genBlocks(GenJVM.scala:355)
at scala.tools.nsc.backend.jvm.GenJVM$BytecodeGenerator.genBlocks(GenJVM.scala:355)
at scala.tools.nsc.backend.jvm.GenJVM$BytecodeGenerator.genBlocks(GenJVM.scala:355)
at scala.tools.nsc.backend.jvm.GenJVM$BytecodeGenerator.genBlocks(GenJVM.scala:355)
at scala.tools.nsc.backend.jvm.GenJVM$BytecodeGenerator.genBlocks(GenJVM.scala:355)
at scala.tools.nsc.backend.jvm.GenJVM$BytecodeGenerator.genBlocks(GenJVM.scala:355)
at scala.tools.nsc.backend.jvm.GenJVM$BytecodeGenerator.genBlocks(GenJVM.scala:355)
at scala.tools.nsc.backend.jvm.GenJVM$BytecodeGenerator.genBlocks(GenJVM.scala:355)
at scala.tools.nsc.backend.jvm.GenJVM$BytecodeGenerator.genBlocks(GenJVM.scala:355)
at scala.tools.nsc.backend.jvm.GenJVM$BytecodeGenerator.genBlocks(GenJVM.scala:355)
at scala.tools.nsc.backend.jvm.GenJVM$BytecodeGenerator.genBlocks(GenJVM.scala:355)
at scala.tools.nsc.backend.jvm.GenJVM$BytecodeGenerator.genBlocks(GenJVM.scala:355)
at scala.tools.nsc.backend.jvm.GenJVM$BytecodeGenerator.genBlocks(GenJVM.scala:355)
at scala.tools.nsc.backend.jvm.GenJVM$BytecodeGenerator.genCode(GenJVM.scala:344)
at scala.tools.nsc.backend.jvm.GenJVM$BytecodeGenerator.genMethod(GenJVM.scala:247)
at scala.tools.nsc.backend.jvm.GenJVM$BytecodeGenerator$$anonfun$11.apply(GenJVM.scala:166)
at scala.tools.nsc.backend.jvm.GenJVM$BytecodeGenerator$$anonfun$11.apply(GenJVM.scala:166)
at scala.List.foreach(List.scala:681)
at scala.tools.nsc.backend.jvm.GenJVM$BytecodeGenerator.genClass(GenJVM.scala:166)
at scala.tools.nsc.backend.jvm.GenJVM$JvmPhase$$anonfun$0.apply(GenJVM.scala:41)
at scala.tools.nsc.backend.jvm.GenJVM$JvmPhase$$anonfun$0.apply(GenJVM.scala:41)
at scala.Iterator$class.foreach(Iterator.scala:285)
at scala.collection.Map$$anon$1.foreach(Map.scala:95)
at scala.tools.nsc.backend.jvm.GenJVM$JvmPhase.run(GenJVM.scala:41)
at scala.tools.nsc.Global$Run.compileSources(Global.scala:432)
at scala.tools.nsc.Global$Run.compile(Global.scala:490)
at scala.tools.nsc.Main$.process(Main.scala:60)
at scala.tools.nsc.Main$.main(Main.scala:80)
at scala.tools.nsc.Main.main(Main.scala)
/home/odersky/scala/src/examples/concurrent> nsc Transactional.scala
Exception in thread "main" java.lang.Error: assertion failed: Invalid index for: variable monitor0
at scala.Predef$.assert(Predef.scala:171)
at scala.tools.nsc.backend.jvm.GenJVM$BytecodeGenerator.indexOf(GenJVM.scala:919)
at scala.tools.nsc.backend.jvm.GenJVM$BytecodeGenerator$$anonfun$27.apply(GenJVM.scala:460)
at scala.tools.nsc.backend.jvm.GenJVM$BytecodeGenerator$$anonfun$27.apply(GenJVM.scala:429)
at scala.Iterator$class.foreach(Iterator.scala:285)
at scala.runtime.BoxedArray$$anon$0.foreach(BoxedArray.scala:32)
at scala.Iterable$class.foreach(Iterable.scala:91)
at scala.runtime.BoxedArray.foreach(BoxedArray.scala:14)
at scala.tools.nsc.backend.icode.BasicBlocks$BasicBlock.traverse(BasicBlocks.scala:70)
at scala.tools.nsc.backend.jvm.GenJVM$BytecodeGenerator.genBlock(GenJVM.scala:429)
at scala.tools.nsc.backend.jvm.GenJVM$BytecodeGenerator.genBlocks(GenJVM.scala:355)
at scala.tools.nsc.backend.jvm.GenJVM$BytecodeGenerator.genBlocks(GenJVM.scala:355)
at scala.tools.nsc.backend.jvm.GenJVM$BytecodeGenerator.genBlocks(GenJVM.scala:355)
at scala.tools.nsc.backend.jvm.GenJVM$BytecodeGenerator.genBlocks(GenJVM.scala:355)
at scala.tools.nsc.backend.jvm.GenJVM$BytecodeGenerator.genBlocks(GenJVM.scala:355)
at scala.tools.nsc.backend.jvm.GenJVM$BytecodeGenerator.genBlocks(GenJVM.scala:355)
at scala.tools.nsc.backend.jvm.GenJVM$BytecodeGenerator.genBlocks(GenJVM.scala:355)
at scala.tools.nsc.backend.jvm.GenJVM$BytecodeGenerator.genBlocks(GenJVM.scala:355)
at scala.tools.nsc.backend.jvm.GenJVM$BytecodeGenerator.genBlocks(GenJVM.scala:355)
at scala.tools.nsc.backend.jvm.GenJVM$BytecodeGenerator.genBlocks(GenJVM.scala:355)
at scala.tools.nsc.backend.jvm.GenJVM$BytecodeGenerator.genBlocks(GenJVM.scala:355)
at scala.tools.nsc.backend.jvm.GenJVM$BytecodeGenerator.genBlocks(GenJVM.scala:355)
at scala.tools.nsc.backend.jvm.GenJVM$BytecodeGenerator.genBlocks(GenJVM.scala:355)
at scala.tools.nsc.backend.jvm.GenJVM$BytecodeGenerator.genBlocks(GenJVM.scala:355)
at scala.tools.nsc.backend.jvm.GenJVM$BytecodeGenerator.genBlocks(GenJVM.scala:355)
at scala.tools.nsc.backend.jvm.GenJVM$BytecodeGenerator.genBlocks(GenJVM.scala:355)
at scala.tools.nsc.backend.jvm.GenJVM$BytecodeGenerator.genBlocks(GenJVM.scala:355)
at scala.tools.nsc.backend.jvm.GenJVM$BytecodeGenerator.genBlocks(GenJVM.scala:355)
at scala.tools.nsc.backend.jvm.GenJVM$BytecodeGenerator.genBlocks(GenJVM.scala:355)
at scala.tools.nsc.backend.jvm.GenJVM$BytecodeGenerator.genBlocks(GenJVM.scala:355)
at scala.tools.nsc.backend.jvm.GenJVM$BytecodeGenerator.genBlocks(GenJVM.scala:355)
at scala.tools.nsc.backend.jvm.GenJVM$BytecodeGenerator.genBlocks(GenJVM.scala:355)
at scala.tools.nsc.backend.jvm.GenJVM$BytecodeGenerator.genBlocks(GenJVM.scala:355)
at scala.tools.nsc.backend.jvm.GenJVM$BytecodeGenerator.genBlocks(GenJVM.scala:355)
at scala.tools.nsc.backend.jvm.GenJVM$BytecodeGenerator.genBlocks(GenJVM.scala:355)
at scala.tools.nsc.backend.jvm.GenJVM$BytecodeGenerator.genBlocks(GenJVM.scala:355)
at scala.tools.nsc.backend.jvm.GenJVM$BytecodeGenerator.genBlocks(GenJVM.scala:355)
at scala.tools.nsc.backend.jvm.GenJVM$BytecodeGenerator.genBlocks(GenJVM.scala:355)
at scala.tools.nsc.backend.jvm.GenJVM$BytecodeGenerator.genBlocks(GenJVM.scala:355)
at scala.tools.nsc.backend.jvm.GenJVM$BytecodeGenerator.genBlocks(GenJVM.scala:355)
at scala.tools.nsc.backend.jvm.GenJVM$BytecodeGenerator.genBlocks(GenJVM.scala:355)
at scala.tools.nsc.backend.jvm.GenJVM$BytecodeGenerator.genCode(GenJVM.scala:344)
at scala.tools.nsc.backend.jvm.GenJVM$BytecodeGenerator.genMethod(GenJVM.scala:247)
at scala.tools.nsc.backend.jvm.GenJVM$BytecodeGenerator$$anonfun$11.apply(GenJVM.scala:166)
at scala.tools.nsc.backend.jvm.GenJVM$BytecodeGenerator$$anonfun$11.apply(GenJVM.scala:166)
at scala.List.foreach(List.scala:681)
at scala.tools.nsc.backend.jvm.GenJVM$BytecodeGenerator.genClass(GenJVM.scala:166)
at scala.tools.nsc.backend.jvm.GenJVM$JvmPhase$$anonfun$0.apply(GenJVM.scala:41)
at scala.tools.nsc.backend.jvm.GenJVM$JvmPhase$$anonfun$0.apply(GenJVM.scala:41)
at scala.Iterator$class.foreach(Iterator.scala:285)
at scala.collection.Map$$anon$1.foreach(Map.scala:95)
at scala.tools.nsc.backend.jvm.GenJVM$JvmPhase.run(GenJVM.scala:41)
at scala.tools.nsc.Global$Run.compileSources(Global.scala:432)
at scala.tools.nsc.Global$Run.compile(Global.scala:490)
at scala.tools.nsc.Main$.process(Main.scala:60)
at scala.tools.nsc.Main$.main(Main.scala:80)
at scala.tools.nsc.Main.main(Main.scala)
|
what expected |
Successful compilation. The source code is checked in under
scala/test/pending/pos/Transactions.scala
|
[back to overview] |