int process_init(struct Process *proc, const char *filename, pid_t pid) { if (process_bare_init(proc, filename, pid, 0) < 0) { fail: fprintf(stderr, "failed to initialize process %d: %s\n", pid, strerror(errno)); return -1; } if (os_process_init(proc) < 0) { process_bare_destroy(proc, 0); goto fail; } if (arch_process_init(proc) < 0) { os_process_destroy(proc); process_bare_destroy(proc, 0); goto fail; } if (proc->leader != proc) return 0; if (process_init_main(proc) < 0) { process_bare_destroy(proc, 0); goto fail; } return 0; }
/* process module init */ status_t process_init(kernel_args_t *kargs) { status_t err; proc_id pid; /* call arch-specific init */ err = arch_process_init(kargs); if(err != NO_ERROR) return err; /* valid process ids and processes group ids starts from 1 */ next_process_id = 1; /* data structures spinlock init */ spin_init(&processes_lock); /* list init */ xlist_init(&processes_list); /* tree init */ avl_tree_create( &processes_tree, compare_process_id, sizeof(process_t), offsetof(process_t, procs_tree_node) ); /* create kernel process */ pid = proc_create_kernel_process("kernel_process"); if(pid == INVALID_PROCESSID) return ERR_MT_GENERAL; return NO_ERROR; }