From da2c9302628886bbdb4cf588f8275c4a44ff5ac9 Mon Sep 17 00:00:00 2001 From: Aleksei Efimov Date: Wed, 10 May 2023 09:39:00 +0000 Subject: [PATCH] 8302845: Replace finalizer usage in JNDI DNS provider with Cleaner Reviewed-by: alanb, dfuchs, djelinski --- src/java.base/share/classes/module-info.java | 3 ++- .../classes/com/sun/jndi/dns/DnsClient.java | 25 +++++++++++-------- .../classes/com/sun/jndi/dns/DnsContext.java | 7 +----- 3 files changed, 18 insertions(+), 17 deletions(-) diff --git a/src/java.base/share/classes/module-info.java b/src/java.base/share/classes/module-info.java index 64d621b602c..51e9f981d9f 100644 --- a/src/java.base/share/classes/module-info.java +++ b/src/java.base/share/classes/module-info.java @@ -246,7 +246,8 @@ module java.base { jdk.jfr; exports jdk.internal.ref to java.desktop, - java.net.http; + java.net.http, + jdk.naming.dns; exports jdk.internal.reflect to java.logging, java.sql, diff --git a/src/jdk.naming.dns/share/classes/com/sun/jndi/dns/DnsClient.java b/src/jdk.naming.dns/share/classes/com/sun/jndi/dns/DnsClient.java index 15e38a58a65..0d5ca39c6f7 100644 --- a/src/jdk.naming.dns/share/classes/com/sun/jndi/dns/DnsClient.java +++ b/src/jdk.naming.dns/share/classes/com/sun/jndi/dns/DnsClient.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000, 2022, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2000, 2023, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -27,6 +27,7 @@ package com.sun.jndi.dns; import java.io.IOException; import java.io.UncheckedIOException; +import java.lang.ref.Cleaner; import java.net.InetAddress; import java.net.InetSocketAddress; import java.net.PortUnreachableException; @@ -51,6 +52,7 @@ import java.util.Map; import java.util.HashMap; import java.util.concurrent.locks.ReentrantLock; +import jdk.internal.ref.CleanerFactory; import sun.security.jca.JCAUtil; // Some of this code began life as part of sun.javaos.net.DnsClient @@ -103,6 +105,7 @@ public class DnsClient { private final ReentrantLock udpChannelLock = new ReentrantLock(); private final Selector udpChannelSelector; + private final Cleaner.Cleanable selectorCleanup; private static final DNSDatagramChannelFactory factory = new DNSDatagramChannelFactory(random); @@ -158,6 +161,16 @@ public class DnsClient { ne.setRootCause(e); throw ne; } + // register a cleaning action to close the Selector + // when this DNS client becomes phantom reachable + Selector sel = udpChannelSelector; + selectorCleanup = CleanerFactory.cleaner().register(this, () -> { + try { + sel.close(); + } catch (IOException ignore) { + } + }); + reqs = Collections.synchronizedMap( new HashMap()); resps = Collections.synchronizedMap(new HashMap()); @@ -173,19 +186,11 @@ public class DnsClient { } } - @SuppressWarnings("removal") - protected void finalize() { - close(); - } - // A lock to access the request and response queues in tandem. private Object queuesLock = new Object(); public void close() { - try { - udpChannelSelector.close(); - } catch (IOException ioException) { - } + selectorCleanup.clean(); synchronized (queuesLock) { reqs.clear(); resps.clear(); diff --git a/src/jdk.naming.dns/share/classes/com/sun/jndi/dns/DnsContext.java b/src/jdk.naming.dns/share/classes/com/sun/jndi/dns/DnsContext.java index c4f00236edc..028108494af 100644 --- a/src/jdk.naming.dns/share/classes/com/sun/jndi/dns/DnsContext.java +++ b/src/jdk.naming.dns/share/classes/com/sun/jndi/dns/DnsContext.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2000, 2023, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -1050,11 +1050,6 @@ final class BindingEnumeration extends BaseNameClassPairEnumeration super(ctx, nodes); } - // Finalizer not needed since it's safe to leave ctx unclosed. -// protected void finalize() { -// close(); -// } - @Override public Binding next() throws NamingException { if (!hasMore()) {