|
1 | 1 | /*
|
2 | 2 | * Copyright (c) 2020, the SerenityOS developers.
|
3 |
| - * Copyright (c) 2021, Andreas Kling <kling@serenityos.org> |
| 3 | + * Copyright (c) 2021-2023, Andreas Kling <kling@serenityos.org> |
4 | 4 | *
|
5 | 5 | * SPDX-License-Identifier: BSD-2-Clause
|
6 | 6 | */
|
|
10 | 10 |
|
11 | 11 | namespace Kernel {
|
12 | 12 |
|
13 |
| -static Singleton<SpinlockProtected<ProcessGroup::List, LockRank::None>> s_process_groups; |
| 13 | +static Singleton<SpinlockProtected<ProcessGroup::AllInstancesList, LockRank::None>> s_all_instances; |
14 | 14 |
|
15 |
| -SpinlockProtected<ProcessGroup::List, LockRank::None>& process_groups() |
| 15 | +SpinlockProtected<ProcessGroup::AllInstancesList, LockRank::None>& ProcessGroup::all_instances() |
16 | 16 | {
|
17 |
| - return *s_process_groups; |
| 17 | + return s_all_instances; |
18 | 18 | }
|
19 | 19 |
|
20 |
| -ProcessGroup::~ProcessGroup() |
21 |
| -{ |
22 |
| - process_groups().with([&](auto& groups) { |
23 |
| - groups.remove(*this); |
24 |
| - }); |
25 |
| -} |
| 20 | +ProcessGroup::~ProcessGroup() = default; |
26 | 21 |
|
27 |
| -ErrorOr<NonnullRefPtr<ProcessGroup>> ProcessGroup::create(ProcessGroupID pgid) |
| 22 | +ErrorOr<NonnullRefPtr<ProcessGroup>> ProcessGroup::create_if_unused_pgid(ProcessGroupID pgid) |
28 | 23 | {
|
29 |
| - auto process_group = TRY(adopt_nonnull_ref_or_enomem(new (nothrow) ProcessGroup(pgid))); |
30 |
| - process_groups().with([&](auto& groups) { |
31 |
| - groups.prepend(*process_group); |
| 24 | + return all_instances().with([&](auto& all_instances) -> ErrorOr<NonnullRefPtr<ProcessGroup>> { |
| 25 | + for (auto& process_group : all_instances) { |
| 26 | + if (process_group.pgid() == pgid) |
| 27 | + return EPERM; |
| 28 | + } |
| 29 | + auto process_group = TRY(adopt_nonnull_ref_or_enomem(new (nothrow) ProcessGroup(pgid))); |
| 30 | + all_instances.prepend(*process_group); |
| 31 | + return process_group; |
32 | 32 | });
|
33 |
| - return process_group; |
34 | 33 | }
|
35 | 34 |
|
36 | 35 | ErrorOr<NonnullRefPtr<ProcessGroup>> ProcessGroup::find_or_create(ProcessGroupID pgid)
|
37 | 36 | {
|
38 |
| - return process_groups().with([&](auto& groups) -> ErrorOr<NonnullRefPtr<ProcessGroup>> { |
39 |
| - for (auto& group : groups) { |
| 37 | + return all_instances().with([&](auto& all_instances) -> ErrorOr<NonnullRefPtr<ProcessGroup>> { |
| 38 | + for (auto& group : all_instances) { |
40 | 39 | if (group.pgid() == pgid)
|
41 | 40 | return group;
|
42 | 41 | }
|
43 | 42 | auto process_group = TRY(adopt_nonnull_ref_or_enomem(new (nothrow) ProcessGroup(pgid)));
|
44 |
| - groups.prepend(*process_group); |
| 43 | + all_instances.prepend(*process_group); |
45 | 44 | return process_group;
|
46 | 45 | });
|
47 | 46 | }
|
48 | 47 |
|
49 | 48 | RefPtr<ProcessGroup> ProcessGroup::from_pgid(ProcessGroupID pgid)
|
50 | 49 | {
|
51 |
| - return process_groups().with([&](auto& groups) -> RefPtr<ProcessGroup> { |
| 50 | + return all_instances().with([&](auto& groups) -> RefPtr<ProcessGroup> { |
52 | 51 | for (auto& group : groups) {
|
53 | 52 | if (group.pgid() == pgid)
|
54 | 53 | return &group;
|
|
0 commit comments