EXPECT_EQ(size3, iobuf3.length());
EXPECT_EQ(buf3.get(), iobuf3.buffer());
EXPECT_EQ(size3, iobuf3.capacity());
+
+ const uint32_t size4 = 2345;
+ unique_ptr<uint8_t[]> buf4(new uint8_t[size4]);
+ IOBuf iobuf4 = IOBuf::wrapBufferAsValue(buf4.get(), size4);
+ EXPECT_EQ(buf4.get(), iobuf4.data());
+ EXPECT_EQ(size4, iobuf4.length());
+ EXPECT_EQ(buf4.get(), iobuf4.buffer());
+ EXPECT_EQ(size4, iobuf4.capacity());
}
TEST(IOBuf, CreateCombined) {
} // namespace
+TEST(IOBuf, ExternallyShared) {
+ struct Item {
+ Item(const char* src, size_t len) : size(len) {
+ CHECK_LE(len, sizeof(buffer));
+ memcpy(buffer, src, len);
+ }
+ uint32_t refcount{0};
+ uint8_t size;
+ char buffer[256];
+ };
+
+ auto hello = "hello";
+ struct Item it(hello, strlen(hello));
+
+ {
+ auto freeFn = [](void* /* unused */, void* userData) {
+ auto it = static_cast<struct Item*>(userData);
+ it->refcount--;
+ };
+ it.refcount++;
+ auto buf1 = IOBuf::takeOwnership(it.buffer, it.size, freeFn, &it);
+ EXPECT_TRUE(buf1->isManagedOne());
+ EXPECT_FALSE(buf1->isSharedOne());
+
+ buf1->markExternallyShared();
+ EXPECT_TRUE(buf1->isSharedOne());
+
+ {
+ auto buf2 = buf1->clone();
+ EXPECT_TRUE(buf2->isManagedOne());
+ EXPECT_TRUE(buf2->isSharedOne());
+ EXPECT_EQ(buf1->data(), buf2->data());
+ EXPECT_EQ(it.refcount, 1);
+ }
+ EXPECT_EQ(it.refcount, 1);
+ }
+ EXPECT_EQ(it.refcount, 0);
+}
+
TEST(IOBuf, Managed) {
auto hello = "hello";
auto buf1UP = wrap(hello);