/** Ċ Ġ* ĠCopyright Ġ 2 0 1 0 Ġ- Ġ 2 0 2 2 Ġ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 Ċ Ġ* Ċ Ġ* Ġhttps :// 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 Ġjet brains . ex od us . log Ċ Ċ import Ġjet brains . ex od us . Array Byte Iterable Ċ import Ġjet brains . ex od us . core . data Structures .* Ċ import Ġjet brains . ex od us . core . data Structures . Long Object Cache Base . Companion . DEFAULT _ SIZE Ċ import Ġkotlin . math . min Ċ Ċ internal Ġclass ĠSepar ate Log Cache Ġ: ĠLog Cache Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġpages Cache : ĠLong Object Cache Base < ByteArray > ĊĊĠĠĠ Ġconstructor ( memory Usage : ĠLong , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠpageSize : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnon Blocking : ĠBoolean , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġuse Soft References : ĠBoolean , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcache Generation Count : ĠInt ) Ġ: Ġsuper ( memory Usage , ĠpageSize ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġpages Count Ġ= Ġ( memory Usage Ġ/ Ġ( pageSize Ġ+ Ġ Ġ/* Ġeach Ġpage Ġconsume s Ġaddition ally Ġsome Ġbytes Ġin Ġthe Ġcache Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( use Soft References ) Ġ 1 4 4 Ġelse Ġ 8 0 )). toInt () ĊĠĠĠĠĠĠĠ Ġpages Cache Ġ= Ġif Ġ( non Blocking ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( use Soft References ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSoft Concurrent Long Object Cache ( pages Count , Ġcache Generation Count ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠConcurrent Long Object Cache ( pages Count , Ġcache Generation Count ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( use Soft References ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSoft Long Object Cache ( pages Count ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLong Object Cache ( pages Count ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġconstructor ( memory Usage Percentage : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠpageSize : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnon Blocking : ĠBoolean , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġuse Soft References : ĠBoolean , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcache Generation Count : ĠInt ) Ġ: Ġsuper ( memory Usage Percentage , ĠpageSize ) Ġ{ ĊĠĠĠĠĠĠĠ Ġpages Cache Ġ= Ġif Ġ( memory Usage Ġ== ĠLong . MAX _ VALUE ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( non Blocking ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( use Soft References ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSoft Concurrent Long Object Cache ( DEFAULT _ SIZE , Ġcache Generation Count ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠConcurrent Long Object Cache ( DEFAULT _ SIZE , Ġcache Generation Count ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( use Soft References ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSoft Long Object Cache ( DEFAULT _ SIZE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLong Object Cache () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpages Count Ġ= Ġ( memory Usage Ġ/ Ġ( pageSize Ġ+ Ġ Ġ/* Ġeach Ġpage Ġconsume s Ġaddition ally Ġnearly Ġ 8 0 Ġbytes Ġin Ġthe Ġcache Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( use Soft References ) Ġ 1 4 4 Ġelse Ġ 8 0 )). toInt () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( non Blocking ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( use Soft References ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSoft Concurrent Long Object Cache ( pages Count , Ġcache Generation Count ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠConcurrent Long Object Cache ( pages Count , Ġcache Generation Count ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( use Soft References ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSoft Long Object Cache ( pages Count ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLong Object Cache ( pages Count ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġclear () Ġ= Ġpages Cache . clear () ĊĊĠĠĠ Ġoverride Ġfun Ġhit Rate () Ġ= Ġpages Cache . hit Rate () ĊĊĠĠĠ Ġoverride Ġfun Ġcache Page ( log : ĠLog , Ġpage Address : ĠLong , Ġpage : ĠByteArray ) Ġ= Ġcache Page ( page Address , Ġpage ) ĊĊĠĠĠ Ġoverride Ġfun Ġget Page Iterable ( log : ĠLog , Ġpage Address : ĠLong ): ĠArray Byte Iterable Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġpage Ġ= Ġpages Cache . try Key Locked ( page Address ) ĊĠĠĠĠĠĠĠ Ġif Ġ( page Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠArray Byte Iterable ( page ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġpage Ġ= Ġlog . get High Page ( page Address ) ĊĠĠĠĠĠĠĠ Ġif Ġ( page Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠArray Byte Iterable ( page , Ġmin ( log . high Address Ġ- Ġpage Address , ĠpageSize . to Long ()). toInt ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġpage Ġ= Ġread Full Page ( log , Ġpage Address ) ĊĠĠĠĠĠĠĠ Ġcache Page ( page Address , Ġpage ) ĊĠĠĠĠĠĠĠ Ġreturn ĠArray Byte Iterable ( page ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Page ( log : ĠLog , Ġpage Address : ĠLong ): ĠByteArray Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġpage Ġ= Ġpages Cache . try Key Locked ( page Address ) ĊĠĠĠĠĠĠĠ Ġif Ġ( page Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġpage ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġpage Ġ= Ġlog . get High Page ( page Address ) ĊĠĠĠĠĠĠĠ Ġif Ġ( page Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġpage ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġpage Ġ= Ġread Full Page ( log , Ġpage Address ) ĊĠĠĠĠĠĠĠ Ġcache Page ( page Address , Ġpage ) ĊĠĠĠĠĠĠĠ Ġreturn Ġpage ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Cached Page ( log : ĠLog , Ġpage Address : ĠLong ): ĠByteArray ? Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġpage Ġ= Ġpages Cache . getObject Locked ( page Address ) ĊĠĠĠĠĠĠĠ Ġif Ġ( page Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġpage ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġpage Ġ= Ġlog . get High Page ( page Address ) ĊĠĠĠĠĠĠĠ Ġreturn Ġpage ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġremove Page ( log : ĠLog , Ġpage Address : ĠLong ) Ġ{ ĊĠĠĠĠĠĠĠ Ġpages Cache . remove Locked ( page Address ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcache Page ( cacheKey : ĠLong , Ġpage Array : ĠByteArray ) Ġ{ ĊĠĠĠĠĠĠĠ Ġpages Cache . cache Object Locked ( cacheKey , Ġpost Process Tail Page ( page Array )) ĊĠĠĠ Ġ} Ċ } Ċ