Skip to content

Commit aa4fa9d

Browse files
committed
getpid(...) should fetch other process exit_code
1 parent 09521ad commit aa4fa9d

File tree

8 files changed

+33
-19
lines changed

8 files changed

+33
-19
lines changed

include/fuzzy/kernel/process/process.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ struct Process {
2828
unsigned int ss, cs, sp, ip;
2929
unsigned int *e;
3030

31-
int status_code;
31+
int exit_code;
3232

3333
unsigned int ppid; // parent pid, 0 to root under kernel_core
3434

@@ -78,7 +78,7 @@ extern void syscall_strncpy_kernel_to_user(int user_ds, char *dest_address, char
7878
extern void kernel_memncpy_absolute(int dst_ds, char *dst_address, int src_ds, char *src_address, size_t size);
7979

8080
// operations
81-
int process_waitpid(unsigned int pid, unsigned int blocked_on_pid);
81+
int process_waitpid(unsigned int pid, unsigned int blocked_on_pid, int *exit_code);
8282

8383
int process_fork_mark_ready(int pid);
8484
int process_fork_check_ready(int pid);

src/kernel/process/allocation.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -185,9 +185,9 @@ int process_create(unsigned int ppid, int argc, char *argv[]) {
185185
return pid;
186186
}
187187

188-
void process_kill(unsigned int pid, int status) {
188+
void process_kill(unsigned int pid, int exit_code) {
189189
struct Process *process = &processes[pid];
190-
process->status_code = status;
190+
process->exit_code = exit_code;
191191
process->state = STATE_EXIT;
192192
}
193193

src/kernel/process/process.c

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -35,13 +35,21 @@ int process_exec(int lba_index, int sector_count) {
3535
return -1;
3636
}
3737

38-
int syscall_1_process_exit(int pid, int status) {
39-
process_kill(pid, status);
38+
int syscall_1_process_exit(int pid, int exit_code) {
39+
process_kill(pid, exit_code);
4040
return 0;
4141
}
4242

43-
int syscall_1_process_wait(int pid, int blocked_on_pid) {
44-
return process_waitpid(pid, blocked_on_pid);
43+
int syscall_1_process_wait(int user_ds, int pid, int blocked_on_pid, int *_us_exit_code) {
44+
int exit_code;
45+
int return_value = process_waitpid(pid, blocked_on_pid, &exit_code);
46+
if(_us_exit_code != NULL) {
47+
// forward exit_code only if user wants it
48+
syscall_strncpy_kernel_to_user(
49+
user_ds, _us_exit_code,
50+
&exit_code, sizeof(exit_code));
51+
}
52+
return return_value;
4553
}
4654

4755
int syscall_1_process_fork(int user_pid, int op) {
@@ -101,7 +109,7 @@ int syscall_1_process(int operation, int a0, int a1, int a2, int a3, int user_ds
101109
syscall_1_process_exit(user_pid, a0);
102110
return 0;
103111
case SYSCALL_PROCESS_SUB_WAIT:
104-
return syscall_1_process_wait(user_pid, a0);
112+
return syscall_1_process_wait(user_ds, user_pid, a0, a1);
105113
case SYSCALL_PROCESS_SUB_FORK:
106114
return syscall_1_process_fork(user_pid, a0);
107115
case SYSCALL_PROCESS_SUB_GET:

src/kernel/process/scheduler.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -110,14 +110,15 @@ void process_scheduler(int *_e_ip, int *_e_cs, int *_e_sp, int *_e_ss) {
110110
*_e_ss = e_ss;
111111
}
112112

113-
int process_waitpid(unsigned int pid, unsigned int blocked_on_pid) {
113+
int process_waitpid(unsigned int pid, unsigned int blocked_on_pid, int *exit_code) {
114114
// It currently allows blocking on any pid, and rely on syscall client
115115
// for yield.
116116
struct Process *other_process = get_process(blocked_on_pid);
117117
if(other_process==NULL) {
118118
return -1; // err
119119
}
120120
if(other_process->state == STATE_COLD) {
121+
*exit_code = other_process->exit_code;
121122
return 0; // no error, wait over
122123
}
123124
return 1; // no error, keep waiting

src/usr/include/process.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,4 +24,4 @@ int getpid();
2424

2525
int fork();
2626
void yield();
27-
int waitpid(unsigned int blocked_on_pid);
27+
int waitpid(unsigned int blocked_on_pid, int *exit_code);

src/usr/lib/process.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -47,9 +47,9 @@ void yield() {
4747
__asm__("int $0x20");
4848
}
4949

50-
int waitpid(unsigned int blocked_on_pid) {
50+
int waitpid(unsigned int blocked_on_pid, int *exit_code) {
5151
while(1) {
52-
int status = SYSCALL_A2(SYSCALL_PROCESS, SYSCALL_PROCESS_SUB_WAIT, blocked_on_pid);
52+
int status = SYSCALL_A3(SYSCALL_PROCESS, SYSCALL_PROCESS_SUB_WAIT, blocked_on_pid, exit_code);
5353
if(status < 0) {
5454
// err
5555
return status;

src/usr/local/src/multiprocessing.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ int main(int argc,char *argv[]) {
1818
// parent process
1919
printf("parent process: says Hi\n");
2020
printf("will for child process to exit\n");
21-
waitpid(pid);
21+
waitpid(pid, NULL);
2222
}
2323
printf("process exiting. Is correct process the child: %s\n", (am_i_child)?"Yes":"No");
2424

src/usr/local/src/sh.c

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ int cmd_help() {
1818
printf(" > exit kill the current shell\n");
1919
printf(" > <filename> [arg1]... execute executable program\n");
2020
printf(" > ls -h example to show ls usage\n");
21+
last_status_code = 0;
2122
return 0;
2223
}
2324

@@ -32,6 +33,11 @@ static char *copy_arg(char *dst, char *src) {
3233
}
3334

3435
int cmd_run(char *cmd) {
36+
if(cmd == NULL) {
37+
// no command entered
38+
last_status_code = 0;
39+
return 0;
40+
}
3541
char *argv[PROCESS_MAX_ARGC];
3642
char argv_data[PROCESS_MAX_ARGC][PROCESS_MAX_ARG_LEN] = {0};
3743

@@ -51,7 +57,7 @@ int cmd_run(char *cmd) {
5157
// failed
5258
return pid;
5359
}
54-
waitpid(pid);
60+
waitpid(pid, &last_status_code);
5561
return 0;
5662
}
5763

@@ -68,12 +74,11 @@ void handle_command(char *full_cmd) {
6874
char *cmd = strtok(full_cmd, COMMAND_DELIM);
6975

7076
if (strcmp(cmd, "help")==0) {
71-
last_status_code = cmd_help();
77+
cmd_help();
7278
} else if (strcmp(cmd, "exit")==0) {
73-
last_status_code = cmd_exit();
79+
cmd_exit();
7480
} else {
75-
last_status_code = cmd_run(cmd);
76-
if (last_status_code < 0) {
81+
if (cmd_run(cmd) < 0) {
7782
printf("failed to run '%s' command\n", cmd);
7883
}
7984
}

0 commit comments

Comments
 (0)