コード例 #1
0
    void JuliaEventHandlerLoop()
    {

        lldb_private::Listener& listener(m_dbg->GetListener());
        lldb_private::ConstString broadcaster_class_target(lldb_private::Target::GetStaticBroadcasterClass());
        lldb_private::ConstString broadcaster_class_process(lldb_private::Process::GetStaticBroadcasterClass());
        lldb_private::ConstString broadcaster_class_thread(lldb_private::Thread::GetStaticBroadcasterClass());
        lldb_private::BroadcastEventSpec target_event_spec (broadcaster_class_target,
                                              lldb_private::Target::eBroadcastBitBreakpointChanged);

        lldb_private::BroadcastEventSpec process_event_spec (broadcaster_class_process,
                                               lldb_private::Process::eBroadcastBitStateChanged   |
                                               lldb_private::Process::eBroadcastBitSTDOUT         |
                                               lldb_private::Process::eBroadcastBitSTDERR);

        lldb_private::BroadcastEventSpec thread_event_spec (broadcaster_class_thread,
                                              lldb_private::Thread::eBroadcastBitStackChanged     |
                                              lldb_private::Thread::eBroadcastBitThreadSelected   );

        listener.StartListeningForEventSpec (*m_dbg, target_event_spec);
        listener.StartListeningForEventSpec (*m_dbg, process_event_spec);
        listener.StartListeningForEventSpec (*m_dbg, thread_event_spec);
        listener.StartListeningForEvents (&m_dbg->GetCommandInterpreter(),
                                          lldb_private::CommandInterpreter::eBroadcastBitQuitCommandReceived      |
                                          lldb_private::CommandInterpreter::eBroadcastBitAsynchronousOutputData   |
                                          lldb_private::CommandInterpreter::eBroadcastBitAsynchronousErrorData    );

        m_sync_broadcaster.BroadcastEvent(eBroadcastBitEventThreadIsListening);

        bool done = false;
        while (!done)
        {
            lldb::EventSP event_sp;
            if (listener.WaitForEvent(NULL, event_sp))
            {
                if (event_sp)
                {
                    lldb_private::Broadcaster *broadcaster = event_sp->GetBroadcaster();
                    if (broadcaster)
                    {
                        uint32_t event_type = event_sp->GetType();
                        lldb_private::ConstString broadcaster_class (broadcaster->GetBroadcasterClass());
                        if (broadcaster_class == broadcaster_class_process)
                        {
                            lldb::StreamSP output_stream_sp = m_dbg->GetAsyncOutputStream();
                            HandleProcessStateChangedEvent(event_sp,output_stream_sp.get());
                        }
                        else if (broadcaster_class == broadcaster_class_target)
                        {
                            if (lldb_private::Breakpoint::BreakpointEventData::GetEventDataFromEvent(event_sp.get()))
                            {
                                m_dbg->HandleBreakpointEvent (event_sp);
                            }
                        }
                        else if (broadcaster_class == broadcaster_class_thread)
                        {
                            //m_dbg->HandleThreadEvent (event_sp);
                        }
                        else if (broadcaster == &m_dbg->GetCommandInterpreter())
                        {
                            if (event_type & lldb_private::CommandInterpreter::eBroadcastBitQuitCommandReceived)
                            {
                                done = true;
                            }
                            else if (event_type & lldb_private::CommandInterpreter::eBroadcastBitAsynchronousErrorData)
                            {
                                const char *data = reinterpret_cast<const char *>(lldb_private::EventDataBytes::GetBytesFromEvent (event_sp.get()));
                                if (data && data[0])
                                {
                                    lldb::StreamSP error_sp (m_dbg->GetAsyncErrorStream());
                                    if (error_sp)
                                    {
                                        error_sp->PutCString(data);
                                        error_sp->Flush();
                                    }
                                }
                            }
                            else if (event_type & lldb_private::CommandInterpreter::eBroadcastBitAsynchronousOutputData)
                            {
                                const char *data = reinterpret_cast<const char *>(lldb_private::EventDataBytes::GetBytesFromEvent (event_sp.get()));
                                if (data && data[0])
                                {
                                    lldb::StreamSP output_sp (m_dbg->GetAsyncOutputStream());
                                    if (output_sp)
                                    {
                                        output_sp->PutCString(data);
                                        output_sp->Flush();
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }