package ĠS ok . Selector Ċ Ċ import ĠS ok . Exceptions . Peer Closed Exception Ċ import ĠS ok . Exceptions . handle Exception Ċ import Ġkotlinx . atomic fu . atomic Ċ import Ġkotlinx . coroutines .* Ċ import Ġjava . lang . IllegalArgumentException Ċ import Ġjava . nio . channels . Cancelled Key Exception Ċ import Ġjava . nio . channels . Selectable Channel Ċ import Ġjava . nio . channels . Selection Key Ċ import Ġkotlin . Exception Ċ Ċ /** Ċ Ġ* ĠA ĠS usp ention Map Ġwill Ġbe Ġused Ġby Ġthe Ġsockets Ġto Ġsimply Ġand Ġefficiently Ġuse Ġthe ĠSelector Ġclass . Ċ Ġ* Ċ Ġ* ĠThe Ġmap ĠCAN ĠONLY ĠADD Ġinterest s , Ġthe Ġselector Ġwill Ġtake Ġcare Ġof Ġthe Ġun - register Ġoperations Ġ( using Ċ Ġ* Ġthe Ġunsafe Unregister Ġmethod ). ĠEvery Ġfield Ġis Ġvolatile Ġ( or Ġimmutable ) Ġbecause Ġthe Ġobject Ġbo unce Ġfrom Ċ Ġ* Ġthread Ġto Ġthread Ġ( socket / selector ). Ċ Ġ* Ċ Ġ* ĠIn Ġorder Ġto Ġreduc Ġthe Ġnumber Ġof Ġregist rations , Ġthe ĠS usp ention Map Ġallow Ġthe Ġregistering Ġof Ġinterest Ċ Ġ* Ġfor Ġan Ġundefined Ġnumber Ġof Ġtime , Ġthose Ġregist rations Ġare Ġrepresented Ġwith Ġthe Ġ` Select Always ` Ġclass . Ċ Ġ* ĠThis Ġkind Ġof Ġregistration Ġallow Ġthe Ġdeveloper Ġto Ġregister Ġa Ġlambda Ġto Ġbe Ġexecuted Ġby Ġthe Ġ` Selector ` Ġwhen Ċ Ġ* Ġan Ġevent Ġcomes , Ġthe Ġlambda Ġwill Ġreturn Ġwhether Ġthe Ġinterest Ġshould Ġbe Ġun registered . Ċ Ġ* Ċ Ġ* Ġ@ property Ġselector Ġ` Selector ` Ġmanaging Ġthis Ġsus p ention Ġmap Ċ Ġ* Ġ@ property Ġchannel ĠN IO Ġchannel Ġregistered Ċ Ġ*/ Ċ internal Ġclass ĠS usp ention Map ( ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġselector Ġ: ĠSelector , ĊĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġchannel Ġ: ĠSelect able Channel , ĊĊĠĠĠĠĠĠĠ Ġinternal Ġval Ġexception Handler : ĠCor outine ExceptionHandler Ċ ){ ĊĠĠĠ Ġprivate Ġval Ġis Closed Ġ= Ġatomic ( false ) ĊĊĠĠĠ Ġval Ġinterest Ġ= Ġatomic ( 0 ) ĊĊĠĠĠ Ġ@ Volatile ĊĠĠĠ Ġvar ĠOP _ WRITE Ġ: ĠC ancellable Continuation < Boolean >? Ġ= Ġnull ĊĠĠĠ Ġ@ Volatile ĊĠĠĠ Ġvar Ġalways Select Write Ġ: ĠSelect Always ? Ġ= Ġnull ĊĊĠĠĠ Ġ@ Volatile ĊĠĠĠ Ġvar ĠOP _ READ Ġ: ĠC ancellable Continuation < Boolean >? Ġ= Ġnull ĊĠĠĠ Ġ@ Volatile ĊĠĠĠ Ġvar Ġalways Select Read Ġ: ĠSelect Always ? Ġ= Ġnull ĊĊĠĠĠ Ġ@ Volatile ĊĠĠĠ Ġvar ĠOP _ ACCEPT Ġ: ĠC ancellable Continuation < Boolean >? Ġ= Ġnull ĊĠĠĠ Ġ@ Volatile ĊĠĠĠ Ġvar Ġalways Select Accept Ġ: ĠSelect Always ? Ġ= Ġnull ĊĊĠĠĠ Ġ@ Volatile ĊĠĠĠ Ġvar ĠOP _ CONNECT Ġ: ĠC ancellable Continuation < Boolean >? Ġ= Ġnull ĊĠĠĠ Ġ@ Volatile ĊĠĠĠ Ġvar Ġalways Select Connect Ġ: ĠSelect Always ? Ġ= Ġnull ĊĊĠĠĠ Ġval Ġselection Key Ġ= Ġthis . selector . register ( this @ Sus p ention Map . channel , 0 , this @ Sus p ention Map ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRegister Ġan Ġinterest Ġfor Ġone Ġselection ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġsuspend Ġfun Ġselect Once ( interest : ĠInt ){ ĊĠĠĠĠĠĠĠ Ġrequire ( this . interest . value . and ( interest ) Ġ!= Ġinterest ) ĊĊĠĠĠĠĠĠĠ Ġthis . interest . plus Assign ( interest ) ĊĊĠĠĠĠĠĠĠ Ġthis . suspend ( interest ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRegister Ġan Ġinterest Ġfor Ġan Ġundefined Ġnumber Ġof Ġselection ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġsuspend Ġfun Ġselect Always ( interest : ĠInt , Ġoperation Ġ: Ġ() Ġ-> ĠBoolean ){ ĊĠĠĠĠĠĠĠ Ġrequire ( this . interest . value . and ( interest ) Ġ!= Ġinterest ) ĊĊĠĠĠĠĠĠĠ Ġthis . interest . plus Assign ( interest ) ĊĊĠĠĠĠĠĠĠ Ġval Ġrequest Ġ= ĠSelect Always ( operation ) ĊĊĠĠĠĠĠĠĠ Ġwhen ( interest ){ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSelection Key . OP _ READ Ġ-> Ġthis . always Select Read Ġ= Ġrequest ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSelection Key . OP _ WRITE Ġ-> Ġthis . always Select Write Ġ= Ġrequest ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSelection Key . OP _ ACCEPT Ġ-> Ġthis . always Select Accept Ġ= Ġrequest ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSelection Key . OP _ CONNECT Ġ-> Ġthis . always Select Connect Ġ= Ġrequest ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠIllegalArgumentException (" The Ġinterest Ġis Ġnot Ġvalid ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġthis . suspend ( interest ) ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠWait Ġfor Ġthe Ġselector Ġto Ġselect Ġour Ġchannel ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġsuspend ( interest : ĠInt ){ ĊĊĠĠĠĠĠĠĠ Ġ// track Ġif Ġan Ġexception Ġwas Ġthrown Ġduring Ġthe Ġregistration Ġcoroutine ĊĠĠĠĠĠĠĠ Ġvar Ġexc Ġ: ĠThrowable ? Ġ= Ġnull ĊĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuspend C ancellable Coroutine < Boolean > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen ( interest ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSelection Key . OP _ READ Ġ-> Ġthis @ Sus p ention Map . OP _ READ Ġ= Ġit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSelection Key . OP _ WRITE Ġ-> Ġthis @ Sus p ention Map . OP _ WRITE Ġ= Ġit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSelection Key . OP _ ACCEPT Ġ-> Ġthis @ Sus p ention Map . OP _ ACCEPT Ġ= Ġit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSelection Key . OP _ CONNECT Ġ-> Ġthis @ Sus p ention Map . OP _ CONNECT Ġ= Ġit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠIllegalArgumentException (" The Ġinterest Ġis Ġnot Ġvalid ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . selector . update Interest ( this . selection Key , Ġthis . interest . value ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} catch Ġ( e Ġ: ĠException ){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexc Ġ= Ġe ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis @ Sus p ention Map . exception Handler . handle Exception ( e ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// if Ġan Ġexception Ġwas Ġthrown , Ġbring Ġit Ġback Ġto Ġthe Ġcaller ĊĠĠĠĠĠĠĠ Ġif ( exc Ġ!= Ġnull ){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow Ġexc !! ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠMethod Ġused ĠONLY Ġby Ġthe ĠSelector Ġclass Ġto Ġunregister Ġinterest s Ġbefore Ġres uming Ġthe Ġcoroutine ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġunsafe Unregister ( interest Ġ: ĠInt ){ ĊĠĠĠĠĠĠĠ Ġthis . interest . minus Assign ( interest ) ĊĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . selection Key . interest Ops ( this . interest . value ) ĊĠĠĠĠĠĠĠ Ġ} catch Ġ( e Ġ: ĠCancel led Key Exception ){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// if Ġthe Ġsocket Ġclosed Ġin Ġthe Ġmeantime ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġwhen ( interest ){ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSelection Key . OP _ READ Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . always Select Read Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . OP _ READ Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSelection Key . OP _ WRITE Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . always Select Write Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . OP _ WRITE Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSelection Key . OP _ ACCEPT Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . always Select Accept Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . OP _ ACCEPT Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSelection Key . OP _ CONNECT Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . always Select Connect Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . OP _ CONNECT Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠIllegalArgumentException (" The Ġinterest Ġis Ġnot Ġvalid ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġclose Ġthe Ġsus p ention Ġmap , Ġthus Ġcancell ing Ġany Ġregistered Ġsocket . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġexception Ġexception Ġgiven Ġto Ġthe Ġcontinu ations Ġwhen Ġcancell ing ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġclose ( exception Ġ: ĠThrowable Ġ= ĠPeer Closed Exception ()){ ĊĠĠĠĠĠĠĠ Ġif ( this . is Closed . compare AndSet ( false , true )){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . selection Key . cancel () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . OP _ ACCEPT ?. cancel ( exception ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . OP _ READ ?. cancel ( exception ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . OP _ WRITE ?. cancel ( exception ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . OP _ CONNECT ?. cancel ( exception ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// as Ġthey Ġrun Ġon Ġthe Ġselector Ġscope , Ġwake up Ġthe Ġselector Ġto Ġlet Ġthe Ġcontinuation Ġcancel Ġand Ġnotify Ġthe Ġselection Ġkey Ġchange ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . selector . wake up () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }