blob: dbfc7a2c940fcceb3d3b72b061bab64e582c5946 (
plain) (
blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
|
class CTxnLocal[ T ] {
def set( x: T )( implicit t: Txn ) {}
def get( implicit t: Txn ) : T = null.asInstanceOf[ T ]
def initialValue( t: Txn ) : T = null.asInstanceOf[ T ]
}
trait Txn
trait ProcTxn {
def ccstm: Txn
}
trait TxnLocal[ @specialized T ] {
def apply()( implicit tx: ProcTxn ) : T
def set( v: T )( implicit tx: ProcTxn ) : Unit
def swap( v: T )( implicit tx: ProcTxn ) : T
def transform( f: T => T )( implicit tx: ProcTxn ) : Unit
}
object TxnLocal {
def apply[ @specialized T ] : TxnLocal[ T ] = new Impl( new CTxnLocal[ T ])
def apply[ @specialized T ]( initValue: => T ) : TxnLocal[ T ] = new Impl( new CTxnLocal[ T ] {
override def initialValue( tx: Txn ): T = initValue
})
private class Impl[ T ]( c: CTxnLocal[ T ]) extends TxnLocal[ T ] {
def apply()( implicit tx: ProcTxn ) : T = c.get( tx.ccstm )
def set( v: T )( implicit tx: ProcTxn ) : Unit = c.set( v )( tx.ccstm )
def swap( v: T )( implicit tx: ProcTxn ) : T = {
// currently not implemented in CTxnLocal
val oldV = apply
set( v )
oldV
}
def transform( f: T => T )( implicit tx: ProcTxn ) {
set( f( apply ))
}
}
}
object Transition {
private val currentRef = TxnLocal[ Transition ]( Instant )
def current( implicit tx: ProcTxn ) : Transition = currentRef()
}
sealed abstract class Transition
case object Instant extends Transition
|