The current ProcessGDBRemote function that updates the threads could end up with an empty list if any other thread had the sequence mutex. We now don't clear the thread list when we can't access it, and we also have changed how lldb_private::Process handles the return code from the:
virtual bool
Process::UpdateThreadList (lldb_private::ThreadList &old_thread_list,
lldb_private::ThreadList &new_thread_list) = 0;
A bool is now returned to indicate if the list was actually updated or not and the lldb_private::Process class will only update the stop ID of the validity of the thread list if "true" is returned.
The ProcessGDBRemote also got an extra assertion that will hopefully assert when running debug builds so we can find the source of this issue.
llvm-svn: 154365
91 lines
2.6 KiB
C++
91 lines
2.6 KiB
C++
//===-- OperatingSystemDarwinKernel.h ---------------------------*- C++ -*-===//
|
|
//
|
|
// The LLVM Compiler Infrastructure
|
|
//
|
|
// This file is distributed under the University of Illinois Open Source
|
|
// License. See LICENSE.TXT for details.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#ifndef liblldb_OperatingSystemDarwinKernel_h_
|
|
#define liblldb_OperatingSystemDarwinKernel_h_
|
|
|
|
// C Includes
|
|
// C++ Includes
|
|
// Other libraries and framework includes
|
|
#include "lldb/Target/OperatingSystem.h"
|
|
|
|
class DynamicRegisterInfo;
|
|
|
|
class OperatingSystemDarwinKernel : public lldb_private::OperatingSystem
|
|
{
|
|
public:
|
|
//------------------------------------------------------------------
|
|
// Static Functions
|
|
//------------------------------------------------------------------
|
|
static lldb_private::OperatingSystem *
|
|
CreateInstance (lldb_private::Process *process, bool force);
|
|
|
|
static void
|
|
Initialize();
|
|
|
|
static void
|
|
Terminate();
|
|
|
|
static const char *
|
|
GetPluginNameStatic();
|
|
|
|
static const char *
|
|
GetPluginDescriptionStatic();
|
|
|
|
//------------------------------------------------------------------
|
|
// Class Methods
|
|
//------------------------------------------------------------------
|
|
OperatingSystemDarwinKernel (lldb_private::Process *process);
|
|
|
|
virtual
|
|
~OperatingSystemDarwinKernel ();
|
|
|
|
//------------------------------------------------------------------
|
|
// lldb_private::PluginInterface Methods
|
|
//------------------------------------------------------------------
|
|
virtual const char *
|
|
GetPluginName();
|
|
|
|
virtual const char *
|
|
GetShortPluginName();
|
|
|
|
virtual uint32_t
|
|
GetPluginVersion();
|
|
|
|
//------------------------------------------------------------------
|
|
// lldb_private::OperatingSystem Methods
|
|
//------------------------------------------------------------------
|
|
virtual bool
|
|
UpdateThreadList (lldb_private::ThreadList &old_thread_list,
|
|
lldb_private::ThreadList &new_thread_list);
|
|
|
|
virtual void
|
|
ThreadWasSelected (lldb_private::Thread *thread);
|
|
|
|
virtual lldb::RegisterContextSP
|
|
CreateRegisterContextForThread (lldb_private::Thread *thread);
|
|
|
|
virtual lldb::StopInfoSP
|
|
CreateThreadStopReason (lldb_private::Thread *thread);
|
|
|
|
protected:
|
|
|
|
lldb::ValueObjectSP
|
|
GetThreadListValueObject ();
|
|
|
|
DynamicRegisterInfo *
|
|
GetDynamicRegisterInfo ();
|
|
|
|
lldb::ValueObjectSP m_thread_list_valobj_sp;
|
|
std::auto_ptr<DynamicRegisterInfo> m_register_info_ap;
|
|
|
|
};
|
|
|
|
#endif // #ifndef liblldb_OperatingSystemDarwinKernel_h_
|