Serenity Operating System
at master 60 lines 1.7 kB view raw
1/* 2 * Copyright (c) 2020, the SerenityOS developers. 3 * Copyright (c) 2021, Andreas Kling <kling@serenityos.org> 4 * 5 * SPDX-License-Identifier: BSD-2-Clause 6 */ 7 8#include <AK/Singleton.h> 9#include <Kernel/ProcessGroup.h> 10 11namespace Kernel { 12 13static Singleton<SpinlockProtected<ProcessGroup::List, LockRank::None>> s_process_groups; 14 15SpinlockProtected<ProcessGroup::List, LockRank::None>& process_groups() 16{ 17 return *s_process_groups; 18} 19 20ProcessGroup::~ProcessGroup() 21{ 22 process_groups().with([&](auto& groups) { 23 groups.remove(*this); 24 }); 25} 26 27ErrorOr<NonnullLockRefPtr<ProcessGroup>> ProcessGroup::try_create(ProcessGroupID pgid) 28{ 29 auto process_group = TRY(adopt_nonnull_lock_ref_or_enomem(new (nothrow) ProcessGroup(pgid))); 30 process_groups().with([&](auto& groups) { 31 groups.prepend(*process_group); 32 }); 33 return process_group; 34} 35 36ErrorOr<NonnullLockRefPtr<ProcessGroup>> ProcessGroup::try_find_or_create(ProcessGroupID pgid) 37{ 38 return process_groups().with([&](auto& groups) -> ErrorOr<NonnullLockRefPtr<ProcessGroup>> { 39 for (auto& group : groups) { 40 if (group.pgid() == pgid) 41 return group; 42 } 43 auto process_group = TRY(adopt_nonnull_lock_ref_or_enomem(new (nothrow) ProcessGroup(pgid))); 44 groups.prepend(*process_group); 45 return process_group; 46 }); 47} 48 49LockRefPtr<ProcessGroup> ProcessGroup::from_pgid(ProcessGroupID pgid) 50{ 51 return process_groups().with([&](auto& groups) -> LockRefPtr<ProcessGroup> { 52 for (auto& group : groups) { 53 if (group.pgid() == pgid) 54 return &group; 55 } 56 return nullptr; 57 }); 58} 59 60}