proc_mgmt: implementation spawn_wait() with nohang flag
authorRoni Häcki <roni.haecki@inf.ethz.ch>
Mon, 9 Oct 2017 08:42:39 +0000 (10:42 +0200)
committerRoni Häcki <roni.haecki@inf.ethz.ch>
Mon, 9 Oct 2017 08:42:39 +0000 (10:42 +0200)
Signed-off-by: Roni Häcki <roni.haecki@inf.ethz.ch>

if/proc_mgmt.if
include/barrelfish/spawn_client.h
lib/barrelfish/spawn_client.c
usr/proc_mgmt/service.c
usr/tests/proc_mgmt_test/main.c

index b8b5c9c..8024932 100644 (file)
@@ -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]);
 };
index e6ab4c9..65191d8 100644 (file)
@@ -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,
index 08609e2..27e0067 100644 (file)
@@ -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;
 }
 
index 90e1739..924bcba 100644 (file)
@@ -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
 };
 
 /**
index 219b9f9..09e1ccc 100644 (file)
@@ -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");