| #include <parlib/event.h> |
| #include <parlib/parlib.h> |
| #include <parlib/uthread.h> |
| |
| #include <assert.h> |
| #include <stdio.h> |
| #include <stdlib.h> |
| #include <sys/types.h> |
| #include <sys/wait.h> |
| |
| static void ev_handler(struct event_msg *msg, unsigned int ev_type, void *data) |
| { |
| int rv; |
| |
| assert(msg != NULL); |
| assert(ev_type == EV_USER_IPI); |
| (void)data; |
| rv = msg->ev_arg1; |
| exit(rv); |
| } |
| |
| int main(int argc, char *argv[], char *envp[]) |
| { |
| struct event_queue *evq, *triggered; |
| pid_t pid; |
| struct event_msg msg; |
| int wstatus; |
| |
| register_ev_handler(EV_USER_IPI, ev_handler, 0); |
| evq = get_eventq(EV_MBOX_UCQ); |
| evq->ev_flags = EVENT_IPI | EVENT_INDIR | EVENT_SPAM_INDIR | |
| EVENT_WAKEUP; |
| register_kevent_q(evq, EV_USER_IPI); |
| |
| pid = create_child_with_stdfds(argv[1], argc - 1, argv + 1, envp); |
| if (pid < 0) { |
| perror("child creation failed"); |
| exit(-1); |
| } |
| sys_proc_run(pid); |
| |
| waitpid(pid, &wstatus, 0); |
| if (!WIFEXITED(wstatus)) { |
| fprintf(stderr, "child %s did not exit normally!\n", argv[1]); |
| return -1; |
| } |
| return WEXITSTATUS(wstatus); |
| } |