mirror of
https://github.com/RGBCube/serenity
synced 2025-05-31 10:28:10 +00:00
Kernel: Use non-locking {Nonnull,}RefPtr for OpenFileDescription
This patch switches away from {Nonnull,}LockRefPtr to the non-locking smart pointers throughout the kernel. I've looked at the handful of places where these were being persisted and I don't see any race situations. Note that the process file descriptor table (Process::m_fds) was already guarded via MutexProtected.
This commit is contained in:
parent
36b0ecfe9e
commit
d1371d66f7
34 changed files with 82 additions and 80 deletions
|
@ -161,7 +161,7 @@ ErrorOr<size_t> ConsolePort::write(OpenFileDescription& desc, u64, UserOrKernelB
|
||||||
return total_bytes_copied;
|
return total_bytes_copied;
|
||||||
}
|
}
|
||||||
|
|
||||||
ErrorOr<NonnullLockRefPtr<OpenFileDescription>> ConsolePort::open(int options)
|
ErrorOr<NonnullRefPtr<OpenFileDescription>> ConsolePort::open(int options)
|
||||||
{
|
{
|
||||||
if (!m_open)
|
if (!m_open)
|
||||||
m_console.send_open_control_message(m_port, true);
|
m_console.send_open_control_message(m_port, true);
|
||||||
|
|
|
@ -44,7 +44,7 @@ private:
|
||||||
virtual ErrorOr<size_t> read(OpenFileDescription&, u64, UserOrKernelBuffer&, size_t) override;
|
virtual ErrorOr<size_t> read(OpenFileDescription&, u64, UserOrKernelBuffer&, size_t) override;
|
||||||
virtual bool can_write(OpenFileDescription const&, u64) const override;
|
virtual bool can_write(OpenFileDescription const&, u64) const override;
|
||||||
virtual ErrorOr<size_t> write(OpenFileDescription&, u64, UserOrKernelBuffer const&, size_t) override;
|
virtual ErrorOr<size_t> write(OpenFileDescription&, u64, UserOrKernelBuffer const&, size_t) override;
|
||||||
virtual ErrorOr<NonnullLockRefPtr<OpenFileDescription>> open(int options) override;
|
virtual ErrorOr<NonnullRefPtr<OpenFileDescription>> open(int options) override;
|
||||||
|
|
||||||
static unsigned next_device_id;
|
static unsigned next_device_id;
|
||||||
u16 m_receive_queue {};
|
u16 m_receive_queue {};
|
||||||
|
|
|
@ -74,7 +74,7 @@ ErrorOr<NonnullOwnPtr<Coredump>> Coredump::try_create(NonnullLockRefPtr<Process>
|
||||||
return adopt_nonnull_own_or_enomem(new (nothrow) Coredump(move(process), move(description), move(regions)));
|
return adopt_nonnull_own_or_enomem(new (nothrow) Coredump(move(process), move(description), move(regions)));
|
||||||
}
|
}
|
||||||
|
|
||||||
Coredump::Coredump(NonnullLockRefPtr<Process> process, NonnullLockRefPtr<OpenFileDescription> description, Vector<FlatRegionData> regions)
|
Coredump::Coredump(NonnullLockRefPtr<Process> process, NonnullRefPtr<OpenFileDescription> description, Vector<FlatRegionData> regions)
|
||||||
: m_process(move(process))
|
: m_process(move(process))
|
||||||
, m_description(move(description))
|
, m_description(move(description))
|
||||||
, m_regions(move(regions))
|
, m_regions(move(regions))
|
||||||
|
@ -93,7 +93,7 @@ Coredump::Coredump(NonnullLockRefPtr<Process> process, NonnullLockRefPtr<OpenFil
|
||||||
++m_num_program_headers; // +1 for NOTE segment
|
++m_num_program_headers; // +1 for NOTE segment
|
||||||
}
|
}
|
||||||
|
|
||||||
ErrorOr<NonnullLockRefPtr<OpenFileDescription>> Coredump::try_create_target_file(Process const& process, StringView output_path)
|
ErrorOr<NonnullRefPtr<OpenFileDescription>> Coredump::try_create_target_file(Process const& process, StringView output_path)
|
||||||
{
|
{
|
||||||
auto output_directory = KLexicalPath::dirname(output_path);
|
auto output_directory = KLexicalPath::dirname(output_path);
|
||||||
auto dump_directory = TRY(VirtualFileSystem::the().open_directory(Process::current().credentials(), output_directory, VirtualFileSystem::the().root_custody()));
|
auto dump_directory = TRY(VirtualFileSystem::the().open_directory(Process::current().credentials(), output_directory, VirtualFileSystem::the().root_custody()));
|
||||||
|
|
|
@ -65,8 +65,8 @@ private:
|
||||||
VirtualAddress m_vaddr;
|
VirtualAddress m_vaddr;
|
||||||
};
|
};
|
||||||
|
|
||||||
Coredump(NonnullLockRefPtr<Process>, NonnullLockRefPtr<OpenFileDescription>, Vector<FlatRegionData>);
|
Coredump(NonnullLockRefPtr<Process>, NonnullRefPtr<OpenFileDescription>, Vector<FlatRegionData>);
|
||||||
static ErrorOr<NonnullLockRefPtr<OpenFileDescription>> try_create_target_file(Process const&, StringView output_path);
|
static ErrorOr<NonnullRefPtr<OpenFileDescription>> try_create_target_file(Process const&, StringView output_path);
|
||||||
|
|
||||||
ErrorOr<void> write_elf_header();
|
ErrorOr<void> write_elf_header();
|
||||||
ErrorOr<void> write_program_headers(size_t notes_size);
|
ErrorOr<void> write_program_headers(size_t notes_size);
|
||||||
|
@ -80,7 +80,7 @@ private:
|
||||||
ErrorOr<void> create_notes_metadata_data(auto&) const;
|
ErrorOr<void> create_notes_metadata_data(auto&) const;
|
||||||
|
|
||||||
NonnullLockRefPtr<Process> m_process;
|
NonnullLockRefPtr<Process> m_process;
|
||||||
NonnullLockRefPtr<OpenFileDescription> m_description;
|
NonnullRefPtr<OpenFileDescription> m_description;
|
||||||
size_t m_num_program_headers { 0 };
|
size_t m_num_program_headers { 0 };
|
||||||
Vector<FlatRegionData> m_regions;
|
Vector<FlatRegionData> m_regions;
|
||||||
};
|
};
|
||||||
|
|
|
@ -59,7 +59,7 @@ ErrorOr<NonnullOwnPtr<KString>> Device::pseudo_path(OpenFileDescription const&)
|
||||||
return KString::formatted("device:{},{}", major(), minor());
|
return KString::formatted("device:{},{}", major(), minor());
|
||||||
}
|
}
|
||||||
|
|
||||||
ErrorOr<NonnullLockRefPtr<OpenFileDescription>> Device::open(int options)
|
ErrorOr<NonnullRefPtr<OpenFileDescription>> Device::open(int options)
|
||||||
{
|
{
|
||||||
TRY(Process::current().jail().with([&](auto const& my_jail) -> ErrorOr<void> {
|
TRY(Process::current().jail().with([&](auto const& my_jail) -> ErrorOr<void> {
|
||||||
if (my_jail && !is_openable_by_jailed_processes())
|
if (my_jail && !is_openable_by_jailed_processes())
|
||||||
|
|
|
@ -43,7 +43,7 @@ public:
|
||||||
MinorNumber minor() const { return m_minor; }
|
MinorNumber minor() const { return m_minor; }
|
||||||
|
|
||||||
virtual ErrorOr<NonnullOwnPtr<KString>> pseudo_path(OpenFileDescription const&) const override;
|
virtual ErrorOr<NonnullOwnPtr<KString>> pseudo_path(OpenFileDescription const&) const override;
|
||||||
virtual ErrorOr<NonnullLockRefPtr<OpenFileDescription>> open(int options) override;
|
virtual ErrorOr<NonnullRefPtr<OpenFileDescription>> open(int options) override;
|
||||||
|
|
||||||
UserID uid() const { return m_uid; }
|
UserID uid() const { return m_uid; }
|
||||||
GroupID gid() const { return m_gid; }
|
GroupID gid() const { return m_gid; }
|
||||||
|
|
|
@ -65,7 +65,7 @@ void KCOVDevice::free_process()
|
||||||
delete kcov_instance;
|
delete kcov_instance;
|
||||||
}
|
}
|
||||||
|
|
||||||
ErrorOr<NonnullLockRefPtr<OpenFileDescription>> KCOVDevice::open(int options)
|
ErrorOr<NonnullRefPtr<OpenFileDescription>> KCOVDevice::open(int options)
|
||||||
{
|
{
|
||||||
auto pid = Process::current().pid();
|
auto pid = Process::current().pid();
|
||||||
if (proc_instance->get(pid).has_value())
|
if (proc_instance->get(pid).has_value())
|
||||||
|
|
|
@ -23,7 +23,7 @@ public:
|
||||||
|
|
||||||
// ^File
|
// ^File
|
||||||
ErrorOr<NonnullLockRefPtr<Memory::VMObject>> vmobject_for_mmap(Process&, Memory::VirtualRange const&, u64& offset, bool shared) override;
|
ErrorOr<NonnullLockRefPtr<Memory::VMObject>> vmobject_for_mmap(Process&, Memory::VirtualRange const&, u64& offset, bool shared) override;
|
||||||
ErrorOr<NonnullLockRefPtr<OpenFileDescription>> open(int options) override;
|
virtual ErrorOr<NonnullRefPtr<OpenFileDescription>> open(int options) override;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
KCOVDevice();
|
KCOVDevice();
|
||||||
|
|
|
@ -19,7 +19,7 @@ UNMAP_AFTER_INIT NonnullLockRefPtr<SelfTTYDevice> SelfTTYDevice::must_create()
|
||||||
return self_tty_device_or_error.release_value();
|
return self_tty_device_or_error.release_value();
|
||||||
}
|
}
|
||||||
|
|
||||||
ErrorOr<NonnullLockRefPtr<OpenFileDescription>> SelfTTYDevice::open(int options)
|
ErrorOr<NonnullRefPtr<OpenFileDescription>> SelfTTYDevice::open(int options)
|
||||||
{
|
{
|
||||||
// Note: If for some odd reason we try to open this device (early on boot?)
|
// Note: If for some odd reason we try to open this device (early on boot?)
|
||||||
// while there's no current Process assigned, don't fail and return an error.
|
// while there's no current Process assigned, don't fail and return an error.
|
||||||
|
|
|
@ -24,7 +24,7 @@ private:
|
||||||
virtual bool is_openable_by_jailed_processes() const override { return true; }
|
virtual bool is_openable_by_jailed_processes() const override { return true; }
|
||||||
|
|
||||||
// ^CharacterDevice
|
// ^CharacterDevice
|
||||||
virtual ErrorOr<NonnullLockRefPtr<OpenFileDescription>> open(int options) override;
|
virtual ErrorOr<NonnullRefPtr<OpenFileDescription>> open(int options) override;
|
||||||
virtual ErrorOr<size_t> read(OpenFileDescription&, u64, UserOrKernelBuffer&, size_t) override;
|
virtual ErrorOr<size_t> read(OpenFileDescription&, u64, UserOrKernelBuffer&, size_t) override;
|
||||||
virtual ErrorOr<size_t> write(OpenFileDescription&, u64, UserOrKernelBuffer const&, size_t) override;
|
virtual ErrorOr<size_t> write(OpenFileDescription&, u64, UserOrKernelBuffer const&, size_t) override;
|
||||||
virtual bool can_read(OpenFileDescription const&, u64) const override;
|
virtual bool can_read(OpenFileDescription const&, u64) const override;
|
||||||
|
|
|
@ -22,7 +22,7 @@ ErrorOr<NonnullLockRefPtr<FIFO>> FIFO::try_create(UserID uid)
|
||||||
return adopt_nonnull_lock_ref_or_enomem(new (nothrow) FIFO(uid, move(buffer)));
|
return adopt_nonnull_lock_ref_or_enomem(new (nothrow) FIFO(uid, move(buffer)));
|
||||||
}
|
}
|
||||||
|
|
||||||
ErrorOr<NonnullLockRefPtr<OpenFileDescription>> FIFO::open_direction(FIFO::Direction direction)
|
ErrorOr<NonnullRefPtr<OpenFileDescription>> FIFO::open_direction(FIFO::Direction direction)
|
||||||
{
|
{
|
||||||
auto description = TRY(OpenFileDescription::try_create(*this));
|
auto description = TRY(OpenFileDescription::try_create(*this));
|
||||||
attach(direction);
|
attach(direction);
|
||||||
|
@ -30,7 +30,7 @@ ErrorOr<NonnullLockRefPtr<OpenFileDescription>> FIFO::open_direction(FIFO::Direc
|
||||||
return description;
|
return description;
|
||||||
}
|
}
|
||||||
|
|
||||||
ErrorOr<NonnullLockRefPtr<OpenFileDescription>> FIFO::open_direction_blocking(FIFO::Direction direction)
|
ErrorOr<NonnullRefPtr<OpenFileDescription>> FIFO::open_direction_blocking(FIFO::Direction direction)
|
||||||
{
|
{
|
||||||
MutexLocker locker(m_open_lock);
|
MutexLocker locker(m_open_lock);
|
||||||
|
|
||||||
|
|
|
@ -29,8 +29,8 @@ public:
|
||||||
|
|
||||||
UserID uid() const { return m_uid; }
|
UserID uid() const { return m_uid; }
|
||||||
|
|
||||||
ErrorOr<NonnullLockRefPtr<OpenFileDescription>> open_direction(Direction);
|
ErrorOr<NonnullRefPtr<OpenFileDescription>> open_direction(Direction);
|
||||||
ErrorOr<NonnullLockRefPtr<OpenFileDescription>> open_direction_blocking(Direction);
|
ErrorOr<NonnullRefPtr<OpenFileDescription>> open_direction_blocking(Direction);
|
||||||
|
|
||||||
#pragma GCC diagnostic push
|
#pragma GCC diagnostic push
|
||||||
#pragma GCC diagnostic ignored "-Woverloaded-virtual"
|
#pragma GCC diagnostic ignored "-Woverloaded-virtual"
|
||||||
|
|
|
@ -15,7 +15,7 @@ namespace Kernel {
|
||||||
File::File() = default;
|
File::File() = default;
|
||||||
File::~File() = default;
|
File::~File() = default;
|
||||||
|
|
||||||
ErrorOr<NonnullLockRefPtr<OpenFileDescription>> File::open(int options)
|
ErrorOr<NonnullRefPtr<OpenFileDescription>> File::open(int options)
|
||||||
{
|
{
|
||||||
auto description = OpenFileDescription::try_create(*this);
|
auto description = OpenFileDescription::try_create(*this);
|
||||||
if (!description.is_error()) {
|
if (!description.is_error()) {
|
||||||
|
|
|
@ -78,7 +78,7 @@ public:
|
||||||
virtual void will_be_destroyed() { }
|
virtual void will_be_destroyed() { }
|
||||||
virtual ~File();
|
virtual ~File();
|
||||||
|
|
||||||
virtual ErrorOr<NonnullLockRefPtr<OpenFileDescription>> open(int options);
|
virtual ErrorOr<NonnullRefPtr<OpenFileDescription>> open(int options);
|
||||||
virtual ErrorOr<void> close();
|
virtual ErrorOr<void> close();
|
||||||
|
|
||||||
virtual bool can_read(OpenFileDescription const&, u64) const = 0;
|
virtual bool can_read(OpenFileDescription const&, u64) const = 0;
|
||||||
|
|
|
@ -38,6 +38,6 @@ private:
|
||||||
virtual bool is_file_backed() const override { return true; }
|
virtual bool is_file_backed() const override { return true; }
|
||||||
|
|
||||||
IntrusiveListNode<FileBackedFileSystem> m_file_backed_file_system_node;
|
IntrusiveListNode<FileBackedFileSystem> m_file_backed_file_system_node;
|
||||||
mutable NonnullLockRefPtr<OpenFileDescription> m_file_description;
|
NonnullRefPtr<OpenFileDescription> m_file_description;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
|
@ -23,19 +23,19 @@
|
||||||
|
|
||||||
namespace Kernel {
|
namespace Kernel {
|
||||||
|
|
||||||
ErrorOr<NonnullLockRefPtr<OpenFileDescription>> OpenFileDescription::try_create(Custody& custody)
|
ErrorOr<NonnullRefPtr<OpenFileDescription>> OpenFileDescription::try_create(Custody& custody)
|
||||||
{
|
{
|
||||||
auto inode_file = TRY(InodeFile::create(custody.inode()));
|
auto inode_file = TRY(InodeFile::create(custody.inode()));
|
||||||
auto description = TRY(adopt_nonnull_lock_ref_or_enomem(new (nothrow) OpenFileDescription(move(inode_file))));
|
auto description = TRY(adopt_nonnull_ref_or_enomem(new (nothrow) OpenFileDescription(move(inode_file))));
|
||||||
|
|
||||||
description->m_state.with([&](auto& state) { state.custody = custody; });
|
description->m_state.with([&](auto& state) { state.custody = custody; });
|
||||||
TRY(description->attach());
|
TRY(description->attach());
|
||||||
return description;
|
return description;
|
||||||
}
|
}
|
||||||
|
|
||||||
ErrorOr<NonnullLockRefPtr<OpenFileDescription>> OpenFileDescription::try_create(File& file)
|
ErrorOr<NonnullRefPtr<OpenFileDescription>> OpenFileDescription::try_create(File& file)
|
||||||
{
|
{
|
||||||
auto description = TRY(adopt_nonnull_lock_ref_or_enomem(new (nothrow) OpenFileDescription(file)));
|
auto description = TRY(adopt_nonnull_ref_or_enomem(new (nothrow) OpenFileDescription(file)));
|
||||||
TRY(description->attach());
|
TRY(description->attach());
|
||||||
return description;
|
return description;
|
||||||
}
|
}
|
||||||
|
|
|
@ -26,8 +26,8 @@ public:
|
||||||
|
|
||||||
class OpenFileDescription final : public AtomicRefCounted<OpenFileDescription> {
|
class OpenFileDescription final : public AtomicRefCounted<OpenFileDescription> {
|
||||||
public:
|
public:
|
||||||
static ErrorOr<NonnullLockRefPtr<OpenFileDescription>> try_create(Custody&);
|
static ErrorOr<NonnullRefPtr<OpenFileDescription>> try_create(Custody&);
|
||||||
static ErrorOr<NonnullLockRefPtr<OpenFileDescription>> try_create(File&);
|
static ErrorOr<NonnullRefPtr<OpenFileDescription>> try_create(File&);
|
||||||
~OpenFileDescription();
|
~OpenFileDescription();
|
||||||
|
|
||||||
Thread::FileBlocker::BlockFlags should_unblock(Thread::FileBlocker::BlockFlags) const;
|
Thread::FileBlocker::BlockFlags should_unblock(Thread::FileBlocker::BlockFlags) const;
|
||||||
|
|
|
@ -262,7 +262,7 @@ ErrorOr<void> Process::procfs_get_fds_stats(KBufferBuilder& builder) const
|
||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
bool cloexec = file_description_metadata.flags() & FD_CLOEXEC;
|
bool cloexec = file_description_metadata.flags() & FD_CLOEXEC;
|
||||||
LockRefPtr<OpenFileDescription> description = file_description_metadata.description();
|
auto const* description = file_description_metadata.description();
|
||||||
auto description_object = TRY(array.add_object());
|
auto description_object = TRY(array.add_object());
|
||||||
TRY(description_object.add("fd"sv, count));
|
TRY(description_object.add("fd"sv, count));
|
||||||
// TODO: Better OOM handling.
|
// TODO: Better OOM handling.
|
||||||
|
@ -275,7 +275,7 @@ ErrorOr<void> Process::procfs_get_fds_stats(KBufferBuilder& builder) const
|
||||||
TRY(description_object.add("blocking"sv, description->is_blocking()));
|
TRY(description_object.add("blocking"sv, description->is_blocking()));
|
||||||
TRY(description_object.add("can_read"sv, description->can_read()));
|
TRY(description_object.add("can_read"sv, description->can_read()));
|
||||||
TRY(description_object.add("can_write"sv, description->can_write()));
|
TRY(description_object.add("can_write"sv, description->can_write()));
|
||||||
Inode* inode = description->inode();
|
Inode const* inode = description->inode();
|
||||||
if (inode != nullptr) {
|
if (inode != nullptr) {
|
||||||
auto inode_object = TRY(description_object.add_object("inode"sv));
|
auto inode_object = TRY(description_object.add_object("inode"sv));
|
||||||
TRY(inode_object.add("fsid"sv, inode->fsid().value()));
|
TRY(inode_object.add("fsid"sv, inode->fsid().value()));
|
||||||
|
|
|
@ -356,12 +356,12 @@ ErrorOr<NonnullLockRefPtr<FileBackedFileSystem>> VirtualFileSystem::find_already
|
||||||
}));
|
}));
|
||||||
}
|
}
|
||||||
|
|
||||||
ErrorOr<NonnullLockRefPtr<OpenFileDescription>> VirtualFileSystem::open(Credentials const& credentials, StringView path, int options, mode_t mode, Custody& base, Optional<UidAndGid> owner)
|
ErrorOr<NonnullRefPtr<OpenFileDescription>> VirtualFileSystem::open(Credentials const& credentials, StringView path, int options, mode_t mode, Custody& base, Optional<UidAndGid> owner)
|
||||||
{
|
{
|
||||||
return open(Process::current(), credentials, path, options, mode, base, owner);
|
return open(Process::current(), credentials, path, options, mode, base, owner);
|
||||||
}
|
}
|
||||||
|
|
||||||
ErrorOr<NonnullLockRefPtr<OpenFileDescription>> VirtualFileSystem::open(Process const& process, Credentials const& credentials, StringView path, int options, mode_t mode, Custody& base, Optional<UidAndGid> owner)
|
ErrorOr<NonnullRefPtr<OpenFileDescription>> VirtualFileSystem::open(Process const& process, Credentials const& credentials, StringView path, int options, mode_t mode, Custody& base, Optional<UidAndGid> owner)
|
||||||
{
|
{
|
||||||
if ((options & O_CREAT) && (options & O_DIRECTORY))
|
if ((options & O_CREAT) && (options & O_DIRECTORY))
|
||||||
return EINVAL;
|
return EINVAL;
|
||||||
|
@ -476,12 +476,12 @@ ErrorOr<void> VirtualFileSystem::mknod(Credentials const& credentials, StringVie
|
||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
ErrorOr<NonnullLockRefPtr<OpenFileDescription>> VirtualFileSystem::create(Credentials const& credentials, StringView path, int options, mode_t mode, Custody& parent_custody, Optional<UidAndGid> owner)
|
ErrorOr<NonnullRefPtr<OpenFileDescription>> VirtualFileSystem::create(Credentials const& credentials, StringView path, int options, mode_t mode, Custody& parent_custody, Optional<UidAndGid> owner)
|
||||||
{
|
{
|
||||||
return create(Process::current(), credentials, path, options, mode, parent_custody, owner);
|
return create(Process::current(), credentials, path, options, mode, parent_custody, owner);
|
||||||
}
|
}
|
||||||
|
|
||||||
ErrorOr<NonnullLockRefPtr<OpenFileDescription>> VirtualFileSystem::create(Process const& process, Credentials const& credentials, StringView path, int options, mode_t mode, Custody& parent_custody, Optional<UidAndGid> owner)
|
ErrorOr<NonnullRefPtr<OpenFileDescription>> VirtualFileSystem::create(Process const& process, Credentials const& credentials, StringView path, int options, mode_t mode, Custody& parent_custody, Optional<UidAndGid> owner)
|
||||||
{
|
{
|
||||||
auto basename = KLexicalPath::basename(path);
|
auto basename = KLexicalPath::basename(path);
|
||||||
auto parent_path = TRY(parent_custody.try_serialize_absolute_path());
|
auto parent_path = TRY(parent_custody.try_serialize_absolute_path());
|
||||||
|
|
|
@ -59,10 +59,10 @@ public:
|
||||||
ErrorOr<void> remount(Custody& mount_point, int new_flags);
|
ErrorOr<void> remount(Custody& mount_point, int new_flags);
|
||||||
ErrorOr<void> unmount(Custody& mount_point);
|
ErrorOr<void> unmount(Custody& mount_point);
|
||||||
|
|
||||||
ErrorOr<NonnullLockRefPtr<OpenFileDescription>> open(Credentials const&, StringView path, int options, mode_t mode, Custody& base, Optional<UidAndGid> = {});
|
ErrorOr<NonnullRefPtr<OpenFileDescription>> open(Credentials const&, StringView path, int options, mode_t mode, Custody& base, Optional<UidAndGid> = {});
|
||||||
ErrorOr<NonnullLockRefPtr<OpenFileDescription>> open(Process const&, Credentials const&, StringView path, int options, mode_t mode, Custody& base, Optional<UidAndGid> = {});
|
ErrorOr<NonnullRefPtr<OpenFileDescription>> open(Process const&, Credentials const&, StringView path, int options, mode_t mode, Custody& base, Optional<UidAndGid> = {});
|
||||||
ErrorOr<NonnullLockRefPtr<OpenFileDescription>> create(Credentials const&, StringView path, int options, mode_t mode, Custody& parent_custody, Optional<UidAndGid> = {});
|
ErrorOr<NonnullRefPtr<OpenFileDescription>> create(Credentials const&, StringView path, int options, mode_t mode, Custody& parent_custody, Optional<UidAndGid> = {});
|
||||||
ErrorOr<NonnullLockRefPtr<OpenFileDescription>> create(Process const&, Credentials const&, StringView path, int options, mode_t mode, Custody& parent_custody, Optional<UidAndGid> = {});
|
ErrorOr<NonnullRefPtr<OpenFileDescription>> create(Process const&, Credentials const&, StringView path, int options, mode_t mode, Custody& parent_custody, Optional<UidAndGid> = {});
|
||||||
ErrorOr<void> mkdir(Credentials const&, StringView path, mode_t mode, Custody& base);
|
ErrorOr<void> mkdir(Credentials const&, StringView path, mode_t mode, Custody& base);
|
||||||
ErrorOr<void> link(Credentials const&, StringView old_path, StringView new_path, Custody& base);
|
ErrorOr<void> link(Credentials const&, StringView old_path, StringView new_path, Custody& base);
|
||||||
ErrorOr<void> unlink(Credentials const&, StringView path, Custody& base);
|
ErrorOr<void> unlink(Credentials const&, StringView path, Custody& base);
|
||||||
|
|
|
@ -472,8 +472,9 @@ ErrorOr<void> LocalSocket::chown(Credentials const& credentials, OpenFileDescrip
|
||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
Vector<NonnullLockRefPtr<OpenFileDescription>>& LocalSocket::recvfd_queue_for(OpenFileDescription const& description)
|
Vector<NonnullRefPtr<OpenFileDescription>>& LocalSocket::recvfd_queue_for(OpenFileDescription const& description)
|
||||||
{
|
{
|
||||||
|
VERIFY(mutex().is_exclusively_locked_by_current_thread());
|
||||||
auto role = this->role(description);
|
auto role = this->role(description);
|
||||||
if (role == Role::Connected)
|
if (role == Role::Connected)
|
||||||
return m_fds_for_client;
|
return m_fds_for_client;
|
||||||
|
@ -482,8 +483,9 @@ Vector<NonnullLockRefPtr<OpenFileDescription>>& LocalSocket::recvfd_queue_for(Op
|
||||||
VERIFY_NOT_REACHED();
|
VERIFY_NOT_REACHED();
|
||||||
}
|
}
|
||||||
|
|
||||||
Vector<NonnullLockRefPtr<OpenFileDescription>>& LocalSocket::sendfd_queue_for(OpenFileDescription const& description)
|
Vector<NonnullRefPtr<OpenFileDescription>>& LocalSocket::sendfd_queue_for(OpenFileDescription const& description)
|
||||||
{
|
{
|
||||||
|
VERIFY(mutex().is_exclusively_locked_by_current_thread());
|
||||||
auto role = this->role(description);
|
auto role = this->role(description);
|
||||||
if (role == Role::Connected)
|
if (role == Role::Connected)
|
||||||
return m_fds_for_server;
|
return m_fds_for_server;
|
||||||
|
@ -492,7 +494,7 @@ Vector<NonnullLockRefPtr<OpenFileDescription>>& LocalSocket::sendfd_queue_for(Op
|
||||||
VERIFY_NOT_REACHED();
|
VERIFY_NOT_REACHED();
|
||||||
}
|
}
|
||||||
|
|
||||||
ErrorOr<void> LocalSocket::sendfd(OpenFileDescription const& socket_description, NonnullLockRefPtr<OpenFileDescription> passing_description)
|
ErrorOr<void> LocalSocket::sendfd(OpenFileDescription const& socket_description, NonnullRefPtr<OpenFileDescription> passing_description)
|
||||||
{
|
{
|
||||||
MutexLocker locker(mutex());
|
MutexLocker locker(mutex());
|
||||||
auto role = this->role(socket_description);
|
auto role = this->role(socket_description);
|
||||||
|
@ -506,7 +508,7 @@ ErrorOr<void> LocalSocket::sendfd(OpenFileDescription const& socket_description,
|
||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
ErrorOr<NonnullLockRefPtr<OpenFileDescription>> LocalSocket::recvfd(OpenFileDescription const& socket_description)
|
ErrorOr<NonnullRefPtr<OpenFileDescription>> LocalSocket::recvfd(OpenFileDescription const& socket_description)
|
||||||
{
|
{
|
||||||
MutexLocker locker(mutex());
|
MutexLocker locker(mutex());
|
||||||
auto role = this->role(socket_description);
|
auto role = this->role(socket_description);
|
||||||
|
@ -520,10 +522,10 @@ ErrorOr<NonnullLockRefPtr<OpenFileDescription>> LocalSocket::recvfd(OpenFileDesc
|
||||||
return queue.take_first();
|
return queue.take_first();
|
||||||
}
|
}
|
||||||
|
|
||||||
ErrorOr<Vector<NonnullLockRefPtr<OpenFileDescription>>> LocalSocket::recvfds(OpenFileDescription const& socket_description, int n)
|
ErrorOr<Vector<NonnullRefPtr<OpenFileDescription>>> LocalSocket::recvfds(OpenFileDescription const& socket_description, int n)
|
||||||
{
|
{
|
||||||
MutexLocker locker(mutex());
|
MutexLocker locker(mutex());
|
||||||
Vector<NonnullLockRefPtr<OpenFileDescription>> fds;
|
Vector<NonnullRefPtr<OpenFileDescription>> fds;
|
||||||
|
|
||||||
auto role = this->role(socket_description);
|
auto role = this->role(socket_description);
|
||||||
if (role != Role::Connected && role != Role::Accepted)
|
if (role != Role::Connected && role != Role::Accepted)
|
||||||
|
|
|
@ -15,8 +15,8 @@ namespace Kernel {
|
||||||
class OpenFileDescription;
|
class OpenFileDescription;
|
||||||
|
|
||||||
struct SocketPair {
|
struct SocketPair {
|
||||||
NonnullLockRefPtr<OpenFileDescription> description0;
|
NonnullRefPtr<OpenFileDescription> description0;
|
||||||
NonnullLockRefPtr<OpenFileDescription> description1;
|
NonnullRefPtr<OpenFileDescription> description1;
|
||||||
};
|
};
|
||||||
|
|
||||||
class LocalSocket final : public Socket {
|
class LocalSocket final : public Socket {
|
||||||
|
@ -26,9 +26,9 @@ public:
|
||||||
static ErrorOr<SocketPair> try_create_connected_pair(int type);
|
static ErrorOr<SocketPair> try_create_connected_pair(int type);
|
||||||
virtual ~LocalSocket() override;
|
virtual ~LocalSocket() override;
|
||||||
|
|
||||||
ErrorOr<void> sendfd(OpenFileDescription const& socket_description, NonnullLockRefPtr<OpenFileDescription> passing_description);
|
ErrorOr<void> sendfd(OpenFileDescription const& socket_description, NonnullRefPtr<OpenFileDescription> passing_description);
|
||||||
ErrorOr<NonnullLockRefPtr<OpenFileDescription>> recvfd(OpenFileDescription const& socket_description);
|
ErrorOr<NonnullRefPtr<OpenFileDescription>> recvfd(OpenFileDescription const& socket_description);
|
||||||
ErrorOr<Vector<NonnullLockRefPtr<OpenFileDescription>>> recvfds(OpenFileDescription const& socket_description, int n);
|
ErrorOr<Vector<NonnullRefPtr<OpenFileDescription>>> recvfds(OpenFileDescription const& socket_description, int n);
|
||||||
|
|
||||||
static void for_each(Function<void(LocalSocket const&)>);
|
static void for_each(Function<void(LocalSocket const&)>);
|
||||||
static ErrorOr<void> try_for_each(Function<ErrorOr<void>(LocalSocket const&)>);
|
static ErrorOr<void> try_for_each(Function<ErrorOr<void>(LocalSocket const&)>);
|
||||||
|
@ -60,8 +60,8 @@ private:
|
||||||
bool has_attached_peer(OpenFileDescription const&) const;
|
bool has_attached_peer(OpenFileDescription const&) const;
|
||||||
DoubleBuffer* receive_buffer_for(OpenFileDescription&);
|
DoubleBuffer* receive_buffer_for(OpenFileDescription&);
|
||||||
DoubleBuffer* send_buffer_for(OpenFileDescription&);
|
DoubleBuffer* send_buffer_for(OpenFileDescription&);
|
||||||
Vector<NonnullLockRefPtr<OpenFileDescription>>& sendfd_queue_for(OpenFileDescription const&);
|
Vector<NonnullRefPtr<OpenFileDescription>>& sendfd_queue_for(OpenFileDescription const&);
|
||||||
Vector<NonnullLockRefPtr<OpenFileDescription>>& recvfd_queue_for(OpenFileDescription const&);
|
Vector<NonnullRefPtr<OpenFileDescription>>& recvfd_queue_for(OpenFileDescription const&);
|
||||||
|
|
||||||
void set_connect_side_role(Role connect_side_role, bool force_evaluate_block_conditions = false)
|
void set_connect_side_role(Role connect_side_role, bool force_evaluate_block_conditions = false)
|
||||||
{
|
{
|
||||||
|
@ -101,8 +101,8 @@ private:
|
||||||
NonnullOwnPtr<DoubleBuffer> m_for_client;
|
NonnullOwnPtr<DoubleBuffer> m_for_client;
|
||||||
NonnullOwnPtr<DoubleBuffer> m_for_server;
|
NonnullOwnPtr<DoubleBuffer> m_for_server;
|
||||||
|
|
||||||
Vector<NonnullLockRefPtr<OpenFileDescription>> m_fds_for_client;
|
Vector<NonnullRefPtr<OpenFileDescription>> m_fds_for_client;
|
||||||
Vector<NonnullLockRefPtr<OpenFileDescription>> m_fds_for_server;
|
Vector<NonnullRefPtr<OpenFileDescription>> m_fds_for_server;
|
||||||
|
|
||||||
IntrusiveListNode<LocalSocket> m_list_node;
|
IntrusiveListNode<LocalSocket> m_list_node;
|
||||||
|
|
||||||
|
|
|
@ -570,13 +570,13 @@ Process::OpenFileDescriptionAndFlags& Process::OpenFileDescriptions::at(size_t i
|
||||||
return m_fds_metadatas[i];
|
return m_fds_metadatas[i];
|
||||||
}
|
}
|
||||||
|
|
||||||
ErrorOr<NonnullLockRefPtr<OpenFileDescription>> Process::OpenFileDescriptions::open_file_description(int fd) const
|
ErrorOr<NonnullRefPtr<OpenFileDescription>> Process::OpenFileDescriptions::open_file_description(int fd) const
|
||||||
{
|
{
|
||||||
if (fd < 0)
|
if (fd < 0)
|
||||||
return EBADF;
|
return EBADF;
|
||||||
if (static_cast<size_t>(fd) >= m_fds_metadatas.size())
|
if (static_cast<size_t>(fd) >= m_fds_metadatas.size())
|
||||||
return EBADF;
|
return EBADF;
|
||||||
LockRefPtr description = m_fds_metadatas[fd].description();
|
RefPtr description = m_fds_metadatas[fd].description();
|
||||||
if (!description)
|
if (!description)
|
||||||
return EBADF;
|
return EBADF;
|
||||||
return description.release_nonnull();
|
return description.release_nonnull();
|
||||||
|
@ -706,7 +706,7 @@ ErrorOr<void> Process::dump_perfcore()
|
||||||
return KString::formatted("{}_{}", process_name->view(), pid().value());
|
return KString::formatted("{}_{}", process_name->view(), pid().value());
|
||||||
}));
|
}));
|
||||||
auto perfcore_filename = TRY(KString::formatted("{}.profile", base_filename));
|
auto perfcore_filename = TRY(KString::formatted("{}.profile", base_filename));
|
||||||
LockRefPtr<OpenFileDescription> description;
|
RefPtr<OpenFileDescription> description;
|
||||||
auto credentials = this->credentials();
|
auto credentials = this->credentials();
|
||||||
for (size_t attempt = 1; attempt <= 10; ++attempt) {
|
for (size_t attempt = 1; attempt <= 10; ++attempt) {
|
||||||
auto description_or_error = VirtualFileSystem::the().open(*this, credentials, perfcore_filename->view(), O_CREAT | O_EXCL, 0400, current_directory(), UidAndGid { 0, 0 });
|
auto description_or_error = VirtualFileSystem::the().open(*this, credentials, perfcore_filename->view(), O_CREAT | O_EXCL, 0400, current_directory(), UidAndGid { 0, 0 });
|
||||||
|
@ -945,7 +945,7 @@ void Process::OpenFileDescriptionAndFlags::clear()
|
||||||
m_flags = 0;
|
m_flags = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Process::OpenFileDescriptionAndFlags::set(NonnullLockRefPtr<OpenFileDescription>&& description, u32 flags)
|
void Process::OpenFileDescriptionAndFlags::set(NonnullRefPtr<OpenFileDescription> description, u32 flags)
|
||||||
{
|
{
|
||||||
m_description = move(description);
|
m_description = move(description);
|
||||||
m_flags = flags;
|
m_flags = flags;
|
||||||
|
|
|
@ -475,7 +475,7 @@ public:
|
||||||
|
|
||||||
ErrorOr<void> exec(NonnullOwnPtr<KString> path, Vector<NonnullOwnPtr<KString>> arguments, Vector<NonnullOwnPtr<KString>> environment, Thread*& new_main_thread, InterruptsState& previous_interrupts_state, int recursion_depth = 0);
|
ErrorOr<void> exec(NonnullOwnPtr<KString> path, Vector<NonnullOwnPtr<KString>> arguments, Vector<NonnullOwnPtr<KString>> environment, Thread*& new_main_thread, InterruptsState& previous_interrupts_state, int recursion_depth = 0);
|
||||||
|
|
||||||
ErrorOr<LoadResult> load(NonnullLockRefPtr<OpenFileDescription> main_program_description, LockRefPtr<OpenFileDescription> interpreter_description, const ElfW(Ehdr) & main_program_header);
|
ErrorOr<LoadResult> load(NonnullRefPtr<OpenFileDescription> main_program_description, RefPtr<OpenFileDescription> interpreter_description, const ElfW(Ehdr) & main_program_header);
|
||||||
|
|
||||||
void terminate_due_to_signal(u8 signal);
|
void terminate_due_to_signal(u8 signal);
|
||||||
ErrorOr<void> send_signal(u8 signal, Process* sender);
|
ErrorOr<void> send_signal(u8 signal, Process* sender);
|
||||||
|
@ -605,12 +605,12 @@ private:
|
||||||
bool create_perf_events_buffer_if_needed();
|
bool create_perf_events_buffer_if_needed();
|
||||||
void delete_perf_events_buffer();
|
void delete_perf_events_buffer();
|
||||||
|
|
||||||
ErrorOr<void> do_exec(NonnullLockRefPtr<OpenFileDescription> main_program_description, Vector<NonnullOwnPtr<KString>> arguments, Vector<NonnullOwnPtr<KString>> environment, LockRefPtr<OpenFileDescription> interpreter_description, Thread*& new_main_thread, InterruptsState& previous_interrupts_state, const ElfW(Ehdr) & main_program_header);
|
ErrorOr<void> do_exec(NonnullRefPtr<OpenFileDescription> main_program_description, Vector<NonnullOwnPtr<KString>> arguments, Vector<NonnullOwnPtr<KString>> environment, RefPtr<OpenFileDescription> interpreter_description, Thread*& new_main_thread, InterruptsState& previous_interrupts_state, const ElfW(Ehdr) & main_program_header);
|
||||||
ErrorOr<FlatPtr> do_write(OpenFileDescription&, UserOrKernelBuffer const&, size_t, Optional<off_t> = {});
|
ErrorOr<FlatPtr> do_write(OpenFileDescription&, UserOrKernelBuffer const&, size_t, Optional<off_t> = {});
|
||||||
|
|
||||||
ErrorOr<FlatPtr> do_statvfs(FileSystem const& path, Custody const*, statvfs* buf);
|
ErrorOr<FlatPtr> do_statvfs(FileSystem const& path, Custody const*, statvfs* buf);
|
||||||
|
|
||||||
ErrorOr<LockRefPtr<OpenFileDescription>> find_elf_interpreter_for_executable(StringView path, ElfW(Ehdr) const& main_executable_header, size_t main_executable_header_size, size_t file_size);
|
ErrorOr<RefPtr<OpenFileDescription>> find_elf_interpreter_for_executable(StringView path, ElfW(Ehdr) const& main_executable_header, size_t main_executable_header_size, size_t file_size);
|
||||||
|
|
||||||
ErrorOr<void> do_kill(Process&, int signal);
|
ErrorOr<void> do_kill(Process&, int signal);
|
||||||
ErrorOr<void> do_killpg(ProcessGroupID pgrp, int signal);
|
ErrorOr<void> do_killpg(ProcessGroupID pgrp, int signal);
|
||||||
|
@ -704,10 +704,10 @@ public:
|
||||||
void set_flags(u32 flags) { m_flags = flags; }
|
void set_flags(u32 flags) { m_flags = flags; }
|
||||||
|
|
||||||
void clear();
|
void clear();
|
||||||
void set(NonnullLockRefPtr<OpenFileDescription>&&, u32 flags = 0);
|
void set(NonnullRefPtr<OpenFileDescription>, u32 flags = 0);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
LockRefPtr<OpenFileDescription> m_description;
|
RefPtr<OpenFileDescription> m_description;
|
||||||
bool m_is_allocated { false };
|
bool m_is_allocated { false };
|
||||||
u32 m_flags { 0 };
|
u32 m_flags { 0 };
|
||||||
};
|
};
|
||||||
|
@ -758,7 +758,7 @@ public:
|
||||||
m_fds_metadatas.clear();
|
m_fds_metadatas.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
ErrorOr<NonnullLockRefPtr<OpenFileDescription>> open_file_description(int fd) const;
|
ErrorOr<NonnullRefPtr<OpenFileDescription>> open_file_description(int fd) const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
static constexpr size_t s_max_open_file_descriptors { FD_SETSIZE };
|
static constexpr size_t s_max_open_file_descriptors { FD_SETSIZE };
|
||||||
|
@ -808,12 +808,12 @@ public:
|
||||||
MutexProtected<OpenFileDescriptions>& fds() { return m_fds; }
|
MutexProtected<OpenFileDescriptions>& fds() { return m_fds; }
|
||||||
MutexProtected<OpenFileDescriptions> const& fds() const { return m_fds; }
|
MutexProtected<OpenFileDescriptions> const& fds() const { return m_fds; }
|
||||||
|
|
||||||
ErrorOr<NonnullLockRefPtr<OpenFileDescription>> open_file_description(int fd)
|
ErrorOr<NonnullRefPtr<OpenFileDescription>> open_file_description(int fd)
|
||||||
{
|
{
|
||||||
return m_fds.with_shared([fd](auto& fds) { return fds.open_file_description(fd); });
|
return m_fds.with_shared([fd](auto& fds) { return fds.open_file_description(fd); });
|
||||||
}
|
}
|
||||||
|
|
||||||
ErrorOr<NonnullLockRefPtr<OpenFileDescription>> open_file_description(int fd) const
|
ErrorOr<NonnullRefPtr<OpenFileDescription>> open_file_description(int fd) const
|
||||||
{
|
{
|
||||||
return m_fds.with_shared([fd](auto& fds) { return fds.open_file_description(fd); });
|
return m_fds.with_shared([fd](auto& fds) { return fds.open_file_description(fd); });
|
||||||
}
|
}
|
||||||
|
|
|
@ -38,7 +38,7 @@ ErrorOr<FlatPtr> Process::sys$anon_create(size_t size, int options)
|
||||||
|
|
||||||
return m_fds.with_exclusive([&](auto& fds) -> ErrorOr<FlatPtr> {
|
return m_fds.with_exclusive([&](auto& fds) -> ErrorOr<FlatPtr> {
|
||||||
auto new_fd = TRY(fds.allocate());
|
auto new_fd = TRY(fds.allocate());
|
||||||
fds[new_fd.fd].set(move(description), fd_flags);
|
fds[new_fd.fd].set(description, fd_flags);
|
||||||
return new_fd.fd;
|
return new_fd.fd;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
|
@ -423,8 +423,8 @@ static ErrorOr<LoadResult> load_elf_object(NonnullOwnPtr<Memory::AddressSpace> n
|
||||||
}
|
}
|
||||||
|
|
||||||
ErrorOr<LoadResult>
|
ErrorOr<LoadResult>
|
||||||
Process::load(NonnullLockRefPtr<OpenFileDescription> main_program_description,
|
Process::load(NonnullRefPtr<OpenFileDescription> main_program_description,
|
||||||
LockRefPtr<OpenFileDescription> interpreter_description, const ElfW(Ehdr) & main_program_header)
|
RefPtr<OpenFileDescription> interpreter_description, const ElfW(Ehdr) & main_program_header)
|
||||||
{
|
{
|
||||||
auto new_space = TRY(Memory::AddressSpace::try_create(nullptr));
|
auto new_space = TRY(Memory::AddressSpace::try_create(nullptr));
|
||||||
|
|
||||||
|
@ -471,8 +471,8 @@ void Process::clear_signal_handlers_for_exec()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ErrorOr<void> Process::do_exec(NonnullLockRefPtr<OpenFileDescription> main_program_description, Vector<NonnullOwnPtr<KString>> arguments, Vector<NonnullOwnPtr<KString>> environment,
|
ErrorOr<void> Process::do_exec(NonnullRefPtr<OpenFileDescription> main_program_description, Vector<NonnullOwnPtr<KString>> arguments, Vector<NonnullOwnPtr<KString>> environment,
|
||||||
LockRefPtr<OpenFileDescription> interpreter_description, Thread*& new_main_thread, InterruptsState& previous_interrupts_state, const ElfW(Ehdr) & main_program_header)
|
RefPtr<OpenFileDescription> interpreter_description, Thread*& new_main_thread, InterruptsState& previous_interrupts_state, const ElfW(Ehdr) & main_program_header)
|
||||||
{
|
{
|
||||||
VERIFY(is_user_process());
|
VERIFY(is_user_process());
|
||||||
VERIFY(!Processor::in_critical());
|
VERIFY(!Processor::in_critical());
|
||||||
|
@ -784,7 +784,7 @@ static ErrorOr<Vector<NonnullOwnPtr<KString>>> find_shebang_interpreter_for_exec
|
||||||
return ENOEXEC;
|
return ENOEXEC;
|
||||||
}
|
}
|
||||||
|
|
||||||
ErrorOr<LockRefPtr<OpenFileDescription>> Process::find_elf_interpreter_for_executable(StringView path, ElfW(Ehdr) const& main_executable_header, size_t main_executable_header_size, size_t file_size)
|
ErrorOr<RefPtr<OpenFileDescription>> Process::find_elf_interpreter_for_executable(StringView path, ElfW(Ehdr) const& main_executable_header, size_t main_executable_header_size, size_t file_size)
|
||||||
{
|
{
|
||||||
// Not using ErrorOr here because we'll want to do the same thing in userspace in the RTLD
|
// Not using ErrorOr here because we'll want to do the same thing in userspace in the RTLD
|
||||||
StringBuilder interpreter_path_builder;
|
StringBuilder interpreter_path_builder;
|
||||||
|
|
|
@ -196,7 +196,7 @@ ErrorOr<FlatPtr> Process::sys$mmap(Userspace<Syscall::SC_mmap_params const*> use
|
||||||
|
|
||||||
Memory::Region* region = nullptr;
|
Memory::Region* region = nullptr;
|
||||||
|
|
||||||
LockRefPtr<OpenFileDescription> description;
|
RefPtr<OpenFileDescription> description;
|
||||||
LockRefPtr<Memory::VMObject> vmobject;
|
LockRefPtr<Memory::VMObject> vmobject;
|
||||||
u64 used_offset = 0;
|
u64 used_offset = 0;
|
||||||
|
|
||||||
|
|
|
@ -51,7 +51,7 @@ ErrorOr<FlatPtr> Process::sys$poll(Userspace<Syscall::SC_poll_params const*> use
|
||||||
TRY(m_fds.with_shared([&](auto& fds) -> ErrorOr<void> {
|
TRY(m_fds.with_shared([&](auto& fds) -> ErrorOr<void> {
|
||||||
for (size_t i = 0; i < params.nfds; i++) {
|
for (size_t i = 0; i < params.nfds; i++) {
|
||||||
auto& pfd = fds_copy[i];
|
auto& pfd = fds_copy[i];
|
||||||
LockRefPtr<OpenFileDescription> description;
|
RefPtr<OpenFileDescription> description;
|
||||||
auto description_or_error = fds.open_file_description(pfd.fd);
|
auto description_or_error = fds.open_file_description(pfd.fd);
|
||||||
if (!description_or_error.is_error())
|
if (!description_or_error.is_error())
|
||||||
description = description_or_error.release_value();
|
description = description_or_error.release_value();
|
||||||
|
|
|
@ -13,7 +13,7 @@ namespace Kernel {
|
||||||
|
|
||||||
using BlockFlags = Thread::FileBlocker::BlockFlags;
|
using BlockFlags = Thread::FileBlocker::BlockFlags;
|
||||||
|
|
||||||
static ErrorOr<NonnullLockRefPtr<OpenFileDescription>> open_readable_file_description(auto& fds, int fd)
|
static ErrorOr<NonnullRefPtr<OpenFileDescription>> open_readable_file_description(auto& fds, int fd)
|
||||||
{
|
{
|
||||||
auto description = TRY(fds.with_shared([&](auto& fds) { return fds.open_file_description(fd); }));
|
auto description = TRY(fds.with_shared([&](auto& fds) { return fds.open_file_description(fd); }));
|
||||||
if (!description->is_readable())
|
if (!description->is_readable())
|
||||||
|
|
|
@ -20,7 +20,7 @@ namespace Kernel {
|
||||||
TRY(require_promise(Pledge::unix)); \
|
TRY(require_promise(Pledge::unix)); \
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
static void setup_socket_fd(Process::OpenFileDescriptions& fds, int fd, NonnullLockRefPtr<OpenFileDescription> description, int type)
|
static void setup_socket_fd(Process::OpenFileDescriptions& fds, int fd, NonnullRefPtr<OpenFileDescription> description, int type)
|
||||||
{
|
{
|
||||||
description->set_readable(true);
|
description->set_readable(true);
|
||||||
description->set_writable(true);
|
description->set_writable(true);
|
||||||
|
@ -94,7 +94,7 @@ ErrorOr<FlatPtr> Process::sys$accept4(Userspace<Syscall::SC_accept4_params const
|
||||||
TRY(copy_from_user(&address_size, static_ptr_cast<socklen_t const*>(user_address_size)));
|
TRY(copy_from_user(&address_size, static_ptr_cast<socklen_t const*>(user_address_size)));
|
||||||
|
|
||||||
ScopedDescriptionAllocation fd_allocation;
|
ScopedDescriptionAllocation fd_allocation;
|
||||||
LockRefPtr<OpenFileDescription> accepting_socket_description;
|
RefPtr<OpenFileDescription> accepting_socket_description;
|
||||||
|
|
||||||
TRY(m_fds.with_exclusive([&](auto& fds) -> ErrorOr<void> {
|
TRY(m_fds.with_exclusive([&](auto& fds) -> ErrorOr<void> {
|
||||||
fd_allocation = TRY(fds.allocate());
|
fd_allocation = TRY(fds.allocate());
|
||||||
|
|
|
@ -38,7 +38,7 @@ ErrorOr<FlatPtr> Process::sys$utimensat(Userspace<Syscall::SC_utimensat_params c
|
||||||
}
|
}
|
||||||
|
|
||||||
OwnPtr<KString> path;
|
OwnPtr<KString> path;
|
||||||
LockRefPtr<OpenFileDescription> description;
|
RefPtr<OpenFileDescription> description;
|
||||||
RefPtr<Custody> base;
|
RefPtr<Custody> base;
|
||||||
|
|
||||||
auto path_or_error = get_syscall_path_argument(params.path);
|
auto path_or_error = get_syscall_path_argument(params.path);
|
||||||
|
|
|
@ -38,9 +38,9 @@ UNMAP_AFTER_INIT void PTYMultiplexer::initialize()
|
||||||
MUST(the().after_inserting());
|
MUST(the().after_inserting());
|
||||||
}
|
}
|
||||||
|
|
||||||
ErrorOr<NonnullLockRefPtr<OpenFileDescription>> PTYMultiplexer::open(int options)
|
ErrorOr<NonnullRefPtr<OpenFileDescription>> PTYMultiplexer::open(int options)
|
||||||
{
|
{
|
||||||
return m_freelist.with([&](auto& freelist) -> ErrorOr<NonnullLockRefPtr<OpenFileDescription>> {
|
return m_freelist.with([&](auto& freelist) -> ErrorOr<NonnullRefPtr<OpenFileDescription>> {
|
||||||
if (freelist.is_empty())
|
if (freelist.is_empty())
|
||||||
return EBUSY;
|
return EBUSY;
|
||||||
|
|
||||||
|
|
|
@ -22,7 +22,7 @@ public:
|
||||||
static PTYMultiplexer& the();
|
static PTYMultiplexer& the();
|
||||||
|
|
||||||
// ^CharacterDevice
|
// ^CharacterDevice
|
||||||
virtual ErrorOr<NonnullLockRefPtr<OpenFileDescription>> open(int options) override;
|
virtual ErrorOr<NonnullRefPtr<OpenFileDescription>> open(int options) override;
|
||||||
virtual ErrorOr<size_t> read(OpenFileDescription&, u64, UserOrKernelBuffer&, size_t) override { return 0; }
|
virtual ErrorOr<size_t> read(OpenFileDescription&, u64, UserOrKernelBuffer&, size_t) override { return 0; }
|
||||||
virtual ErrorOr<size_t> write(OpenFileDescription&, u64, UserOrKernelBuffer const&, size_t) override { return 0; }
|
virtual ErrorOr<size_t> write(OpenFileDescription&, u64, UserOrKernelBuffer const&, size_t) override { return 0; }
|
||||||
virtual bool can_read(OpenFileDescription const&, u64) const override { return true; }
|
virtual bool can_read(OpenFileDescription const&, u64) const override { return true; }
|
||||||
|
|
|
@ -519,7 +519,7 @@ public:
|
||||||
explicit OpenFileDescriptionBlocker(OpenFileDescription&, BlockFlags, BlockFlags&);
|
explicit OpenFileDescriptionBlocker(OpenFileDescription&, BlockFlags, BlockFlags&);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
NonnullLockRefPtr<OpenFileDescription> m_blocked_description;
|
NonnullRefPtr<OpenFileDescription> m_blocked_description;
|
||||||
const BlockFlags m_flags;
|
const BlockFlags m_flags;
|
||||||
BlockFlags& m_unblocked_flags;
|
BlockFlags& m_unblocked_flags;
|
||||||
bool m_did_unblock { false };
|
bool m_did_unblock { false };
|
||||||
|
@ -577,7 +577,7 @@ public:
|
||||||
class SelectBlocker final : public FileBlocker {
|
class SelectBlocker final : public FileBlocker {
|
||||||
public:
|
public:
|
||||||
struct FDInfo {
|
struct FDInfo {
|
||||||
LockRefPtr<OpenFileDescription> description;
|
RefPtr<OpenFileDescription> description;
|
||||||
BlockFlags block_flags { BlockFlags::None };
|
BlockFlags block_flags { BlockFlags::None };
|
||||||
BlockFlags unblocked_flags { BlockFlags::None };
|
BlockFlags unblocked_flags { BlockFlags::None };
|
||||||
};
|
};
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue