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 は、ちょっと追えなかったので後で。