Serenity Operating System
1/*
2 * Copyright (c) 2020, the SerenityOS developers.
3 *
4 * SPDX-License-Identifier: BSD-2-Clause
5 */
6
7#pragma once
8
9#include <AK/AtomicRefCounted.h>
10#include <AK/IntrusiveList.h>
11#include <Kernel/Forward.h>
12#include <Kernel/Library/LockWeakable.h>
13#include <Kernel/Locking/SpinlockProtected.h>
14#include <Kernel/UnixTypes.h>
15
16namespace Kernel {
17
18class ProcessGroup
19 : public AtomicRefCounted<ProcessGroup>
20 , public LockWeakable<ProcessGroup> {
21
22 AK_MAKE_NONMOVABLE(ProcessGroup);
23 AK_MAKE_NONCOPYABLE(ProcessGroup);
24
25public:
26 ~ProcessGroup();
27
28 static ErrorOr<NonnullLockRefPtr<ProcessGroup>> try_create(ProcessGroupID);
29 static ErrorOr<NonnullLockRefPtr<ProcessGroup>> try_find_or_create(ProcessGroupID);
30 static LockRefPtr<ProcessGroup> from_pgid(ProcessGroupID);
31
32 ProcessGroupID const& pgid() const { return m_pgid; }
33
34private:
35 ProcessGroup(ProcessGroupID pgid)
36 : m_pgid(pgid)
37 {
38 }
39
40 IntrusiveListNode<ProcessGroup> m_list_node;
41 ProcessGroupID m_pgid;
42
43public:
44 using List = IntrusiveList<&ProcessGroup::m_list_node>;
45};
46
47SpinlockProtected<ProcessGroup::List, LockRank::None>& process_groups();
48
49}