/* * Copyright (c) 2020, the SerenityOS developers. * Copyright (c) 2021-2023, Andreas Kling * * SPDX-License-Identifier: BSD-2-Clause */ #include #include namespace Kernel { static Singleton> s_all_instances; SpinlockProtected& ProcessGroup::all_instances() { return s_all_instances; } ProcessGroup::~ProcessGroup() = default; ErrorOr> ProcessGroup::create_if_unused_pgid(ProcessGroupID pgid) { return all_instances().with([&](auto& all_instances) -> ErrorOr> { for (auto& process_group : all_instances) { if (process_group.pgid() == pgid) return EPERM; } auto process_group = TRY(adopt_nonnull_ref_or_enomem(new (nothrow) ProcessGroup(pgid))); all_instances.prepend(*process_group); return process_group; }); } ErrorOr> ProcessGroup::find_or_create(ProcessGroupID pgid) { return all_instances().with([&](auto& all_instances) -> ErrorOr> { for (auto& group : all_instances) { if (group.pgid() == pgid) return group; } auto process_group = TRY(adopt_nonnull_ref_or_enomem(new (nothrow) ProcessGroup(pgid))); all_instances.prepend(*process_group); return process_group; }); } RefPtr ProcessGroup::from_pgid(ProcessGroupID pgid) { return all_instances().with([&](auto& groups) -> RefPtr { for (auto& group : groups) { if (group.pgid() == pgid) return &group; } return nullptr; }); } }