From 23d2c2bec84d178791f3c252112a31e35abf0c15 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Roni=20H=C3=A4cki?= Date: Mon, 9 Oct 2017 10:42:39 +0200 Subject: [PATCH 1/1] proc_mgmt: implementation spawn_wait() with nohang flag MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Signed-off-by: Roni Häcki --- if/proc_mgmt.if | 13 ++++++++++++- include/barrelfish/spawn_client.h | 2 +- lib/barrelfish/spawn_client.c | 21 ++++++++++++--------- usr/proc_mgmt/service.c | 18 ++++++++++++++++-- usr/tests/proc_mgmt_test/main.c | 10 ++++++++++ 5 files changed, 51 insertions(+), 13 deletions(-) diff --git a/if/proc_mgmt.if b/if/proc_mgmt.if index b8b5c9c..8024932 100644 --- a/if/proc_mgmt.if +++ b/if/proc_mgmt.if @@ -9,6 +9,10 @@ interface proc_mgmt "Process management service" { + typedef struct { + uint8 status; + } ps_entry; + // Add a new spawnd to the process manager's list. message add_spawnd(coreid core, iref iref); @@ -42,5 +46,12 @@ interface proc_mgmt "Process management service" { //message exit(cap domain_cap, uint8 status); rpc exit(in cap domain_cap, in uint8 status); - rpc wait(in cap domain_cap, out errval err, out uint8 status); + rpc wait(in cap domain_cap, in bool nohang, out errval err, out uint8 status); + + + rpc status(in domainid domain_id, out ps_entry ps_entry, out char argv[len, 2048], + out errval err); + + // XXX: Should be domainid instead of uint8, but it's not yet supported + rpc get_domainlist(out uint8 domains[len, 2048]); }; diff --git a/include/barrelfish/spawn_client.h b/include/barrelfish/spawn_client.h index e6ab4c9..65191d8 100644 --- a/include/barrelfish/spawn_client.h +++ b/include/barrelfish/spawn_client.h @@ -72,7 +72,7 @@ errval_t spawn_wait_core(coreid_t coreid, struct capref domainid, errval_t spawn_binding(coreid_t coreid, struct spawn_binding **ret_client); errval_t spawn_bind_iref(iref_t iref, struct spawn_binding **ret_client); errval_t spawn_get_domain_list(uint8_t **domains, size_t *len); -errval_t spawn_get_status(uint8_t domainid, struct spawn_ps_entry *pse, +errval_t spawn_get_status(domainid_t domain_id, struct spawn_ps_entry *pse, char **argbuf, size_t *arglen, errval_t *reterr); errval_t alloc_inheritcn_with_caps(struct capref *inheritcn_capp, diff --git a/lib/barrelfish/spawn_client.c b/lib/barrelfish/spawn_client.c index 08609e2..27e0067 100644 --- a/lib/barrelfish/spawn_client.c +++ b/lib/barrelfish/spawn_client.c @@ -866,7 +866,7 @@ errval_t spawn_wait(struct capref domain_cap, uint8_t *status, bool nohang) struct proc_mgmt_binding *b = get_proc_mgmt_binding(); assert(b != NULL); - err = b->rpc_tx_vtbl.wait(b, domain_cap, &msgerr, status); + err = b->rpc_tx_vtbl.wait(b, domain_cap, nohang, &msgerr, status); if (err_is_fail(err)) { USER_PANIC_ERR(err, "error sending wait request to process manager"); } @@ -900,16 +900,16 @@ errval_t spawn_wait_compat(uint8_t domainid, errval_t spawn_get_domain_list(uint8_t **domains, size_t *len) { errval_t err; - - struct spawn_binding *cl; - err = spawn_binding(disp_get_core_id(), &cl); + err = proc_mgmt_bind_client(); if (err_is_fail(err)) { - USER_PANIC_ERR(err, "spawn_binding"); + return err; } - assert(cl != NULL); - struct spawn_get_domainlist_response__rx_args reply; - err = cl->rpc_tx_vtbl.get_domainlist(cl, reply.domains, len); + struct proc_mgmt_binding *b = get_proc_mgmt_binding(); + assert(b != NULL); + + struct proc_mgmt_get_domainlist_response__rx_args reply; + err = b->rpc_tx_vtbl.get_domainlist(b, reply.domains, len); if (err_is_fail(err)) { USER_PANIC_ERR(err, "get_domainlist"); } @@ -921,9 +921,10 @@ errval_t spawn_get_domain_list(uint8_t **domains, size_t *len) /** * \brief Get the status of a domain for ps like implementation */ -errval_t spawn_get_status(uint8_t domain, struct spawn_ps_entry *pse, +errval_t spawn_get_status(domainid_t domain_id, struct spawn_ps_entry *pse, char **argbuf, size_t *arglen, errval_t *reterr) { + /* errval_t err; struct spawn_binding *cl; @@ -941,6 +942,8 @@ errval_t spawn_get_status(uint8_t domain, struct spawn_ps_entry *pse, } *argbuf = memdup(reply.argv, *arglen); + +*/ return SYS_ERR_OK; } diff --git a/usr/proc_mgmt/service.c b/usr/proc_mgmt/service.c index 90e1739..924bcba 100644 --- a/usr/proc_mgmt/service.c +++ b/usr/proc_mgmt/service.c @@ -607,7 +607,7 @@ static void exit_handler(struct proc_mgmt_binding *b, struct capref domain_cap, /** * \brief Handler for rpc wait. */ -static void wait_handler(struct proc_mgmt_binding *b, struct capref domain_cap) +static void wait_handler(struct proc_mgmt_binding *b, struct capref domain_cap, bool nohang) { errval_t err, resp_err; struct domain_entry *entry; @@ -621,6 +621,11 @@ static void wait_handler(struct proc_mgmt_binding *b, struct capref domain_cap) goto respond; } + if (nohang) { + entry->exit_status = -1; + goto respond; + } + struct domain_waiter *waiter = (struct domain_waiter*) malloc( sizeof(struct domain_waiter)); waiter->b = b; @@ -636,6 +641,14 @@ respond: } } +/** + * \brief Handler for rpc get_domainlist. + */ +static void get_domainlist_handler(struct proc_mgmt_binding *b) +{ + +} + static struct proc_mgmt_rx_vtbl monitor_vtbl = { .add_spawnd = add_spawnd_handler, .spawn_call = spawn_handler, @@ -653,7 +666,8 @@ static struct proc_mgmt_rx_vtbl non_monitor_vtbl = { .span_call = span_handler, .kill_call = kill_handler, .exit_call = exit_handler, - .wait_call = wait_handler + .wait_call = wait_handler, + .get_domainlist_call = get_domainlist_handler }; /** diff --git a/usr/tests/proc_mgmt_test/main.c b/usr/tests/proc_mgmt_test/main.c index 219b9f9..09e1ccc 100644 --- a/usr/tests/proc_mgmt_test/main.c +++ b/usr/tests/proc_mgmt_test/main.c @@ -224,12 +224,22 @@ int main(int argc, char **argv) barrelfish_usleep(5*1000*1000); printf("Waiting for process on same core to finish \n"); + err = spawn_wait(domain_cap, &code, true); + if (err_is_fail(err)) { + USER_PANIC("Failed waiting for domain \n"); + } + printf("Nowait hang return code %d \n", code); err = spawn_wait(domain_cap, &code, false); if (err_is_fail(err)) { USER_PANIC("Failed waiting for domain \n"); } printf("Unblocked \n"); + err = spawn_wait(domain_cap, &code, true); + if (err_is_fail(err)) { + USER_PANIC("Failed waiting for domain \n"); + } + printf("Nowait hang return code %d \n", code); printf("Running benchmarks core 0 \n"); run_benchmark_spawn(0); printf("Running benchmarks core 3 \n"); -- 1.7.2.5