Scala STM コードリーディングメモ
Ref を作る
object Ref の factory は、impl.STMImpl.instance
impl.STMImpl.instance は、scala.concurrent.stm.ccstm.CCSTM を impl.STMImpl にキャストしたもの
Ref.apply で 1:Int とか渡すと newPrimitiveRef > factory.newRef が呼ばれる
factory は、impl.RefFactory だけど CCSTMRefs.Factory が実体。CCSTM が CCSTMRefs.Factory を extends している
最終的に new IntRef(1) の結果が返る
atomic の呼び出し
atomic > scala.concurrent.stm.TxnExecutor.defaultAtomic > impl.STMImpl.instance > scala.concurrent.stm.ccstm.CCSTM という所までは、Ref と同じ
CCSTM は、CCSTMExecutor を extends している。これの def apply[Z](block: InTxn => Z)(implicit mt: MaybeTxn): Z が呼ばれる
InTxnImpl.apply の中で implicit で渡した mt が InTxnImpl だったら mt をそのまま、そーではなければ、get
一番外側の atomic なら get を、内側なら mt をそのまま返す
get は、ちょっと追えなかったので後で。
6 months ago