/* Ċ Ġ* ĠCopyright Ġ 2 0 1 6 - 2 0 1 7 ĠJetBrains Ġs . r . o . Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ Ċ package Ġkotlinx . coroutines . experimental . select s Ċ Ċ import Ġkotlinx . coroutines . experimental .* Ċ import Ġkotlinx . coroutines . experimental . sync . Mutex Ċ import Ġorg . junit . Assert . assertTrue Ċ import Ġorg . junit . Test Ċ Ċ class ĠSelect Ph ilo sop h ers St ress Test Ġ: ĠTest Base () Ġ{ ĊĠĠĠ Ġval ĠTEST _ DURATION Ġ= Ġ 3 0 0 0 L Ġ* Ġstress Test Multiplier ĊĊĠĠĠ Ġval Ġn Ġ= Ġ 1 0 Ġ// Ġnumber Ġof Ġph ilo sop h ers ĊĠĠĠ Ġval Ġfor ks Ġ= ĠArray < Mutex >( n ) Ġ{ ĠMutex () Ġ} ĊĊĠĠĠ Ġsuspend Ġfun Ġeat ( id : ĠInt , Ġdesc : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġleft Ġ= Ġfor ks [ id ] ĊĠĠĠĠĠĠĠ Ġval Ġright Ġ= Ġfor ks [( id Ġ+ Ġ 1 ) Ġ% Ġn ] ĊĠĠĠĠĠĠĠ Ġwhile Ġ( true ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpair Ġ= Ġselect Un bi ased < Pair < Mutex , ĠMutex >> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġleft . on Lock ( desc ) Ġ{ Ġleft Ġto Ġright Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġright . on Lock ( desc ) Ġ{ Ġright Ġto Ġleft Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( pair . second . try Lock ( desc )) Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpair . first . unlock ( desc ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpair . second . lock ( desc ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( pair . first . try Lock ( desc )) Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpair . second . unlock ( desc ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠassertTrue ( left . is Locked Ġ&& Ġright . is Locked ) ĊĠĠĠĠĠĠĠ Ġ// Ġom , Ġnom , Ġnom Ġ--> Ġe ating !!! ĊĠĠĠĠĠĠĠ Ġright . unlock ( desc ) ĊĠĠĠĠĠĠĠ Ġleft . unlock ( desc ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Ph ilo sop h ers () Ġ= Ġrun Blocking < Unit > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtime Limit Ġ= ĠSystem . currentTimeMillis () Ġ+ ĠTEST _ DURATION ĊĠĠĠĠĠĠĠ Ġval Ġph ilo sop h ers Ġ= ĠList < Deferred < Int >>( n ) Ġ{ Ġid Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġasync ( Common Pool ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdesc Ġ= Ġ" Ph ilo sop her Ġ$ id " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġe ats Count Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( System . currentTimeMillis () Ġ< Ġtime Limit ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġeat ( id , Ġdesc ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġe ats Count ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġyield () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" Ph ilo sop her Ġ$ id Ġdone , Ġe ats Ġ$ e ats Count Ġtimes ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġe ats Count ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġdebug Job Ġ= Ġlaunch ( coroutine Context ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdelay ( 3 Ġ* ĠTEST _ DURATION ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" Test Ġis Ġfailing . ĠLock Ġstates Ġare :") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor ks . with Index (). forEach Ġ{ Ġ( id , Ġmutex ) Ġ-> Ġprintln ("$ id : Ġ$ mutex ") Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġe ats Ġ= Ġwith Timeout ( 5 Ġ* ĠTEST _ DURATION ) Ġ{ Ġph ilo sop h ers . map Ġ{ Ġit . await () Ġ} Ġ} ĊĠĠĠĠĠĠĠ Ġdebug Job . cancel () ĊĠĠĠĠĠĠĠ Ġe ats . with Index (). forEach Ġ{ Ġ( id , Ġe ats ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertTrue ("$ id Ġshall Ġnot Ġstar ve ", Ġe ats Ġ> Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }