proc_mgmt: bugfix for domains spawned from startd
authorRoni Häcki <roni.haecki@inf.ethz.ch>
Mon, 2 Oct 2017 13:47:58 +0000 (15:47 +0200)
committerRoni Häcki <roni.haecki@inf.ethz.ch>
Mon, 2 Oct 2017 13:47:58 +0000 (15:47 +0200)
- Apps specified in menu.lst are now spawned using the proc_mgmt
- client side of proc_mgmt allocates cap slot as it should be
- Changed exit message to RPC

Signed-off-by: Roni Häcki <roni.haecki@inf.ethz.ch>

if/proc_mgmt.if
lib/barrelfish/proc_mgmt_client.c
usr/proc_mgmt/service.c
usr/startd/spawn.c

index 7c53aa3..b8b5c9c 100644 (file)
@@ -39,8 +39,8 @@ interface proc_mgmt "Process management service" {
   rpc kill(in cap domain_cap, out errval err);
 
   // Let the process manager know the caller has finished execution.
-  message exit(cap domain_cap, uint8 status);
-  //rpc exit(in cap domain_cap, in uint8 status);
+  //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);
 };
index a205cae..b2600e7 100644 (file)
@@ -23,7 +23,6 @@ struct proc_mgmt_bind_retst {
     errval_t err;
     struct proc_mgmt_binding *b;
     bool present;
-    bool kill_sent;
 };
 
 extern char **environ;
@@ -366,6 +365,10 @@ errval_t proc_mgmt_spawn_program_with_caps(coreid_t core_id, const char *path,
     }
 
     struct capref domain_cap;
+    err = slot_alloc(&domain_cap);
+    if (err_is_fail(err)) {
+        return err;
+    }
 
     if (capref_is_null(inheritcn_cap) && capref_is_null(argcn_cap)) {
         err = b->rpc_tx_vtbl.spawn(b, core_id, path, argstr, argstrlen, envstr,
@@ -487,13 +490,6 @@ errval_t proc_mgmt_kill(struct capref domain_cap)
     return msgerr;
 }
 
-static void cont(void* arg) 
-{
-    struct proc_mgmt_binding *b = get_proc_mgmt_binding();
-    struct proc_mgmt_bind_retst *st = (struct proc_mgmt_bind_retst*) b->st;
-    st->kill_sent = true;
-}
-
 /**
  * \brief Inform the process manager about exiting execution.
  */
@@ -507,22 +503,11 @@ errval_t proc_mgmt_exit(uint8_t status)
     struct proc_mgmt_binding *b = get_proc_mgmt_binding();
     assert(b != NULL);
 
-
-    struct proc_mgmt_bind_retst *st = (struct proc_mgmt_bind_retst*) b->st;
-    st->kill_sent = false;
-    err = b->tx_vtbl.exit(b, MKCLOSURE(cont, 0), cap_domainid, status);
+    err = b->rpc_tx_vtbl.exit(b, cap_domainid, status);
     if (err_is_fail(err)) {
         return err;
     }
-    
-    /* We have to make sure that the kill message is sent, otherwise
-     * we might cleanup the channel BEFORE the messages is actually sent 
-     * to the process manager
-     */
-    while(!st->kill_sent) {
-        event_dispatch(get_default_waitset());
-    }
-    
+
     return SYS_ERR_OK;
 }
 
index 299d222..d2c6c60 100644 (file)
@@ -643,7 +643,7 @@ static struct proc_mgmt_rx_vtbl monitor_vtbl = {
     .spawn_with_caps_call = spawn_with_caps_handler,
     .span_call            = span_handler,
     .kill_call            = kill_handler,
-    .exit                 = exit_handler,
+    .exit_call            = exit_handler,
     .wait_call            = wait_handler
 };
 
@@ -653,7 +653,7 @@ static struct proc_mgmt_rx_vtbl non_monitor_vtbl = {
     .spawn_with_caps_call = spawn_with_caps_handler,
     .span_call            = span_handler,
     .kill_call            = kill_handler,
-    .exit                 = exit_handler,
+    .exit_call            = exit_handler,
     .wait_call            = wait_handler
 };
 
index 6aac412..704c4f9 100644 (file)
@@ -21,6 +21,7 @@
 
 #include <barrelfish/spawn_client.h>
 #include <spawndomain/spawndomain.h>
+#include <barrelfish/proc_mgmt_client.h>
 #include <dist/barrier.h>
 
 #include "internal.h"
@@ -363,9 +364,10 @@ void spawn_app_domains(void)
                         debug_printf("starting app %s on core %d\n",
                                      si.name, i);
 
-                        domainid_t new_domain;
-                        err = spawn_program(i, si.name, si.argv, environ,
-                                            spawn_flags, &new_domain);
+                        struct capref ret_domain_cap;
+                        err = proc_mgmt_spawn_program(i, si.name,
+                                                      si.argv, environ, spawn_flags, 
+                                                      &ret_domain_cap);
                         if (err_is_fail(err)) {
                             DEBUG_ERR(err, "spawn of %s failed", si.name);
                         }
@@ -377,9 +379,10 @@ void spawn_app_domains(void)
 
                 debug_printf("starting app %s on core %d\n", si.name, coreid);
 
-                domainid_t new_domain;
-                err = spawn_program(coreid, si.name, si.argv, environ,
-                                    spawn_flags, &new_domain);
+                struct capref ret_domain_cap;
+                err = proc_mgmt_spawn_program(coreid, si.name,
+                                              si.argv, environ, spawn_flags, 
+                                              &ret_domain_cap);
                 if (err_is_fail(err)) {
                     DEBUG_ERR(err, "spawn of %s failed", si.name);
                 }