diff --git a/Kernel/Tasks/PerformanceEventBuffer.cpp b/Kernel/Tasks/PerformanceEventBuffer.cpp index f0087e1ae45..12d0bdafcf4 100644 --- a/Kernel/Tasks/PerformanceEventBuffer.cpp +++ b/Kernel/Tasks/PerformanceEventBuffer.cpp @@ -1,5 +1,6 @@ /* * Copyright (c) 2020-2021, Andreas Kling + * Copyright (c) 2023, Jakub Berkop * * SPDX-License-Identifier: BSD-2-Clause */ @@ -192,19 +193,24 @@ template ErrorOr PerformanceEventBuffer::to_json_impl(Serializer& object) const { { - auto strings = TRY(object.add_array("strings"sv)); + auto strings_object = TRY(object.add_array("strings"sv)); Vector strings_sorted_by_index; - TRY(strings_sorted_by_index.try_resize(m_strings.size())); - for (auto& entry : m_strings) { - strings_sorted_by_index[entry.value] = const_cast(entry.key.ptr()); - } + TRY(m_strings.with([&](auto& strings) -> ErrorOr { + TRY(strings_sorted_by_index.try_resize(strings.size())); - for (size_t i = 0; i < m_strings.size(); i++) { - TRY(strings.add(strings_sorted_by_index[i]->view())); - } + for (auto& entry : strings) { + strings_sorted_by_index[entry.value] = const_cast(entry.key.ptr()); + } - TRY(strings.finish()); + for (size_t i = 0; i < strings.size(); i++) { + TRY(strings_object.add(strings_sorted_by_index[i]->view())); + } + + return {}; + })); + + TRY(strings_object.finish()); } auto current_process_credentials = Process::current().credentials(); @@ -367,14 +373,16 @@ ErrorOr PerformanceEventBuffer::add_process(Process const& process, Proces ErrorOr PerformanceEventBuffer::register_string(NonnullOwnPtr string) { - auto it = m_strings.find(string); - if (it != m_strings.end()) { - return it->value; - } + return m_strings.with([&](auto& m_strings) -> ErrorOr { + auto it = m_strings.find(string); + if (it != m_strings.end()) { + return it->value; + } - auto new_index = m_strings.size(); - TRY(m_strings.try_set(move(string), move(new_index))); - return new_index; + auto new_index = m_strings.size(); + TRY(m_strings.try_set(move(string), move(new_index))); + return new_index; + }); } } diff --git a/Kernel/Tasks/PerformanceEventBuffer.h b/Kernel/Tasks/PerformanceEventBuffer.h index 74233424be9..53eaaf4ee0f 100644 --- a/Kernel/Tasks/PerformanceEventBuffer.h +++ b/Kernel/Tasks/PerformanceEventBuffer.h @@ -1,5 +1,6 @@ /* * Copyright (c) 2020, Andreas Kling + * Copyright (c) 2023, Jakub Berkop * * SPDX-License-Identifier: BSD-2-Clause */ @@ -145,7 +146,7 @@ private: size_t m_count { 0 }; NonnullOwnPtr m_buffer; - HashMap, size_t> m_strings; + SpinlockProtected, size_t>, LockRank::None> m_strings; }; extern bool g_profiling_all_threads;