diff options
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(); |