diff options
author | Anton Kling <anton@kling.gg> | 2024-12-11 14:56:58 +0100 |
---|---|---|
committer | Anton Kling <anton@kling.gg> | 2024-12-12 15:48:19 +0100 |
commit | bc828883c51c3c0f35872019f4db632e4ce82dc5 (patch) | |
tree | c4217493e69e4e8078aa403ca23f71fdf598f826 /kernel/sched/scheduler.c | |
parent | b343b0dae5aa51b5bd9b195936358341a943b3b2 (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.c | 12 |
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(); |