/* * Copyright 2009, Ingo Weinhold, ingo_weinhold@gmx.de. * Distributed under the terms of the MIT License. */ #ifndef MAIN_MODEL_LOADER_H #define MAIN_MODEL_LOADER_H #include #include "AbstractModelLoader.h" #include "Model.h" class BDataIO; class BDebugEventInputStream; class DataSource; struct system_profiler_thread_added; class ModelLoader : public AbstractModelLoader { public: ModelLoader(DataSource* dataSource, const BMessenger& target, void* targetCookie); protected: ~ModelLoader(); public: Model* DetachModel(); protected: virtual status_t PrepareForLoading(); virtual status_t Load(); virtual void FinishLoading(bool success); private: // shorthands for the longish structure names typedef system_profiler_thread_enqueued_in_run_queue thread_enqueued_in_run_queue; typedef system_profiler_thread_removed_from_run_queue thread_removed_from_run_queue; typedef system_profiler_io_request_scheduled io_request_scheduled; typedef system_profiler_io_request_finished io_request_finished; typedef system_profiler_io_operation_started io_operation_started; typedef system_profiler_io_operation_finished io_operation_finished; struct CPUInfo; struct IOOperation; struct IORequest; struct IORequestHashDefinition; struct ExtendedThreadSchedulingState; struct ExtendedSchedulingState; typedef DoublyLinkedList IOOperationList; typedef DoublyLinkedList IORequestList; typedef BOpenHashTable IORequestTable; private: status_t _Load(); status_t _ReadDebugEvents(void** _eventData, size_t* _size); status_t _CreateDebugEventArray(void* eventData, size_t eventDataSize, system_profiler_event_header**& _events, size_t& _eventCount); status_t _ProcessEvent(uint32 event, uint32 cpu, const void* buffer, size_t size); bool _SetThreadEvents(); bool _SetThreadIORequests(); void _SetThreadIORequests(Model::Thread* thread, Model::IORequest** requests, size_t requestCount); inline void _UpdateLastEventTime(nanotime_t time); void _HandleTeamAdded( system_profiler_team_added* event); void _HandleTeamRemoved( system_profiler_team_removed* event); void _HandleTeamExec( system_profiler_team_exec* event); void _HandleThreadAdded( system_profiler_thread_added* event); void _HandleThreadRemoved( system_profiler_thread_removed* event); void _HandleThreadScheduled(uint32 cpu, system_profiler_thread_scheduled* event); void _HandleThreadEnqueuedInRunQueue( thread_enqueued_in_run_queue* event); void _HandleThreadRemovedFromRunQueue(uint32 cpu, thread_removed_from_run_queue* event); void _HandleWaitObjectInfo( system_profiler_wait_object_info* event); void _HandleIOSchedulerAdded( system_profiler_io_scheduler_added* event); void _HandleIORequestScheduled( io_request_scheduled* event); void _HandleIORequestFinished( io_request_finished* event); void _HandleIOOperationStarted( io_operation_started* event); void _HandleIOOperationFinished( io_operation_finished* event); ExtendedThreadSchedulingState* _AddThread( system_profiler_thread_added* event); ExtendedThreadSchedulingState* _AddUnknownThread( thread_id threadID); Model::Team* _AddUnknownTeam(); void _AddThreadWaitObject( ExtendedThreadSchedulingState* thread, uint32 type, addr_t object); void _AddIdleTime(uint32 cpu, nanotime_t time); private: Model* fModel; DataSource* fDataSource; CPUInfo* fCPUInfos; nanotime_t fBaseTime; ExtendedSchedulingState* fState; IORequestTable* fIORequests; uint32 fMaxCPUIndex; }; #endif // MAIN_MODEL_LOADER_H