We now log the new executable on exec() and throw away all the samples we've accumulated so far. But profiling keeps going.
@@ -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;
@@ -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) {
@@ -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&)>);