Files
clang-p2996/lldb/source/Core/Event.cpp
Jim Ingham 583bbb1dd4 Change over the broadcaster/listener process to hold shared or weak pointers
to each other.  This should remove some infrequent teardown crashes when the
listener is not the debugger's listener.

Processes now need to take a ListenerSP, not a Listener&.

This required changing over the Process plugin class constructors to take a ListenerSP, instead
of a Listener&.   Other than that there should be no functional change.
 
<rdar://problem/24580184> CrashTracer: [USER] Xcode at …ework: lldb_private::Listener::BroadcasterWillDestruct + 39

llvm-svn: 262863
2016-03-07 21:50:25 +00:00

231 lines
5.3 KiB
C++

//===-- Event.cpp -----------------------------------------------*- C++ -*-===//
//
// The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
// C Includes
// C++ Includes
// Other libraries and framework includes
// Project includes
#include "lldb/Core/Event.h"
#include "lldb/Core/Broadcaster.h"
#include "lldb/Core/DataExtractor.h"
#include "lldb/Core/Log.h"
#include "lldb/Core/State.h"
#include "lldb/Core/Stream.h"
#include "lldb/Host/Endian.h"
#include "lldb/Target/Process.h"
#include <algorithm>
using namespace lldb;
using namespace lldb_private;
//----------------------------------------------------------------------
// Event constructor
//----------------------------------------------------------------------
Event::Event (Broadcaster *broadcaster, uint32_t event_type, EventData *data) :
m_broadcaster_wp (broadcaster->GetBroadcasterImpl()),
m_type (event_type),
m_data_ap (data)
{
}
Event::Event(uint32_t event_type, EventData *data) :
m_type (event_type),
m_data_ap (data)
{
}
//----------------------------------------------------------------------
// Event destructor
//----------------------------------------------------------------------
Event::~Event ()
{
}
void
Event::Dump (Stream *s) const
{
Broadcaster *broadcaster;
Broadcaster::BroadcasterImplSP broadcaster_impl_sp(m_broadcaster_wp.lock());
if (broadcaster_impl_sp)
broadcaster = broadcaster_impl_sp->GetBroadcaster();
else
broadcaster = nullptr;
if (broadcaster)
{
StreamString event_name;
if (broadcaster->GetEventNames (event_name, m_type, false))
s->Printf("%p Event: broadcaster = %p (%s), type = 0x%8.8x (%s), data = ",
static_cast<const void*>(this),
static_cast<void*>(broadcaster),
broadcaster->GetBroadcasterName().GetCString(),
m_type, event_name.GetString().c_str());
else
s->Printf("%p Event: broadcaster = %p (%s), type = 0x%8.8x, data = ",
static_cast<const void*>(this),
static_cast<void*>(broadcaster),
broadcaster->GetBroadcasterName().GetCString(), m_type);
}
else
s->Printf("%p Event: broadcaster = NULL, type = 0x%8.8x, data = ",
static_cast<const void*>(this), m_type);
if (m_data_ap.get() == NULL)
s->Printf ("<NULL>");
else
{
s->PutChar('{');
m_data_ap->Dump (s);
s->PutChar('}');
}
}
void
Event::DoOnRemoval ()
{
if (m_data_ap.get())
m_data_ap->DoOnRemoval (this);
}
EventData::EventData()
{
}
EventData::~EventData()
{
}
void
EventData::Dump (Stream *s) const
{
s->PutCString ("Generic Event Data");
}
EventDataBytes::EventDataBytes () :
m_bytes()
{
}
EventDataBytes::EventDataBytes (const char *cstr) :
m_bytes()
{
SetBytesFromCString (cstr);
}
EventDataBytes::EventDataBytes (const void *src, size_t src_len) :
m_bytes()
{
SetBytes (src, src_len);
}
EventDataBytes::~EventDataBytes()
{
}
const ConstString &
EventDataBytes::GetFlavorString ()
{
static ConstString g_flavor ("EventDataBytes");
return g_flavor;
}
const ConstString &
EventDataBytes::GetFlavor () const
{
return EventDataBytes::GetFlavorString ();
}
void
EventDataBytes::Dump (Stream *s) const
{
size_t num_printable_chars = std::count_if (m_bytes.begin(), m_bytes.end(), isprint);
if (num_printable_chars == m_bytes.size())
{
s->Printf("\"%s\"", m_bytes.c_str());
}
else if (m_bytes.size() > 0)
{
DataExtractor data;
data.SetData(&m_bytes[0], m_bytes.size(), endian::InlHostByteOrder());
data.Dump(s, 0, eFormatBytes, 1, m_bytes.size(), 32, LLDB_INVALID_ADDRESS, 0, 0);
}
}
const void *
EventDataBytes::GetBytes() const
{
if (m_bytes.empty())
return NULL;
return &m_bytes[0];
}
size_t
EventDataBytes::GetByteSize() const
{
return m_bytes.size ();
}
void
EventDataBytes::SetBytes (const void *src, size_t src_len)
{
if (src && src_len > 0)
m_bytes.assign ((const char *)src, src_len);
else
m_bytes.clear();
}
void
EventDataBytes::SetBytesFromCString (const char *cstr)
{
if (cstr && cstr[0])
m_bytes.assign (cstr);
else
m_bytes.clear();
}
const void *
EventDataBytes::GetBytesFromEvent (const Event *event_ptr)
{
const EventDataBytes *e = GetEventDataFromEvent (event_ptr);
if (e)
return e->GetBytes();
return NULL;
}
size_t
EventDataBytes::GetByteSizeFromEvent (const Event *event_ptr)
{
const EventDataBytes *e = GetEventDataFromEvent (event_ptr);
if (e)
return e->GetByteSize();
return 0;
}
const EventDataBytes *
EventDataBytes::GetEventDataFromEvent (const Event *event_ptr)
{
if (event_ptr)
{
const EventData *event_data = event_ptr->GetData();
if (event_data && event_data->GetFlavor() == EventDataBytes::GetFlavorString())
return static_cast <const EventDataBytes *> (event_data);
}
return NULL;
}
void
EventDataBytes::SwapBytes (std::string &new_bytes)
{
m_bytes.swap (new_bytes);
}