import Ġkotlinx . coroutines . Global Scope Ċ import Ġkotlinx . coroutines . channels . Channel Ċ import Ġkotlinx . coroutines . launch Ċ import Ġjava . util . concurrent . atomic . Atomic Integer Ċ Ċ class ĠCor outines Latch ( ĊĠĠĠ Ġprivate Ġval Ġcount : ĠInt Ċ ) Ġ{ ĊĠĠĠ Ġprivate Ġval Ġjoined Count Ġ= ĠAtomicInteger ( 0 ) ĊĠĠĠ Ġprivate Ġval Ġjoining Notifications Ġ= ĠChannel < Unit >() ĊĠĠĠ Ġprivate Ġval Ġpermission To Continue Ġ= ĠChannel < Unit >() ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġrequire ( count Ġ> Ġ 0 ) Ġ{ Ġ" Count Ġmust Ġbe Ġgreater Ġthan Ġ 0 " Ġ} ĊĠĠĠĠĠĠĠ ĠGlobal Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwait Until All Join () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġallow All Continue () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġwait Until All Join () Ġ{ ĊĠĠĠĠĠĠĠ Ġfor ( join ing Notification Ġin Ġjoining Notifications ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( joined Count . increment AndGet () Ġ>= Ġcount ) Ġbreak ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġjoining Notifications . close () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġallow All Continue () Ġ{ ĊĠĠĠĠĠĠĠ Ġrepeat ( count ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpermission To Continue . send ( Unit ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġpermission To Continue . close () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġsuspend Ġfun Ġjoin And Wait Other () Ġ{ ĊĠĠĠĠĠĠĠ Ġnotify About Join () ĊĠĠĠĠĠĠĠ Ġwait Permission () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġnotify About Join () Ġ{ ĊĠĠĠĠĠĠĠ Ġjoining Notifications . send ( Unit ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġwait Permission () Ġ{ ĊĠĠĠĠĠĠĠ Ġpermission To Continue . receive () ĊĠĠĠ Ġ} Ċ }