From 8fdeff25e8cd9e751fac8836c9c3b5fd48944641 Mon Sep 17 00:00:00 2001 From: Jim Ingham Date: Tue, 21 Feb 2012 18:22:37 +0000 Subject: [PATCH] Forgot to add two files from the last checkin. llvm-svn: 151069 --- lldb/include/lldb/Core/StreamCallback.h | 47 ++++++++++++++++++ lldb/source/Core/StreamCallback.cpp | 65 +++++++++++++++++++++++++ 2 files changed, 112 insertions(+) create mode 100644 lldb/include/lldb/Core/StreamCallback.h create mode 100644 lldb/source/Core/StreamCallback.cpp diff --git a/lldb/include/lldb/Core/StreamCallback.h b/lldb/include/lldb/Core/StreamCallback.h new file mode 100644 index 000000000000..bb25e4e4073c --- /dev/null +++ b/lldb/include/lldb/Core/StreamCallback.h @@ -0,0 +1,47 @@ +//===-- StreamCallback.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_StreamCallback_h_ +#define liblldb_StreamCallback_h_ + +#include + +#include "lldb/Core/Stream.h" +#include "lldb/Core/StreamString.h" +#include "lldb/Host/Mutex.h" + +namespace lldb_private { + +class StreamCallback : + public Stream +{ +public: + StreamCallback (lldb::LogOutputCallback callback, void *baton); + + virtual ~StreamCallback (); + + virtual void + Flush (); + + virtual int + Write (const void *src, size_t src_len); + + +private: + typedef std::map collection; + lldb::LogOutputCallback m_callback; + void *m_baton; + collection m_accumulated_data; + Mutex m_collection_mutex; + + StreamString &FindStreamForThread(lldb::tid_t cur_tid); +}; + +} // namespace lldb_private +#endif // #ifndef liblldb_StreamCallback_h diff --git a/lldb/source/Core/StreamCallback.cpp b/lldb/source/Core/StreamCallback.cpp new file mode 100644 index 000000000000..b6545d5932e6 --- /dev/null +++ b/lldb/source/Core/StreamCallback.cpp @@ -0,0 +1,65 @@ +//===-- StreamCallback.cpp -------------------------------------*- C++ -*-===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#include + +#include "lldb/lldb-private.h" +#include "lldb/Core/Broadcaster.h" +#include "lldb/Core/Event.h" +#include "lldb/Core/StreamCallback.h" +#include "lldb/Host/Host.h" + +using namespace lldb; +using namespace lldb_private; + + +StreamCallback::StreamCallback (lldb::LogOutputCallback callback, void *baton) : + Stream (0, 4, eByteOrderBig), + m_callback (callback), + m_baton (baton), + m_accumulated_data (), + m_collection_mutex () +{ +} + +StreamCallback::~StreamCallback () +{ +} + +StreamString & +StreamCallback::FindStreamForThread(lldb::tid_t cur_tid) +{ + Mutex::Locker (m_collection_mutex); + collection::iterator iter, end_iter = m_accumulated_data.end(); + iter = m_accumulated_data.find (cur_tid); + if (iter == m_accumulated_data.end()) + { + std::pair ret; + ret = m_accumulated_data.insert(std::pair(cur_tid, StreamString())); + iter = ret.first; + } + return (*iter).second; +} + +void +StreamCallback::Flush () +{ + lldb::tid_t cur_tid = Host::GetCurrentThreadID(); + StreamString &out_stream = FindStreamForThread(cur_tid); + m_callback (out_stream.GetData(), m_baton); + out_stream.Clear(); +} + +int +StreamCallback::Write (const void *s, size_t length) +{ + lldb::tid_t cur_tid = Host::GetCurrentThreadID(); + FindStreamForThread(cur_tid).Write (s, length); + return length; +}