Serenity Operating System
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}