summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndreas Kling <kling@serenityos.org>2020-02-22 10:54:50 +0100
committerAndreas Kling <kling@serenityos.org>2020-02-22 10:54:50 +0100
commitd7a13dbaa7312ef83054478399c847ae3b4b6813 (patch)
tree00c15e33df3015b0244d310771241441f434cacc
parent647d0b9e0ff43060097bb772beb1ad1fd8e1aed2 (diff)
downloadserenity-d7a13dbaa7312ef83054478399c847ae3b4b6813.zip
Kernel: Reset profiling state on exec() (but keep it going)
We now log the new executable on exec() and throw away all the samples we've accumulated so far. But profiling keeps going.
-rw-r--r--Kernel/Process.cpp3
-rw-r--r--Kernel/Profiling.cpp6
-rw-r--r--Kernel/Profiling.h1
3 files changed, 10 insertions, 0 deletions
diff --git a/Kernel/Process.cpp b/Kernel/Process.cpp
index cf4e793249..db9040e0f7 100644
--- a/Kernel/Process.cpp
+++ b/Kernel/Process.cpp
@@ -1015,6 +1015,9 @@ int Process::do_exec(NonnullRefPtr<FileDescription> main_program_description, Ve
kprintf("Process %u (%s) exec'd %s @ %p\n", pid(), name().characters(), path.characters(), tss.eip);
#endif
+ if (is_profiling())
+ Profiling::did_exec(path);
+
new_main_thread->set_state(Thread::State::Skip1SchedulerPass);
big_lock().force_unlock_if_locked();
return 0;
diff --git a/Kernel/Profiling.cpp b/Kernel/Profiling.cpp
index 90cc9fa2d2..1c64512ba9 100644
--- a/Kernel/Profiling.cpp
+++ b/Kernel/Profiling.cpp
@@ -90,6 +90,12 @@ void stop()
s_process = nullptr;
}
+void did_exec(const String& new_executable_path)
+{
+ executable_path() = new_executable_path;
+ s_next_slot_index = 0;
+}
+
void for_each_sample(Function<void(Sample&)> callback)
{
for (size_t i = 0; i < s_next_slot_index; ++i) {
diff --git a/Kernel/Profiling.h b/Kernel/Profiling.h
index d94c81ece0..dc419a34a6 100644
--- a/Kernel/Profiling.h
+++ b/Kernel/Profiling.h
@@ -51,6 +51,7 @@ extern String& executable_path();
Sample& next_sample_slot();
void start(Process&);
void stop();
+void did_exec(const String& new_executable_path);
void for_each_sample(Function<void(Sample&)>);
}