proxygen
folly::AsyncPipeReader Class Reference

#include <AsyncPipe.h>

Inheritance diagram for folly::AsyncPipeReader:
folly::EventHandler folly::AsyncReader folly::DelayedDestruction folly::DelayedDestructionBase

Public Types

typedef std::unique_ptr< AsyncPipeReader, folly::DelayedDestruction::DestructorUniquePtr
 
- Public Types inherited from folly::EventHandler
enum  EventFlags {
  NONE = 0, READ = EV_READ, WRITE = EV_WRITE, READ_WRITE = (READ | WRITE),
  PERSIST = EV_PERSIST
}
 

Public Member Functions

 AsyncPipeReader (folly::EventBase *eventBase, int pipeFd)
 
void setReadCB (AsyncReader::ReadCallback *callback) override
 
AsyncReader::ReadCallbackgetReadCallback () const override
 
void setCloseCallback (std::function< void(int)> closeCb)
 
- Public Member Functions inherited from folly::EventHandler
 EventHandler (EventBase *eventBase, int fd)
 
 EventHandler (EventBase *eventBase=nullptr, NetworkSocket fd=NetworkSocket())
 
virtual ~EventHandler ()
 
bool registerHandler (uint16_t events)
 
void unregisterHandler ()
 
bool isHandlerRegistered () const
 
void attachEventBase (EventBase *eventBase)
 
void detachEventBase ()
 
void changeHandlerFD (int fd)
 
void changeHandlerFD (NetworkSocket fd)
 
void initHandler (EventBase *eventBase, int fd)
 
void initHandler (EventBase *eventBase, NetworkSocket fd)
 
uint16_t getRegisteredEvents () const
 
bool registerInternalHandler (uint16_t events)
 
bool isPending () const
 
- Public Member Functions inherited from folly::DelayedDestruction
virtual void destroy ()
 
bool getDestroyPending () const
 
- Public Member Functions inherited from folly::DelayedDestructionBase
virtual ~DelayedDestructionBase ()=default
 

Static Public Member Functions

template<typename... Args>
static UniquePtr newReader (Args &&...args)
 

Private Member Functions

 ~AsyncPipeReader () override
 
void handlerReady (uint16_t events) noexceptoverride
 
void failRead (const AsyncSocketException &ex)
 
void close ()
 

Private Attributes

int fd_
 
AsyncReader::ReadCallbackreadCallback_ {nullptr}
 
std::function< void(int)> closeCb_
 

Additional Inherited Members

- Protected Member Functions inherited from folly::AsyncReader
virtual ~AsyncReader ()=default
 
- Protected Member Functions inherited from folly::DelayedDestruction
 ~DelayedDestruction () override=default
 
 DelayedDestruction ()
 
- Protected Member Functions inherited from folly::DelayedDestructionBase
 DelayedDestructionBase ()
 
uint32_t getDestructorGuardCount () const
 

Detailed Description

Read from a pipe in an async manner.

Definition at line 34 of file AsyncPipe.h.

Member Typedef Documentation

Constructor & Destructor Documentation

folly::AsyncPipeReader::AsyncPipeReader ( folly::EventBase eventBase,
int  pipeFd 
)
inline

Definition at line 47 of file AsyncPipe.h.

Referenced by newReader().

48  : EventHandler(eventBase, pipeFd), fd_(pipeFd) {}
EventHandler(EventBase *eventBase, int fd)
Definition: EventHandler.h:65
folly::AsyncPipeReader::~AsyncPipeReader ( )
overrideprivate

Definition at line 28 of file AsyncPipe.cpp.

References close().

Referenced by setCloseCallback().

28  {
29  close();
30 }

Member Function Documentation

void folly::AsyncPipeReader::close ( )
private

Definition at line 43 of file AsyncPipe.cpp.

References folly::EventHandler::changeHandlerFD(), closeCb_, fd_, and folly::EventHandler::unregisterHandler().

Referenced by folly::AsyncPipeWriter::closeNow(), failRead(), setCloseCallback(), and ~AsyncPipeReader().

43  {
45  if (fd_ >= 0) {
46  changeHandlerFD(-1);
47 
48  if (closeCb_) {
49  closeCb_(fd_);
50  } else {
51  ::close(fd_);
52  }
53  fd_ = -1;
54  }
55 }
void changeHandlerFD(int fd)
Definition: EventHandler.h:143
std::function< void(int)> closeCb_
Definition: AsyncPipe.h:89
void folly::AsyncPipeReader::failRead ( const AsyncSocketException ex)
private

Definition at line 32 of file AsyncPipe.cpp.

References close(), fd_, readCallback_, and folly::AsyncReader::ReadCallback::readErr().

Referenced by handlerReady(), and setCloseCallback().

32  {
33  VLOG(5) << "AsyncPipeReader(this=" << this << ", fd=" << fd_
34  << "): failed while reading: " << ex.what();
35 
36  DCHECK(readCallback_ != nullptr);
37  AsyncReader::ReadCallback* callback = readCallback_;
38  readCallback_ = nullptr;
39  callback->readErr(ex);
40  close();
41 }
AsyncReader::ReadCallback * readCallback_
Definition: AsyncPipe.h:88
virtual void readErr(const AsyncSocketException &ex) noexcept=0
AsyncReader::ReadCallback* folly::AsyncPipeReader::getReadCallback ( ) const
inlineoverridevirtual

Get the read callback

Implements folly::AsyncReader.

Definition at line 69 of file AsyncPipe.h.

References readCallback_.

69  {
70  return readCallback_;
71  }
AsyncReader::ReadCallback * readCallback_
Definition: AsyncPipe.h:88
void folly::AsyncPipeReader::handlerReady ( uint16_t  events)
overrideprivatevirtualnoexcept

handlerReady() is invoked when the handler is ready.

Parameters
eventsA bitset indicating the events that are ready.

Implements folly::EventHandler.

Definition at line 57 of file AsyncPipe.cpp.

References folly::IOBuf::append(), folly::AsyncSocketException::BAD_ARGS, folly::IOBuf::capacity(), folly::IOBuf::create(), failRead(), fd_, folly::AsyncReader::ReadCallback::getReadBuffer(), folly::AsyncSocketException::INVALID_STATE, folly::AsyncReader::ReadCallback::isBufferMovable(), folly::AsyncReader::ReadCallback::maxBufferSize(), folly::gen::move, folly::EventHandler::READ, folly::AsyncReader::ReadCallback::readBufferAvailable(), readCallback_, folly::AsyncReader::ReadCallback::readDataAvailable(), folly::AsyncReader::ReadCallback::readEOF(), folly::readNoInt(), folly::EventHandler::unregisterHandler(), and folly::IOBuf::writableBuffer().

Referenced by setCloseCallback(), and folly::AsyncPipeWriter::writev().

57  {
58  DestructorGuard dg(this);
59  CHECK(events & EventHandler::READ);
60 
61  VLOG(5) << "AsyncPipeReader::handlerReady() this=" << this << ", fd=" << fd_;
62  assert(readCallback_ != nullptr);
63 
64  while (readCallback_) {
65  // - What API does callback support?
66  const auto movable = readCallback_->isBufferMovable(); // noexcept
67 
68  // Get the buffer to read into.
69  void* buf = nullptr;
70  size_t buflen = 0;
71  std::unique_ptr<IOBuf> ioBuf;
72 
73  if (movable) {
75  buf = ioBuf->writableBuffer();
76  buflen = ioBuf->capacity();
77  } else {
78  try {
79  readCallback_->getReadBuffer(&buf, &buflen);
80  } catch (const std::exception& ex) {
81  AsyncSocketException aex(
83  string("ReadCallback::getReadBuffer() "
84  "threw exception: ") +
85  ex.what());
86  failRead(aex);
87  return;
88  } catch (...) {
89  AsyncSocketException aex(
91  string("ReadCallback::getReadBuffer() "
92  "threw non-exception type"));
93  failRead(aex);
94  return;
95  }
96  if (buf == nullptr || buflen == 0) {
97  AsyncSocketException aex(
99  string("ReadCallback::getReadBuffer() "
100  "returned empty buffer"));
101  failRead(aex);
102  return;
103  }
104  }
105 
106  // Perform the read
107  ssize_t bytesRead = folly::readNoInt(fd_, buf, buflen);
108 
109  if (bytesRead > 0) {
110  if (movable) {
111  ioBuf->append(std::size_t(bytesRead));
113  } else {
114  readCallback_->readDataAvailable(size_t(bytesRead));
115  }
116  // Fall through and continue around the loop if the read
117  // completely filled the available buffer.
118  // Note that readCallback_ may have been uninstalled or changed inside
119  // readDataAvailable().
120  if (static_cast<size_t>(bytesRead) < buflen) {
121  return;
122  }
123  } else if (bytesRead < 0 && (errno == EAGAIN || errno == EWOULDBLOCK)) {
124  // No more data to read right now.
125  return;
126  } else if (bytesRead < 0) {
127  AsyncSocketException ex(
128  AsyncSocketException::INVALID_STATE, "read failed", errno);
129  failRead(ex);
130  return;
131  } else {
132  assert(bytesRead == 0);
133  // EOF
134 
136  AsyncReader::ReadCallback* callback = readCallback_;
137  readCallback_ = nullptr;
138  callback->readEOF();
139  return;
140  }
141  // Max reads per loop?
142  }
143 }
virtual void readBufferAvailable(std::unique_ptr< IOBuf >) noexcept
virtual void readDataAvailable(size_t len) noexcept=0
static std::unique_ptr< IOBuf > create(std::size_t capacity)
Definition: IOBuf.cpp:229
constexpr detail::Map< Move > move
Definition: Base-inl.h:2567
ssize_t readNoInt(int fd, void *buf, size_t count)
Definition: FileUtil.cpp:102
virtual bool isBufferMovable() noexcept
std::size_t capacity() const
Definition: IOBuf.h:593
AsyncReader::ReadCallback * readCallback_
Definition: AsyncPipe.h:88
uint8_t * writableBuffer()
Definition: IOBuf.h:572
virtual void getReadBuffer(void **bufReturn, size_t *lenReturn)=0
virtual size_t maxBufferSize() const
void failRead(const AsyncSocketException &ex)
Definition: AsyncPipe.cpp:32
virtual void readEOF() noexcept=0
void append(std::size_t amount)
Definition: IOBuf.h:689
template<typename... Args>
static UniquePtr folly::AsyncPipeReader::newReader ( Args &&...  args)
inlinestatic

Definition at line 43 of file AsyncPipe.h.

References AsyncPipeReader().

Referenced by folly::AsyncSSLSocket::willBlock().

43  {
44  return UniquePtr(new AsyncPipeReader(std::forward<Args>(args)...));
45  }
std::unique_ptr< AsyncPipeReader, folly::DelayedDestruction::Destructor > UniquePtr
Definition: AsyncPipe.h:40
AsyncPipeReader(folly::EventBase *eventBase, int pipeFd)
Definition: AsyncPipe.h:47
void folly::AsyncPipeReader::setCloseCallback ( std::function< void(int)>  closeCb)
inline

Set a special hook to close the socket (otherwise, will call close())

Definition at line 76 of file AsyncPipe.h.

References close(), closeCb_, failRead(), handlerReady(), folly::pushmi::__adl::noexcept(), uint16_t, and ~AsyncPipeReader().

76  {
77  closeCb_ = closeCb;
78  }
std::function< void(int)> closeCb_
Definition: AsyncPipe.h:89
void folly::AsyncPipeReader::setReadCB ( AsyncReader::ReadCallback callback)
inlineoverridevirtual

Set the read callback and automatically install/uninstall the handler for events.

Implements folly::AsyncReader.

Definition at line 54 of file AsyncPipe.h.

References folly::EventHandler::isHandlerRegistered(), folly::EventHandler::PERSIST, folly::EventHandler::READ, readCallback_, folly::EventHandler::registerHandler(), and folly::EventHandler::unregisterHandler().

54  {
55  if (callback == readCallback_) {
56  return;
57  }
58  readCallback_ = callback;
61  } else if (!readCallback_ && isHandlerRegistered()) {
63  }
64  }
AsyncReader::ReadCallback * readCallback_
Definition: AsyncPipe.h:88
bool registerHandler(uint16_t events)
Definition: EventHandler.h:100
bool isHandlerRegistered() const
Definition: EventHandler.h:112

Member Data Documentation

std::function<void(int)> folly::AsyncPipeReader::closeCb_
private
int folly::AsyncPipeReader::fd_
private
AsyncReader::ReadCallback* folly::AsyncPipeReader::readCallback_ {nullptr}
private

Definition at line 88 of file AsyncPipe.h.

Referenced by failRead(), getReadCallback(), handlerReady(), and setReadCB().


The documentation for this class was generated from the following files: