Add spawn, spawn_with_caps and span calls to the Process Manager API.
[barrelfish] / usr / proc_mgmt / domain.h
1 /*
2  * \brief Domain internals for the process manager.
3  *
4  * Copyright (c) 2017, ETH Zurich.
5  * All rights reserved.
6  *
7  * This file is distributed under the terms in the attached LICENSE file.
8  * If you do not find this file, copies can be found by writing to:
9  * ETH Zurich D-INFK, Haldeneggsteig 4, CH-8092 Zurich. Attn: Systems Group.
10  */
11
12 #ifndef PROC_MGMT_DOMAIN_H
13 #define PROC_MGMT_DOMAIN_H
14
15 #include <barrelfish/barrelfish.h>
16 #include <if/proc_mgmt_defs.h>
17
18 #include "spawnd_state.h"
19
20 enum domain_status {
21     DOMAIN_STATUS_NIL,
22     DOMAIN_STATUS_RUNNING,
23     DOMAIN_STATUS_STOP_PEND,
24     DOMAIN_STATUS_STOPPED
25     // TODO(razvan): Add the others, as per the state machine.
26 };
27
28 struct domain_waiter {
29     struct proc_mgmt_binding *b;
30     struct domain_waiter *next;
31 };
32
33 struct domain_spawnd_state {
34     struct spawnd_state *spawnd_state;
35     struct domain_spawnd_state *next;
36 };
37
38 struct domain_entry {
39     struct capref domain_cap;              // Unique domain ID cap.
40     enum domain_status status;             // Current domain state.
41     struct domain_spawnd_state *spawnds;   // Spawnds running this domain.
42     struct domain_waiter *waiters;         // Clients waiting after this domain.
43 };
44
45 errval_t domain_cap_hash(struct capref domain_cap, uint64_t *ret_hash);
46 errval_t domain_new(struct capref domain_cap, struct domain_entry **ret_entry);
47 errval_t domain_get_by_cap(struct capref domain_cap,
48                            struct domain_entry **ret_entry);
49 void domain_run_on_spawnd(struct domain_entry *entry,
50                           struct spawnd_state *spawnd);
51
52 errval_t domain_spawn(struct capref domain_cap, coreid_t core_id);
53 errval_t domain_can_span(struct capref domain_cap, coreid_t core_id);
54 errval_t domain_span(struct capref domain_cap, coreid_t core_id);
55 void domain_send_stop(struct domain_entry *entry);
56 // TODO(razvan): domain_exists, domain_remove etc.
57
58 #endif  // PROC_MGMT_DOMAIN_H