int icem_candpair_alloc(struct candpair **cpp, struct icem *icem, struct cand *lcand, struct cand *rcand) { struct candpair *cp; struct icem_comp *comp; if (!icem || !lcand || !rcand) return EINVAL; comp = icem_comp_find(icem, lcand->compid); if (!comp) return ENOENT; cp = mem_zalloc(sizeof(*cp), candpair_destructor); if (!cp) return ENOMEM; cp->icem = icem; cp->comp = comp; cp->lcand = mem_ref(lcand); cp->rcand = mem_ref(rcand); cp->state = CANDPAIR_FROZEN; cp->ertt = -1; cp->def = comp->def_lcand == lcand && comp->def_rcand == rcand; candpair_set_pprio(cp); list_add_sorted(&icem->checkl, cp); if (cpp) *cpp = cp; return 0; }
int icem_candpair_clone(struct candpair **cpp, struct candpair *cp0, struct cand *lcand, struct cand *rcand) { struct candpair *cp; if (!cp0) return EINVAL; cp = mem_zalloc(sizeof(*cp), candpair_destructor); if (!cp) return ENOMEM; cp->icem = cp0->icem; cp->comp = cp0->comp; cp->lcand = mem_ref(lcand ? lcand : cp0->lcand); cp->rcand = mem_ref(rcand ? rcand : cp0->rcand); cp->def = cp0->def; cp->valid = cp0->valid; cp->nominated = cp0->nominated; cp->state = cp0->state; cp->pprio = cp0->pprio; cp->usec_sent = cp0->usec_sent; cp->ertt = cp0->ertt; cp->err = cp0->err; cp->scode = cp0->scode; list_add_sorted(&cp0->icem->checkl, cp); if (cpp) *cpp = cp; return 0; }
void icem_candpair_make_valid(struct candpair *cp) { if (!cp) return; cp->err = 0; cp->scode = 0; cp->valid = true; if (cp->usec_sent) cp->ertt = (long)(ice_get_usec() - cp->usec_sent); icem_candpair_set_state(cp, CANDPAIR_SUCCEEDED); list_unlink(&cp->le); list_add_sorted(&cp->icem->validl, cp); }
static void item_add_sorted(Item **head, Item *w, Mutex *mutex) { list_add_sorted((pList*) head, (pList) w, pnext_item, item_cmp, mutex); }
/* * list_add() * * wrapper do list_add_sorted(), który zachowuje poprzedni± sk³adniê. */ void *list_add(list_t *list, void *data, int alloc_size) { return list_add_sorted(list, data, alloc_size, NULL); }