From bd2c06dd4cfb7f2aeaca2ace2dd2723a72ca4bcb Mon Sep 17 00:00:00 2001 From: Jesse Wilson Date: Sun, 26 Jan 2020 18:29:18 -0500 Subject: [PATCH] Use different thread names if OkHttp is shaded Closes: https://github.com/square/okhttp/issues/5632 --- okhttp/src/main/java/okhttp3/Dispatcher.kt | 3 ++- okhttp/src/main/java/okhttp3/RealCall.kt | 3 ++- okhttp/src/main/java/okhttp3/internal/Util.kt | 10 ++++++++++ .../main/java/okhttp3/internal/cache/DiskLruCache.kt | 3 ++- .../main/java/okhttp3/internal/concurrent/TaskQueue.kt | 3 ++- .../java/okhttp3/internal/concurrent/TaskRunner.kt | 3 ++- .../okhttp3/internal/connection/RealConnectionPool.kt | 3 ++- .../java/okhttp3/internal/http2/Http2Connection.kt | 3 ++- .../src/main/java/okhttp3/internal/ws/RealWebSocket.kt | 3 ++- 9 files changed, 26 insertions(+), 8 deletions(-) diff --git a/okhttp/src/main/java/okhttp3/Dispatcher.kt b/okhttp/src/main/java/okhttp3/Dispatcher.kt index 77b1e13e8..0b4b4c967 100644 --- a/okhttp/src/main/java/okhttp3/Dispatcher.kt +++ b/okhttp/src/main/java/okhttp3/Dispatcher.kt @@ -24,6 +24,7 @@ import java.util.concurrent.ThreadPoolExecutor import java.util.concurrent.TimeUnit import okhttp3.RealCall.AsyncCall import okhttp3.internal.assertThreadDoesntHoldLock +import okhttp3.internal.okHttpName import okhttp3.internal.threadFactory /** @@ -91,7 +92,7 @@ class Dispatcher constructor() { get() { if (executorServiceOrNull == null) { executorServiceOrNull = ThreadPoolExecutor(0, Int.MAX_VALUE, 60, TimeUnit.SECONDS, - SynchronousQueue(), threadFactory("OkHttp Dispatcher", false)) + SynchronousQueue(), threadFactory("$okHttpName Dispatcher", false)) } return executorServiceOrNull!! } diff --git a/okhttp/src/main/java/okhttp3/RealCall.kt b/okhttp/src/main/java/okhttp3/RealCall.kt index 05b1fa072..6529b9ff2 100644 --- a/okhttp/src/main/java/okhttp3/RealCall.kt +++ b/okhttp/src/main/java/okhttp3/RealCall.kt @@ -29,6 +29,7 @@ import okhttp3.internal.http.BridgeInterceptor import okhttp3.internal.http.CallServerInterceptor import okhttp3.internal.http.RealInterceptorChain import okhttp3.internal.http.RetryAndFollowUpInterceptor +import okhttp3.internal.okHttpName import okhttp3.internal.platform.Platform import okhttp3.internal.platform.Platform.Companion.INFO import okhttp3.internal.threadName @@ -131,7 +132,7 @@ internal class RealCall private constructor( } override fun run() { - threadName("OkHttp ${redactedUrl()}") { + threadName("$okHttpName ${redactedUrl()}") { var signalledCallback = false transmitter.timeoutEnter() try { diff --git a/okhttp/src/main/java/okhttp3/internal/Util.kt b/okhttp/src/main/java/okhttp3/internal/Util.kt index 5b4260f16..9c9ce0a9a 100644 --- a/okhttp/src/main/java/okhttp3/internal/Util.kt +++ b/okhttp/src/main/java/okhttp3/internal/Util.kt @@ -532,6 +532,16 @@ internal fun MutableList.addIfAbsent(element: E) { @JvmField internal val assertionsEnabled = OkHttpClient::class.java.desiredAssertionStatus() +/** + * Returns the string "OkHttp" unless the library has been shaded for inclusion in another library, + * or obfuscated with tools like R8 or ProGuard. In such cases it'll return a longer string like + * "com.example.shaded.okhttp3.OkHttp". In large applications it's possible to have multiple OkHttp + * instances; this makes it clear which is which. + */ +@JvmField +internal val okHttpName = + OkHttpClient::class.java.name.removePrefix("okhttp3.").removeSuffix("Client") + @Suppress("NOTHING_TO_INLINE") internal inline fun Any.assertThreadHoldsLock() { if (assertionsEnabled && !Thread.holdsLock(this)) { diff --git a/okhttp/src/main/java/okhttp3/internal/cache/DiskLruCache.kt b/okhttp/src/main/java/okhttp3/internal/cache/DiskLruCache.kt index aabba10bd..1a9bade8e 100644 --- a/okhttp/src/main/java/okhttp3/internal/cache/DiskLruCache.kt +++ b/okhttp/src/main/java/okhttp3/internal/cache/DiskLruCache.kt @@ -30,6 +30,7 @@ import okhttp3.internal.closeQuietly import okhttp3.internal.concurrent.Task import okhttp3.internal.concurrent.TaskRunner import okhttp3.internal.io.FileSystem +import okhttp3.internal.okHttpName import okhttp3.internal.platform.Platform import okhttp3.internal.platform.Platform.Companion.WARN import okio.BufferedSink @@ -169,7 +170,7 @@ class DiskLruCache internal constructor( private var nextSequenceNumber: Long = 0 private val cleanupQueue = taskRunner.newQueue() - private val cleanupTask = object : Task("OkHttp Cache") { + private val cleanupTask = object : Task("$okHttpName Cache") { override fun runOnce(): Long { synchronized(this@DiskLruCache) { if (!initialized || closed) { diff --git a/okhttp/src/main/java/okhttp3/internal/concurrent/TaskQueue.kt b/okhttp/src/main/java/okhttp3/internal/concurrent/TaskQueue.kt index 3521cfd6f..b394adad8 100644 --- a/okhttp/src/main/java/okhttp3/internal/concurrent/TaskQueue.kt +++ b/okhttp/src/main/java/okhttp3/internal/concurrent/TaskQueue.kt @@ -18,6 +18,7 @@ package okhttp3.internal.concurrent import java.util.concurrent.CountDownLatch import java.util.concurrent.RejectedExecutionException import okhttp3.internal.assertThreadDoesntHoldLock +import okhttp3.internal.okHttpName /** * A set of tasks that are executed in sequential order. @@ -129,7 +130,7 @@ class TaskQueue internal constructor( } } - private class AwaitIdleTask : Task("OkHttp awaitIdle", cancelable = false) { + private class AwaitIdleTask : Task("$okHttpName awaitIdle", cancelable = false) { val latch = CountDownLatch(1) override fun runOnce(): Long { diff --git a/okhttp/src/main/java/okhttp3/internal/concurrent/TaskRunner.kt b/okhttp/src/main/java/okhttp3/internal/concurrent/TaskRunner.kt index be3473efc..7f4e32eff 100644 --- a/okhttp/src/main/java/okhttp3/internal/concurrent/TaskRunner.kt +++ b/okhttp/src/main/java/okhttp3/internal/concurrent/TaskRunner.kt @@ -25,6 +25,7 @@ import okhttp3.internal.assertThreadDoesntHoldLock import okhttp3.internal.assertThreadHoldsLock import okhttp3.internal.concurrent.TaskRunner.Companion.INSTANCE import okhttp3.internal.notify +import okhttp3.internal.okHttpName import okhttp3.internal.threadFactory /** @@ -305,7 +306,7 @@ class TaskRunner( companion object { @JvmField - val INSTANCE = TaskRunner(RealBackend(threadFactory("OkHttp TaskRunner", daemon = true))) + val INSTANCE = TaskRunner(RealBackend(threadFactory("$okHttpName TaskRunner", daemon = true))) val logger: Logger = Logger.getLogger(TaskRunner::class.java.name) } diff --git a/okhttp/src/main/java/okhttp3/internal/connection/RealConnectionPool.kt b/okhttp/src/main/java/okhttp3/internal/connection/RealConnectionPool.kt index 97da36c88..dc1a44d4c 100644 --- a/okhttp/src/main/java/okhttp3/internal/connection/RealConnectionPool.kt +++ b/okhttp/src/main/java/okhttp3/internal/connection/RealConnectionPool.kt @@ -29,6 +29,7 @@ import okhttp3.internal.concurrent.Task import okhttp3.internal.concurrent.TaskQueue import okhttp3.internal.concurrent.TaskRunner import okhttp3.internal.connection.Transmitter.TransmitterReference +import okhttp3.internal.okHttpName import okhttp3.internal.platform.Platform class RealConnectionPool( @@ -41,7 +42,7 @@ class RealConnectionPool( private val keepAliveDurationNs: Long = timeUnit.toNanos(keepAliveDuration) private val cleanupQueue: TaskQueue = taskRunner.newQueue() - private val cleanupTask = object : Task("OkHttp ConnectionPool") { + private val cleanupTask = object : Task("$okHttpName ConnectionPool") { override fun runOnce() = cleanup(System.nanoTime()) } diff --git a/okhttp/src/main/java/okhttp3/internal/http2/Http2Connection.kt b/okhttp/src/main/java/okhttp3/internal/http2/Http2Connection.kt index 0327eb401..523f168fb 100644 --- a/okhttp/src/main/java/okhttp3/internal/http2/Http2Connection.kt +++ b/okhttp/src/main/java/okhttp3/internal/http2/Http2Connection.kt @@ -29,6 +29,7 @@ import okhttp3.internal.http2.ErrorCode.REFUSED_STREAM import okhttp3.internal.http2.Settings.Companion.DEFAULT_INITIAL_WINDOW_SIZE import okhttp3.internal.ignoreIoExceptions import okhttp3.internal.notifyAll +import okhttp3.internal.okHttpName import okhttp3.internal.peerName import okhttp3.internal.platform.Platform import okhttp3.internal.platform.Platform.Companion.INFO @@ -574,7 +575,7 @@ class Http2Connection internal constructor(builder: Builder) : Closeable { ) = apply { this.socket = socket this.connectionName = when { - client -> "OkHttp $peerName" + client -> "$okHttpName $peerName" else -> "MockWebServer $peerName" } this.source = source diff --git a/okhttp/src/main/java/okhttp3/internal/ws/RealWebSocket.kt b/okhttp/src/main/java/okhttp3/internal/ws/RealWebSocket.kt index a245ce142..78e8addd2 100644 --- a/okhttp/src/main/java/okhttp3/internal/ws/RealWebSocket.kt +++ b/okhttp/src/main/java/okhttp3/internal/ws/RealWebSocket.kt @@ -38,6 +38,7 @@ import okhttp3.internal.closeQuietly import okhttp3.internal.concurrent.Task import okhttp3.internal.concurrent.TaskRunner import okhttp3.internal.connection.Exchange +import okhttp3.internal.okHttpName import okhttp3.internal.ws.WebSocketProtocol.CLOSE_CLIENT_GOING_AWAY import okhttp3.internal.ws.WebSocketProtocol.CLOSE_MESSAGE_MAX import okhttp3.internal.ws.WebSocketProtocol.OPCODE_BINARY @@ -164,7 +165,7 @@ class RealWebSocket( // Process all web socket messages. try { - val name = "OkHttp WebSocket ${request.url.redact()}" + val name = "$okHttpName WebSocket ${request.url.redact()}" initReaderAndWriter(name, streams) listener.onOpen(this@RealWebSocket, response) loopReader()