From 1fade1aa9e2006ae39983d6d8a4610f318115d24 Mon Sep 17 00:00:00 2001 From: Bananymous Date: Fri, 24 Mar 2023 01:43:53 +0200 Subject: [PATCH] Kernel: Process::working_directory() is now thread safe I realized you cannot return a stirng view and it to be thread safe --- kernel/include/kernel/Process.h | 4 ++-- kernel/kernel/Process.cpp | 8 +++++++- kernel/kernel/Shell.cpp | 2 +- 3 files changed, 10 insertions(+), 4 deletions(-) diff --git a/kernel/include/kernel/Process.h b/kernel/include/kernel/Process.h index b483023e..e3ffe061 100644 --- a/kernel/include/kernel/Process.h +++ b/kernel/include/kernel/Process.h @@ -32,7 +32,7 @@ namespace Kernel BAN::ErrorOr read(int, void*, size_t); BAN::ErrorOr creat(BAN::StringView, mode_t); - BAN::StringView working_directory() const { return m_working_directory; } + BAN::String working_directory() const; BAN::ErrorOr set_working_directory(BAN::StringView); Inode& inode_for_fd(int); @@ -63,7 +63,7 @@ namespace Kernel mutable RecursiveSpinLock m_lock; - pid_t m_pid = 0; + const pid_t m_pid = 0; BAN::String m_working_directory; BAN::Vector> m_threads; diff --git a/kernel/kernel/Process.cpp b/kernel/kernel/Process.cpp index 4649aa44..e28827a6 100644 --- a/kernel/kernel/Process.cpp +++ b/kernel/kernel/Process.cpp @@ -21,7 +21,7 @@ namespace Kernel BAN::ErrorOr Process::add_thread(entry_t entry, void* data) { LockGuard _(m_lock); - + auto thread = TRY(Thread::create(entry, data, this)); TRY(m_threads.push_back(thread)); if (auto res = Scheduler::get().add_thread(thread); res.is_error()) @@ -104,6 +104,12 @@ namespace Kernel return *open_file_description(fd).inode; } + BAN::String Process::working_directory() const + { + LockGuard _(m_lock); + return m_working_directory; + } + BAN::ErrorOr Process::set_working_directory(BAN::StringView path) { LockGuard _(m_lock); diff --git a/kernel/kernel/Shell.cpp b/kernel/kernel/Shell.cpp index aa675cd3..17550dd4 100644 --- a/kernel/kernel/Shell.cpp +++ b/kernel/kernel/Shell.cpp @@ -356,7 +356,7 @@ argument_done: if (arguments.size() > 2) return BAN::Error::from_c_string("usage: 'ls [path]'"); - BAN::StringView path = (arguments.size() == 2) ? arguments[1].sv() : Process::current()->working_directory(); + BAN::String path = (arguments.size() == 2) ? arguments[1] : Process::current()->working_directory(); int fd = TRY(Process::current()->open(path, O_RDONLY)); BAN::ScopeGuard _([fd] { MUST(Process::current()->close(fd)); });