017b5880cab5d241590df8d1ccbcff8f24ac47c2
[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 #define EXIT_STATUS_KILLED 9
21
22 enum domain_status {
23     DOMAIN_STATUS_NIL,
24     DOMAIN_STATUS_RUNNING,
25     DOMAIN_STATUS_STOP_PEND,
26     DOMAIN_STATUS_STOPPED
27     // TODO(razvan): Add the others, as per the state machine.
28 };
29
30 struct domain_waiter {
31     struct proc_mgmt_binding *b;
32     struct domain_waiter *next;
33 };
34
35 struct domain_entry {
36     struct capref domain_cap;   // Unique domain ID cap.
37     enum domain_status status;  // Current domain state.
38
39     struct spawnd_state *spawnds[MAX_COREID];  // Spawnds running this domain.
40     coreid_t num_spawnds_running;
41
42     struct domain_waiter *waiters;  // Clients waiting after this domain.
43
44     uint8_t exit_status;
45 };
46
47 errval_t domain_new(struct capref domain_cap, struct domain_entry **ret_entry);
48 errval_t domain_get_by_cap(struct capref domain_cap,
49                            struct domain_entry **ret_entry);
50 void domain_run_on_core(struct domain_entry *entry, coreid_t core_id);
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 static inline void domain_stop_pending(struct domain_entry *entry)
56 {
57     assert(entry != NULL);
58     entry->status = DOMAIN_STATUS_STOP_PEND;
59 }
60 // TODO(razvan): domain_exists, domain_remove etc.
61
62 #endif  // PROC_MGMT_DOMAIN_H