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:
parent
93e90e16c3
commit
8ebec2938c
30 changed files with 257 additions and 190 deletions
|
@ -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;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue