1/*
2 * Copyright 2008-2011, Ingo Weinhold, ingo_weinhold@gmx.de.
3 * Copyright 2002-2007, Axel D��rfler, axeld@pinc-software.de.
4 * Distributed under the terms of the MIT License.
5 */
6#ifndef KERNEL_SCHEDULER_TRACING_H
7#define KERNEL_SCHEDULER_TRACING_H
8
9
10#include <arch/debug.h>
11#include <cpu.h>
12#include <thread.h>
13#include <tracing.h>
14
15
16#if SCHEDULER_TRACING
17
18namespace SchedulerTracing {
19
20class SchedulerTraceEntry : public AbstractTraceEntry {
21public:
22	SchedulerTraceEntry(Thread* thread)
23		:
24		fID(thread->id)
25	{
26	}
27
28	thread_id ThreadID() const	{ return fID; }
29
30	virtual const char* Name() const = 0;
31
32protected:
33	thread_id			fID;
34};
35
36
37class EnqueueThread : public SchedulerTraceEntry {
38public:
39	EnqueueThread(Thread* thread, int32 effectivePriority)
40		:
41		SchedulerTraceEntry(thread),
42		fPriority(thread->priority),
43		fEffectivePriority(effectivePriority)
44	{
45		fName = alloc_tracing_buffer_strcpy(thread->name, B_OS_NAME_LENGTH,
46			false);
47		Initialized();
48	}
49
50	virtual void AddDump(TraceOutput& out);
51
52	virtual const char* Name() const;
53
54private:
55	char*				fName;
56	int32				fPriority;
57	int32				fEffectivePriority;
58};
59
60
61class RemoveThread : public SchedulerTraceEntry {
62public:
63	RemoveThread(Thread* thread)
64		:
65		SchedulerTraceEntry(thread),
66		fPriority(thread->priority)
67	{
68		Initialized();
69	}
70
71	virtual void AddDump(TraceOutput& out);
72
73	virtual const char* Name() const;
74
75private:
76	int32				fPriority;
77};
78
79
80class ScheduleThread : public SchedulerTraceEntry {
81public:
82	ScheduleThread(Thread* thread, Thread* previous)
83		:
84		SchedulerTraceEntry(thread),
85		fPreviousID(previous->id),
86		fCPU(previous->cpu->cpu_num),
87		fPriority(thread->priority),
88		fPreviousState(previous->state),
89		fPreviousWaitObjectType(previous->wait.type)
90	{
91		fName = alloc_tracing_buffer_strcpy(thread->name, B_OS_NAME_LENGTH,
92			false);
93
94#if SCHEDULER_TRACING >= 2
95		if (fPreviousState == B_THREAD_READY)
96			fPreviousPC = arch_debug_get_interrupt_pc(NULL);
97		else
98#endif
99			fPreviousWaitObject = previous->wait.object;
100
101		Initialized();
102	}
103
104	virtual void AddDump(TraceOutput& out);
105
106	virtual const char* Name() const;
107
108	thread_id PreviousThreadID() const		{ return fPreviousID; }
109	uint8 PreviousState() const				{ return fPreviousState; }
110	uint16 PreviousWaitObjectType() const	{ return fPreviousWaitObjectType; }
111	const void* PreviousWaitObject() const	{ return fPreviousWaitObject; }
112
113private:
114	thread_id			fPreviousID;
115	int32				fCPU;
116	char*				fName;
117	int32				fPriority;
118	uint8				fPreviousState;
119	uint16				fPreviousWaitObjectType;
120	union {
121		const void*		fPreviousWaitObject;
122		void*			fPreviousPC;
123	};
124};
125
126}	// namespace SchedulerTracing
127
128#	define T(x) new(std::nothrow) SchedulerTracing::x;
129#else
130#	define T(x) ;
131#endif
132
133
134#if SCHEDULER_TRACING
135
136namespace SchedulerTracing {
137
138enum ScheduleState {
139	RUNNING,
140	STILL_RUNNING,
141	PREEMPTED,
142	READY,
143	WAITING,
144	UNKNOWN
145};
146
147}
148
149int cmd_scheduler(int argc, char** argv);
150
151#endif	// SCHEDULER_TRACING
152
153#endif	// KERNEL_SCHEDULER_TRACING_H
154