Implement kill_request_handler in spawnd, using domain caps.
[barrelfish] / usr / proc_mgmt / pending_clients.c
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 #include <collections/hash_table.h>
13
14 #include "domain.h"
15 #include "pending_clients.h"
16
17 static collections_hash_table* pending_clients_table = NULL;
18
19 errval_t pending_clients_add(struct capref domain_cap,
20                              struct proc_mgmt_binding *b, enum ClientType type,
21                              coreid_t core_id)
22 {
23     if (pending_clients_table == NULL) {
24         collections_hash_create_with_buckets(&pending_clients_table,
25                                              HASH_INDEX_BUCKETS, NULL);
26         if (pending_clients_table == NULL) {
27             return PROC_MGMT_ERR_CREATE_CLIENTS_TABLE;
28         }
29     }
30
31     uint64_t key;
32     errval_t err = domain_cap_hash(domain_cap, &key);
33     if (err_is_fail(err)) {
34         return err;
35     }
36
37     struct pending_client *client = (struct pending_client*) malloc(
38             sizeof(struct pending_client));
39     client->b = b;
40     client->core_id = core_id;
41     client->type = type;
42     collections_hash_insert(pending_clients_table, key, client);
43
44     return SYS_ERR_OK;
45 }
46
47 errval_t pending_clients_release(struct capref domain_cap,
48                                         struct pending_client **ret_cl)
49 {
50     uint64_t key;
51     errval_t err = domain_cap_hash(domain_cap, &key);
52     if (err_is_fail(err)) {
53         return err;
54     }
55
56     void *table_entry = collections_hash_find(pending_clients_table, key);
57     if (table_entry == NULL) {
58         return PROC_MGMT_ERR_CLIENTS_TABLE_FIND;
59     }
60     if (ret_cl != NULL) {
61         *ret_cl = (struct pending_client*) table_entry;
62     }
63
64     collections_hash_delete(pending_clients_table, key);
65
66     return SYS_ERR_OK;
67 }