blob: 63f3c9f8b2d45b2c12d81ef7dd6bd17e678637b4 [file] [log] [blame]
Jim Ingham2d9c2d42012-02-21 18:22:37 +00001//===-- StreamCallback.cpp -------------------------------------*- C++ -*-===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10#include <stdio.h>
11
12#include "lldb/lldb-private.h"
13#include "lldb/Core/Broadcaster.h"
14#include "lldb/Core/Event.h"
15#include "lldb/Core/StreamCallback.h"
16#include "lldb/Host/Host.h"
17
18using namespace lldb;
19using namespace lldb_private;
20
21
22StreamCallback::StreamCallback (lldb::LogOutputCallback callback, void *baton) :
23 Stream (0, 4, eByteOrderBig),
24 m_callback (callback),
25 m_baton (baton),
26 m_accumulated_data (),
27 m_collection_mutex ()
28{
29}
30
31StreamCallback::~StreamCallback ()
32{
33}
34
35StreamString &
36StreamCallback::FindStreamForThread(lldb::tid_t cur_tid)
37{
Jason Molendabf41e192012-10-04 22:47:07 +000038 Mutex::Locker locker(m_collection_mutex);
Sean Callanan142f94c2012-03-01 02:03:47 +000039 collection::iterator iter = m_accumulated_data.find (cur_tid);
Jim Ingham2d9c2d42012-02-21 18:22:37 +000040 if (iter == m_accumulated_data.end())
41 {
42 std::pair<collection::iterator, bool> ret;
43 ret = m_accumulated_data.insert(std::pair<lldb::tid_t,StreamString>(cur_tid, StreamString()));
44 iter = ret.first;
45 }
46 return (*iter).second;
47}
48
49void
50StreamCallback::Flush ()
51{
52 lldb::tid_t cur_tid = Host::GetCurrentThreadID();
53 StreamString &out_stream = FindStreamForThread(cur_tid);
54 m_callback (out_stream.GetData(), m_baton);
55 out_stream.Clear();
56}
57
58int
59StreamCallback::Write (const void *s, size_t length)
60{
61 lldb::tid_t cur_tid = Host::GetCurrentThreadID();
62 FindStreamForThread(cur_tid).Write (s, length);
63 return length;
64}