void rwmsg_destination_destroy(rwmsg_destination_t *dt) { RW_ASSERT_TYPE(dt, rwmsg_destination_t); if (!dt->refct) { rwmsg_endpoint_t *ep = dt->ep; RW_ASSERT(ep); //?? TBD rwmsg_endpoint_del_srvchan_method_binding(ep, sc, ...); RWMSG_EP_LOCK(ep); RW_DL_REMOVE(&ep->track.destinations, dt, trackelem); RWMSG_EP_UNLOCK(ep); ck_pr_dec_32(&ep->stat.objects.destinations); if (dt->localep) { rwmsg_endpoint_release(dt->localep); dt->localep = NULL; } if (dt->defstream.localsc) { _RWMSG_CH_DEBUG_(&dt->defstream.localsc->ch, "--"); rwmsg_srvchan_release(dt->defstream.localsc); dt->defstream.localsc = NULL; } RW_FREE_TYPE(dt, rwmsg_destination_t); dt = NULL; } return; }
/** * A unit test for the linked list package */ rw_status_t rw_dl_unit_test(void) { rw_dl_t list; foo_t a,b,c,d, *ptr; uint32_t len; bool_t brc; RW_DL_INIT(&list); len = rw_dl_walking_length(&list); RW_ASSERT(0 == len); RW_DL_ELEMENT_INIT(&a.elem); a.ch = 'a'; RW_ZERO_VARIABLE(&b); b.ch = 'b'; RW_ZERO_VARIABLE(&c); c.ch = 'c'; RW_ZERO_VARIABLE(&d); d.ch = 'd'; brc = rw_dl_contains_element(&list, &b.elem); RW_ASSERT(FALSE == brc); ptr = RW_DL_ELEMENT_PTR(foo_t,elem,&a.elem); RW_ASSERT(&a == ptr); RW_DL_PUSH(&list,(&a),elem); RW_DL_PUSH(&list,(&b),elem); RW_DL_PUSH(&list,(&c),elem); RW_DL_PUSH(&list,(&d),elem); len = RW_DL_LENGTH(&list); RW_ASSERT(4 == len); len = rw_dl_walking_length(&list); RW_ASSERT(4 == len); brc = rw_dl_contains_element(&list, &b.elem); RW_ASSERT(TRUE == brc); ptr = RW_DL_POP(&list,foo_t,elem); RW_ASSERT(ptr == &d); ptr = RW_DL_POP(&list,foo_t,elem); RW_ASSERT(ptr == &c); brc = rw_dl_contains_element(&list, &b.elem); RW_ASSERT(TRUE == brc); ptr = RW_DL_POP(&list,foo_t,elem); RW_ASSERT(ptr == &b); brc = rw_dl_contains_element(&list, &b.elem); RW_ASSERT(FALSE == brc); ptr = RW_DL_POP(&list,foo_t,elem); RW_ASSERT(ptr == &a); len = RW_DL_LENGTH(&list); RW_ASSERT(0 == len); len = rw_dl_walking_length(&list); RW_ASSERT(0 == len); ptr = RW_DL_HEAD(&list,foo_t,elem); RW_ASSERT(ptr == NULL); ptr = RW_DL_TAIL(&list,foo_t,elem); RW_ASSERT(ptr == NULL); ptr = RW_DL_DEQUEUE(&list,foo_t,elem); RW_ASSERT(ptr == NULL); RW_DL_ENQUEUE(&list,(&a),elem); RW_DL_ENQUEUE(&list,(&b),elem); RW_DL_ENQUEUE(&list,(&c),elem); RW_DL_ENQUEUE(&list,(&d),elem); len = RW_DL_LENGTH(&list); RW_ASSERT(4 == len); len = rw_dl_walking_length(&list); RW_ASSERT(4 == len); ptr = RW_DL_DEQUEUE(&list,foo_t,elem); RW_ASSERT(ptr == &a); ptr = RW_DL_HEAD(&list,foo_t,elem); RW_ASSERT(ptr == &b); ptr = RW_DL_TAIL(&list,foo_t,elem); RW_ASSERT(ptr == &d); ptr = RW_DL_DEQUEUE(&list,foo_t,elem); RW_ASSERT(ptr == &b); ptr = RW_DL_DEQUEUE(&list,foo_t,elem); RW_ASSERT(ptr == &c); ptr = RW_DL_DEQUEUE(&list,foo_t,elem); RW_ASSERT(ptr == &d); len = RW_DL_LENGTH(&list); RW_ASSERT(0 == len); len = rw_dl_walking_length(&list); RW_ASSERT(0 == len); RW_DL_ENQUEUE(&list,(&a),elem); RW_DL_ENQUEUE(&list,(&b),elem); RW_DL_ENQUEUE(&list,(&c),elem); RW_DL_ENQUEUE(&list,(&d),elem); /* a b c d */ RW_DL_REMOVE(&list,(&c),elem); /* a b d */ RW_ASSERT(3 == RW_DL_LENGTH(&list)); ptr = RW_DL_TAIL(&list,foo_t,elem); RW_ASSERT(ptr == &d); ptr = RW_DL_REMOVE_TAIL(&list,foo_t,elem); RW_ASSERT(ptr == &d); /* a b */ ptr = RW_DL_REMOVE_TAIL(&list,foo_t,elem); RW_ASSERT(ptr == &b); /* a */ ptr = RW_DL_HEAD(&list,foo_t,elem); RW_ASSERT(ptr == &a); ptr = RW_DL_TAIL(&list,foo_t,elem); RW_ASSERT(ptr == &a); RW_ASSERT(RW_DL_LENGTH(&list) == 1); RW_DL_REMOVE(&list,(&a),elem); /* empty */ RW_ASSERT(RW_DL_LENGTH(&list) == 0); ptr = RW_DL_TAIL(&list,foo_t,elem); RW_ASSERT(ptr == NULL); ptr = RW_DL_DEQUEUE(&list,foo_t,elem); RW_ASSERT(ptr == NULL); return RW_STATUS_SUCCESS; }