Revert "Make sure all runtime threads are in the System thread group."
This reverts commit 0e01c8d3f3c2d7cc4ac2cf5cf01ae913a4c6181e.
Bug: 146178357
Reason for revert: Breaks on debug-gc
Change-Id: I2a305a271ef50263c2a722114f686a478d931c22
diff --git a/runtime/thread_pool.cc b/runtime/thread_pool.cc
index 2bca5a9..365c097 100644
--- a/runtime/thread_pool.cc
+++ b/runtime/thread_pool.cc
@@ -97,17 +97,10 @@
void* ThreadPoolWorker::Callback(void* arg) {
ThreadPoolWorker* worker = reinterpret_cast<ThreadPoolWorker*>(arg);
Runtime* runtime = Runtime::Current();
- CHECK(runtime->AttachCurrentThread(
- worker->name_.c_str(),
- true,
- // Thread-groups are only tracked by the peer j.l.Thread objects. If we aren't creating peers
- // we don't need to specify the thread group. We want to place these threads in the System
- // thread group because that thread group is where important threads that debuggers and
- // similar tools should not mess with are placed. As this is an internal-thread-pool we might
- // rely on being able to (for example) wait for all threads to finish some task. If debuggers
- // are suspending these threads that might not be possible.
- worker->thread_pool_->create_peers_ ? runtime->GetSystemThreadGroup() : nullptr,
- worker->thread_pool_->create_peers_));
+ CHECK(runtime->AttachCurrentThread(worker->name_.c_str(),
+ true,
+ nullptr,
+ worker->thread_pool_->create_peers_));
worker->thread_ = Thread::Current();
// Mark thread pool workers as runtime-threads.
worker->thread_->SetIsRuntimeThread(true);
diff --git a/test/2005-pause-all-redefine-multithreaded/expected.txt b/test/2005-pause-all-redefine-multithreaded/expected.txt
deleted file mode 100644
index e69de29..0000000
--- a/test/2005-pause-all-redefine-multithreaded/expected.txt
+++ /dev/null
diff --git a/test/2005-pause-all-redefine-multithreaded/info.txt b/test/2005-pause-all-redefine-multithreaded/info.txt
deleted file mode 100644
index c300f0c..0000000
--- a/test/2005-pause-all-redefine-multithreaded/info.txt
+++ /dev/null
@@ -1,5 +0,0 @@
-Tests structural redefinition with multiple threads.
-
-Tests that using the structural redefinition while pausing all other (main thread-group) threads
-doesn't cause problems. This also tests that we can update the newly created fields while the
-other threads are suspended, thus making them look initialized.
diff --git a/test/2005-pause-all-redefine-multithreaded/pause-all.cc b/test/2005-pause-all-redefine-multithreaded/pause-all.cc
deleted file mode 100644
index ca13d3a..0000000
--- a/test/2005-pause-all-redefine-multithreaded/pause-all.cc
+++ /dev/null
@@ -1,88 +0,0 @@
-/*
- * Copyright (C) 2013 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.
- */
-
-#include <stdio.h>
-
-#include <vector>
-
-#include "android-base/logging.h"
-#include "android-base/macros.h"
-#include "jni.h"
-#include "jvmti.h"
-
-// Test infrastructure
-#include "jvmti_helper.h"
-#include "scoped_local_ref.h"
-#include "test_env.h"
-
-namespace art {
-namespace Test2005PauseAllRedefineMultithreaded {
-
-static constexpr jlong kRedefinedObjectTag = 0xDEADBEEF;
-
-extern "C" JNIEXPORT void JNICALL
-Java_art_Test2005_UpdateFieldValuesAndResumeThreads(JNIEnv* env,
- jclass klass ATTRIBUTE_UNUSED,
- jobjectArray threads_arr,
- jclass redefined_class,
- jobjectArray new_fields,
- jstring default_val) {
- std::vector<jthread> threads;
- for (jint i = 0; i < env->GetArrayLength(threads_arr); i++) {
- threads.push_back(env->GetObjectArrayElement(threads_arr, i));
- }
- std::vector<jfieldID> fields;
- for (jint i = 0; i < env->GetArrayLength(new_fields); i++) {
- fields.push_back(env->FromReflectedField(env->GetObjectArrayElement(new_fields, i)));
- }
- // Tag every instance of the redefined class with kRedefinedObjectTag
- CHECK_EQ(jvmti_env->IterateOverInstancesOfClass(
- redefined_class,
- JVMTI_HEAP_OBJECT_EITHER,
- [](jlong class_tag ATTRIBUTE_UNUSED,
- jlong size ATTRIBUTE_UNUSED,
- jlong* tag_ptr,
- void* user_data ATTRIBUTE_UNUSED) -> jvmtiIterationControl {
- *tag_ptr = kRedefinedObjectTag;
- return JVMTI_ITERATION_CONTINUE;
- },
- nullptr),
- JVMTI_ERROR_NONE);
- jobject* objs;
- jint cnt;
- // Get the objects.
- CHECK_EQ(jvmti_env->GetObjectsWithTags(1, &kRedefinedObjectTag, &cnt, &objs, nullptr),
- JVMTI_ERROR_NONE);
- // Set every field that's null
- for (jint i = 0; i < cnt; i++) {
- jobject obj = objs[i];
- for (jfieldID field : fields) {
- if (ScopedLocalRef<jobject>(env, env->GetObjectField(obj, field)).get() == nullptr) {
- env->SetObjectField(obj, field, default_val);
- }
- }
- }
- LOG(INFO) << "Setting " << cnt << " objects with default values";
- if (!threads.empty()) {
- std::vector<jvmtiError> errs(threads.size(), JVMTI_ERROR_NONE);
- CHECK_EQ(jvmti_env->ResumeThreadList(threads.size(), threads.data(), errs.data()),
- JVMTI_ERROR_NONE);
- }
- jvmti_env->Deallocate(reinterpret_cast<unsigned char*>(objs));
-}
-
-} // namespace Test2005PauseAllRedefineMultithreaded
-} // namespace art
diff --git a/test/2005-pause-all-redefine-multithreaded/run b/test/2005-pause-all-redefine-multithreaded/run
deleted file mode 100755
index 03e41a5..0000000
--- a/test/2005-pause-all-redefine-multithreaded/run
+++ /dev/null
@@ -1,17 +0,0 @@
-#!/bin/bash
-#
-# Copyright 2016 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.
-
-./default-run "$@" --jvmti --runtime-option -Xopaque-jni-ids:true
diff --git a/test/2005-pause-all-redefine-multithreaded/src/Main.java b/test/2005-pause-all-redefine-multithreaded/src/Main.java
deleted file mode 100644
index 72cf037..0000000
--- a/test/2005-pause-all-redefine-multithreaded/src/Main.java
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
- * Copyright (C) 2017 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.
- */
-
-public class Main {
- public static void main(String[] args) throws Exception {
- art.Test2005.run();
- }
-}
diff --git a/test/2005-pause-all-redefine-multithreaded/src/art/Redefinition.java b/test/2005-pause-all-redefine-multithreaded/src/art/Redefinition.java
deleted file mode 120000
index 81eaf31..0000000
--- a/test/2005-pause-all-redefine-multithreaded/src/art/Redefinition.java
+++ /dev/null
@@ -1 +0,0 @@
-../../../jvmti-common/Redefinition.java
\ No newline at end of file
diff --git a/test/2005-pause-all-redefine-multithreaded/src/art/Suspension.java b/test/2005-pause-all-redefine-multithreaded/src/art/Suspension.java
deleted file mode 120000
index bcef96f..0000000
--- a/test/2005-pause-all-redefine-multithreaded/src/art/Suspension.java
+++ /dev/null
@@ -1 +0,0 @@
-../../../jvmti-common/Suspension.java
\ No newline at end of file
diff --git a/test/2005-pause-all-redefine-multithreaded/src/art/Test2005.java b/test/2005-pause-all-redefine-multithreaded/src/art/Test2005.java
deleted file mode 100644
index 9de7643..0000000
--- a/test/2005-pause-all-redefine-multithreaded/src/art/Test2005.java
+++ /dev/null
@@ -1,198 +0,0 @@
-/*
- * Copyright (C) 2016 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.Field;
-import java.util.*;
-import java.util.concurrent.CountDownLatch;
-public class Test2005 {
- private static final int NUM_THREADS = 20;
- private static final String DEFAULT_VAL = "DEFAULT_VALUE";
-
- public static final class Transform {
- public String greetingEnglish;
- public Transform() {
- this.greetingEnglish = "Hello";
- }
- public String sayHi() {
- return greetingEnglish + " from " + Thread.currentThread().getName();
- }
- }
-
- /**
- * base64 encoded class/dex file for
- * public static final class Transform {
- * public String greetingEnglish;
- * public String greetingFrench;
- * public String greetingDanish;
- * public String greetingJapanese;
- *
- * public Transform() {
- * this.greetingEnglish = "Hello World";
- * this.greetingFrench = "Bonjour le Monde";
- * this.greetingDanish = "Hej Verden";
- * this.greetingJapanese = "こんにちは世界";
- * }
- * public String sayHi() {
- * return sayHiEnglish() + ", " + sayHiFrench() + ", " + sayHiDanish() + ", " +
- * sayHiJapanese() + " from " + Thread.currentThread().getName();
- * }
- * public String sayHiEnglish() {
- * return greetingEnglish;
- * }
- * public String sayHiDanish() {
- * return greetingDanish;
- * }
- * public String sayHiJapanese() {
- * return greetingJapanese;
- * }
- * public String sayHiFrench() {
- * return greetingFrench;
- * }
- * }
- */
- private static final byte[] DEX_BYTES = Base64.getDecoder().decode(
- "ZGV4CjAzNQAgJ1QXHJ8PAODMKTV14wyH4oKGOMK1yyL4BgAAcAAAAHhWNBIAAAAAAAAAADQGAAAl"
- + "AAAAcAAAAAkAAAAEAQAABAAAACgBAAAEAAAAWAEAAAwAAAB4AQAAAQAAANgBAAAABQAA+AEAAEoD"
- + "AABSAwAAVgMAAF4DAABwAwAAfAMAAIkDAACMAwAAkAMAAKoDAAC6AwAA3gMAAP4DAAASBAAAJgQA"
- + "AEEEAABVBAAAZAQAAG8EAAByBAAAfwQAAIcEAACWBAAAnwQAAK8EAADABAAA0AQAAOIEAADoBAAA"
- + "7wQAAPwEAAAKBQAAFwUAACYFAAAwBQAANwUAAMUFAAAIAAAACQAAAAoAAAALAAAADAAAAA0AAAAO"
- + "AAAADwAAABIAAAAGAAAABQAAAAAAAAAHAAAABgAAAEQDAAAGAAAABwAAAAAAAAASAAAACAAAAAAA"
- + "AAAAAAUAFwAAAAAABQAYAAAAAAAFABkAAAAAAAUAGgAAAAAAAwACAAAAAAAAABwAAAAAAAAAHQAA"
- + "AAAAAAAeAAAAAAAAAB8AAAAAAAAAIAAAAAQAAwACAAAABgADAAIAAAAGAAEAFAAAAAYAAAAhAAAA"
- + "BwACABUAAAAHAAAAFgAAAAAAAAARAAAABAAAAAAAAAAQAAAAJAYAAOsFAAAAAAAABwABAAIAAAAt"
- + "AwAAQQAAAG4QAwAGAAwAbhAEAAYADAFuEAIABgAMAm4QBQAGAAwDcQAKAAAADARuEAsABAAMBCIF"
- + "BgBwEAcABQBuIAgABQAaAAEAbiAIAAUAbiAIABUAbiAIAAUAbiAIACUAbiAIAAUAbiAIADUAGgAA"
- + "AG4gCAAFAG4gCABFAG4QCQAFAAwAEQAAAAIAAQAAAAAAMQMAAAMAAABUEAAAEQAAAAIAAQAAAAAA"
- + "NQMAAAMAAABUEAEAEQAAAAIAAQAAAAAAOQMAAAMAAABUEAIAEQAAAAIAAQAAAAAAPQMAAAMAAABU"
- + "EAMAEQAAAAIAAQABAAAAJAMAABQAAABwEAYAAQAaAAUAWxABABoAAwBbEAIAGgAEAFsQAAAaACQA"
- + "WxADAA4ACQAOPEtLS0sAEAAOABYADgATAA4AHAAOABkADgAAAAABAAAABQAGIGZyb20gAAIsIAAG"
- + "PGluaXQ+ABBCb25qb3VyIGxlIE1vbmRlAApIZWogVmVyZGVuAAtIZWxsbyBXb3JsZAABTAACTEwA"
- + "GExhcnQvVGVzdDIwMDUkVHJhbnNmb3JtOwAOTGFydC9UZXN0MjAwNTsAIkxkYWx2aWsvYW5ub3Rh"
- + "dGlvbi9FbmNsb3NpbmdDbGFzczsAHkxkYWx2aWsvYW5ub3RhdGlvbi9Jbm5lckNsYXNzOwASTGph"
- + "dmEvbGFuZy9PYmplY3Q7ABJMamF2YS9sYW5nL1N0cmluZzsAGUxqYXZhL2xhbmcvU3RyaW5nQnVp"
- + "bGRlcjsAEkxqYXZhL2xhbmcvVGhyZWFkOwANVGVzdDIwMDUuamF2YQAJVHJhbnNmb3JtAAFWAAth"
- + "Y2Nlc3NGbGFncwAGYXBwZW5kAA1jdXJyZW50VGhyZWFkAAdnZXROYW1lAA5ncmVldGluZ0Rhbmlz"
- + "aAAPZ3JlZXRpbmdFbmdsaXNoAA5ncmVldGluZ0ZyZW5jaAAQZ3JlZXRpbmdKYXBhbmVzZQAEbmFt"
- + "ZQAFc2F5SGkAC3NheUhpRGFuaXNoAAxzYXlIaUVuZ2xpc2gAC3NheUhpRnJlbmNoAA1zYXlIaUph"
- + "cGFuZXNlAAh0b1N0cmluZwAFdmFsdWUAiwF+fkQ4eyJjb21waWxhdGlvbi1tb2RlIjoiZGVidWci"
- + "LCJoYXMtY2hlY2tzdW1zIjpmYWxzZSwibWluLWFwaSI6MSwic2hhLTEiOiI5N2RmNmVkNzlhNzQw"
- + "ZWVhMzM4MmNiNWRhOTIyYmI1YmJjMDg2NDMzIiwidmVyc2lvbiI6IjIuMC45LWRldiJ9AAfjgZPj"
- + "gpPjgavjgaHjga/kuJbnlYwAAgIBIhgBAgMCEwQZGxcRAAQBBQABAQEBAQEBAIGABOwFAQH4AwEB"
- + "jAUBAaQFAQG8BQEB1AUAAAAAAAAAAgAAANwFAADiBQAAGAYAAAAAAAAAAAAAAAAAABAAAAAAAAAA"
- + "AQAAAAAAAAABAAAAJQAAAHAAAAACAAAACQAAAAQBAAADAAAABAAAACgBAAAEAAAABAAAAFgBAAAF"
- + "AAAADAAAAHgBAAAGAAAAAQAAANgBAAABIAAABgAAAPgBAAADIAAABgAAACQDAAABEAAAAQAAAEQD"
- + "AAACIAAAJQAAAEoDAAAEIAAAAgAAANwFAAAAIAAAAQAAAOsFAAADEAAAAgAAABQGAAAGIAAAAQAA"
- + "ACQGAAAAEAAAAQAAADQGAAA=");
-
- public static void run() throws Exception {
- Redefinition.setTestConfiguration(Redefinition.Config.COMMON_REDEFINE);
- doTest();
- }
-
- public static final class MyThread extends Thread {
- public MyThread(CountDownLatch delay, int id) {
- super("Thread: " + id);
- this.thr_id = id;
- this.results = new ArrayList<>(1000);
- this.finish = false;
- this.delay = delay;
- }
-
- public void run() {
- delay.countDown();
- while (!finish) {
- Transform t = new Transform();
- results.add(t.sayHi());
- }
- }
-
- public void finish() throws Exception {
- finish = true;
- this.join();
- }
-
- public void Check() throws Exception {
- for (String s : results) {
- if (!s.equals("Hello from " + getName())
- && !s.equals("Hello, " + DEFAULT_VAL + ", " + DEFAULT_VAL + ", " + DEFAULT_VAL
- + " from " + getName())
- && !s.equals(
- "Hello World, Bonjour le Monde, Hej Verden, こんにちは世界 from " + getName())) {
- System.out.println("FAIL " + thr_id + ": Unexpected result: " + s);
- }
- }
- }
-
- public ArrayList<String> results;
- public volatile boolean finish;
- public int thr_id;
- public CountDownLatch delay;
- }
-
- public static MyThread[] startThreads(int num_threads) throws Exception {
- CountDownLatch cdl = new CountDownLatch(num_threads);
- MyThread[] res = new MyThread[num_threads];
- for (int i = 0; i < num_threads; i++) {
- res[i] = new MyThread(cdl, i);
- res[i].start();
- }
- cdl.await();
- return res;
- }
- public static void finishThreads(MyThread[] thrs) throws Exception {
- for (MyThread t : thrs) {
- t.finish();
- }
- for (MyThread t : thrs) {
- t.Check();
- }
- }
-
- public static void doRedefinition() throws Exception {
- // Get the current set of fields.
- Field[] fields = Transform.class.getDeclaredFields();
- // Get all the threads in the 'main' thread group
- ThreadGroup mytg = Thread.currentThread().getThreadGroup();
- Thread[] all_threads = new Thread[mytg.activeCount()];
- mytg.enumerate(all_threads);
- Set<Thread> thread_set = new HashSet<>(Arrays.asList(all_threads));
- thread_set.remove(Thread.currentThread());
- // Suspend them.
- Suspension.suspendList(thread_set.toArray(new Thread[0]));
- // Actual redefine.
- Redefinition.doCommonStructuralClassRedefinition(Transform.class, DEX_BYTES);
- // Get the new fields.
- Field[] new_fields = Transform.class.getDeclaredFields();
- Set<Field> field_set = new HashSet(Arrays.asList(new_fields));
- field_set.removeAll(Arrays.asList(fields));
- // Initialize the new fields on the old objects and resume.
- UpdateFieldValuesAndResumeThreads(thread_set.toArray(new Thread[0]),
- Transform.class,
- field_set.toArray(new Field[0]),
- DEFAULT_VAL);
- }
-
- public static void doTest() throws Exception {
- MyThread[] threads = startThreads(NUM_THREADS);
-
- doRedefinition();
- finishThreads(threads);
- }
- public static native void UpdateFieldValuesAndResumeThreads(
- Thread[] t, Class<?> redefined_class, Field[] new_fields, String default_val);
-}
diff --git a/test/925-threadgroups/src/art/Test925.java b/test/925-threadgroups/src/art/Test925.java
index a63f4ce..0779f63 100644
--- a/test/925-threadgroups/src/art/Test925.java
+++ b/test/925-threadgroups/src/art/Test925.java
@@ -124,16 +124,7 @@
for (int i = 0; i < timeoutS; i++) {
Object[] data = getThreadGroupChildren(tg);
Thread[] threads = (Thread[])data[0];
- List<Thread> lthreads = new ArrayList<>(Arrays.asList(threads));
- Iterator<Thread> it = lthreads.iterator();
- while (it.hasNext()) {
- Thread t = it.next();
- if (t.getName().startsWith("Jit thread pool worker")) {
- it.remove();
- break;
- }
- }
- if (lthreads.size() == expectedChildCount) {
+ if (threads.length == expectedChildCount) {
return;
}
Thread.sleep(1000);
diff --git a/test/Android.bp b/test/Android.bp
index 0051853..de2ab3f 100644
--- a/test/Android.bp
+++ b/test/Android.bp
@@ -361,7 +361,6 @@
"1974-resize-array/resize_array.cc",
"1975-hello-structural-transformation/structural_transform.cc",
"1976-hello-structural-static-methods/structural_transform_methods.cc",
- "2005-pause-all-redefine-multithreaded/pause-all.cc",
],
// Use NDK-compatible headers for ctstiagent.
header_libs: [