mirror of
https://github.com/RGBCube/serenity
synced 2025-10-24 17:42:33 +00:00
This is done with 2 major steps:
1. Remove JailManagement singleton and use a structure that resembles
what we have with the Process object. This is required later for the
second step in this commit, but on its own, is a major change that
removes this clunky singleton that had no real usage by itself.
2. Use IntrusiveLists to keep references to Process objects in the same
Jail so it will be much more straightforward to iterate on this kind
of objects when needed. Previously we locked the entire Process list
and we did a simple pointer comparison to check if the checked
Process we iterate on is in the same Jail or not, which required
taking multiple Spinlocks in a very clumsy and heavyweight way.
59 lines
1.5 KiB
C++
59 lines
1.5 KiB
C++
/*
|
|
* Copyright (c) 2022-2023, Liav A. <liavalb@hotmail.co.il>
|
|
*
|
|
* SPDX-License-Identifier: BSD-2-Clause
|
|
*/
|
|
|
|
#pragma once
|
|
|
|
#include <AK/DistinctNumeric.h>
|
|
#include <AK/Error.h>
|
|
#include <AK/IntrusiveList.h>
|
|
#include <AK/IntrusiveListRelaxedConst.h>
|
|
#include <AK/OwnPtr.h>
|
|
#include <AK/RefPtr.h>
|
|
#include <AK/Try.h>
|
|
#include <AK/Types.h>
|
|
#include <Kernel/KString.h>
|
|
#include <Kernel/Library/LockRefPtr.h>
|
|
#include <Kernel/Locking/SpinlockProtected.h>
|
|
|
|
namespace Kernel {
|
|
|
|
class ProcessList;
|
|
|
|
AK_TYPEDEF_DISTINCT_ORDERED_ID(u64, JailIndex);
|
|
|
|
class Jail : public RefCounted<Jail> {
|
|
|
|
public:
|
|
NonnullRefPtr<ProcessList> process_list();
|
|
|
|
static LockRefPtr<Jail> find_by_index(JailIndex);
|
|
static ErrorOr<NonnullLockRefPtr<Jail>> create(NonnullOwnPtr<KString> name);
|
|
static ErrorOr<void> for_each_when_process_is_not_jailed(Function<ErrorOr<void>(Jail const&)> callback);
|
|
|
|
StringView name() const { return m_name->view(); }
|
|
JailIndex index() const { return m_index; }
|
|
|
|
void detach(Badge<Process>);
|
|
SpinlockProtected<size_t, LockRank::None>& attach_count() { return m_attach_count; }
|
|
|
|
private:
|
|
Jail(NonnullOwnPtr<KString>, JailIndex, NonnullRefPtr<ProcessList>);
|
|
|
|
NonnullOwnPtr<KString> m_name;
|
|
JailIndex const m_index;
|
|
|
|
IntrusiveListNode<Jail, NonnullLockRefPtr<Jail>> m_list_node;
|
|
|
|
public:
|
|
using List = IntrusiveListRelaxedConst<&Jail::m_list_node>;
|
|
|
|
private:
|
|
NonnullRefPtr<ProcessList> m_process_list;
|
|
|
|
SpinlockProtected<size_t, LockRank::None> m_attach_count { 0 };
|
|
};
|
|
|
|
}
|