From 2f028f63edda391482083792f61bda841f471d07 Mon Sep 17 00:00:00 2001 From: Daniel Sommermann Date: Fri, 9 Sep 2016 13:50:08 -0700 Subject: [PATCH] Add forwarding gather() function to IOBufQueue Summary: I'm working with a parser that requires a certain number of contiguous bytes to be able to make forward progress. I'm also using IOBufQueue to receive data from an AsyncReader::ReadCallback with pre/postallocate. So, I need to call gather() to ensure that the queue's front IOBuf has the right number of contiguous bytes available. Reviewed By: djwatson Differential Revision: D3838079 fbshipit-source-id: 9f1ec5c86895eb1b2b109f9f145ca42d2dbba4c6 --- folly/io/IOBufQueue.cpp | 6 ++++++ folly/io/IOBufQueue.h | 5 +++++ folly/io/test/IOBufQueueTest.cpp | 16 ++++++++++++++++ 3 files changed, 27 insertions(+) diff --git a/folly/io/IOBufQueue.cpp b/folly/io/IOBufQueue.cpp index 491e99a8..6faf5c79 100644 --- a/folly/io/IOBufQueue.cpp +++ b/folly/io/IOBufQueue.cpp @@ -286,4 +286,10 @@ void IOBufQueue::appendToString(std::string& out) const { } } +void IOBufQueue::gather(uint64_t maxLength) { + if (head_ != nullptr) { + head_->gather(maxLength); + } +} + } // folly diff --git a/folly/io/IOBufQueue.h b/folly/io/IOBufQueue.h index d421f917..bbf28fe9 100644 --- a/folly/io/IOBufQueue.h +++ b/folly/io/IOBufQueue.h @@ -265,6 +265,11 @@ class IOBufQueue { */ void appendToString(std::string& out) const; + /** + * Calls IOBuf::gather() on the head of the queue, if it exists. + */ + void gather(uint64_t maxLength); + /** Movable */ IOBufQueue(IOBufQueue&&) noexcept; IOBufQueue& operator=(IOBufQueue&&); diff --git a/folly/io/test/IOBufQueueTest.cpp b/folly/io/test/IOBufQueueTest.cpp index 8ba3d7b4..26062185 100644 --- a/folly/io/test/IOBufQueueTest.cpp +++ b/folly/io/test/IOBufQueueTest.cpp @@ -385,3 +385,19 @@ TEST(IOBufQueue, AppendToString) { queue.appendToString(s); EXPECT_EQ("hello world", s); } + +TEST(IOBufQueue, Gather) { + IOBufQueue queue; + + queue.append(stringToIOBuf(SCL("hello "))); + queue.append(stringToIOBuf(SCL("world"))); + + EXPECT_EQ(queue.front()->length(), 6); + queue.gather(11); + EXPECT_EQ(queue.front()->length(), 11); + + StringPiece s( + reinterpret_cast(queue.front()->data()), + queue.front()->length()); + EXPECT_EQ("hello world", s); +} -- 2.34.1