root/headers/private/debug/DebugLooper.h
/*
 * Copyright 2010, Ingo Weinhold, ingo_weinhold@gmx.de.
 * Distributed under the terms of the MIT License.
 */
#ifndef _DEBUG_LOOPER_H
#define _DEBUG_LOOPER_H


#include <Locker.h>

#include <ObjectList.h>


class BDebugMessageHandler;
class BTeamDebugger;


class BDebugLooper {
public:
                                                                BDebugLooper();
        virtual                                         ~BDebugLooper();

                        status_t                        Init();

                        thread_id                       Run(bool spawnThread);
                        void                            Quit();

                        status_t                        AddTeamDebugger(BTeamDebugger* debugger,
                                                                        BDebugMessageHandler* handler);
                        bool                            RemoveTeamDebugger(BTeamDebugger* debugger);
                        bool                            RemoveTeamDebugger(team_id team);

private:
                        struct Debugger;

                        struct Job;
                        struct JobList;
                        struct AddDebuggerJob;
                        struct RemoveDebuggerJob;

                        friend struct AddDebuggerJob;
                        friend struct RemoveDebuggerJob;

                        typedef BObjectList<Debugger> DebuggerList;

private:
        static  status_t                        _MessageLoopEntry(void* data);
                        status_t                        _MessageLoop();

                        status_t                        _DoJob(Job* job);
                        void                            _Notify();

private:
                        BLocker                         fLock;
                        thread_id                       fThread;
                        bool                            fOwnsThread;
                        bool                            fTerminating;
                        bool                            fNotified;
                        JobList*                        fJobs;
                        sem_id                          fEventSemaphore;
                        DebuggerList            fDebuggers;
};


#endif  // _DEBUG_LOOPER_H