void find_cap_result__rx_handler(struct intermon_binding *b, errval_t result, genvaddr_t st) { // if we receive a positive result, immediately forward to caller lvaddr_t lst = (lvaddr_t)st; struct find_cap_broadcast_st *fc_bc_st = (struct find_cap_broadcast_st*)lst; if (err_is_ok(result)) { if (!fc_bc_st->found) { fc_bc_st->found = true; struct intermon_state *inter_st = (struct intermon_state*)b->st; coreid_t from = inter_st->core_id; fc_bc_st->result_handler(SYS_ERR_OK, from, fc_bc_st->st); } } else if (err_no(result) != SYS_ERR_CAP_NOT_FOUND) { DEBUG_ERR(result, "ignoring bad find_cap_result"); } // check to see if broadcast is complete if (capsend_handle_mc_reply(&fc_bc_st->bc)) { if (!fc_bc_st->found) { // broadcast did not find a core, report notfound to caller fc_bc_st->result_handler(SYS_ERR_CAP_NOT_FOUND, 0, fc_bc_st->st); } free(fc_bc_st); } }
void owner_updated__rx_handler(struct intermon_binding *b, genvaddr_t st) { lvaddr_t lst = (lvaddr_t)st; struct update_owner_broadcast_st *uo_bc_st = (struct update_owner_broadcast_st*)lst; if (!capsend_handle_mc_reply(&uo_bc_st->bc)) { // broadcast is not complete return; } struct event_closure *cl = &uo_bc_st->completion_continuation; cl->handler(cl->arg); free(uo_bc_st); }
void revoke_done__rx(struct intermon_binding *b, genvaddr_t st) { DEBUG_CAPOPS("%s\n", __FUNCTION__); struct revoke_master_st *rvk_st = (struct revoke_master_st*)(lvaddr_t)st; if (!capsend_handle_mc_reply(&rvk_st->revoke_mc_st)) { // multicast not complete return; } DEBUG_CAPOPS("%s ## revocation: fin phase\n", __FUNCTION__); rvk_st->remote_fin = true; if (rvk_st->local_fin) { revoke_result__rx(SYS_ERR_OK, rvk_st, true); } }
void find_descendants_result__rx_handler(struct intermon_binding *b, errval_t status, genvaddr_t st) { lvaddr_t lst = (lvaddr_t) st; struct find_descendants_mc_st *mc_st = (struct find_descendants_mc_st*)lst; if (err_is_ok(status)) { // found result if (!mc_st->have_result) { mc_st->have_result = true; mc_st->result_fn(SYS_ERR_OK, mc_st->st); } } else if (err_no(status) != SYS_ERR_CAP_NOT_FOUND) { DEBUG_ERR(status, "ignoring bad find_descendants result"); } if (capsend_handle_mc_reply(&mc_st->mc_st)) { if (!mc_st->have_result) { mc_st->result_fn(SYS_ERR_CAP_NOT_FOUND, mc_st->st); } free(mc_st); } }
void revoke_ready__rx(struct intermon_binding *b, genvaddr_t st) { DEBUG_CAPOPS("%s\n", __FUNCTION__); errval_t err; struct revoke_master_st *rvk_st = (struct revoke_master_st*)(lvaddr_t)st; if (!capsend_handle_mc_reply(&rvk_st->revoke_mc_st)) { DEBUG_CAPOPS("%s: waiting for remote cores\n", __FUNCTION__); // multicast not complete return; } DEBUG_CAPOPS("%s ## revocation: commit phase\n", __FUNCTION__); err = capsend_relations(&rvk_st->rawcap, revoke_commit__send, &rvk_st->revoke_mc_st, &rvk_st->dests); PANIC_IF_ERR(err, "enqueing revoke_commit multicast"); delete_steps_resume(); struct event_closure steps_fin_cont = MKCLOSURE(revoke_master_steps__fin, rvk_st); delete_queue_wait(&rvk_st->del_qn, steps_fin_cont); }