/* Ċ Ġ* ĠThis ĠSource ĠCode ĠForm Ġis Ġsubject Ġto Ġthe Ġterms Ġof Ġthe ĠMozilla ĠPublic Ċ Ġ* ĠLicense , Ġv . Ġ 2 . 0 . ĠIf Ġa Ġcopy Ġof Ġthe ĠM PL Ġwas Ġnot Ġdistributed Ġwith Ġthis Ċ Ġ* Ġfile , ĠYou Ġcan Ġobtain Ġone Ġat Ġhttps :// mozilla . org / MPL / 2 . 0 /. Ċ Ġ*/ Ċ Ċ package Ġcom . kot l ind is cord . k ord . extensions . types Ċ Ċ import Ġkotlinx . coroutines . sync . Mutex Ċ Ċ /** ĠInterface Ġrepresenting Ġsomething Ġwith Ġa Ġ[ Mutex ] Ġthat Ġcan Ġbe Ġlocked . Ġ**/ Ċ public Ġinterface ĠLock able Ġ{ ĊĠĠĠ Ġ/** ĠMutex Ġobject Ġto Ġuse Ġfor Ġlocking . Ġ**/ ĊĠĠĠ Ġpublic Ġvar Ġmutex : ĠMutex ? ĊĊĠĠĠ Ġ/** ĠSet Ġthis Ġto Ġ` true ` Ġto Ġlock Ġexecution Ġwith Ġa Ġ[ Mutex ]. Ġ**/ ĊĠĠĠ Ġpublic Ġvar Ġlocking : ĠBoolean ĊĊĠĠĠ Ġ/** ĠLock Ġthe Ġmutex Ġ( if Ġlocking Ġis Ġenabled ), Ġcall Ġthe Ġsupplied Ġcallable , Ġand Ġunlock . Ġ**/ ĊĠĠĠ Ġpublic Ġsuspend Ġfun Ġ< T > Ġwith Lock ( body : Ġsuspend Ġ() Ġ-> ĠT ) Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlock () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġbody () ĊĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġunlock () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠLock Ġthe Ġmutex , Ġif Ġlocking Ġis Ġenabled Ġ- Ġsus pending Ġuntil Ġit 's Ġun locked . Ġ**/ ĊĠĠĠ Ġpublic Ġsuspend Ġfun Ġlock () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( lock ing ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmutex ?. lock () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠUn lock Ġthe Ġmutex , Ġif Ġit 's Ġlocked . Ġ**/ ĊĠĠĠ Ġpublic Ġfun Ġunlock () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( lock ing ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmutex ?. unlock () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ