xref: /haiku/src/apps/debuganalyzer/model/ThreadModel.h (revision d8d4b902cb1b24645c5a730e3a8b279201b94419)
1ded186e9SIngo Weinhold /*
2ded186e9SIngo Weinhold  * Copyright 2009, Ingo Weinhold, ingo_weinhold@gmx.de.
3ded186e9SIngo Weinhold  * Distributed under the terms of the MIT License.
4ded186e9SIngo Weinhold  */
5ded186e9SIngo Weinhold #ifndef THREAD_MODEL_H
6ded186e9SIngo Weinhold #define THREAD_MODEL_H
7ded186e9SIngo Weinhold 
8*d8d4b902SIngo Weinhold 
9ded186e9SIngo Weinhold #include <string.h>
10ded186e9SIngo Weinhold 
11ded186e9SIngo Weinhold #include "Model.h"
12ded186e9SIngo Weinhold 
13ded186e9SIngo Weinhold 
14ded186e9SIngo Weinhold class ThreadModel {
15ded186e9SIngo Weinhold public:
16ded186e9SIngo Weinhold 			struct type_and_name;
17ded186e9SIngo Weinhold 			class WaitObjectGroup;
18ded186e9SIngo Weinhold 
19ded186e9SIngo Weinhold public:
20ded186e9SIngo Weinhold 								ThreadModel(Model* model,
21ded186e9SIngo Weinhold 									Model::Thread* thread);
22ded186e9SIngo Weinhold 								~ThreadModel();
23ded186e9SIngo Weinhold 
24ded186e9SIngo Weinhold 			Model*				GetModel() const	{ return fModel; }
25ded186e9SIngo Weinhold 			Model::Thread*		GetThread() const	{ return fThread; }
26ded186e9SIngo Weinhold 
27ded186e9SIngo Weinhold 			WaitObjectGroup*	AddWaitObjectGroup(
28ded186e9SIngo Weinhold 									const BObjectList<Model::ThreadWaitObject>&
29ded186e9SIngo Weinhold 										waitObjects,
30ded186e9SIngo Weinhold 									int32 start, int32 end);
31ded186e9SIngo Weinhold 	inline	int32				CountWaitObjectGroups() const;
32ded186e9SIngo Weinhold 	inline	WaitObjectGroup*	WaitObjectGroupAt(int32 index) const;
33ded186e9SIngo Weinhold 
348cd416d9SIngo Weinhold 			bool				AddSchedulingEvent(
358cd416d9SIngo Weinhold 									const system_profiler_event_header*
368cd416d9SIngo Weinhold 										eventHeader);
378cd416d9SIngo Weinhold 	inline	int32				CountSchedulingEvents() const;
388cd416d9SIngo Weinhold 	inline	const system_profiler_event_header* SchedulingEventAt(
398cd416d9SIngo Weinhold 									int32 index) const;
40*d8d4b902SIngo Weinhold 			int32				FindSchedulingEvent(nanotime_t time);
418cd416d9SIngo Weinhold 
42ded186e9SIngo Weinhold private:
43ded186e9SIngo Weinhold 			typedef BObjectList<WaitObjectGroup> WaitObjectGroupList;
448cd416d9SIngo Weinhold 			typedef BObjectList<const system_profiler_event_header> EventList;
45ded186e9SIngo Weinhold 
46ded186e9SIngo Weinhold private:
47ded186e9SIngo Weinhold 			Model*				fModel;
48ded186e9SIngo Weinhold 			Model::Thread*		fThread;
49ded186e9SIngo Weinhold 			WaitObjectGroupList	fWaitObjectGroups;
508cd416d9SIngo Weinhold 			EventList			fSchedulingEvents;
51ded186e9SIngo Weinhold };
52ded186e9SIngo Weinhold 
53ded186e9SIngo Weinhold 
54ded186e9SIngo Weinhold struct ThreadModel::type_and_name {
55ded186e9SIngo Weinhold 	uint32		type;
56ded186e9SIngo Weinhold 	const char*	name;
57ded186e9SIngo Weinhold };
58ded186e9SIngo Weinhold 
59ded186e9SIngo Weinhold 
60ded186e9SIngo Weinhold class ThreadModel::WaitObjectGroup {
61ded186e9SIngo Weinhold public:
62ded186e9SIngo Weinhold 								WaitObjectGroup(
63ded186e9SIngo Weinhold 									Model::ThreadWaitObject** waitObjects,
64ded186e9SIngo Weinhold 									int32 count);
65ded186e9SIngo Weinhold 								~WaitObjectGroup();
66ded186e9SIngo Weinhold 
67ded186e9SIngo Weinhold 	inline	uint32				Type() const;
68ded186e9SIngo Weinhold 	inline	const char*			Name() const;
69ded186e9SIngo Weinhold 
704ab2927dSIngo Weinhold 	inline	int64				Waits() const;
71*d8d4b902SIngo Weinhold 	inline	nanotime_t			TotalWaitTime() const;
724ab2927dSIngo Weinhold 
73ded186e9SIngo Weinhold 	inline	int32				CountWaitObjects() const;
74ded186e9SIngo Weinhold 	inline	Model::ThreadWaitObject* WaitObjectAt(int32 index) const;
75ded186e9SIngo Weinhold 
76ded186e9SIngo Weinhold 	static inline int			CompareByTypeName(const WaitObjectGroup* a,
77ded186e9SIngo Weinhold 									const WaitObjectGroup* b);
78ded186e9SIngo Weinhold 	static inline int			CompareWithTypeName(
79ded186e9SIngo Weinhold 									const type_and_name* key,
80ded186e9SIngo Weinhold 									const WaitObjectGroup* group);
81ded186e9SIngo Weinhold 
82ded186e9SIngo Weinhold private:
83ded186e9SIngo Weinhold 			Model::ThreadWaitObject** fWaitObjects;
84ded186e9SIngo Weinhold 			int32				fCount;
854ab2927dSIngo Weinhold 			int64				fWaits;
86*d8d4b902SIngo Weinhold 			nanotime_t			fTotalWaitTime;
87ded186e9SIngo Weinhold };
88ded186e9SIngo Weinhold 
89ded186e9SIngo Weinhold 
90ded186e9SIngo Weinhold // #pragma mark - ThreadModel
91ded186e9SIngo Weinhold 
92ded186e9SIngo Weinhold 
93ded186e9SIngo Weinhold int32
94ded186e9SIngo Weinhold ThreadModel::CountWaitObjectGroups() const
95ded186e9SIngo Weinhold {
96ded186e9SIngo Weinhold 	return fWaitObjectGroups.CountItems();
97ded186e9SIngo Weinhold }
98ded186e9SIngo Weinhold 
99ded186e9SIngo Weinhold 
100ded186e9SIngo Weinhold ThreadModel::WaitObjectGroup*
101ded186e9SIngo Weinhold ThreadModel::WaitObjectGroupAt(int32 index) const
102ded186e9SIngo Weinhold {
103ded186e9SIngo Weinhold 	return fWaitObjectGroups.ItemAt(index);
104ded186e9SIngo Weinhold }
105ded186e9SIngo Weinhold 
106ded186e9SIngo Weinhold 
1078cd416d9SIngo Weinhold int32
1088cd416d9SIngo Weinhold ThreadModel::CountSchedulingEvents() const
1098cd416d9SIngo Weinhold {
1108cd416d9SIngo Weinhold 	return fSchedulingEvents.CountItems();
1118cd416d9SIngo Weinhold }
1128cd416d9SIngo Weinhold 
1138cd416d9SIngo Weinhold 
1148cd416d9SIngo Weinhold const system_profiler_event_header*
1158cd416d9SIngo Weinhold ThreadModel::SchedulingEventAt(int32 index) const
1168cd416d9SIngo Weinhold {
1178cd416d9SIngo Weinhold 	return fSchedulingEvents.ItemAt(index);
1188cd416d9SIngo Weinhold }
1198cd416d9SIngo Weinhold 
1208cd416d9SIngo Weinhold 
121ded186e9SIngo Weinhold // #pragma mark - WaitObjectGroup
122ded186e9SIngo Weinhold 
123ded186e9SIngo Weinhold 
124ded186e9SIngo Weinhold uint32
125ded186e9SIngo Weinhold ThreadModel::WaitObjectGroup::Type() const
126ded186e9SIngo Weinhold {
127ded186e9SIngo Weinhold 	return fWaitObjects[0]->Type();
128ded186e9SIngo Weinhold }
129ded186e9SIngo Weinhold 
130ded186e9SIngo Weinhold 
131ded186e9SIngo Weinhold const char*
132ded186e9SIngo Weinhold ThreadModel::WaitObjectGroup::Name() const
133ded186e9SIngo Weinhold {
134ded186e9SIngo Weinhold 	return fWaitObjects[0]->Name();
135ded186e9SIngo Weinhold }
136ded186e9SIngo Weinhold 
137ded186e9SIngo Weinhold 
1384ab2927dSIngo Weinhold int64
1394ab2927dSIngo Weinhold ThreadModel::WaitObjectGroup::Waits() const
1404ab2927dSIngo Weinhold {
1414ab2927dSIngo Weinhold 	return fWaits;
1424ab2927dSIngo Weinhold }
1434ab2927dSIngo Weinhold 
1444ab2927dSIngo Weinhold 
145*d8d4b902SIngo Weinhold nanotime_t
1464ab2927dSIngo Weinhold ThreadModel::WaitObjectGroup::TotalWaitTime() const
1474ab2927dSIngo Weinhold {
1484ab2927dSIngo Weinhold 	return fTotalWaitTime;
1494ab2927dSIngo Weinhold }
1504ab2927dSIngo Weinhold 
1514ab2927dSIngo Weinhold 
152ded186e9SIngo Weinhold int32
153ded186e9SIngo Weinhold ThreadModel::WaitObjectGroup::CountWaitObjects() const
154ded186e9SIngo Weinhold {
155ded186e9SIngo Weinhold 	return fCount;
156ded186e9SIngo Weinhold }
157ded186e9SIngo Weinhold 
158ded186e9SIngo Weinhold 
159ded186e9SIngo Weinhold Model::ThreadWaitObject*
160ded186e9SIngo Weinhold ThreadModel::WaitObjectGroup::WaitObjectAt(int32 index) const
161ded186e9SIngo Weinhold {
16284b7a2d0SIngo Weinhold 	return index >= 0 && index < fCount ? fWaitObjects[index] : NULL;
163ded186e9SIngo Weinhold }
164ded186e9SIngo Weinhold 
165ded186e9SIngo Weinhold 
166ded186e9SIngo Weinhold /*static*/ int
167ded186e9SIngo Weinhold ThreadModel::WaitObjectGroup::CompareByTypeName(const WaitObjectGroup* a,
168ded186e9SIngo Weinhold 	const WaitObjectGroup* b)
169ded186e9SIngo Weinhold {
170ded186e9SIngo Weinhold 	type_and_name key;
171ded186e9SIngo Weinhold 	key.type = a->Type();
172ded186e9SIngo Weinhold 	key.name = a->Name();
173ded186e9SIngo Weinhold 	return CompareWithTypeName(&key, b);
174ded186e9SIngo Weinhold }
175ded186e9SIngo Weinhold 
176ded186e9SIngo Weinhold 
177ded186e9SIngo Weinhold /*static*/ int
178ded186e9SIngo Weinhold ThreadModel::WaitObjectGroup::CompareWithTypeName(const type_and_name* key,
179ded186e9SIngo Weinhold 	const WaitObjectGroup* group)
180ded186e9SIngo Weinhold {
181ded186e9SIngo Weinhold 	if (key->type != group->Type())
182ded186e9SIngo Weinhold 		return key->type < group->Type() ? -1 : 1;
183ded186e9SIngo Weinhold 
184ded186e9SIngo Weinhold 	return strcmp(key->name, group->Name());
185ded186e9SIngo Weinhold }
186ded186e9SIngo Weinhold 
187ded186e9SIngo Weinhold 
188ded186e9SIngo Weinhold #endif	// THREAD_MODEL_h
189