Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(800)

Unified Diff: net/quic/iovector.h

Issue 2193073003: Move shared files in net/quic/ into net/quic/core/ (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: io_thread_unittest.cc Created 4 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « net/quic/interval_test.cc ('k') | net/quic/iovector.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: net/quic/iovector.h
diff --git a/net/quic/iovector.h b/net/quic/iovector.h
deleted file mode 100644
index cf77a9acc26af7e82ac3b1a1c152c08b949f782c..0000000000000000000000000000000000000000
--- a/net/quic/iovector.h
+++ /dev/null
@@ -1,238 +0,0 @@
-// Copyright 2013 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef NET_QUIC_IOVECTOR_H_
-#define NET_QUIC_IOVECTOR_H_
-
-#include <stddef.h>
-
-#include <algorithm>
-#include <vector>
-
-#include "base/logging.h"
-#include "net/base/iovec.h"
-#include "net/base/net_export.h"
-
-namespace net {
-
-// Calculate the total number of bytes in an array of iovec structures.
-inline size_t TotalIovecLength(const struct iovec* iov, size_t iovcnt) {
- size_t length = 0;
- if (iov != NULL) {
- for (size_t i = 0; i < iovcnt; ++i) {
- length += iov[i].iov_len;
- }
- }
- return length;
-}
-
-// IOVector is a helper class that makes it easier to work with POSIX vector I/O
-// struct. It is a thin wrapper by design and thus has no virtual functions and
-// all inlined methods. This class makes no assumptions about the ordering of
-// the pointer values of the blocks appended, it simply counts bytes when asked
-// to consume bytes.
-//
-// IOVector is a bookkeeping object that collects a description of buffers to
-// be read or written together and in order. It does not take ownership of the
-// blocks appended.
-//
-// Because it is used for scatter-gather operations, the order in which the
-// buffer blocks are added to the IOVector is important to the client. The
-// intended usage pattern is:
-//
-// iovector.Append(p0, len0);
-// ...
-// iovector.Append(pn, lenn);
-// int bytes_written = writev(fd, iovector.iovec(), iovector.Size());
-// if (bytes_written > 0)
-// iovector.Consume(bytes_written);
-//
-// The sequence is the same for readv, except that Consume() in this case is
-// used to change the IOVector to only keep track of description of blocks of
-// memory not yet written to.
-//
-// IOVector does not have any method to change the iovec entries that it
-// accumulates. This is due to the block merging nature of Append(): we'd like
-// to avoid accidentally change an entry that is assembled by two or more
-// Append()'s by simply an index access.
-//
-class NET_EXPORT_PRIVATE IOVector {
- public:
- // Provide a default constructor so it'll never be inhibited by adding other
- // constructors.
- IOVector();
- IOVector(const IOVector& other);
- ~IOVector();
-
- // Provides a way to convert system call-like iovec representation to
- // IOVector.
- void AppendIovec(const struct iovec* iov, size_t iovcnt) {
- for (size_t i = 0; i < iovcnt; ++i)
- Append(static_cast<char*>(iov[i].iov_base), iov[i].iov_len);
- }
-
- // Appends at most max_bytes from iovec to the IOVector.
- size_t AppendIovecAtMostBytes(const struct iovec* iov,
- size_t iovcnt,
- size_t max_bytes) {
- size_t bytes_appended = 0;
- for (size_t i = 0; i < iovcnt && max_bytes > 0; ++i) {
- const size_t length = std::min(max_bytes, iov[i].iov_len);
- Append(static_cast<char*>(iov[i].iov_base), length);
- max_bytes -= length;
- bytes_appended += length;
- }
- return bytes_appended;
- }
-
- // Append another block to the IOVector. Since IOVector can be used for read
- // and write, it always takes char*. Clients that writes will need to cast
- // away the constant of the pointer before appending a block.
- void Append(char* buffer, size_t length) {
- if (buffer != nullptr && length > 0) {
- if (iovec_.size() > 0) {
- struct iovec& last = iovec_.back();
- // If the new block is contiguous with the last block, just extend.
- if (static_cast<char*>(last.iov_base) + last.iov_len == buffer) {
- last.iov_len += length;
- return;
- }
- }
- struct iovec tmp = {buffer, length};
- iovec_.push_back(tmp);
- }
- }
-
- // Same as Append, but doesn't do the tail merge optimization.
- // Intended for testing.
- void AppendNoCoalesce(char* buffer, size_t length) {
- if (buffer != nullptr && length > 0) {
- struct iovec tmp = {buffer, length};
- iovec_.push_back(tmp);
- }
- }
-
- // Remove a number of bytes from the beginning of the IOVector. Since vector
- // I/O operations always occur at the beginning of the block list, a method
- // to remove bytes at the end is not provided.
- // It returns the number of bytes actually consumed (it'll only be smaller
- // than the requested number if the IOVector contains less data).
- size_t Consume(size_t length) {
- if (length == 0)
- return 0;
-
- size_t bytes_to_consume = length;
- std::vector<struct iovec>::iterator iter = iovec_.begin();
- std::vector<struct iovec>::iterator end = iovec_.end();
- for (; iter < end && bytes_to_consume >= iter->iov_len; ++iter) {
- bytes_to_consume -= iter->iov_len;
- }
- iovec_.erase(iovec_.begin(), iter);
- if (!iovec_.empty() && bytes_to_consume != 0) {
- iovec_[0].iov_base =
- static_cast<char*>(iovec_[0].iov_base) + bytes_to_consume;
- iovec_[0].iov_len -= bytes_to_consume;
- return length;
- }
- if (iovec_.size() == 0 && bytes_to_consume > 0) {
- LOG(DFATAL) << "Attempting to consume " << bytes_to_consume
- << " non-existent bytes.";
- }
- // At this point bytes_to_consume is the number of wanted bytes left over
- // after walking through all the iovec entries.
- return length - bytes_to_consume;
- }
-
- // Identical to Consume, but also copies the portion of the buffer being
- // consumed into |buffer|. |buffer| must be at least size |length|. If
- // the IOVector is less than |length|, the method consumes the entire
- // IOVector, logs an error and returns the length consumed.
- size_t ConsumeAndCopy(size_t length, char* buffer) {
- if (length == 0)
- return 0;
-
- size_t bytes_to_consume = length;
- // First consume all the iovecs which can be consumed completely.
- std::vector<struct iovec>::iterator iter = iovec_.begin();
- std::vector<struct iovec>::iterator end = iovec_.end();
- for (; iter < end && bytes_to_consume >= iter->iov_len; ++iter) {
- memcpy(buffer, iter->iov_base, iter->iov_len);
- bytes_to_consume -= iter->iov_len;
- buffer += iter->iov_len;
- }
- iovec_.erase(iovec_.begin(), iter);
- if (bytes_to_consume == 0) {
- return length;
- }
- if (iovec_.empty()) {
- LOG_IF(DFATAL, bytes_to_consume > 0) << "Attempting to consume "
- << bytes_to_consume
- << " non-existent bytes.";
- return length - bytes_to_consume;
- }
- // Partially consume the next iovec.
- memcpy(buffer, iovec_[0].iov_base, bytes_to_consume);
- iovec_[0].iov_base =
- static_cast<char*>(iovec_[0].iov_base) + bytes_to_consume;
- iovec_[0].iov_len -= bytes_to_consume;
- return length;
- }
-
- // TODO(joechan): If capacity is large, swap out for a blank one.
- // Clears the IOVector object to contain no blocks.
- void Clear() { iovec_.clear(); }
-
- // Swap the guts of two IOVector.
- void Swap(IOVector* other) { iovec_.swap(other->iovec_); }
-
- // Returns the number of valid blocks in the IOVector (not the number of
- // bytes).
- size_t Size() const { return iovec_.size(); }
-
- // Returns the total storage used by the IOVector in number of blocks (not
- // the number of bytes).
- size_t Capacity() const { return iovec_.capacity(); }
-
- // Returns true if there are no blocks in the IOVector.
- bool Empty() const { return iovec_.empty(); }
-
- // Returns the pointer to the beginning of the iovec to be used for vector
- // I/O operations. If the IOVector has no blocks appened, this function
- // returns NULL.
- struct iovec* iovec() {
- return !Empty() ? &iovec_[0] : NULL;
- }
-
- // Const version.
- const struct iovec* iovec() const { return !Empty() ? &iovec_[0] : NULL; }
-
- // Returns a pointer to one past the last byte of the last block. If the
- // IOVector is empty, NULL is returned.
- const char* LastBlockEnd() const {
- return iovec_.size() > 0
- ? static_cast<char*>(iovec_.back().iov_base) +
- iovec_.back().iov_len
- : NULL;
- }
-
- // Returns the total number of bytes in the IOVector.
- size_t TotalBufferSize() const { return TotalIovecLength(iovec(), Size()); }
-
- void Resize(size_t count) { iovec_.resize(count); }
-
- private:
- std::vector<struct iovec> iovec_;
-
- // IOVector has value-semantics; copy and assignment are allowed.
- // This class does not explicitly define copy/move constructors or the
- // assignment operator to preserve compiler-generated copy/move constructors
- // and assignment operators. Note that since IOVector does not own the
- // actual buffers that the struct iovecs point to, copies and assignments
- // result in a shallow copy of the buffers; resulting IOVectors will point
- // to the same copy of the underlying data.
-};
-
-} // namespace net
-
-#endif // NET_QUIC_IOVECTOR_H_
« no previous file with comments | « net/quic/interval_test.cc ('k') | net/quic/iovector.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698