package Ġdev . in mo . micro _ utils . repos Ċ Ċ import Ġandroid . database . sqlite . SQLite Database Ċ import Ġdev . in mo . micro _ utils . coroutines . saf ely Ċ import Ġkotlinx . coroutines .* Ċ import Ġkotlinx . coroutines . sync . Mutex Ċ import Ġkotlinx . coroutines . sync . with Lock Ċ import Ġjava . util . concurrent . Executors Ċ import Ġkotlin . coroutines . Coroutine Context Ċ import Ġkotlin . coroutines . coroutine Context Ċ Ċ private Ġobject ĠContext s Pool Ġ{ ĊĠĠĠ Ġprivate Ġval Ġcontexts Ġ= Ġmutable ListOf < Coroutine Context >() ĊĠĠĠ Ġprivate Ġval Ġmutex Ġ= ĠMutex ( locked Ġ= Ġfalse ) ĊĠĠĠ Ġprivate Ġval Ġfree Contexts Ġ= Ġmutable ListOf < Coroutine Context >() ĊĊĠĠĠ Ġsuspend Ġfun Ġacquire Context (): ĠCor outine Context Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġmutex . with Lock Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfree Contexts . remove First OrNull () Ġ?: ĠExec utors . new Single Thread Executor (). as Coroutine Dispatcher (). also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontexts . add ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġsuspend Ġfun Ġfree Context ( context : ĠCor outine Context ) Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġmutex . with Lock Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( context Ġin Ġcontexts Ġ&& Ġcontext Ġ! in Ġfree Contexts ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfree Contexts . add ( context ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġsuspend Ġfun Ġ< T > Ġuse ( block : Ġsuspend Ġ( Coroutine Context ) Ġ-> ĠT ): ĠT Ġ= Ġacquire Context (). let Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsafely Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġblock ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfree Context ( it ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ class ĠTransaction Context ( ĊĠĠĠ Ġval Ġdatabase Context : ĠCor outine Context Ċ ): ĠCor outine Context . Element Ġ{ ĊĠĠĠ Ġoverride Ġval Ġkey : ĠCor outine Context . Key < Transaction Context > Ġ= ĠTransaction Context ĊĊĠĠĠ Ġcompanion Ġobject Ġ: ĠCor outine Context . Key < Transaction Context > Ċ } Ċ Ċ suspend Ġfun Ġ< T > ĠSQLite Database . transaction ( block : Ġsuspend ĠSQLite Database . () Ġ-> ĠT ): ĠT Ġ{ ĊĠĠĠ Ġcoroutine Context [ Transaction Context ] Ġ? . let Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġwith Context ( it . database Context ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġblock () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn ĠContext s Pool . use Ġ{ Ġcontext Ġ-> ĊĠĠĠĠĠĠĠ Ġwith Context ( Transaction Context ( context ) Ġ+ Ġcontext ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbegin Transaction () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsafely ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġend Transaction () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow Ġit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġblock (). also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Transaction Successful () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġend Transaction () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ inline Ġfun Ġ< T > ĠSQLite Database . inline Transaction ( cross inline Ġblock : ĠSQLite Database . () Ġ-> ĠT ): ĠT Ġ{ ĊĠĠĠ Ġreturn Ġwhen Ġ{ ĊĠĠĠĠĠĠĠ Ġin Transaction () Ġ-> Ġblock () ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbegin Transaction () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġblock (). also Ġ{ Ġset Transaction Successful () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġend Transaction () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun Ġ< T > ĠSQLite Database . blocking Transaction ( block : ĠSQLite Database . () Ġ-> ĠT ): ĠT Ġ= Ġinline Transaction ( block ) Ċ