/* * Copyright (c) 2018-present, Facebook, Inc. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ import android.support.annotation.UiThread; import java.util.concurrent.CountDownLatch; import java.util.concurrent.ExecutionException; import java.util.concurrent.Future; class Dedup { CountDownLatch latch; Future future; // only one report should be seen @UiThread void onUiThreadBad() throws InterruptedException, ExecutionException { callMethodWithMultipleBlocksBad(); } // three reports are expected @UiThread void callMethodWithMultipleBlocksBad() throws InterruptedException, ExecutionException { future.get(); latch.await(); future.get(); } Object lockA, lockB; // deadlock should be reported between oneWayBad and anotherWayBad only void oneWayBad() { synchronized (lockA) { synchronized (lockB) { } } } void anotherWayBad() { synchronized (lockB) { synchronized (lockA) { } } } // this is creating a longer trace than anotherWayBad, so should be suppressed void thirdLongerWayBad() { anotherWayBad(); } }