PatchworkOS  dbbdc99
A non-POSIX operating system.
Loading...
Searching...
No Matches
group.c
Go to the documentation of this file.
1#include <kernel/fs/dentry.h>
3#include <kernel/fs/vfs.h>
4#include <kernel/fs/vnode.h>
5#include <kernel/log/log.h>
6#include <kernel/proc/group.h>
9
10#include <errno.h>
11#include <kernel/sync/lock.h>
12#include <kernel/sync/rcu.h>
13#include <stdlib.h>
14
15static void group_free(group_t* group)
16{
17 if (group == NULL)
18 {
19 return;
20 }
21
23
24 free(group);
25}
26
27static group_t* group_new(void)
28{
29 group_t* group = malloc(sizeof(group_t));
30 if (group == NULL)
31 {
32 errno = ENOMEM;
33 return NULL;
34 }
35 ref_init(&group->ref, group_free);
36 list_init(&group->processes);
37 lock_init(&group->lock);
38
39 return group;
40}
41
43{
44 list_entry_init(&member->entry);
45 member->group = NULL;
46 lock_init(&member->lock);
47
48 if (group != NULL)
49 {
50 group_t* grp = group_get(group);
51 if (grp == NULL)
52 {
53 return ERR;
54 }
55
56 group_add(grp, member);
57 return 0;
58 }
59
60 group_t* newGroup = group_new();
61 if (newGroup == NULL)
62 {
63 return ERR;
64 }
65
66 lock_acquire(&newGroup->lock);
67 list_push_back(&newGroup->processes, &member->entry);
68 member->group = newGroup;
69 lock_release(&newGroup->lock);
70
71 return 0;
72}
73
75{
76 group_remove(member);
77}
78
80{
81 if (member == NULL)
82 {
83 errno = EINVAL;
84 return NULL;
85 }
86
87 LOCK_SCOPE(&member->lock);
88
89 if (member->group == NULL)
90 {
91 errno = ESRCH;
92 return NULL;
93 }
94
95 return REF(member->group);
96}
97
98void group_add(group_t* group, group_member_t* member)
99{
100 if (group == NULL || member == NULL)
101 {
102 return;
103 }
104
105 LOCK_SCOPE(&member->lock);
106 if (member->group != NULL)
107 {
108 lock_acquire(&member->group->lock);
109 list_remove(&member->entry);
110 lock_release(&member->group->lock);
111 UNREF(member->group);
112 member->group = NULL;
113 }
114
115 LOCK_SCOPE(&group->lock);
116 list_push_back(&group->processes, &member->entry);
117 member->group = REF(group);
118}
119
121{
122 if (member == NULL)
123 {
124 return;
125 }
126
127 LOCK_SCOPE(&member->lock);
128
129 if (member->group == NULL)
130 {
131 return;
132 }
133
134 lock_acquire(&member->group->lock);
135 list_remove(&member->entry);
136 lock_release(&member->group->lock);
137
138 UNREF(member->group);
139 member->group = NULL;
140}
141
142uint64_t group_send_note(group_member_t* member, const char* note)
143{
144 if (member == NULL || note == NULL)
145 {
146 errno = EINVAL;
147 return ERR;
148 }
149
150 group_t* group = member->group;
151 if (group == NULL)
152 {
153 errno = EINVAL;
154 return ERR;
155 }
156
157 LOCK_SCOPE(&group->lock);
158
159 process_t* process;
160 LIST_FOR_EACH(process, &group->processes, group.entry)
161 {
163
164 thread_t* thread = process_rcu_first_thread(process);
165 if (thread == NULL)
166 {
167 continue;
168 }
169
170 if (thread_send_note(thread, note) == ERR)
171 {
172 return ERR;
173 }
174 }
175
176 return 0;
177}
#define assert(expression)
Definition assert.h:29
static group_t * group_new(void)
Definition group.c:27
static void group_free(group_t *group)
Definition group.c:15
group_t * group_get(group_member_t *member)
Retrieve the group of a group member.
Definition group.c:79
uint64_t group_send_note(group_member_t *member, const char *note)
Sends a note to all processes in the group of the specified member.
Definition group.c:142
void group_member_deinit(group_member_t *member)
Deinitializes a group member.
Definition group.c:74
void group_add(group_t *group, group_member_t *member)
Joins a process to a specific group.
Definition group.c:98
uint64_t group_member_init(group_member_t *member, group_member_t *group)
Initializes a group member.
Definition group.c:42
void group_remove(group_member_t *member)
Removes a process from its group.
Definition group.c:120
static thread_t * process_rcu_first_thread(process_t *process)
Gets the first thread of a process.
Definition process.h:206
uint64_t thread_send_note(thread_t *thread, const char *string)
Send a note to a thread.
Definition thread.c:176
static void lock_init(lock_t *lock)
Initializes a lock.
Definition lock.h:79
#define LOCK_SCOPE(lock)
Acquires a lock for the reminder of the current scope.
Definition lock.h:58
static void lock_release(lock_t *lock)
Releases a lock.
Definition lock.h:175
static void lock_acquire(lock_t *lock)
Acquires a lock, blocking until it is available.
Definition lock.h:96
#define RCU_READ_SCOPE()
RCU read-side critical section for the current scope.
Definition rcu.h:94
#define REF(ptr)
Increment reference count.
Definition ref.h:82
static void ref_init(ref_t *ref, void *callback)
Initialize a reference counter.
Definition ref.h:130
#define UNREF(ptr)
Decrement reference count.
Definition ref.h:109
#define EINVAL
Invalid argument.
Definition errno.h:142
#define ESRCH
No such process.
Definition errno.h:47
#define ENOMEM
Out of memory.
Definition errno.h:92
#define errno
Error number variable.
Definition errno.h:27
#define LIST_FOR_EACH(elem, list, member)
Iterates over a list.
Definition list.h:58
static void list_remove(list_entry_t *entry)
Removes a list entry from its current list.
Definition list.h:290
static void list_push_back(list_t *list, list_entry_t *entry)
Pushes an entry to the end of the list.
Definition list.h:322
static bool list_is_empty(list_t *list)
Checks if a list is empty.
Definition list.h:210
static void list_entry_init(list_entry_t *entry)
Initializes a list entry.
Definition list.h:173
static void list_init(list_t *list)
Initializes a list.
Definition list.h:185
#define NULL
Pointer error value.
Definition NULL.h:25
#define ERR
Integer error value.
Definition ERR.h:17
__UINT64_TYPE__ uint64_t
Definition stdint.h:17
_PUBLIC void * malloc(size_t size)
Definition malloc.c:5
_PUBLIC void free(void *ptr)
Definition free.c:11
Group member structure.
Definition group.h:35
group_t * group
Definition group.h:37
list_entry_t entry
Definition group.h:36
lock_t lock
Definition group.h:38
Process group structure.
Definition group.h:46
ref_t ref
Definition group.h:47
list_t processes
Definition group.h:48
lock_t lock
Definition group.h:49
Process structure.
Definition process.h:76
Thread of execution structure.
Definition thread.h:61