Serenity Operating System
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}