Esempio n. 1
0
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;
}
Esempio n. 2
0
/**
 * 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;
}