void flounder_support_deregister_chan(struct waitset_chanstate *wc) { if (waitset_chan_is_registered(wc)) { errval_t err = waitset_chan_deregister(wc); assert(err_is_ok(err)); // shouldn't fail if registered } }
/** * \brief Cancel an event registration made with lmp_chan_register_send() * * \param lc LMP channel */ errval_t lmp_chan_deregister_send(struct lmp_chan *lc) { assert(lc != NULL); errval_t err = waitset_chan_deregister(&lc->send_waitset); if (err_is_fail(err)) { return err; } // dequeue from list of channels with send events assert(lc->next != NULL && lc->prev != NULL); dispatcher_handle_t handle = disp_disable(); struct dispatcher_generic *dp = get_dispatcher_generic(handle); if (lc->next == lc->prev) { assert_disabled(dp->lmp_send_events_list == lc); dp->lmp_send_events_list = NULL; } else { lc->prev->next = lc->next; lc->next->prev = lc->prev; if (dp->lmp_send_events_list == lc) { dp->lmp_send_events_list = lc->next; } } #ifndef NDEBUG lc->prev = lc->next = NULL; #endif disp_enable(handle); return err; }
/** * \brief Destroy previously-initialised per-channel waitset state * \param chan Channel state */ void waitset_chanstate_destroy(struct waitset_chanstate *chan) { assert(chan != NULL); if (chan->waitset != NULL) { errval_t err = waitset_chan_deregister(chan); assert(err_is_ok(err)); // can't fail if registered } }