1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-05-31 10:48:11 +00:00

Kernel: Convert process file descriptor table to a SpinlockProtected

Instead of manually locking in the various member functions of
Process::OpenFileDescriptions, simply wrap it in a SpinlockProtected.
This commit is contained in:
Andreas Kling 2022-01-29 01:22:28 +01:00
parent 93e90e16c3
commit 8ebec2938c
30 changed files with 257 additions and 190 deletions

View file

@ -139,17 +139,21 @@ ErrorOr<NonnullRefPtr<Process>> Process::try_create_user_process(RefPtr<Thread>&
auto name = TRY(KString::try_create(parts.last()));
auto process = TRY(Process::try_create(first_thread, move(name), uid, gid, ProcessID(0), false, VirtualFileSystem::the().root_custody(), nullptr, tty));
TRY(process->m_fds.try_resize(Process::OpenFileDescriptions::max_open()));
TRY(process->m_fds.with([&](auto& fds) -> ErrorOr<void> {
TRY(fds.try_resize(Process::OpenFileDescriptions::max_open()));
auto& device_to_use_as_tty = tty ? (CharacterDevice&)*tty : DeviceManagement::the().null_device();
auto description = TRY(device_to_use_as_tty.open(O_RDWR));
auto setup_description = [&process, &description](int fd) {
process->m_fds.m_fds_metadatas[fd].allocate();
process->m_fds[fd].set(*description);
};
setup_description(0);
setup_description(1);
setup_description(2);
auto& device_to_use_as_tty = tty ? (CharacterDevice&)*tty : DeviceManagement::the().null_device();
auto description = TRY(device_to_use_as_tty.open(O_RDWR));
auto setup_description = [&](int fd) {
fds.m_fds_metadatas[fd].allocate();
fds[fd].set(*description);
};
setup_description(0);
setup_description(1);
setup_description(2);
return {};
}));
Thread* new_main_thread = nullptr;
u32 prev_flags = 0;
@ -387,7 +391,6 @@ RefPtr<Process> Process::from_pid(ProcessID pid)
const Process::OpenFileDescriptionAndFlags* Process::OpenFileDescriptions::get_if_valid(size_t i) const
{
SpinlockLocker lock(m_fds_lock);
if (m_fds_metadatas.size() <= i)
return nullptr;
@ -398,7 +401,6 @@ const Process::OpenFileDescriptionAndFlags* Process::OpenFileDescriptions::get_i
}
Process::OpenFileDescriptionAndFlags* Process::OpenFileDescriptions::get_if_valid(size_t i)
{
SpinlockLocker lock(m_fds_lock);
if (m_fds_metadatas.size() <= i)
return nullptr;
@ -410,20 +412,18 @@ Process::OpenFileDescriptionAndFlags* Process::OpenFileDescriptions::get_if_vali
const Process::OpenFileDescriptionAndFlags& Process::OpenFileDescriptions::at(size_t i) const
{
SpinlockLocker lock(m_fds_lock);
VERIFY(m_fds_metadatas[i].is_allocated());
return m_fds_metadatas[i];
}
Process::OpenFileDescriptionAndFlags& Process::OpenFileDescriptions::at(size_t i)
{
SpinlockLocker lock(m_fds_lock);
VERIFY(m_fds_metadatas[i].is_allocated());
return m_fds_metadatas[i];
}
ErrorOr<NonnullRefPtr<OpenFileDescription>> Process::OpenFileDescriptions::open_file_description(int fd) const
{
SpinlockLocker lock(m_fds_lock);
if (fd < 0)
return EBADF;
if (static_cast<size_t>(fd) >= m_fds_metadatas.size())
@ -436,7 +436,6 @@ ErrorOr<NonnullRefPtr<OpenFileDescription>> Process::OpenFileDescriptions::open_
void Process::OpenFileDescriptions::enumerate(Function<void(const OpenFileDescriptionAndFlags&)> callback) const
{
SpinlockLocker lock(m_fds_lock);
for (auto const& file_description_metadata : m_fds_metadatas) {
callback(file_description_metadata);
}
@ -444,7 +443,6 @@ void Process::OpenFileDescriptions::enumerate(Function<void(const OpenFileDescri
void Process::OpenFileDescriptions::change_each(Function<void(OpenFileDescriptionAndFlags&)> callback)
{
SpinlockLocker lock(m_fds_lock);
for (auto& file_description_metadata : m_fds_metadatas) {
callback(file_description_metadata);
}
@ -462,7 +460,6 @@ size_t Process::OpenFileDescriptions::open_count() const
ErrorOr<Process::ScopedDescriptionAllocation> Process::OpenFileDescriptions::allocate(int first_candidate_fd)
{
SpinlockLocker lock(m_fds_lock);
for (size_t i = first_candidate_fd; i < max_open(); ++i) {
if (!m_fds_metadatas[i].is_allocated()) {
m_fds_metadatas[i].allocate();
@ -592,7 +589,7 @@ void Process::finalize()
if (m_alarm_timer)
TimerQueue::the().cancel_timer(m_alarm_timer.release_nonnull());
m_fds.clear();
m_fds.with([](auto& fds) { fds.clear(); });
m_tty = nullptr;
m_executable = nullptr;
m_cwd = nullptr;