⛏️ index : haiku.git

/*
 * Copyright 2009, Ingo Weinhold, ingo_weinhold@gmx.de.
 * Copyright 2013, Rene Gollent, rene@gollent.com.
 * Distributed under the terms of the MIT License.
 */
#ifndef DEBUG_EVENT_H
#define DEBUG_EVENT_H

#include <debugger.h>

#include "ImageInfo.h"
#include "SignalInfo.h"
#include "SyscallInfo.h"
#include "Types.h"


class CpuState;


// constants for synthetic events generated via the
// start_system_watching() interface
enum {
	DEBUGGER_MESSAGE_THREAD_RENAMED				= 'dmtr',
	DEBUGGER_MESSAGE_THREAD_PRIORITY_CHANGED	= 'dmpc'
};


class DebugEvent {
public:
								DebugEvent(int32 eventType,
									team_id team, thread_id thread);
	virtual						~DebugEvent();

			int32 				EventType() const		{ return fEventType; }
			team_id				Team() const			{ return fTeam; }
			thread_id			Thread() const			{ return fThread; }

			bool				ThreadStopped() const { return fThreadStopped; }
			void				SetThreadStopped(bool stopped);

private:
			int32 				fEventType;
			team_id				fTeam;
			thread_id			fThread;
			bool				fThreadStopped;
};


class CpuStateEvent : public DebugEvent {
public:
								CpuStateEvent(debug_debugger_message eventType,
									team_id team, thread_id thread,
									CpuState* state);
	virtual						~CpuStateEvent();

			CpuState*			GetCpuState() const	{ return fCpuState; }

private:
			CpuState*			fCpuState;
};


class ThreadDebuggedEvent : public DebugEvent {
public:
								ThreadDebuggedEvent(team_id team,
									thread_id thread);
};


class DebuggerCallEvent : public DebugEvent {
public:
								DebuggerCallEvent(team_id team,
									thread_id thread, target_addr_t message);

			target_addr_t		Message() const	{ return fMessage; }

private:
			target_addr_t		fMessage;
};


class BreakpointHitEvent : public CpuStateEvent {
public:
								BreakpointHitEvent(team_id team,
									thread_id thread, CpuState* state);
};


class WatchpointHitEvent : public CpuStateEvent {
public:
								WatchpointHitEvent(team_id team,
									thread_id thread, CpuState* state);
};


class SingleStepEvent : public CpuStateEvent {
public:
								SingleStepEvent(team_id team,
									thread_id thread, CpuState* state);
};


class ExceptionOccurredEvent : public DebugEvent {
public:
								ExceptionOccurredEvent(team_id team,
									thread_id thread,
									debug_exception_type exception);

			debug_exception_type Exception() const	{ return fException; }

private:
			debug_exception_type fException;
};


class TeamDeletedEvent : public DebugEvent {
public:
								TeamDeletedEvent(team_id team,
									thread_id thread);
};


class TeamExecEvent : public DebugEvent {
public:
								TeamExecEvent(team_id team, thread_id thread);
};


class ThreadCreatedEvent : public DebugEvent {
public:
								ThreadCreatedEvent(team_id team,
									thread_id thread, thread_id newThread);

			thread_id			NewThread() const	{ return fNewThread; }

private:
			thread_id			fNewThread;
};


class ThreadRenamedEvent : public DebugEvent {
public:
								ThreadRenamedEvent(team_id team,
									thread_id thread, thread_id renamedThread,
									const char* name);

			thread_id			RenamedThread() const { return fRenamedThread; }
			const char*			NewName() const	{ return fName; }

private:
			thread_id			fRenamedThread;
			char				fName[B_OS_NAME_LENGTH];
};


class ThreadPriorityChangedEvent : public DebugEvent {
public:
								ThreadPriorityChangedEvent(team_id team,
									thread_id thread, thread_id changedThread,
									int32 newPriority);

			thread_id			ChangedThread() const { return fChangedThread; }
			int32				NewPriority() const	{ return fNewPriority; }

private:
			thread_id			fChangedThread;
			int32				fNewPriority;
};


class ThreadDeletedEvent : public DebugEvent {
public:
								ThreadDeletedEvent(team_id team,
									thread_id thread);
};


class ImageCreatedEvent : public DebugEvent {
public:
								ImageCreatedEvent(team_id team,
									thread_id thread, const ImageInfo& info);

			const ImageInfo&	GetImageInfo() const	{ return fInfo; }

private:
			ImageInfo			fInfo;
};


class ImageDeletedEvent : public DebugEvent {
public:
								ImageDeletedEvent(team_id team,
									thread_id thread, const ImageInfo& info);

			const ImageInfo&	GetImageInfo() const	{ return fInfo; }

private:
			ImageInfo			fInfo;
};


class PostSyscallEvent : public DebugEvent {
public:
								PostSyscallEvent(team_id team,
									thread_id thread,
									const SyscallInfo& info);

			const SyscallInfo&	GetSyscallInfo() const	{ return fInfo; }

private:
			SyscallInfo			fInfo;
};


class HandedOverEvent : public DebugEvent {
public:
								HandedOverEvent(team_id team,
									thread_id thread, thread_id causingThread);

			thread_id			CausingThread() const { return fCausingThread; }

private:
			thread_id			fCausingThread;
};


class SignalReceivedEvent : public DebugEvent {
public:
								SignalReceivedEvent(team_id team,
									thread_id thread,
									const SignalInfo& info);

			const SignalInfo&	GetSignalInfo() const	{ return fInfo; }

private:
			SignalInfo			fInfo;
};


#endif	// DEBUG_EVENT_H