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) {
}
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,
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);