diff options
Diffstat (limited to 'packages/Python/lldbsuite/test/api/multithreaded')
10 files changed, 0 insertions, 592 deletions
diff --git a/packages/Python/lldbsuite/test/api/multithreaded/Makefile b/packages/Python/lldbsuite/test/api/multithreaded/Makefile deleted file mode 100644 index 37323ea78190..000000000000 --- a/packages/Python/lldbsuite/test/api/multithreaded/Makefile +++ /dev/null @@ -1,9 +0,0 @@ -LEVEL = ../../make - -ENABLE_THREADS := YES -CXX_SOURCES := main.cpp - -include $(LEVEL)/Makefile.rules - -clean:: - rm -rf $(wildcard *.o *.d *.dSYM) diff --git a/packages/Python/lldbsuite/test/api/multithreaded/TestMultithreaded.py b/packages/Python/lldbsuite/test/api/multithreaded/TestMultithreaded.py deleted file mode 100644 index d91eec1fd51b..000000000000 --- a/packages/Python/lldbsuite/test/api/multithreaded/TestMultithreaded.py +++ /dev/null @@ -1,114 +0,0 @@ -"""Test the lldb public C++ api breakpoint callbacks.""" - -from __future__ import print_function - -# __package__ = "lldbsuite.test" - - -import os -import re -from lldbsuite.test.decorators import * -from lldbsuite.test.lldbtest import * -from lldbsuite.test import lldbutil -import subprocess - - -class SBBreakpointCallbackCase(TestBase): - - NO_DEBUG_INFO_TESTCASE = True - - def setUp(self): - TestBase.setUp(self) - self.generateSource('driver.cpp') - self.generateSource('listener_test.cpp') - self.generateSource('test_breakpoint_callback.cpp') - self.generateSource('test_listener_event_description.cpp') - self.generateSource('test_listener_event_process_state.cpp') - self.generateSource('test_listener_resume.cpp') - - mydir = TestBase.compute_mydir(__file__) - - @skipIfRemote - @skipIfNoSBHeaders - # clang-cl does not support throw or catch (llvm.org/pr24538) - @skipIfWindows - def test_breakpoint_callback(self): - """Test the that SBBreakpoint callback is invoked when a breakpoint is hit. """ - self.build_and_test('driver.cpp test_breakpoint_callback.cpp', - 'test_breakpoint_callback') - - @skipIfRemote - @skipIfNoSBHeaders - # clang-cl does not support throw or catch (llvm.org/pr24538) - @skipIfWindows - @expectedFlakeyFreeBSD - def test_sb_api_listener_event_description(self): - """ Test the description of an SBListener breakpoint event is valid.""" - self.build_and_test( - 'driver.cpp listener_test.cpp test_listener_event_description.cpp', - 'test_listener_event_description') - pass - - @skipIfRemote - @skipIfNoSBHeaders - # clang-cl does not support throw or catch (llvm.org/pr24538) - @skipIfWindows - @expectedFlakeyFreeBSD - def test_sb_api_listener_event_process_state(self): - """ Test that a registered SBListener receives events when a process - changes state. - """ - self.build_and_test( - 'driver.cpp listener_test.cpp test_listener_event_process_state.cpp', - 'test_listener_event_process_state') - pass - - @skipIfRemote - @skipIfNoSBHeaders - # clang-cl does not support throw or catch (llvm.org/pr24538) - @skipIfWindows - @expectedFlakeyFreeBSD - @skipIf(oslist=["linux"]) # flakey - def test_sb_api_listener_resume(self): - """ Test that a process can be resumed from a non-main thread. """ - self.build_and_test( - 'driver.cpp listener_test.cpp test_listener_resume.cpp', - 'test_listener_resume') - pass - - def build_and_test(self, sources, test_name, args=None): - """ Build LLDB test from sources, and run expecting 0 exit code """ - - # These tests link against host lldb API. - # Compiler's target triple must match liblldb triple - # because remote is disabled, we can assume that the os is the same - # still need to check architecture - if self.getLldbArchitecture() != self.getArchitecture(): - self.skipTest( - "This test is only run if the target arch is the same as the lldb binary arch") - - self.inferior = 'inferior_program' - self.buildProgram('inferior.cpp', self.inferior) - self.addTearDownHook(lambda: - os.remove(self.getBuildArtifact(self.inferior))) - - self.buildDriver(sources, test_name) - self.addTearDownHook(lambda: - os.remove(self.getBuildArtifact(test_name))) - - test_exe = self.getBuildArtifact(test_name) - self.signBinary(test_exe) - exe = [test_exe, self.getBuildArtifact(self.inferior)] - - env = {self.dylibPath: self.getLLDBLibraryEnvVal()} - if 'LLDB_DEBUGSERVER_PATH' in os.environ: - env['LLDB_DEBUGSERVER_PATH'] = os.environ['LLDB_DEBUGSERVER_PATH'] - if self.TraceOn(): - print("Running test %s" % " ".join(exe)) - check_call(exe, env=env) - else: - with open(os.devnull, 'w') as fnull: - check_call(exe, env=env, stdout=fnull, stderr=fnull) - - def build_program(self, sources, program): - return self.buildDriver(sources, program) diff --git a/packages/Python/lldbsuite/test/api/multithreaded/common.h b/packages/Python/lldbsuite/test/api/multithreaded/common.h deleted file mode 100644 index dad8bba07a3f..000000000000 --- a/packages/Python/lldbsuite/test/api/multithreaded/common.h +++ /dev/null @@ -1,68 +0,0 @@ -#ifndef LLDB_TEST_API_COMMON_H -#define LLDB_TEST_API_COMMON_H - -#include <condition_variable> -#include <chrono> -#include <exception> -#include <iostream> -#include <mutex> -#include <string> -#include <queue> - -#include <unistd.h> - -/// Simple exception class with a message -struct Exception : public std::exception -{ - std::string s; - Exception(std::string ss) : s(ss) {} - virtual ~Exception() throw () { } - const char* what() const throw() { return s.c_str(); } -}; - -// Synchronized data structure for listener to send events through -template<typename T> -class multithreaded_queue { - std::condition_variable m_condition; - std::mutex m_mutex; - std::queue<T> m_data; - bool m_notified; - -public: - - void push(T e) { - std::lock_guard<std::mutex> lock(m_mutex); - m_data.push(e); - m_notified = true; - m_condition.notify_all(); - } - - T pop(int timeout_seconds, bool &success) { - int count = 0; - while (count < timeout_seconds) { - std::unique_lock<std::mutex> lock(m_mutex); - if (!m_data.empty()) { - m_notified = false; - T ret = m_data.front(); - m_data.pop(); - success = true; - return ret; - } else if (!m_notified) - m_condition.wait_for(lock, std::chrono::seconds(1)); - count ++; - } - success = false; - return T(); - } -}; - -/// Allocates a char buffer with the current working directory -inline char* get_working_dir() { -#if defined(__APPLE__) || defined(__FreeBSD__) || defined(__NetBSD__) - return getwd(0); -#else - return get_current_dir_name(); -#endif -} - -#endif // LLDB_TEST_API_COMMON_H diff --git a/packages/Python/lldbsuite/test/api/multithreaded/driver.cpp.template b/packages/Python/lldbsuite/test/api/multithreaded/driver.cpp.template deleted file mode 100644 index f4bd021632ce..000000000000 --- a/packages/Python/lldbsuite/test/api/multithreaded/driver.cpp.template +++ /dev/null @@ -1,48 +0,0 @@ - -/// LLDB C API Test Driver - -#include <algorithm> -#include <iostream> -#include <iterator> -#include <string> -#include <vector> -#if !defined(_MSC_VER) - #include <signal.h> -#endif - -%include_SB_APIs% - -#include "common.h" - -using namespace std; -using namespace lldb; - -void test(SBDebugger &dbg, std::vector<string> args); - -int main(int argc, char** argv) { - -// Ignore SIGPIPE. The lldb driver does this as well, -// because we seem to get spurious SIGPIPES on some -// Unixen that take the driver down. -#if !defined(_MSC_VER) - signal(SIGPIPE, SIG_IGN); -#endif - int code = 0; - - SBDebugger::Initialize(); - SBDebugger dbg = SBDebugger::Create(); - - try { - if (!dbg.IsValid()) - throw Exception("invalid debugger"); - vector<string> args(argv + 1, argv + argc); - - test(dbg, args); - } catch (Exception &e) { - cout << "ERROR: " << e.what() << endl; - code = 1; - } - - SBDebugger::Destroy(dbg); - return code; -} diff --git a/packages/Python/lldbsuite/test/api/multithreaded/inferior.cpp b/packages/Python/lldbsuite/test/api/multithreaded/inferior.cpp deleted file mode 100644 index 9dbb289f98be..000000000000 --- a/packages/Python/lldbsuite/test/api/multithreaded/inferior.cpp +++ /dev/null @@ -1,17 +0,0 @@ - -#include <iostream> - -using namespace std; - -int next() { - static int i = 0; - cout << "incrementing " << i << endl; - return ++i; -} - -int main() { - int i = 0; - while (i < 5) - i = next(); - return 0; -} diff --git a/packages/Python/lldbsuite/test/api/multithreaded/listener_test.cpp.template b/packages/Python/lldbsuite/test/api/multithreaded/listener_test.cpp.template deleted file mode 100644 index e305d1af4893..000000000000 --- a/packages/Python/lldbsuite/test/api/multithreaded/listener_test.cpp.template +++ /dev/null @@ -1,74 +0,0 @@ -// LLDB test snippet that registers a listener with a process that hits -// a breakpoint. - -#include <atomic> -#include <iostream> -#include <string> -#include <thread> -#include <vector> - -%include_SB_APIs% -#include "common.h" - -using namespace lldb; -using namespace std; - -void listener_func(); -void check_listener(SBDebugger &dbg); - -// Listener thread and related variables -atomic<bool> g_done; -SBListener g_listener("test-listener"); -thread g_listener_thread; - -void shutdown_listener() { - g_done.store(true); - if (g_listener_thread.joinable()) - g_listener_thread.join(); -} - -void test(SBDebugger &dbg, std::vector<string> args) { - try { - g_done.store(false); - SBTarget target = dbg.CreateTarget(args.at(0).c_str()); - if (!target.IsValid()) throw Exception("invalid target"); - - SBBreakpoint breakpoint = target.BreakpointCreateByName("next"); - if (!breakpoint.IsValid()) throw Exception("invalid breakpoint"); - - std::unique_ptr<char> working_dir(get_working_dir()); - - SBError error; - SBProcess process = target.Launch(g_listener, - 0, 0, 0, 0, 0, - working_dir.get(), - 0, - false, - error); - if (!error.Success()) - throw Exception("Error launching process."); - - /* FIXME: the approach below deadlocks - SBProcess process = target.LaunchSimple (0, 0, working_dir.get()); - - // get debugger listener (which is attached to process by default) - g_listener = dbg.GetListener(); - */ - - // FIXME: because a listener is attached to the process at launch-time, - // registering the listener below results in two listeners being attached, - // which is not supported by LLDB. - // register listener - // process.GetBroadcaster().AddListener(g_listener, - // SBProcess::eBroadcastBitStateChanged); - - // start listener thread - g_listener_thread = thread(listener_func); - check_listener(dbg); - - } catch (Exception &e) { - shutdown_listener(); - throw e; - } - shutdown_listener(); -} diff --git a/packages/Python/lldbsuite/test/api/multithreaded/test_breakpoint_callback.cpp.template b/packages/Python/lldbsuite/test/api/multithreaded/test_breakpoint_callback.cpp.template deleted file mode 100644 index 4133025aa495..000000000000 --- a/packages/Python/lldbsuite/test/api/multithreaded/test_breakpoint_callback.cpp.template +++ /dev/null @@ -1,49 +0,0 @@ - -// LLDB C++ API Test: verify that the function registered with -// SBBreakpoint.SetCallback() is invoked when a breakpoint is hit. - -#include <mutex> -#include <iostream> -#include <vector> -#include <string> - -%include_SB_APIs% - -#include "common.h" - -using namespace std; -using namespace lldb; - -mutex g_mutex; -condition_variable g_condition; -int g_breakpoint_hit_count = 0; - -bool BPCallback (void *baton, - SBProcess &process, - SBThread &thread, - SBBreakpointLocation &location) { - lock_guard<mutex> lock(g_mutex); - g_breakpoint_hit_count += 1; - g_condition.notify_all(); - return true; -} - -void test(SBDebugger &dbg, vector<string> args) { - dbg.SetAsync(false); - SBTarget target = dbg.CreateTarget(args.at(0).c_str()); - if (!target.IsValid()) throw Exception("invalid target"); - - SBBreakpoint breakpoint = target.BreakpointCreateByName("next"); - if (!breakpoint.IsValid()) throw Exception("invalid breakpoint"); - breakpoint.SetCallback(BPCallback, 0); - - std::unique_ptr<char> working_dir(get_working_dir()); - SBProcess process = target.LaunchSimple (0, 0, working_dir.get()); - - { - unique_lock<mutex> lock(g_mutex); - g_condition.wait_for(lock, chrono::seconds(5)); - if (g_breakpoint_hit_count != 1) - throw Exception("Breakpoint hit count expected to be 1"); - } -} diff --git a/packages/Python/lldbsuite/test/api/multithreaded/test_listener_event_description.cpp.template b/packages/Python/lldbsuite/test/api/multithreaded/test_listener_event_description.cpp.template deleted file mode 100644 index 63e3f3631e5d..000000000000 --- a/packages/Python/lldbsuite/test/api/multithreaded/test_listener_event_description.cpp.template +++ /dev/null @@ -1,97 +0,0 @@ - -// LLDB C++ API Test: verify the event description that is received by an -// SBListener object registered with a process with a breakpoint. - -#include <atomic> -#include <array> -#include <iostream> -#include <string> -#include <thread> - -%include_SB_APIs% - -#include "common.h" - -using namespace lldb; -using namespace std; - -// listener thread control -extern atomic<bool> g_done; -extern SBListener g_listener; - -multithreaded_queue<string> g_event_descriptions; -string g_error_desc; - -void listener_func() { - while (!g_done) { - SBEvent event; - bool got_event = g_listener.WaitForEvent(1, event); - - if (got_event) { - if (!event.IsValid()) - throw Exception("event is not valid in listener thread"); - - SBStream description; - event.GetDescription(description); - string str(description.GetData()); - g_event_descriptions.push(str); - } - } -} - -bool check_state(string &state, string &desc, bool got_description) -{ - g_error_desc.clear(); - - if(!got_description) - { - g_error_desc.append("Did not get expected event description"); - return false; - } - - if (desc.find("state-changed") == desc.npos) - g_error_desc.append("Event description incorrect: missing 'state-changed' "); - - if (desc.find("pid = ") == desc.npos) - g_error_desc.append("Event description incorrect: missing process pid "); - - string state_search_str = "state = " + state; - if (desc.find(state_search_str) == desc.npos) - { - string errString = ("Event description incorrect: expected state " - + state - + " but desc was " - + desc); - g_error_desc.append(errString); - } - - if (g_error_desc.length() > 0) - return false; - - cout << "check_state: " << state << " OK\n"; - return true; -} - -void check_listener(SBDebugger &dbg) -{ - bool got_description; - string state; - - // check for "launching" state, this may or may not be present - string desc = g_event_descriptions.pop(5, got_description); - state = "launching"; - if (check_state(state, desc, got_description)) - { - // found a 'launching' state, pop next one from queue - desc = g_event_descriptions.pop(5, got_description); - } - - state = "running"; - if( !check_state(state, desc, got_description) ) - throw Exception(g_error_desc); - - desc = g_event_descriptions.pop(5, got_description); - state = "stopped"; - if( !check_state(state, desc, got_description) ) - throw Exception(g_error_desc); -} diff --git a/packages/Python/lldbsuite/test/api/multithreaded/test_listener_event_process_state.cpp.template b/packages/Python/lldbsuite/test/api/multithreaded/test_listener_event_process_state.cpp.template deleted file mode 100644 index 2926ece4d8d9..000000000000 --- a/packages/Python/lldbsuite/test/api/multithreaded/test_listener_event_process_state.cpp.template +++ /dev/null @@ -1,63 +0,0 @@ - -// LLDB C++ API Test: verify the event description as obtained by calling -// SBEvent::GetCStringFromEvent that is received by an -// SBListener object registered with a process with a breakpoint. - -#include <atomic> -#include <iostream> -#include <string> -#include <thread> - -%include_SB_APIs% - -#include "common.h" - -using namespace lldb; -using namespace std; - -// listener thread control -extern atomic<bool> g_done; - -multithreaded_queue<string> g_frame_functions; - -extern SBListener g_listener; - -void listener_func() { - while (!g_done) { - SBEvent event; - bool got_event = g_listener.WaitForEvent(1, event); - if (got_event) { - if (!event.IsValid()) - throw Exception("event is not valid in listener thread"); - // send process description - SBProcess process = SBProcess::GetProcessFromEvent(event); - if (!process.IsValid()) - throw Exception("process is not valid"); - if (SBProcess::GetStateFromEvent(event) != lldb::eStateStopped || SBProcess::GetRestartedFromEvent(event)) - continue; // Only interested in "stopped" events. - - SBStream description; - - for (int i = 0; i < process.GetNumThreads(); ++i) { - // send each thread description - SBThread thread = process.GetThreadAtIndex(i); - // send each frame function name - uint32_t num_frames = thread.GetNumFrames(); - for(int j = 0; j < num_frames; ++j) { - const char* function_name = thread.GetFrameAtIndex(j).GetSymbol().GetName(); - if (function_name) - g_frame_functions.push(string(function_name)); - } - } - } - } -} - -void check_listener(SBDebugger &dbg) { - // check thread description - bool got_description = false; - string func_name = g_frame_functions.pop(5, got_description); - - if(got_description == false) - throw Exception("Expected at least one frame function"); -} diff --git a/packages/Python/lldbsuite/test/api/multithreaded/test_listener_resume.cpp.template b/packages/Python/lldbsuite/test/api/multithreaded/test_listener_resume.cpp.template deleted file mode 100644 index 4adc9b338879..000000000000 --- a/packages/Python/lldbsuite/test/api/multithreaded/test_listener_resume.cpp.template +++ /dev/null @@ -1,53 +0,0 @@ - -// LLDB C++ API Test: verify the event description as obtained by calling -// SBEvent::GetCStringFromEvent that is received by an -// SBListener object registered with a process with a breakpoint. - -#include <atomic> -#include <iostream> -#include <string> -#include <thread> - -%include_SB_APIs% - -#include "common.h" - -using namespace lldb; -using namespace std; - -// listener thread control -extern atomic<bool> g_done; - -// used by listener thread to communicate a successful process continue command -// back to the checking thread. - -multithreaded_queue<bool> g_process_started; - -extern SBListener g_listener; - -void listener_func() { - while (!g_done) { - SBEvent event; - bool got_event = g_listener.WaitForEvent(1, event); - if (got_event) { - if (!event.IsValid()) - throw Exception("event is not valid in listener thread"); - - SBProcess process = SBProcess::GetProcessFromEvent(event); - if (process.GetState() == eStateStopped) { - SBError error = process.Continue(); - if (!error.Success()) - throw Exception(string("Cannot continue process from listener thread: ") - + error.GetCString()); - g_process_started.push(true); - } - } - } -} - -void check_listener(SBDebugger &dbg) { - bool got_message = false; - while (!got_message) - g_process_started.pop(5, got_message); - g_done = true; -} |