[lldb] Delete TestBacktraceAll.py

This test is completely nondeterministic, environment-dependent and does
not test what it was supposed to test (reverting the associated patch
does not make it fail).

I tried to figure out what the patch was meant to fix to see if I can
create a better test with the current tools, but I was not able to
understand the problem (it sounds like it has something to do with local
classes, but I don't understand the details).
This commit is contained in:
Pavel Labath 2022-01-27 14:55:49 +01:00
parent 1ca02bddb4
commit 33eb3f14eb
3 changed files with 0 additions and 216 deletions

View File

@ -1,5 +0,0 @@
CXXFLAGS_EXTRAS := -std=c++11
CXX_SOURCES := ParallelTask.cpp
ENABLE_THREADS := YES
include Makefile.rules

View File

@ -1,152 +0,0 @@
#include <cstdint>
#include <thread>
#include <vector>
#include <queue>
#include <functional>
#include <future>
#include <iostream>
#include <cassert>
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<typename F, typename... Args>
std::future<typename std::result_of<F(Args...)>::type>
AddTask(F&& f, Args&&... args)
{
auto task = std::make_shared<std::packaged_task<typename std::result_of<F(Args...)>::type()>>(
std::bind(std::forward<F>(f), std::forward<Args>(args)...));
std::unique_lock<std::mutex> 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<std::mutex> 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<std::mutex> 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<void()> f = pool->m_tasks.front();
pool->m_tasks.pop();
lock.unlock();
f();
}
}
std::queue<std::function<void()>> m_tasks;
std::mutex m_tasks_mutex;
std::condition_variable m_tasks_cv;
bool m_stop;
std::vector<std::thread> 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<typename F, typename... Args>
static std::future<typename std::result_of<F(Args...)>::type>
AddTask(F&& f, Args&&... args)
{
return GetImplementation().AddTask(std::forward<F>(f), std::forward<Args>(args)...);
}
// Run all of the specified tasks on the thread pool and wait until all of them are finished
// before returning
template<typename... T>
static void
RunTasks(T&&... t)
{
RunTaskImpl<T...>::Run(std::forward<T>(t)...);
}
private:
static TaskPoolImpl&
GetImplementation()
{
static TaskPoolImpl g_task_pool_impl(std::thread::hardware_concurrency());
return g_task_pool_impl;
}
template<typename... T>
struct RunTaskImpl;
};
template<typename H, typename... T>
struct TaskPool::RunTaskImpl<H, T...>
{
static void
Run(H&& h, T&&... t)
{
auto f = AddTask(std::forward<H>(h));
RunTaskImpl<T...>::Run(std::forward<T>(t)...);
f.wait();
}
};
template<>
struct TaskPool::RunTaskImpl<>
{
static void
Run() {}
};
int main()
{
std::vector<std::future<uint32_t>> 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"; }
);
}

View File

@ -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<T>
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")