package Ġorg . un bro k end ome . gradle . plugins . helm . util Ċ Ċ import Ġjava . io . File Ċ import Ġjava . io . Random Access File Ċ import Ġjava . util . concurrent . Concurrent HashMap Ċ import Ġjava . util . concurrent . locks . Re entrant Lock Ċ import Ġkotlin . concurrent . with Lock ĊĊ Ċ private Ġval Ġlock sBy Lock File Ġ= ĠConcurrent HashMap < File , ĠRe entrant Lock >() ĊĊ Ċ internal Ġfun Ġ< T > Ġwith Lock File ( file : ĠFile , Ġblock : Ġ() Ġ-> ĠT ): ĠT Ġ{ ĊĠĠĠ Ġ// ĠFile Ġlocks Ġwon 't Ġwork Ġwithin Ġthe Ġsame ĠJVM , Ġwe Ġhave Ġto Ġsynchronize Ġaccess Ġto Ġthe Ġlock file ĊĠĠĠ Ġ// Ġwith Ġa ĠRe entrant Lock ĊĠĠĠ Ġreturn Ġlock sBy Lock File . compute If Absent ( file ) Ġ{ ĠRe entrant Lock () Ġ} ĊĠĠĠĠĠĠĠ Ġ. with Lock Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfile . parent File . mkdir s () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠRandom Access File ( file , Ġ" rw "). channel . use Ġ{ Ġchannel Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchannel . lock (). use Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġblock () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ċ } Ċ