@@ -15,20 +15,30 @@ internal fun closeWhenPhantomReachable(observed: Any, closeable: AutoCloseable)
15
15
check(observed != = closeable) {
16
16
" `observed` cannot be the same object as `closeable` because it would never become phantom reachable"
17
17
}
18
- closeWhenPhantomReachable?. let { it (observed, closeable::close) }
18
+ closeWhenPhantomReachable(observed, closeable::close)
19
19
}
20
20
21
- private val closeWhenPhantomReachable: ((Any , AutoCloseable ) -> Unit )? by lazy {
21
+ /* *
22
+ * Calls [close] when [observed] becomes only phantom reachable.
23
+ *
24
+ * This is a wrapper around a Java 9+ [java.lang.ref.Cleaner], or a no-op in older Java versions.
25
+ */
26
+ @JvmSynthetic
27
+ internal fun closeWhenPhantomReachable (observed : Any , close : () -> Unit ) {
28
+ closeWhenPhantomReachable?.let { it(observed, close) }
29
+ }
30
+
31
+ private val closeWhenPhantomReachable: ((Any , () -> Unit ) -> Unit )? by lazy {
22
32
try {
23
33
val cleanerClass = Class .forName(" java.lang.ref.Cleaner" )
24
34
val cleanerCreate = cleanerClass.getMethod(" create" )
25
35
val cleanerRegister =
26
36
cleanerClass.getMethod(" register" , Any ::class .java, Runnable ::class .java)
27
37
val cleanerObject = cleanerCreate.invoke(null );
28
38
29
- { observed, closeable ->
39
+ { observed, close ->
30
40
try {
31
- cleanerRegister.invoke(cleanerObject, observed, Runnable { closeable. close() })
41
+ cleanerRegister.invoke(cleanerObject, observed, Runnable { close() })
32
42
} catch (e: ReflectiveOperationException ) {
33
43
if (e is InvocationTargetException ) {
34
44
when (val cause = e.cause) {
0 commit comments