/*
- * Copyright 2017 Facebook, Inc.
+ * Copyright 2017-present Facebook, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-
#pragma once
#include <folly/Optional.h>
*
* @param evb EventBase that will manage this socket.
* @param fd File descriptor to take over (should be a connected socket).
+ * @param zeroCopyBufId Zerocopy buf id to start with.
*/
- AsyncSocket(EventBase* evb, int fd);
+ AsyncSocket(EventBase* evb, int fd, uint32_t zeroCopyBufId = 0);
/**
* Create an AsyncSocket from a different, already connected AsyncSocket.
void setReadCB(ReadCallback* callback) override;
ReadCallback* getReadCallback() const override;
- static const size_t kDefaultZeroCopyThreshold = 0;
-
bool setZeroCopy(bool enable);
bool getZeroCopy() const {
return zeroCopyEnabled_;
}
- void setZeroCopyWriteChainThreshold(size_t threshold);
- size_t getZeroCopyWriteChainThreshold() const {
- return zeroCopyWriteChainThreshold_;
+ uint32_t getZeroCopyBufId() const {
+ return zeroCopyBufId_;
}
- bool isZeroCopyMsg(const cmsghdr& cmsg) const;
- void processZeroCopyMsg(const cmsghdr& cmsg);
-
void write(WriteCallback* callback, const void* buf, size_t bytes,
WriteFlags flags = WriteFlags::NONE) override;
void writev(WriteCallback* callback, const iovec* vec, size_t count,
*/
bool isZeroCopyWriteInProgress() const noexcept;
+ /**
+ * Tries to process the msg error queue
+ * And returns true if there are no more zero copy writes in progress
+ */
+ bool processZeroCopyWriteInProgress() noexcept;
+
/**
* writeReturn is the total number of bytes written, or WRITE_ERROR on error.
* If no data has been written, 0 is returned.
virtual void checkForImmediateRead() noexcept;
virtual void handleInitialReadWrite() noexcept;
virtual void prepareReadBuffer(void** buf, size_t* buflen);
- virtual void handleErrMessages() noexcept;
+ virtual size_t handleErrMessages() noexcept;
virtual void handleRead() noexcept;
virtual void handleWrite() noexcept;
virtual void handleConnect() noexcept;
void cachePeerAddress() const;
bool isZeroCopyRequest(WriteFlags flags);
- uint32_t getNextZeroCopyBuffId() {
- return zeroCopyBuffId_++;
+
+ bool isZeroCopyMsg(const cmsghdr& cmsg) const;
+ void processZeroCopyMsg(const cmsghdr& cmsg);
+
+ uint32_t getNextZeroCopyBufId() {
+ return zeroCopyBufId_++;
}
- void adjustZeroCopyFlags(folly::IOBuf* buf, folly::WriteFlags& flags);
- void adjustZeroCopyFlags(
- const iovec* vec,
- uint32_t count,
- folly::WriteFlags& flags);
+ void adjustZeroCopyFlags(folly::WriteFlags& flags);
void addZeroCopyBuf(std::unique_ptr<folly::IOBuf>&& buf);
void addZeroCopyBuf(folly::IOBuf* ptr);
void setZeroCopyBuf(std::unique_ptr<folly::IOBuf>&& buf);
// there is a that maps a buffer id to a raw folly::IOBuf ptr
// and another one that adds a ref count for a folly::IOBuf that is either
// the original ptr or nullptr
- uint32_t zeroCopyBuffId_{0};
+ uint32_t zeroCopyBufId_{0};
struct IOBufInfo {
uint32_t count_{0};
bool trackEor_{false};
bool zeroCopyEnabled_{false};
bool zeroCopyVal_{false};
- size_t zeroCopyWriteChainThreshold_{kDefaultZeroCopyThreshold};
};
#ifdef _MSC_VER
#pragma vtordisp(pop)