ProcessGroup.cpp 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  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. #include <AK/Singleton.h>
  8. #include <Kernel/ProcessGroup.h>
  9. namespace Kernel {
  10. static Singleton<SpinlockProtected<ProcessGroup::List>> s_process_groups;
  11. SpinlockProtected<ProcessGroup::List>& process_groups()
  12. {
  13. return *s_process_groups;
  14. }
  15. ProcessGroup::~ProcessGroup()
  16. {
  17. process_groups().with([&](auto& groups) {
  18. groups.remove(*this);
  19. });
  20. }
  21. ErrorOr<NonnullRefPtr<ProcessGroup>> ProcessGroup::try_create(ProcessGroupID pgid)
  22. {
  23. auto process_group = TRY(adopt_nonnull_ref_or_enomem(new (nothrow) ProcessGroup(pgid)));
  24. process_groups().with([&](auto& groups) {
  25. groups.prepend(*process_group);
  26. });
  27. return process_group;
  28. }
  29. ErrorOr<NonnullRefPtr<ProcessGroup>> ProcessGroup::try_find_or_create(ProcessGroupID pgid)
  30. {
  31. return process_groups().with([&](auto& groups) -> ErrorOr<NonnullRefPtr<ProcessGroup>> {
  32. for (auto& group : groups) {
  33. if (group.pgid() == pgid)
  34. return group;
  35. }
  36. auto process_group = TRY(adopt_nonnull_ref_or_enomem(new (nothrow) ProcessGroup(pgid)));
  37. groups.prepend(*process_group);
  38. return process_group;
  39. });
  40. }
  41. RefPtr<ProcessGroup> ProcessGroup::from_pgid(ProcessGroupID pgid)
  42. {
  43. return process_groups().with([&](auto& groups) -> RefPtr<ProcessGroup> {
  44. for (auto& group : groups) {
  45. if (group.pgid() == pgid)
  46. return &group;
  47. }
  48. return nullptr;
  49. });
  50. }
  51. }