Serenity Operating System
at master 77 lines 2.1 kB view raw
1/* 2 * Copyright (c) 2018-2021, Andreas Kling <kling@serenityos.org> 3 * 4 * SPDX-License-Identifier: BSD-2-Clause 5 */ 6 7#pragma once 8 9#include "EventSerialNumber.h" 10#include <AK/HashMap.h> 11#include <AK/OwnPtr.h> 12#include <AK/Vector.h> 13#include <LibCore/MappedFile.h> 14#include <LibDebug/DebugInfo.h> 15#include <LibELF/Image.h> 16 17namespace Profiler { 18 19struct MappedObject { 20 NonnullRefPtr<Core::MappedFile> file; 21 ELF::Image elf; 22}; 23 24extern HashMap<DeprecatedString, OwnPtr<MappedObject>> g_mapped_object_cache; 25 26class LibraryMetadata { 27public: 28 struct Library { 29 FlatPtr base; 30 size_t size; 31 DeprecatedString name; 32 MappedObject* object { nullptr }; 33 // This is loaded lazily because we only need it in disassembly view 34 mutable OwnPtr<Debug::DebugInfo> debug_info; 35 36 DeprecatedString symbolicate(FlatPtr, u32* offset) const; 37 Debug::DebugInfo const& load_debug_info(FlatPtr base_address) const; 38 }; 39 40 void handle_mmap(FlatPtr base, size_t size, DeprecatedString const& name); 41 Library const* library_containing(FlatPtr) const; 42 43private: 44 mutable HashMap<DeprecatedString, NonnullOwnPtr<Library>> m_libraries; 45}; 46 47struct Thread { 48 pid_t tid; 49 EventSerialNumber start_valid; 50 EventSerialNumber end_valid; 51 52 bool valid_at(EventSerialNumber serial) const 53 { 54 return serial >= start_valid && (end_valid == EventSerialNumber {} || serial <= end_valid); 55 } 56}; 57 58struct Process { 59 pid_t pid {}; 60 DeprecatedString executable; 61 DeprecatedString basename; 62 HashMap<int, Vector<Thread>> threads {}; 63 LibraryMetadata library_metadata {}; 64 EventSerialNumber start_valid; 65 EventSerialNumber end_valid; 66 67 Thread* find_thread(pid_t tid, EventSerialNumber serial); 68 void handle_thread_create(pid_t tid, EventSerialNumber serial); 69 void handle_thread_exit(pid_t tid, EventSerialNumber serial); 70 71 bool valid_at(EventSerialNumber serial) const 72 { 73 return serial >= start_valid && (end_valid == EventSerialNumber {} || serial <= end_valid); 74 } 75}; 76 77}