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