package io.grpc.internal; import io.grpc.ManagedChannel; import java.lang.ref.Reference; import java.lang.ref.ReferenceQueue; import java.lang.ref.SoftReference; import java.lang.ref.WeakReference; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; import java.util.concurrent.atomic.AtomicBoolean; import java.util.logging.Level; import java.util.logging.LogRecord; import java.util.logging.Logger; /* JADX INFO: Access modifiers changed from: package-private */ /* loaded from: classes6.dex */ public final class ManagedChannelOrphanWrapper extends ForwardingManagedChannel { private final ManagedChannelReference phantom; private static final ReferenceQueue refqueue = new ReferenceQueue<>(); private static final ConcurrentMap refs = new ConcurrentHashMap(); private static final Logger logger = Logger.getLogger(ManagedChannelOrphanWrapper.class.getName()); /* JADX INFO: Access modifiers changed from: package-private */ public ManagedChannelOrphanWrapper(ManagedChannel managedChannel) { this(managedChannel, refqueue, refs); } ManagedChannelOrphanWrapper(ManagedChannel managedChannel, ReferenceQueue referenceQueue, ConcurrentMap concurrentMap) { super(managedChannel); this.phantom = new ManagedChannelReference(this, managedChannel, referenceQueue, concurrentMap); } @Override // io.grpc.internal.ForwardingManagedChannel, io.grpc.ManagedChannel public final ManagedChannel shutdown() { this.phantom.clearSafely(); return super.shutdown(); } @Override // io.grpc.internal.ForwardingManagedChannel, io.grpc.ManagedChannel public final ManagedChannel shutdownNow() { this.phantom.clearSafely(); return super.shutdownNow(); } /* loaded from: classes6.dex */ static final class ManagedChannelReference extends WeakReference { private static final String ALLOCATION_SITE_PROPERTY_NAME = "io.grpc.ManagedChannel.enableAllocationTracking"; private static final boolean ENABLE_ALLOCATION_TRACKING = Boolean.parseBoolean(System.getProperty(ALLOCATION_SITE_PROPERTY_NAME, "true")); private static final RuntimeException missingCallSite = missingCallSite(); private final Reference allocationSite; private final String channelStr; private final ReferenceQueue refqueue; private final ConcurrentMap refs; private final AtomicBoolean shutdown; ManagedChannelReference(ManagedChannelOrphanWrapper managedChannelOrphanWrapper, ManagedChannel managedChannel, ReferenceQueue referenceQueue, ConcurrentMap concurrentMap) { super(managedChannelOrphanWrapper, referenceQueue); this.shutdown = new AtomicBoolean(); this.allocationSite = new SoftReference(ENABLE_ALLOCATION_TRACKING ? new RuntimeException("ManagedChannel allocation site") : missingCallSite); this.channelStr = managedChannel.toString(); this.refqueue = referenceQueue; this.refs = concurrentMap; concurrentMap.put(this, this); cleanQueue(referenceQueue); } @Override // java.lang.ref.Reference public final void clear() { clearInternal(); cleanQueue(this.refqueue); } /* JADX INFO: Access modifiers changed from: private */ public void clearSafely() { if (this.shutdown.getAndSet(true)) { return; } clear(); } private void clearInternal() { super.clear(); this.refs.remove(this); this.allocationSite.clear(); } private static RuntimeException missingCallSite() { RuntimeException runtimeException = new RuntimeException("ManagedChannel allocation site not recorded. Set -Dio.grpc.ManagedChannel.enableAllocationTracking=true to enable it"); runtimeException.setStackTrace(new StackTraceElement[0]); return runtimeException; } static int cleanQueue(ReferenceQueue referenceQueue) { int i = 0; while (true) { ManagedChannelReference managedChannelReference = (ManagedChannelReference) referenceQueue.poll(); if (managedChannelReference == null) { return i; } RuntimeException runtimeException = managedChannelReference.allocationSite.get(); managedChannelReference.clearInternal(); if (!managedChannelReference.shutdown.get()) { i++; Level level = Level.SEVERE; if (ManagedChannelOrphanWrapper.logger.isLoggable(level)) { StringBuilder sb = new StringBuilder("*~*~*~ Channel {0} was not shutdown properly!!! ~*~*~*"); sb.append(System.getProperty("line.separator")); sb.append(" Make sure to call shutdown()/shutdownNow() and wait until awaitTermination() returns true."); LogRecord logRecord = new LogRecord(level, sb.toString()); logRecord.setLoggerName(ManagedChannelOrphanWrapper.logger.getName()); logRecord.setParameters(new Object[]{managedChannelReference.channelStr}); logRecord.setThrown(runtimeException); ManagedChannelOrphanWrapper.logger.log(logRecord); } } } } } }