ProcessGroup.cpp 1.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. /*
  2. * Copyright (c) 2020, the SerenityOS developers.
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #include "ProcessGroup.h"
  7. namespace Kernel {
  8. RecursiveSpinLock g_process_groups_lock;
  9. InlineLinkedList<ProcessGroup>* g_process_groups;
  10. ProcessGroup::~ProcessGroup()
  11. {
  12. ScopedSpinLock lock(g_process_groups_lock);
  13. g_process_groups->remove(this);
  14. }
  15. NonnullRefPtr<ProcessGroup> ProcessGroup::create(ProcessGroupID pgid)
  16. {
  17. auto process_group = adopt_ref(*new ProcessGroup(pgid));
  18. {
  19. ScopedSpinLock lock(g_process_groups_lock);
  20. g_process_groups->prepend(process_group);
  21. }
  22. return process_group;
  23. }
  24. NonnullRefPtr<ProcessGroup> ProcessGroup::find_or_create(ProcessGroupID pgid)
  25. {
  26. ScopedSpinLock lock(g_process_groups_lock);
  27. if (auto existing = from_pgid(pgid))
  28. return existing.release_nonnull();
  29. return create(pgid);
  30. }
  31. RefPtr<ProcessGroup> ProcessGroup::from_pgid(ProcessGroupID pgid)
  32. {
  33. ScopedSpinLock lock(g_process_groups_lock);
  34. for (auto& group : *g_process_groups) {
  35. if (group.pgid() == pgid)
  36. return &group;
  37. }
  38. return nullptr;
  39. }
  40. }