diff --git a/lldb/test/API/functionalities/thread/backtrace_all/Makefile b/lldb/test/API/functionalities/thread/backtrace_all/Makefile deleted file mode 100644 index cd092b7725618..0000000000000 --- a/lldb/test/API/functionalities/thread/backtrace_all/Makefile +++ /dev/null @@ -1,5 +0,0 @@ -CXXFLAGS_EXTRAS := -std=c++11 -CXX_SOURCES := ParallelTask.cpp -ENABLE_THREADS := YES - -include Makefile.rules diff --git a/lldb/test/API/functionalities/thread/backtrace_all/ParallelTask.cpp b/lldb/test/API/functionalities/thread/backtrace_all/ParallelTask.cpp deleted file mode 100644 index 8e0f76f691b98..0000000000000 --- a/lldb/test/API/functionalities/thread/backtrace_all/ParallelTask.cpp +++ /dev/null @@ -1,152 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include -#include - -class TaskPoolImpl -{ -public: - TaskPoolImpl(uint32_t num_threads) : - m_stop(false) - { - for (uint32_t i = 0; i < num_threads; ++i) - m_threads.emplace_back(Worker, this); - } - - ~TaskPoolImpl() - { - Stop(); - } - - template - std::future::type> - AddTask(F&& f, Args&&... args) - { - auto task = std::make_shared::type()>>( - std::bind(std::forward(f), std::forward(args)...)); - - std::unique_lock lock(m_tasks_mutex); - assert(!m_stop && "Can't add task to TaskPool after it is stopped"); - m_tasks.emplace([task](){ (*task)(); }); - lock.unlock(); - m_tasks_cv.notify_one(); - - return task->get_future(); - } - - void - Stop() - { - std::unique_lock lock(m_tasks_mutex); - m_stop = true; - m_tasks_mutex.unlock(); - m_tasks_cv.notify_all(); - for (auto& t : m_threads) - t.join(); - } - -private: - static void - Worker(TaskPoolImpl* pool) - { - while (true) - { - std::unique_lock lock(pool->m_tasks_mutex); - if (pool->m_tasks.empty()) - pool->m_tasks_cv.wait(lock, [pool](){ return !pool->m_tasks.empty() || pool->m_stop; }); - if (pool->m_tasks.empty()) - break; - - std::function f = pool->m_tasks.front(); - pool->m_tasks.pop(); - lock.unlock(); - - f(); - } - } - - std::queue> m_tasks; - std::mutex m_tasks_mutex; - std::condition_variable m_tasks_cv; - bool m_stop; - std::vector m_threads; -}; - -class TaskPool -{ -public: - // Add a new task to the thread pool and return a std::future belongs for the newly created task. - // The caller of this function have to wait on the future for this task to complete. - template - static std::future::type> - AddTask(F&& f, Args&&... args) - { - return GetImplementation().AddTask(std::forward(f), std::forward(args)...); - } - - // Run all of the specified tasks on the thread pool and wait until all of them are finished - // before returning - template - static void - RunTasks(T&&... t) - { - RunTaskImpl::Run(std::forward(t)...); - } - -private: - static TaskPoolImpl& - GetImplementation() - { - static TaskPoolImpl g_task_pool_impl(std::thread::hardware_concurrency()); - return g_task_pool_impl; - } - - template - struct RunTaskImpl; -}; - -template -struct TaskPool::RunTaskImpl -{ - static void - Run(H&& h, T&&... t) - { - auto f = AddTask(std::forward(h)); - RunTaskImpl::Run(std::forward(t)...); - f.wait(); - } -}; - -template<> -struct TaskPool::RunTaskImpl<> -{ - static void - Run() {} -}; - -int main() -{ - std::vector> tasks; - for (int i = 0; i < 100000; ++i) - { - tasks.emplace_back(TaskPool::AddTask([](int i){ - uint32_t s = 0; - for (int j = 0; j <= i; ++j) - s += j; - return s; - }, - i)); - } - - for (auto& it : tasks) // Set breakpoint here - it.wait(); - - TaskPool::RunTasks( - []() { return 1; }, - []() { return "aaaa"; } - ); -} diff --git a/lldb/test/API/functionalities/thread/backtrace_all/TestBacktraceAll.py b/lldb/test/API/functionalities/thread/backtrace_all/TestBacktraceAll.py deleted file mode 100644 index f34d4e0b81b45..0000000000000 --- a/lldb/test/API/functionalities/thread/backtrace_all/TestBacktraceAll.py +++ /dev/null @@ -1,59 +0,0 @@ -""" -Test regression for Bug 25251. -""" - -import unittest2 -import lldb -from lldbsuite.test.decorators import * -from lldbsuite.test.lldbtest import * -from lldbsuite.test import lldbutil - - -class BacktraceAllTestCase(TestBase): - - mydir = TestBase.compute_mydir(__file__) - - def setUp(self): - # Call super's setUp(). - TestBase.setUp(self) - # Find the line number for our breakpoint. - self.breakpoint = line_number( - 'ParallelTask.cpp', '// Set breakpoint here') - - # The android-arm compiler can't compile the inferior - @skipIfTargetAndroid(archs=["arm"]) - # because of an issue around std::future. - # TODO: Change the test to don't depend on std::future - def test(self): - """Test breakpoint handling after a thread join.""" - self.build() - - exe = self.getBuildArtifact("a.out") - self.runCmd("file " + exe, CURRENT_EXECUTABLE_SET) - - # This should create a breakpoint - lldbutil.run_break_set_by_file_and_line( - self, "ParallelTask.cpp", self.breakpoint, num_expected_locations=-1) - - # The breakpoint list should show 1 location. - self.expect( - "breakpoint list -f", - "Breakpoint location shown correctly", - substrs=[ - "1: file = 'ParallelTask.cpp', line = %d, exact_match = 0" % - self.breakpoint]) - - # Run the program. - self.runCmd("run", RUN_SUCCEEDED) - - # The stop reason of the thread should be breakpoint. - self.expect("thread list", STOPPED_DUE_TO_BREAKPOINT, - substrs=['stopped', - 'stop reason = breakpoint']) - - # This should not result in a segmentation fault - self.expect("thread backtrace all", STOPPED_DUE_TO_BREAKPOINT, - substrs=["stop reason = breakpoint 1."]) - - # Run to completion - self.runCmd("continue")