summaryrefslogtreecommitdiff
path: root/kernel/sched/scheduler.c
diff options
context:
space:
mode:
authorAnton Kling <anton@kling.gg>2024-12-11 14:56:58 +0100
committerAnton Kling <anton@kling.gg>2024-12-12 15:48:19 +0100
commitbc828883c51c3c0f35872019f4db632e4ce82dc5 (patch)
treec4217493e69e4e8078aa403ca23f71fdf598f826 /kernel/sched/scheduler.c
parentb343b0dae5aa51b5bd9b195936358341a943b3b2 (diff)
procfs: Add a procfs
Userland can now interface with processes by writing/reading from `/proc/<pid>/<entry>` It can send signals, for example `echo 15 > /proc/1/signal`
Diffstat (limited to 'kernel/sched/scheduler.c')
-rw-r--r--kernel/sched/scheduler.c12
1 files changed, 12 insertions, 0 deletions
diff --git a/kernel/sched/scheduler.c b/kernel/sched/scheduler.c
index d0452fd..1b36e8a 100644
--- a/kernel/sched/scheduler.c
+++ b/kernel/sched/scheduler.c
@@ -98,6 +98,7 @@ process_t *create_process(process_t *p, u32 esp, u32 eip) {
if (!r) {
return NULL;
}
+ r->reference_count = 1;
r->tcb = kcalloc(1, sizeof(struct TCB));
if (!r->tcb) {
kfree(r);
@@ -147,6 +148,9 @@ process_t *create_process(process_t *p, u32 esp, u32 eip) {
r->cr3 = get_active_pagedirectory();
}
r->parent = p;
+ if (p) {
+ p->reference_count++;
+ }
r->tcb->CR3 = r->cr3->physical_address;
@@ -205,6 +209,14 @@ void free_process(process_t *p) {
mmu_free_pagedirectory(p->cr3);
}
+void process_remove_reference(process_t *p) {
+ assert(0 != p->reference_count);
+ p->reference_count--;
+ if (0 == p->reference_count) {
+ kfree(p);
+ }
+}
+
void exit_process(process_t *p, int status) {
assert(p->pid != 1);
disable_interrupts();