Exemple #1
0
void zmq::msg_t::add_refs (int refs_)
{
    zmq_assert (refs_ >= 0);

    //  Operation not supported for messages with metadata.
    zmq_assert (u.base.metadata == NULL);

    //  No copies required.
    if (!refs_)
        return;

    //  VSMs, CMSGS and delimiters can be copied straight away. The only
    //  message type that needs special care are long messages.
    if (u.base.type == type_lmsg || is_zcmsg() ) {
        if (u.base.flags & msg_t::shared)
            refcnt()->add (refs_);
        else {
            refcnt()->set (refs_ + 1);
            u.base.flags |= msg_t::shared;
        }
    }
}
Exemple #2
0
END_TEST

START_TEST(test_buffer_retain_release)
{
    gpudata *d;
    gpudata *d2;

    d = ops->buffer_alloc(ctx, 1024, NULL, 0, NULL);
    ck_assert(d != NULL);
    ck_assert_int_eq(refcnt(d), 1);

    d2 = ops->buffer_alloc(ctx, 1024, NULL, 0, NULL);
    ck_assert(d2 != NULL);
    ck_assert_int_eq(refcnt(d2), 1);

    ops->buffer_retain(d);
    ck_assert_int_eq(refcnt(d), 2);

    ops->buffer_release(d);
    ck_assert_int_eq(refcnt(d), 1);

    ops->buffer_retain(d);
    ops->buffer_retain(d2);
    ops->buffer_retain(d);
    ck_assert_int_eq(refcnt(d), 3);
    ck_assert_int_eq(refcnt(d2), 2);

    ops->buffer_release(d);
    ck_assert_int_eq(refcnt(d), 2);
    ck_assert_int_eq(refcnt(d2), 2);

    ops->buffer_release(d);
    ops->buffer_release(d2);
    ck_assert_int_eq(refcnt(d), 1);
    ck_assert_int_eq(refcnt(d2), 1);

    ops->buffer_release(d);
    ck_assert_int_eq(refcnt(d2), 1);

    ops->buffer_release(d2);
}