ProcessGroup.cpp 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  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<SpinLockProtectedValue<ProcessGroup::List>> s_process_groups;
  11. SpinLockProtectedValue<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. RefPtr<ProcessGroup> ProcessGroup::create(ProcessGroupID pgid)
  22. {
  23. auto process_group = adopt_ref_if_nonnull(new (nothrow) ProcessGroup(pgid));
  24. if (!process_group)
  25. return {};
  26. process_groups().with([&](auto& groups) {
  27. groups.prepend(*process_group);
  28. });
  29. return process_group;
  30. }
  31. RefPtr<ProcessGroup> ProcessGroup::find_or_create(ProcessGroupID pgid)
  32. {
  33. return process_groups().with([&](auto& groups) -> RefPtr<ProcessGroup> {
  34. for (auto& group : groups) {
  35. if (group.pgid() == pgid)
  36. return &group;
  37. }
  38. auto process_group = adopt_ref_if_nonnull(new (nothrow) ProcessGroup(pgid));
  39. if (process_group)
  40. groups.prepend(*process_group);
  41. return process_group;
  42. });
  43. }
  44. RefPtr<ProcessGroup> ProcessGroup::from_pgid(ProcessGroupID pgid)
  45. {
  46. return process_groups().with([&](auto& groups) -> RefPtr<ProcessGroup> {
  47. for (auto& group : groups) {
  48. if (group.pgid() == pgid)
  49. return &group;
  50. }
  51. return nullptr;
  52. });
  53. }
  54. }