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; } } }
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); }