blob: b5c29928233602b64fd38b6f2096506f32b363ed [file] [log] [blame]
/*
* Copyright (C) 2019 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package art;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.concurrent.CountDownLatch;
public class Test1962 {
public static void doNothing() {
// We set a breakpoint here!
}
public static void run() throws Exception {
doTest();
}
public static void HandleEvent(Thread t, List<String> events) {
events.add("Hit event on " + t.getName());
}
public static void doTest() throws Exception {
setupTest();
final int NUM_THREADS = 2;
List<String> t1Events = new ArrayList<>();
List<String> t2Events = new ArrayList<>();
final CountDownLatch threadResumeLatch = new CountDownLatch(1);
final CountDownLatch threadStartLatch = new CountDownLatch(NUM_THREADS);
Runnable threadRun = () -> {
try {
threadStartLatch.countDown();
threadResumeLatch.await();
doNothing();
} catch (Exception e) {
throw new Error("Failed at something", e);
}
};
Thread T1 = new Thread(threadRun, "T1 Thread");
Thread T2 = new Thread(threadRun, "T2 Thread");
T1.start();
T2.start();
// Wait for both threads to have started.
threadStartLatch.await();
// Tell the threads to notify us when the doNothing method exits
Method target = Test1962.class.getDeclaredMethod("doNothing");
setupThread(T1, t1Events, target);
setupThread(T2, t2Events, target);
// Let the threads go.
threadResumeLatch.countDown();
// Wait for the threads to finish.
T1.join();
T2.join();
// Print out the events each of the threads performed.
System.out.println("Events on thread 1:");
for (String s : t1Events) {
System.out.println("\t" + s);
}
System.out.println("Events on thread 2:");
for (String s : t2Events) {
System.out.println("\t" + s);
}
}
public static native void setupTest();
public static native void setupThread(Thread t, List<String> events, Method target);
}