package Ġcn . t urs om . core . pool Ċ Ċ import Ġcn . t urs om . core . buffer . ByteBuffer Ċ import Ġcn . t urs om . core . buffer . impl . Heap ByteBuffer Ċ import Ġcn . t urs om . core . buffer . impl . P ooled ByteBuffer Ċ import Ġcn . t urs om . core . data struct . Array Bit Set Ċ Ċ abstract Ġclass ĠThread Unsafe Abstract Memory Pool ( ĊĠ Ġval ĠblockSize : ĠInt , ĊĠ Ġval Ġblock Count : ĠInt , ĊĠ Ġval Ġempty Pool Buffer : Ġ( block Size : ĠInt ) Ġ-> ĠByteBuffer Ġ= Ġ:: Heap ByteBuffer , ĊĠ Ġprivate Ġval Ġmemory Pool : ĠByteBuffer , ĊĠ Ġoverride Ġvar Ġauto Collection : ĠBoolean Ġ= Ġfalse , Ċ ) Ġ: ĠMemory Pool Ġ{ ĊĠ Ġprivate Ġval Ġbit Map Ġ= ĠArray Bit Set ( block Count . to Long ()) ĊĠ Ġval Ġallocated : ĠInt Ġget () Ġ= Ġbit Map . true Count . toInt () ĊĊĠ Ġprivate Ġfun Ġunsafe Allocate (): ĠInt Ġ{ ĊĠĠĠ Ġval Ġindex Ġ= Ġbit Map . first Down () ĊĠĠĠ Ġreturn Ġif Ġ( index Ġin Ġ 0 Ġuntil Ġblock Count ) Ġ{ ĊĠĠĠĠĠ Ġbit Map . up ( index ) ĊĠĠĠĠĠ Ġindex . toInt () ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠ Ġ- 1 ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġunsafe Free ( token : ĠInt ) Ġ{ ĊĠĠĠ Ġbit Map . down ( token . to Long ()) ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġunsafe Get Memory ( token : ĠInt ): ĠByteBuffer Ġ{ ĊĠĠĠ Ġreturn ĠP ooled ByteBuffer ( memory Pool . slice ( token Ġ* ĠblockSize , ĠblockSize ), Ġthis , Ġtoken , Ġauto Collection ) ĊĠ Ġ} ĊĊĠ Ġ/** ĊĠĠ Ġ* Ġ@ return Ġtoken ĊĠĠ Ġ*/ ĊĠ Ġprivate Ġfun Ġallocate (): ĠInt Ġ= Ġunsafe Allocate () ĊĊĠ Ġoverride Ġfun Ġfree ( memory : ĠByteBuffer ) Ġ{ ĊĠĠĠ Ġif Ġ( memory Ġis ĠP ooled ByteBuffer Ġ&& Ġmemory . pool Ġ== Ġthis ) Ġ{ ĊĠĠĠĠĠ Ġval Ġtoken Ġ= Ġmemory . token ĊĠĠĠĠĠ Ġif Ġ( token Ġin Ġ 0 Ġuntil Ġblock Count ) Ġunsafe Free ( token ) ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġget Memory OrNull (): ĠByteBuffer ? Ġ{ ĊĠĠĠ Ġval Ġtoken Ġ= Ġallocate () ĊĠĠĠ Ġreturn Ġif Ġ( token Ġin Ġ 0 Ġuntil Ġblock Count ) Ġ{ ĊĠĠĠĠĠ Ġunsafe Get Memory ( token ) ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠ Ġnull ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġget Memory (): ĠByteBuffer Ġ= Ġget Memory OrNull () Ġ?: Ġempty Pool Buffer ( block Size ) ĊĊĠ Ġoverride Ġfun Ġget ( block Count : ĠInt ): ĠArray < ByteBuffer > Ġ= Ġsynchronized ( this ) Ġ{ ĊĠĠĠ ĠArray ( block Count ) Ġ{ ĊĠĠĠĠĠ Ġval Ġtoken Ġ= Ġunsafe Allocate () ĊĠĠĠĠĠ Ġif Ġ( token Ġin Ġ 0 Ġuntil Ġblock Count ) Ġ{ ĊĠĠĠĠĠĠĠ Ġunsafe Get Memory ( token ) ĊĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠ Ġempty Pool Buffer ( block Size ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} Ċ }