OLD | NEW |
1 // Copyright 2012 The Chromium Authors. All rights reserved. | 1 // Copyright 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 package org.chromium.base; | 5 package org.chromium.base; |
6 | 6 |
7 import android.os.Handler; | 7 import android.os.Handler; |
8 import android.os.Looper; | 8 import android.os.Looper; |
9 import android.os.Process; | 9 import android.os.Process; |
10 | 10 |
11 import org.chromium.base.annotations.CalledByNative; | 11 import org.chromium.base.annotations.CalledByNative; |
12 | 12 |
13 import java.util.concurrent.Callable; | 13 import java.util.concurrent.Callable; |
14 import java.util.concurrent.ExecutionException; | 14 import java.util.concurrent.ExecutionException; |
15 import java.util.concurrent.FutureTask; | 15 import java.util.concurrent.FutureTask; |
16 | 16 |
17 /** | 17 /** |
18 * Helper methods to deal with threading related tasks. | 18 * Helper methods to deal with threading related tasks. |
19 */ | 19 */ |
20 public class ThreadUtils { | 20 public class ThreadUtils { |
21 | 21 |
22 private static final Object sLock = new Object(); | 22 private static final Object sLock = new Object(); |
23 | 23 |
24 private static boolean sWillOverride; | 24 private static boolean sWillOverride; |
25 | 25 |
26 private static Handler sUiThreadHandler; | 26 private static Handler sUiThreadHandler; |
27 | 27 |
| 28 private static boolean sThreadAssertsDisabled; |
| 29 |
28 public static void setWillOverrideUiThread() { | 30 public static void setWillOverrideUiThread() { |
29 synchronized (sLock) { | 31 synchronized (sLock) { |
30 sWillOverride = true; | 32 sWillOverride = true; |
31 } | 33 } |
32 } | 34 } |
33 | 35 |
34 @VisibleForTesting | 36 @VisibleForTesting |
35 public static void setUiThread(Looper looper) { | 37 public static void setUiThread(Looper looper) { |
36 synchronized (sLock) { | 38 synchronized (sLock) { |
37 if (looper == null) { | 39 if (looper == null) { |
(...skipping 147 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
185 * @param task The Runnable to run | 187 * @param task The Runnable to run |
186 * @param delayMillis The delay in milliseconds until the Runnable will be r
un | 188 * @param delayMillis The delay in milliseconds until the Runnable will be r
un |
187 */ | 189 */ |
188 @VisibleForTesting | 190 @VisibleForTesting |
189 public static void postOnUiThreadDelayed(Runnable task, long delayMillis) { | 191 public static void postOnUiThreadDelayed(Runnable task, long delayMillis) { |
190 getUiThreadHandler().postDelayed(task, delayMillis); | 192 getUiThreadHandler().postDelayed(task, delayMillis); |
191 } | 193 } |
192 | 194 |
193 /** | 195 /** |
194 * Throw an exception (when DCHECKs are enabled) if currently not running on
the UI thread. | 196 * Throw an exception (when DCHECKs are enabled) if currently not running on
the UI thread. |
| 197 * |
| 198 * Can be disabled by setThreadAssertsDisabledForTesting(true). |
195 */ | 199 */ |
196 public static void assertOnUiThread() { | 200 public static void assertOnUiThread() { |
197 if (BuildConfig.DCHECK_IS_ON && !runningOnUiThread()) { | 201 if (sThreadAssertsDisabled) return; |
198 throw new IllegalStateException("Must be called on the Ui thread."); | 202 |
199 } | 203 assert runningOnUiThread() : "Must be called on the UI thread."; |
200 } | 204 } |
201 | 205 |
202 /** | 206 /** |
203 * Throw an exception (regardless of build) if currently not running on the
UI thread. | 207 * Throw an exception (regardless of build) if currently not running on the
UI thread. |
204 * | 208 * |
| 209 * Can be disabled by setThreadAssertsEnabledForTesting(false). |
| 210 * |
205 * @see #assertOnUiThread() | 211 * @see #assertOnUiThread() |
206 */ | 212 */ |
207 public static void checkUiThread() { | 213 public static void checkUiThread() { |
208 if (!runningOnUiThread()) { | 214 if (!sThreadAssertsDisabled && !runningOnUiThread()) { |
209 throw new IllegalStateException("Must be called on the Ui thread."); | 215 throw new IllegalStateException("Must be called on the UI thread."); |
210 } | 216 } |
211 } | 217 } |
212 | 218 |
213 /** | 219 /** |
| 220 * Throw an exception (when DCHECKs are enabled) if currently running on the
UI thread. |
| 221 * |
| 222 * Can be disabled by setThreadAssertsDisabledForTesting(true). |
| 223 */ |
| 224 public static void assertOnBackgroundThread() { |
| 225 if (sThreadAssertsDisabled) return; |
| 226 |
| 227 assert !runningOnUiThread() : "Must be called on a thread other than UI.
"; |
| 228 } |
| 229 |
| 230 /** |
| 231 * Disables thread asserts. |
| 232 * |
| 233 * Can be used by tests where code that normally runs multi-threaded is goin
g to run |
| 234 * single-threaded for the test (otherwise asserts that are valid in product
ion would fail in |
| 235 * those tests). |
| 236 */ |
| 237 public static void setThreadAssertsDisabledForTesting(boolean disabled) { |
| 238 sThreadAssertsDisabled = disabled; |
| 239 } |
| 240 |
| 241 /** |
214 * @return true iff the current thread is the main (UI) thread. | 242 * @return true iff the current thread is the main (UI) thread. |
215 */ | 243 */ |
216 public static boolean runningOnUiThread() { | 244 public static boolean runningOnUiThread() { |
217 return getUiThreadHandler().getLooper() == Looper.myLooper(); | 245 return getUiThreadHandler().getLooper() == Looper.myLooper(); |
218 } | 246 } |
219 | 247 |
220 public static Looper getUiThreadLooper() { | 248 public static Looper getUiThreadLooper() { |
221 return getUiThreadHandler().getLooper(); | 249 return getUiThreadHandler().getLooper(); |
222 } | 250 } |
223 | 251 |
224 /** | 252 /** |
225 * Set thread priority to audio. | 253 * Set thread priority to audio. |
226 */ | 254 */ |
227 @CalledByNative | 255 @CalledByNative |
228 public static void setThreadPriorityAudio(int tid) { | 256 public static void setThreadPriorityAudio(int tid) { |
229 Process.setThreadPriority(tid, Process.THREAD_PRIORITY_AUDIO); | 257 Process.setThreadPriority(tid, Process.THREAD_PRIORITY_AUDIO); |
230 } | 258 } |
231 | 259 |
232 /** | 260 /** |
233 * Checks whether Thread priority is THREAD_PRIORITY_AUDIO or not. | 261 * Checks whether Thread priority is THREAD_PRIORITY_AUDIO or not. |
234 * @param tid Thread id. | 262 * @param tid Thread id. |
235 * @return true for THREAD_PRIORITY_AUDIO and false otherwise. | 263 * @return true for THREAD_PRIORITY_AUDIO and false otherwise. |
236 */ | 264 */ |
237 @CalledByNative | 265 @CalledByNative |
238 private static boolean isThreadPriorityAudio(int tid) { | 266 private static boolean isThreadPriorityAudio(int tid) { |
239 return Process.getThreadPriority(tid) == Process.THREAD_PRIORITY_AUDIO; | 267 return Process.getThreadPriority(tid) == Process.THREAD_PRIORITY_AUDIO; |
240 } | 268 } |
241 } | 269 } |
OLD | NEW |