/* Ċ Ġ* ĠCopyright Ġ 2 0 1 0 - 2 0 1 5 Ġ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 Ġorg . jetbrains . kotlin . gradle . plugin Ċ Ċ import Ġorg . gradle . Build Adapter Ċ import Ġorg . gradle . api . logging . Logging Ċ import Ġorg . gradle . Build Result Ċ import Ġjava . lang . ref . Reference Ċ Ċ class ĠFinish Build Listener ( var Ġplugin ClassLoader : ĠParent Last URL ClassLoader ?) Ġ: ĠBuild Adapter () Ġ{ ĊĠĠĠ Ġval Ġlog Ġ= ĠLogging . getLogger ( this . java Class ) ĊĊĠĠĠ Ġoverride Ġfun Ġbuild Finished ( result : ĠBuild Result ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġlog . debug (" Build Ġfinished Ġlistener ") ĊĊĠĠĠĠĠĠĠ Ġstop Zip File Cache () ĊĠĠĠĠĠĠĠ Ġstop Low Memory Watcher () ĊĊĉ ĉ // ĠTODO : ĠTry Ġto Ġclean Ġup Ġthread Ġlocals Ġwithout Ġthis Ġugly Ġhack Ċĉ ĉ // ĠTODO : ĠFurther Ġinvestigation Ġof ĠP erm Gen Ġleak Ġ( KT - 6 4 5 1 ) ĊĠĠĠĠĠĠĠ Ġremove Thread Local s () ĊĊĠĠĠĠĠĠĠ Ġplugin ClassLoader Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġresult ?. get Gradle ()?. remove Listener ( this ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġpublic Ġfun Ġremove Thread Local s () Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog . debug (" Remove ĠChild URL ClassLoader Ġthread Ġlocals ") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġthread Ġ= ĠThread . currentThread () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġthread Local s Field Ġ= Ġjava Class < Thread >(). getDeclared Field (" thread Local s ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthread Local s Field . setAccessible ( true ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġthread Local Map Class Ġ= ĠClass . forName (" java . lang . Thread Local \$ Thread Local Map ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtable Field Ġ= Ġthread Local Map Class . getDeclared Field (" table ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtable Field . setAccessible ( true ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrefer ent Field Ġ= Ġjava Class < Reference < Any >> (). getDeclared Field (" refer ent ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrefer ent Field . setAccessible ( true ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtable Ġ= Ġtable Field [ thread Local s Field [ thread ]] Ġas ĠArray < *> ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( entry Ġin Ġtable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( entry Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġthread Local Ġ= Ġrefer ent Field [ entry ] Ġas ĠThread Local < *> ? ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġclass Loader Ġ= Ġthread Local ?. java Class ?. getClassLoader () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( class Loader Ġis ĠParent Last URL ClassLoader . Child URL ClassLoader ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthread Local ?. remove () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog . debug (" Removing ĠChild URL ClassLoader Ġthread Ġlocals Ġfinished Ġsuccessfully ") ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog . debug (" Exception Ġduring Ġthread Ġlocals Ġremove : Ġ" Ġ+ Ġe ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġstop Zip File Cache () Ġ{ ĊĠĠĠĠĠĠĠ Ġcall Void Static Method (" com . intellij . openapi . util . io . Zip File Cache ", Ġ" shutdown ") ĊĠĠĠĠĠĠĠ Ġlog . debug (" Zip File Cache Ġfinished Ġsuccessfully ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġstop Low Memory Watcher () Ġ{ ĊĠĠĠĠĠĠĠ Ġcall Void Static Method (" com . intellij . openapi . util . Low Memory Watcher ", Ġ" shutdown ") ĊĠĠĠĠĠĠĠ Ġlog . debug (" Low Memory Watcher Ġfinished Ġsuccessfully ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcall Void Static Method ( class Fq Name : ĠString , ĠmethodName : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġshort Name Ġ= Ġclass Fq Name . substring ( class Fq Name . lastIndexOf ('.') Ġ+ Ġ 1 ) ĊĊĠĠĠĠĠĠĠ Ġlog . debug (" Looking Ġfor Ġ$ short Name Ġclass ") ĊĠĠĠĠĠĠĠ Ġval Ġlow Memory Watcher Class Ġ= ĠClass . forName ( class Fq Name , Ġfalse , Ġplugin ClassLoader ) ĊĊĠĠĠĠĠĠĠ Ġlog . debug (" Looking Ġfor Ġ$ methodName () Ġmethod ") ĊĠĠĠĠĠĠĠ Ġval Ġshutdown Method Ġ= Ġlow Memory Watcher Class . getMethod ( methodName ) ĊĊĠĠĠĠĠĠĠ Ġlog . debug (" Call Ġ$ short Name .$ methodName () ") ĊĠĠĠĠĠĠĠ Ġshutdown Method . invoke ( null ) ĊĠĠĠ Ġ} Ċ } Ċ