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

Kernel: Add jail semantics to methods iterating over thread lists

We should consider whether the selected Thread is within the same jail
or not.
Therefore let's make it clear to callers with jail semantics if a called
method checks if the desired Thread object is within the same jail.

As for Thread::for_each_* methods, currently nothing in the kernel
codebase needs iteration with consideration for jails, so the old
Thread::for_each* were simply renamed to include "ignoring_jails" suffix
in their names.
This commit is contained in:
Liav A 2023-09-09 18:09:42 +03:00 committed by Andrew Kaster
parent 3a55a1b592
commit cbaa3465a8
7 changed files with 36 additions and 17 deletions

View file

@ -71,7 +71,8 @@ public:
static ErrorOr<NonnullRefPtr<Thread>> create(NonnullRefPtr<Process>);
~Thread();
static RefPtr<Thread> from_tid(ThreadID);
static RefPtr<Thread> from_tid_ignoring_jails(ThreadID);
static RefPtr<Thread> from_tid_in_same_jail(ThreadID);
static void finalize_dying_threads();
ThreadID tid() const { return m_tid; }
@ -967,14 +968,14 @@ public:
ErrorOr<NonnullRefPtr<Thread>> clone(NonnullRefPtr<Process>);
template<IteratorFunction<Thread&> Callback>
static IterationDecision for_each_in_state(State, Callback);
static IterationDecision for_each_in_state_ignoring_jails(State, Callback);
template<IteratorFunction<Thread&> Callback>
static IterationDecision for_each(Callback);
static IterationDecision for_each_ignoring_jails(Callback);
template<VoidFunction<Thread&> Callback>
static IterationDecision for_each_in_state(State, Callback);
static IterationDecision for_each_in_state_ignoring_jails(State, Callback);
template<VoidFunction<Thread&> Callback>
static IterationDecision for_each(Callback);
static IterationDecision for_each_ignoring_jails(Callback);
static constexpr u32 default_kernel_stack_size = 65536;
static constexpr u32 default_userspace_stack_size = 1 * MiB;
@ -1264,7 +1265,7 @@ public:
AK_ENUM_BITWISE_OPERATORS(Thread::FileBlocker::BlockFlags);
template<IteratorFunction<Thread&> Callback>
inline IterationDecision Thread::for_each(Callback callback)
inline IterationDecision Thread::for_each_ignoring_jails(Callback callback)
{
return Thread::all_instances().with([&](auto& list) -> IterationDecision {
for (auto& thread : list) {
@ -1277,7 +1278,7 @@ inline IterationDecision Thread::for_each(Callback callback)
}
template<IteratorFunction<Thread&> Callback>
inline IterationDecision Thread::for_each_in_state(State state, Callback callback)
inline IterationDecision Thread::for_each_in_state_ignoring_jails(State state, Callback callback)
{
return Thread::all_instances().with([&](auto& list) -> IterationDecision {
for (auto& thread : list) {
@ -1292,7 +1293,7 @@ inline IterationDecision Thread::for_each_in_state(State state, Callback callbac
}
template<VoidFunction<Thread&> Callback>
inline IterationDecision Thread::for_each(Callback callback)
inline IterationDecision Thread::for_each_ignoring_jails(Callback callback)
{
return Thread::all_instances().with([&](auto& list) {
for (auto& thread : list) {
@ -1304,9 +1305,9 @@ inline IterationDecision Thread::for_each(Callback callback)
}
template<VoidFunction<Thread&> Callback>
inline IterationDecision Thread::for_each_in_state(State state, Callback callback)
inline IterationDecision Thread::for_each_in_state_ignoring_jails(State state, Callback callback)
{
return for_each_in_state(state, [&](auto& thread) {
return for_each_in_state_ignoring_jails(state, [&](auto& thread) {
callback(thread);
return IterationDecision::Continue;
});