Ejemplo n.º 1
0
void proxy_vka_utspace_free(void *data, seL4_Word type, seL4_Word size_bits, uint32_t target) {
    proxy_vka_t *vka = (proxy_vka_t*)data;
    ut_node_t *node = (ut_node_t*)target;
    if (!node->frame) {
        vka_utspace_free(&vka->regular_vka, type, size_bits, node->cookie);
    } else {
        _utspace_trickle_free(vka->allocman, &vka->ram_ut_manager, node->cookie, size_bits);
    }
    allocman_mspace_free(vka->allocman, node, sizeof(*node));
}
Ejemplo n.º 2
0
void _utspace_trickle_free(struct allocman *alloc, void *_trickle, uint32_t cookie, uint32_t size_bits)
{
    utspace_trickle_t *trickle = (utspace_trickle_t*)_trickle;
    struct utspace_trickle_node *node = _cookie_to_node(cookie);
    uint32_t offset = _cookie_to_offset(cookie);
    int in_list = !(node->bitmap == 0);
    node->bitmap |= BIT(31 - offset);
    if (node->bitmap == _make_bitmap(node->bitmap_bits)) {
        if (node->parent_cookie) {
            if (in_list) {
                _remove_node(&trickle->heads[size_bits], node);
            }
            _utspace_trickle_free(alloc, trickle, node->parent_cookie, size_bits + node->bitmap_bits - 1);
            _free_node(alloc, node);
        } else if (!in_list) {
            _insert_node(&trickle->heads[size_bits], node);
        }
    } else if (!in_list) {
        _insert_node(&trickle->heads[size_bits], node);
    }
}