From 482580565ffe4b161c2aa64d86c62ffe5a0857a9 Mon Sep 17 00:00:00 2001 From: Matthias Kruk Date: Mon, 28 Oct 2019 18:35:32 +0900 Subject: [PATCH] Add an argument to process_create() so the caller may request the process to be created with a specific pid --- kernel/core/process.c | 28 ++++++++++++++++++++++++++-- kernel/include/process.h | 2 +- 2 files changed, 27 insertions(+), 3 deletions(-) diff --git a/kernel/core/process.c b/kernel/core/process.c index 7b9b8ae..e4fb472 100644 --- a/kernel/core/process.c +++ b/kernel/core/process.c @@ -75,12 +75,30 @@ static inline int DQ(process_t *p) return(ret_val); } -int process_create(process_t **dst, u32_t ppl, void *entry) +int process_create(process_t **dst, pid_t pid, u32_t ppl, void *entry) { int ret_val; process_t *proc; ret_val = -ENOMEM; + proc = NULL; + + /* was a specific pid requested? */ + if(pid != PID_ANY) { + /* may only request pids in [2..100] */ + + if(pid < 2 || pid >= 100) { + ret_val = -EINVAL; + goto cleanup; + } + + /* check if pid is already taken */ + if(process_lookup(pid)) { + ret_val = -EALREADY; + goto cleanup; + } + } + proc = kmalloc(sizeof(*proc)); if(proc) { @@ -106,7 +124,13 @@ int process_create(process_t **dst, u32_t ppl, void *entry) } proc->p_privl = ppl; - proc->p_id = _next_pid++; + + if(pid == PID_ANY) { + /* no specific pid requested */ + proc->p_id = _next_pid++; + } else { + proc->p_id = pid; + } task_prepare(proc->p_tasks, (u32_t)pdbr, (u32_t)entry, (u32_t)kstack + CONFIG_KERNEL_STACK_SIZE, diff --git a/kernel/include/process.h b/kernel/include/process.h index 6ec4286..ca42c6e 100644 --- a/kernel/include/process.h +++ b/kernel/include/process.h @@ -24,7 +24,7 @@ typedef struct process process_t; -int process_create(process_t**, u32_t, void*); +int process_create(process_t**, pid_t, u32_t, void*); int process_switch(process_t*); int process_falloc(process_t*, int); -- 2.47.3