From 8bc6a58df7046b4d6f4b51eb274c7e60fea396ff Mon Sep 17 00:00:00 2001 From: Hans Boehm Date: Tue, 19 Dec 2023 18:48:15 +0000 Subject: Revert^17 "Thread suspension cleanup and deadlock fix" This reverts commit c6371b52df0da31acc174a3526274417b7aac0a7. Reason for revert: This seems to have two remaining issues: 1. The second DCHECK in WaitForFlipFunction is not completely guaranteed to hold, resulting in failures for 658-fp-read-barrier. 2. WaitForSuspendBarrier seems to time out occasionally, possibly spuriously so. We fail when the futex times out once. That's probably incompatible with the app freezer. We should retry a few times. Change-Id: Ibd8909b31083fc29e6d4f1fcde003d08eb16fc0a --- runtime/thread_test.cc | 99 -------------------------------------------------- 1 file changed, 99 deletions(-) delete mode 100644 runtime/thread_test.cc (limited to 'runtime/thread_test.cc') diff --git a/runtime/thread_test.cc b/runtime/thread_test.cc deleted file mode 100644 index c4577bc250..0000000000 --- a/runtime/thread_test.cc +++ /dev/null @@ -1,99 +0,0 @@ -/* - * Copyright (C) 2023 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 "thread.h" - -#include "android-base/logging.h" -#include "base/locks.h" -#include "base/mutex.h" -#include "common_runtime_test.h" -#include "thread-current-inl.h" -#include "thread-inl.h" - -namespace art { - -class ThreadTest : public CommonRuntimeTest {}; - -// Ensure that basic list operations on ThreadExitFlags work. These are rarely -// exercised in practice, since normally only one flag is registered at a time. - -TEST_F(ThreadTest, ThreadExitFlagTest) { - Thread* self = Thread::Current(); - ThreadExitFlag tefs[3]; - { - MutexLock mu(self, *Locks::thread_list_lock_); - self->NotifyOnThreadExit(&tefs[2]); - ASSERT_TRUE(self->IsRegistered(&tefs[2])); - ASSERT_FALSE(tefs[2].HasExited()); - ASSERT_FALSE(self->IsRegistered(&tefs[1])); - self->NotifyOnThreadExit(&tefs[1]); - self->NotifyOnThreadExit(&tefs[0]); - ASSERT_TRUE(self->IsRegistered(&tefs[0])); - ASSERT_TRUE(self->IsRegistered(&tefs[1])); - ASSERT_TRUE(self->IsRegistered(&tefs[2])); - self->UnregisterThreadExitFlag(&tefs[1]); - ASSERT_TRUE(self->IsRegistered(&tefs[0])); - ASSERT_FALSE(self->IsRegistered(&tefs[1])); - ASSERT_TRUE(self->IsRegistered(&tefs[2])); - self->UnregisterThreadExitFlag(&tefs[2]); - ASSERT_TRUE(self->IsRegistered(&tefs[0])); - ASSERT_FALSE(self->IsRegistered(&tefs[1])); - ASSERT_FALSE(self->IsRegistered(&tefs[2])); - } - Thread::DCheckUnregisteredEverywhere(&tefs[1], &tefs[2]); - { - MutexLock mu(self, *Locks::thread_list_lock_); - self->UnregisterThreadExitFlag(&tefs[0]); - ASSERT_FALSE(self->IsRegistered(&tefs[0])); - ASSERT_FALSE(self->IsRegistered(&tefs[1])); - ASSERT_FALSE(self->IsRegistered(&tefs[2])); - } - Thread::DCheckUnregisteredEverywhere(&tefs[0], &tefs[2]); -} - -TEST_F(ThreadTest, ThreadExitSignalTest) { - Thread* self = Thread::Current(); - ThreadExitFlag tefs[3]; - { - MutexLock mu(self, *Locks::thread_list_lock_); - self->NotifyOnThreadExit(&tefs[2]); - ASSERT_TRUE(self->IsRegistered(&tefs[2])); - ASSERT_FALSE(self->IsRegistered(&tefs[1])); - self->NotifyOnThreadExit(&tefs[1]); - ASSERT_TRUE(self->IsRegistered(&tefs[1])); - self->SignalExitFlags(); - ASSERT_TRUE(tefs[1].HasExited()); - ASSERT_TRUE(tefs[2].HasExited()); - } - Thread::DCheckUnregisteredEverywhere(&tefs[1], &tefs[2]); - { - MutexLock mu(self, *Locks::thread_list_lock_); - self->NotifyOnThreadExit(&tefs[0]); - tefs[2].~ThreadExitFlag(); // Destroy and reinitialize. - new (&tefs[2]) ThreadExitFlag(); - self->NotifyOnThreadExit(&tefs[2]); - ASSERT_FALSE(tefs[0].HasExited()); - ASSERT_TRUE(tefs[1].HasExited()); - ASSERT_FALSE(tefs[2].HasExited()); - self->SignalExitFlags(); - ASSERT_TRUE(tefs[0].HasExited()); - ASSERT_TRUE(tefs[1].HasExited()); - ASSERT_TRUE(tefs[2].HasExited()); - } - Thread::DCheckUnregisteredEverywhere(&tefs[0], &tefs[2]); -} - -} // namespace art -- cgit v1.2.3-59-g8ed1b