import Ġkotlinx . atomic fu .* Ċ Ċ /** Ċ Ġ* ĠAtomic Ġblock . Ċ Ġ*/ Ċ fun Ġ< T > Ġatomic ( block : ĠTx Scope . () Ġ-> ĠT ): ĠT Ġ{ ĊĠĠĠ Ġwhile Ġ( true ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtransaction Ġ= ĠTransaction () ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġblock ( transaction ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( transaction . commit ()) Ġreturn Ġresult ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtransaction . abort () ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠAbort Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtransaction . abort () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠTransaction al Ġoperations Ġare Ġperformed Ġin Ġthis Ġscope . Ċ Ġ*/ Ċ abstract Ġclass ĠTx Scope Ġ{ ĊĠĠĠ Ġabstract Ġfun Ġ< T > ĠTx Var < T >. read (): ĠT ĊĠĠĠ Ġabstract Ġfun Ġ< T > ĠTx Var < T >. write ( x : ĠT ): ĠT Ċ } Ċ Ċ /** Ċ Ġ* ĠTransaction al Ġvariable . Ċ Ġ*/ Ċ @ Suppress (" UN CHECK ED _ CAST ") Ċ class ĠTx Var < T >( initial : ĠT ) Ġ{ ĊĠĠĠ Ġprivate Ġval Ġloc Ġ= Ġatomic ( Loc ( initial , Ġinitial , Ġroot Tx )) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠOpen s Ġthis Ġtransaction al Ġvariable Ġin Ġthe Ġspecified Ġtransaction Ġ[ tx ] Ġand Ġapplies ĊĠĠĠĠ Ġ* Ġupdating Ġfunction Ġ[ update ] Ġto Ġit . ĠReturns Ġthe Ġupdated Ġvalue . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġopen In ( tx : ĠTransaction , Ġupdate : Ġ( T ) Ġ-> ĠT ): ĠT Ġ{ ĊĠĠĠĠĠĠĠ Ġwhile Ġ( true ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcur Loc Ġ= Ġloc . value ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcur Value Ġ= Ġcur Loc . value In ( tx ) Ġ{ Ġit . abort () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( cur Value Ġ== ĠTx Status . ACTIVE ) Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġup d Value Ġ= Ġupdate ( cur Value Ġas ĠT ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġup d Loc Ġ= ĠLoc ( cur Value , Ġup d Value , Ġtx ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( loc . compare AndSet ( cur Loc , Ġup d Loc )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( tx . status Ġ== ĠTx Status . ABORT ED ) Ġthrow ĠAbort Exception ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġup d Value ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠState Ġof Ġtransaction al Ġvalue Ċ Ġ*/ Ċ private Ġclass ĠLoc < T >( ĊĠĠĠĠĠĠĠ Ġval ĠoldValue : ĠT , ĊĠĠĠĠĠĠĠ Ġval ĠnewValue : ĠT , ĊĠĠĠĠĠĠĠ Ġval Ġowner : ĠTransaction Ċ ) Ġ{ ĊĠĠĠ Ġfun Ġvalue In ( tx : ĠTransaction , Ġon Active : Ġ( Transaction ) Ġ-> ĠUnit ): ĠAny ? Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( owner Ġ=== Ġtx ) ĠnewValue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( owner . status ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTx Status . ABORT ED Ġ-> ĠoldValue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTx Status . COMMIT TED Ġ-> ĠnewValue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTx Status . ACTIVE Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Active ( owner ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTx Status . ACTIVE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ċ } Ċ Ċ private Ġval Ġroot Tx Ġ= ĠTransaction (). apply Ġ{ Ġcommit () Ġ} Ċ Ċ /** Ċ Ġ* ĠTransaction Ġstatus . Ċ Ġ*/ Ċ enum Ġclass ĠTx Status Ġ{ ĠACT IVE , ĠCOMMIT TED , ĠAB ORT ED Ġ} Ċ Ċ /** Ċ Ġ* ĠTransaction Ġimplementation . Ċ Ġ*/ Ċ class ĠTransaction Ġ: ĠTx Scope () Ġ{ ĊĠĠĠ Ġprivate Ġval Ġ_ status Ġ= Ġatomic ( Tx Status . ACTIVE ) ĊĠĠĠ Ġval Ġstatus : ĠTx Status Ġget () Ġ= Ġ_ status . value ĊĊĠĠĠ Ġfun Ġcommit (): ĠBoolean Ġ= Ġ_ status . compare AndSet ( Tx Status . ACTIVE , ĠTx Status . COMMIT TED ) ĊĊĠĠĠ Ġfun Ġabort () Ġ{ ĊĠĠĠĠĠĠĠ Ġ_ status . compare AndSet ( Tx Status . ACTIVE , ĠTx Status . ABORT ED ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġ< T > ĠTx Var < T >. read (): ĠT Ġ= Ġopen In ( this @ Transaction ) Ġ{ Ġit Ġ} ĊĠĠĠ Ġoverride Ġfun Ġ< T > ĠTx Var < T >. write ( x : ĠT ) Ġ= Ġopen In ( this @ Transaction ) Ġ{ Ġx Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠThis Ġexception Ġis Ġthrown Ġwhen Ġtransaction Ġis Ġaborted . Ċ Ġ*/ Ċ private Ġobject ĠAbort Exception Ġ: ĠException () Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġfill In StackTrace (): ĠThrowable Ġ= Ġthis Ċ }