From: Jim Ingham Date: Fri, 23 Feb 2018 21:10:42 +0000 (+0000) Subject: Fix breakpoint thread name conditionals after breakpoint options refactor. X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=e8b072d9e48881c4b84793acd554cc85e641b05f;p=platform%2Fupstream%2Fllvm.git Fix breakpoint thread name conditionals after breakpoint options refactor. PR36435 llvm-svn: 325958 --- diff --git a/lldb/packages/Python/lldbsuite/test/functionalities/thread/thread_specific_break/TestThreadSpecificBreakpoint.py b/lldb/packages/Python/lldbsuite/test/functionalities/thread/thread_specific_break/TestThreadSpecificBreakpoint.py index 4ebe699..9fdf42a 100644 --- a/lldb/packages/Python/lldbsuite/test/functionalities/thread/thread_specific_break/TestThreadSpecificBreakpoint.py +++ b/lldb/packages/Python/lldbsuite/test/functionalities/thread/thread_specific_break/TestThreadSpecificBreakpoint.py @@ -13,68 +13,57 @@ from lldbsuite.test.decorators import * from lldbsuite.test.lldbtest import * from lldbsuite.test import lldbutil +def set_thread_id(thread, breakpoint): + id = thread.id + breakpoint.SetThreadID(id) + +def set_thread_name(thread, breakpoint): + breakpoint.SetThreadName("main-thread") class ThreadSpecificBreakTestCase(TestBase): mydir = TestBase.compute_mydir(__file__) + NO_DEBUG_INFO_TESTCASE = True @add_test_categories(['pyapi']) + @expectedFailureAll(oslist=["windows"]) @expectedFailureAll(oslist=['ios', 'watchos', 'tvos', 'bridgeos'], archs=['armv7', 'armv7k'], bugnumber='rdar://problem/34563920') # armv7 ios problem - breakpoint with tid qualifier isn't working - def test_python(self): + def test_thread_id(self): + self.do_test(set_thread_id) + + @skipUnlessDarwin + @expectedFailureAll(oslist=['ios', 'watchos', 'tvos', 'bridgeos'], archs=['armv7', 'armv7k'], bugnumber='rdar://problem/34563920') # armv7 ios problem - breakpoint with tid qualifier isn't working + def test_thread_name(self): + self.do_test(set_thread_name) + + def do_test(self, setter_method): """Test that we obey thread conditioned breakpoints.""" self.build() - exe = self.getBuildArtifact("a.out") + main_source_spec = lldb.SBFileSpec("main.cpp") + (target, process, main_thread, main_breakpoint) = lldbutil.run_to_source_breakpoint(self, + "Set main breakpoint here", main_source_spec) - target = self.dbg.CreateTarget(exe) - self.assertTrue(target, VALID_TARGET) + main_thread_id = main_thread.GetThreadID() # This test works by setting a breakpoint in a function conditioned to stop only on # the main thread, and then calling this function on a secondary thread, joining, # and then calling again on the main thread. If the thread specific breakpoint works # then it should not be hit on the secondary thread, only on the main # thread. - - main_source_spec = lldb.SBFileSpec("main.cpp") - - main_breakpoint = target.BreakpointCreateBySourceRegex( - "Set main breakpoint here", main_source_spec) thread_breakpoint = target.BreakpointCreateBySourceRegex( "Set thread-specific breakpoint here", main_source_spec) - - self.assertTrue( - main_breakpoint.IsValid(), - "Failed to set main breakpoint.") - self.assertGreater( - main_breakpoint.GetNumLocations(), - 0, - "main breakpoint has no locations associated with it.") - self.assertTrue( - thread_breakpoint.IsValid(), - "Failed to set thread breakpoint.") self.assertGreater( thread_breakpoint.GetNumLocations(), 0, "thread breakpoint has no locations associated with it.") - process = target.LaunchSimple( - None, None, self.get_process_working_directory()) - - self.assertTrue(process, PROCESS_IS_VALID) - - stopped_threads = lldbutil.get_threads_stopped_at_breakpoint( - process, main_breakpoint) - self.assertEqual( - len(stopped_threads), - 1, - "main breakpoint stopped at unexpected number of threads") - main_thread = stopped_threads[0] - main_thread_id = main_thread.GetThreadID() - # Set the thread-specific breakpoint to only stop on the main thread. The run the function # on another thread and join on it. If the thread-specific breakpoint works, the next # stop should be on the main thread. - thread_breakpoint.SetThreadID(main_thread_id) + + main_thread_id = main_thread.GetThreadID() + setter_method(main_thread, thread_breakpoint) process.Continue() next_stop_state = process.GetState() diff --git a/lldb/packages/Python/lldbsuite/test/functionalities/thread/thread_specific_break/main.cpp b/lldb/packages/Python/lldbsuite/test/functionalities/thread/thread_specific_break/main.cpp index 7721b5d..0509b3d 100644 --- a/lldb/packages/Python/lldbsuite/test/functionalities/thread/thread_specific_break/main.cpp +++ b/lldb/packages/Python/lldbsuite/test/functionalities/thread/thread_specific_break/main.cpp @@ -12,6 +12,11 @@ int main () { // Set main breakpoint here. + + #ifdef __APPLE__ + pthread_setname_np("main-thread"); + #endif + std::thread t(thread_function); t.join(); diff --git a/lldb/source/Breakpoint/BreakpointOptions.cpp b/lldb/source/Breakpoint/BreakpointOptions.cpp index 662b288..9c49822 100644 --- a/lldb/source/Breakpoint/BreakpointOptions.cpp +++ b/lldb/source/Breakpoint/BreakpointOptions.cpp @@ -470,12 +470,18 @@ const Baton *BreakpointOptions::GetBaton() const { bool BreakpointOptions::InvokeCallback(StoppointCallbackContext *context, lldb::user_id_t break_id, lldb::user_id_t break_loc_id) { - if (m_callback && context->is_synchronous == IsCallbackSynchronous()) { - return m_callback(m_callback_baton_sp ? m_callback_baton_sp->data() + if (m_callback) { + if (context->is_synchronous == IsCallbackSynchronous()) { + return m_callback(m_callback_baton_sp ? m_callback_baton_sp->data() : nullptr, context, break_id, break_loc_id); - } else - return true; + } else if (IsCallbackSynchronous()) { + // If a synchronous callback is called at async time, it should not say + // to stop. + return false; + } + } + return true; } bool BreakpointOptions::HasCallback() const { @@ -526,7 +532,10 @@ const ThreadSpec *BreakpointOptions::GetThreadSpecNoCreate() const { ThreadSpec *BreakpointOptions::GetThreadSpec() { if (m_thread_spec_ap.get() == nullptr) + { + m_set_flags.Set(eThreadSpec); m_thread_spec_ap.reset(new ThreadSpec()); + } return m_thread_spec_ap.get(); }