Add per-spawnd message queues to the process manager.
[barrelfish] / usr / proc_mgmt / pending_clients.h
1 /*
2  * \brief Client handling 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 PENDING_CLIENTS_H
13 #define PENDING_CLIENTS_H
14
15 #include <barrelfish/barrelfish.h>
16 #include <barrelfish/event_queue.h>
17 #include <if/proc_mgmt_defs.h>
18 #include <if/spawn_defs.h>
19
20 #define HASH_INDEX_BUCKETS 6151
21
22 enum ClientType {
23         ClientType_Spawn,
24         ClientType_SpawnWithCaps,
25         ClientType_Span,
26         ClientType_Kill,
27         ClientType_Exit,
28         ClientType_Cleanup
29         // TODO(razvan): Others?
30 };
31
32 struct pending_spawn {
33     struct capref domain_cap;
34
35         struct spawn_binding *b;
36         coreid_t core_id;
37         
38         const char *path;
39         
40         const char *argvbuf;
41         size_t argvbytes;
42         const char *envbuf;
43         size_t envbytes;
44         
45         struct capref inheritcn_cap;
46         struct capref argcn_cap;
47         
48         uint8_t flags;
49
50         struct event_queue_node qn;
51 };
52
53 struct pending_span {
54     struct capref domain_cap;
55
56         struct spawn_binding *b;
57
58         coreid_t core_id;
59         struct capref vroot;
60         struct capref dispframe;
61
62         struct event_queue_node qn;
63 };
64
65 struct pending_kill_exit_cleanup {
66     struct capref domain_cap;
67         struct spawn_binding *sb;
68         struct proc_mgmt_binding *pmb;
69         
70         struct event_queue_node qn;
71 };
72
73 struct pending_client {
74     struct proc_mgmt_binding *b;
75
76     struct capref domain_cap;
77
78     coreid_t core_id;
79     enum ClientType type;
80
81     struct pending_client *next;
82 };
83
84 errval_t pending_clients_add(struct capref domain_cap,
85                              struct proc_mgmt_binding *b, enum ClientType type,
86                              coreid_t core_id);
87 errval_t pending_clients_release(struct capref domain_cap, enum ClientType type,
88                                  struct pending_client **ret_cl);
89 errval_t pending_clients_release_one(struct capref domain_cap,
90                                          enum ClientType type,
91                                          struct proc_mgmt_binding *b,
92                                      struct pending_client **ret_cl);
93
94 #endif  // PENDING_CLIENTS_H