proxygen
wangle::AsyncSocketHandler Class Reference

#include <AsyncSocketHandler.h>

Inheritance diagram for wangle::AsyncSocketHandler:
wangle::HandlerAdapter< R, W > folly::AsyncReader::ReadCallback wangle::Handler< R, R, W, W > wangle::HandlerBase< HandlerContext< R, W > >

Classes

class  WriteCallback
 

Public Member Functions

 AsyncSocketHandler (std::shared_ptr< folly::AsyncTransportWrapper > socket)
 
 AsyncSocketHandler (AsyncSocketHandler &&)=default
 
 ~AsyncSocketHandler () override
 
void attachReadCallback ()
 
void detachReadCallback ()
 
void attachEventBase (folly::EventBase *eventBase)
 
void detachEventBase ()
 
void transportActive (Context *ctx) override
 
void transportInactive (Context *ctx) override
 
void detachPipeline (Context *) override
 
folly::Future< folly::Unitwrite (Context *ctx, std::unique_ptr< folly::IOBuf > buf) override
 
folly::Future< folly::UnitwriteException (Context *ctx, folly::exception_wrapper) override
 
folly::Future< folly::Unitclose (Context *ctx) override
 
void readEOF (Context *ctx) override
 
void getReadBuffer (void **bufReturn, size_t *lenReturn) override
 
void readDataAvailable (size_t len) noexceptoverride
 
void readEOF () noexceptoverride
 
void readErr (const folly::AsyncSocketException &ex) noexceptoverride
 
- Public Member Functions inherited from wangle::HandlerAdapter< R, W >
void read (Context *ctx, R msg) override
 
folly::Future< folly::Unitwrite (Context *ctx, W msg) override
 
- Public Member Functions inherited from wangle::Handler< R, R, W, W >
 ~Handler () override=default
 
virtual void read (Context *ctx, Rmsg)=0
 
virtual void readEOF (Context *ctx)
 
virtual void readException (Context *ctx, folly::exception_wrapper e)
 
virtual void transportActive (Context *ctx)
 
virtual void transportInactive (Context *ctx)
 
virtual folly::Future< folly::Unitwrite (Context *ctx, Wmsg)=0
 
virtual folly::Future< folly::UnitwriteException (Context *ctx, folly::exception_wrapper e)
 
virtual folly::Future< folly::Unitclose (Context *ctx)
 
- Public Member Functions inherited from wangle::HandlerBase< HandlerContext< R, W > >
virtual ~HandlerBase ()=default
 
virtual void attachPipeline (HandlerContext< R, W > *)
 
virtual void detachPipeline (HandlerContext< R, W > *)
 
HandlerContext< R, W > * getContext ()
 
- Public Member Functions inherited from folly::AsyncReader::ReadCallback
virtual ~ReadCallback ()=default
 
virtual bool isBufferMovable () noexcept
 
virtual size_t maxBufferSize () const
 
virtual void readBufferAvailable (std::unique_ptr< IOBuf >) noexcept
 

Private Member Functions

void refreshTimeout ()
 
folly::Future< folly::Unitshutdown (Context *ctx, bool closeWithReset)
 

Private Attributes

folly::IOBufQueue bufQueue_ {folly::IOBufQueue::cacheChainLength()}
 
std::shared_ptr< folly::AsyncTransportWrappersocket_ {nullptr}
 
bool firedInactive_ {false}
 
bool pipelineDeleted_ {false}
 

Additional Inherited Members

- Public Types inherited from wangle::HandlerAdapter< R, W >
typedef Handler< R, R, W, W >::Context Context
 
- Public Types inherited from wangle::Handler< R, R, W, W >
typedef R rin
 
typedef R rout
 
typedef W win
 
typedef W wout
 
typedef HandlerContext< R, W > Context
 
- Static Public Attributes inherited from wangle::Handler< R, R, W, W >
static const HandlerDir dir
 

Detailed Description

Definition at line 29 of file AsyncSocketHandler.h.

Constructor & Destructor Documentation

wangle::AsyncSocketHandler::AsyncSocketHandler ( std::shared_ptr< folly::AsyncTransportWrapper socket)
inlineexplicit

Definition at line 33 of file AsyncSocketHandler.h.

35  : socket_(std::move(socket)) {}
constexpr detail::Map< Move > move
Definition: Base-inl.h:2567
std::shared_ptr< folly::AsyncTransportWrapper > socket_
NetworkSocket socket(int af, int type, int protocol)
Definition: NetOps.cpp:412
wangle::AsyncSocketHandler::AsyncSocketHandler ( AsyncSocketHandler &&  )
default
wangle::AsyncSocketHandler::~AsyncSocketHandler ( )
inlineoverride

Definition at line 39 of file AsyncSocketHandler.h.

References detachReadCallback(), folly::gen::move, s, and socket_.

39  {
41 
42  if (socket_) {
43  auto evb = socket_->getEventBase();
44  if (evb) {
45  evb->runImmediatelyOrRunInEventBaseThreadAndWait(
46  [s = std::move(socket_)]() mutable {
47  s.reset();
48  });
49  }
50  }
51  }
constexpr detail::Map< Move > move
Definition: Base-inl.h:2567
std::shared_ptr< folly::AsyncTransportWrapper > socket_
static set< string > s

Member Function Documentation

void wangle::AsyncSocketHandler::attachEventBase ( folly::EventBase eventBase)
inline

Definition at line 68 of file AsyncSocketHandler.h.

References socket_.

68  {
69  if (eventBase && !socket_->getEventBase()) {
70  socket_->attachEventBase(eventBase);
71  }
72  }
std::shared_ptr< folly::AsyncTransportWrapper > socket_
void wangle::AsyncSocketHandler::attachReadCallback ( )
inline

Definition at line 53 of file AsyncSocketHandler.h.

References socket_.

Referenced by transportActive().

53  {
54  socket_->setReadCB(socket_->good() ? this : nullptr);
55  }
std::shared_ptr< folly::AsyncTransportWrapper > socket_
folly::Future<folly::Unit> wangle::AsyncSocketHandler::close ( Context ctx)
inlineoverride

Definition at line 125 of file AsyncSocketHandler.h.

References folly::isSet(), folly::makeFuture(), shutdown(), socket_, and folly::WRITE_SHUTDOWN.

125  {
126  bool shutdownWriteOnly = isSet(ctx->getWriteFlags(),
128  if (shutdownWriteOnly) {
129  socket_->shutdownWrite();
130  return folly::makeFuture();
131  } else {
132  return shutdown(ctx, false);
133  }
134  }
folly::Future< folly::Unit > shutdown(Context *ctx, bool closeWithReset)
bool isSet(WriteFlags a, WriteFlags b)
std::shared_ptr< folly::AsyncTransportWrapper > socket_
Future< typename std::decay< T >::type > makeFuture(T &&t)
Definition: Future-inl.h:1310
void wangle::AsyncSocketHandler::detachEventBase ( )
inline

Definition at line 74 of file AsyncSocketHandler.h.

References detachReadCallback(), and socket_.

74  {
76  if (socket_->getEventBase()) {
77  socket_->detachEventBase();
78  }
79  }
std::shared_ptr< folly::AsyncTransportWrapper > socket_
void wangle::AsyncSocketHandler::detachPipeline ( Context )
inlineoverride

Definition at line 95 of file AsyncSocketHandler.h.

References detachReadCallback().

95  {
97  }
void wangle::AsyncSocketHandler::detachReadCallback ( )
inline

Definition at line 57 of file AsyncSocketHandler.h.

References firedInactive_, wangle::HandlerBase< HandlerContext< R, W > >::getContext(), and socket_.

Referenced by detachEventBase(), detachPipeline(), shutdown(), transportInactive(), and ~AsyncSocketHandler().

57  {
58  if (socket_ && socket_->getReadCallback() == this) {
59  socket_->setReadCB(nullptr);
60  }
61  auto ctx = getContext();
62  if (ctx && !firedInactive_) {
63  firedInactive_ = true;
64  ctx->fireTransportInactive();
65  }
66  }
HandlerContext< R, W > * getContext()
Definition: Handler.h:34
std::shared_ptr< folly::AsyncTransportWrapper > socket_
void wangle::AsyncSocketHandler::getReadBuffer ( void **  bufReturn,
size_t *  lenReturn 
)
inlineoverridevirtual

When data becomes available, getReadBuffer() will be invoked to get the buffer into which data should be read.

This method allows the ReadCallback to delay buffer allocation until data becomes available. This allows applications to manage large numbers of idle connections, without having to maintain a separate read buffer for each idle connection.

It is possible that in some cases, getReadBuffer() may be called multiple times before readDataAvailable() is invoked. In this case, the data will be written to the buffer returned from the most recent call to readDataAvailable(). If the previous calls to readDataAvailable() returned different buffers, the ReadCallback is responsible for ensuring that they are not leaked.

If getReadBuffer() throws an exception, returns a nullptr buffer, or returns a 0 length, the ReadCallback will be uninstalled and its readError() method will be invoked.

getReadBuffer() is not allowed to change the transport state before it returns. (For example, it should never uninstall the read callback, or set a different read callback.)

Parameters
bufReturngetReadBuffer() should update *bufReturn to contain the address of the read buffer. This parameter will never be nullptr.
lenReturngetReadBuffer() should update *lenReturn to contain the maximum number of bytes that may be written to the read buffer. This parameter will never be nullptr.

Implements folly::AsyncReader::ReadCallback.

Definition at line 142 of file AsyncSocketHandler.h.

References bufQueue_, wangle::HandlerBase< HandlerContext< R, W > >::getContext(), wangle::HandlerContext< In, Out >::getReadBufferSettings(), and folly::IOBufQueue::preallocate().

142  {
143  const auto readBufferSettings = getContext()->getReadBufferSettings();
144  const auto ret = bufQueue_.preallocate(
145  readBufferSettings.first,
146  readBufferSettings.second);
147  *bufReturn = ret.first;
148  *lenReturn = ret.second;
149  }
std::pair< void *, std::size_t > preallocate(std::size_t min, std::size_t newAllocationSize, std::size_t max=std::numeric_limits< std::size_t >::max())
Definition: IOBufQueue.h:356
HandlerContext< R, W > * getContext()
Definition: Handler.h:34
virtual std::pair< uint64_t, uint64_t > getReadBufferSettings()=0
void wangle::AsyncSocketHandler::readDataAvailable ( size_t  len)
inlineoverridevirtualnoexcept

readDataAvailable() will be invoked when data has been successfully read into the buffer returned by the last call to getReadBuffer().

The read callback remains installed after readDataAvailable() returns. It must be explicitly uninstalled to stop receiving read events. getReadBuffer() will be called at least once before each call to readDataAvailable(). getReadBuffer() will also be called before any call to readEOF().

Parameters
lenThe number of bytes placed in the buffer.

Implements folly::AsyncReader::ReadCallback.

Definition at line 151 of file AsyncSocketHandler.h.

References bufQueue_, wangle::HandlerContext< In, Out >::fireRead(), wangle::HandlerBase< HandlerContext< R, W > >::getContext(), folly::IOBufQueue::postallocate(), and refreshTimeout().

151  {
152  refreshTimeout();
153  bufQueue_.postallocate(len);
155  }
HandlerContext< R, W > * getContext()
Definition: Handler.h:34
virtual void fireRead(In msg)=0
void postallocate(std::size_t n)
Definition: IOBufQueue.h:380
void wangle::AsyncSocketHandler::readEOF ( Context ctx)
inlineoverride

Definition at line 138 of file AsyncSocketHandler.h.

138  {
139  ctx->fireReadEOF();
140  }
void wangle::AsyncSocketHandler::readEOF ( )
inlineoverridevirtualnoexcept

readEOF() will be invoked when the transport is closed.

The read callback will be automatically uninstalled immediately before readEOF() is invoked.

Implements folly::AsyncReader::ReadCallback.

Definition at line 157 of file AsyncSocketHandler.h.

References wangle::HandlerContext< In, Out >::fireReadEOF(), and wangle::HandlerBase< HandlerContext< R, W > >::getContext().

157  {
158  getContext()->fireReadEOF();
159  }
virtual void fireReadEOF()=0
HandlerContext< R, W > * getContext()
Definition: Handler.h:34
void wangle::AsyncSocketHandler::readErr ( const folly::AsyncSocketException ex)
inlineoverridevirtualnoexcept

readError() will be invoked if an error occurs reading from the transport.

The read callback will be automatically uninstalled immediately before readError() is invoked.

Parameters
exAn exception describing the error that occurred.

Implements folly::AsyncReader::ReadCallback.

Definition at line 161 of file AsyncSocketHandler.h.

References wangle::HandlerContext< In, Out >::fireReadException(), and wangle::HandlerBase< HandlerContext< R, W > >::getContext().

162  {
164  folly::make_exception_wrapper<folly::AsyncSocketException>(ex));
165  }
HandlerContext< R, W > * getContext()
Definition: Handler.h:34
virtual void fireReadException(folly::exception_wrapper e)=0
void wangle::AsyncSocketHandler::refreshTimeout ( )
inlineprivate

Definition at line 168 of file AsyncSocketHandler.h.

References wangle::HandlerBase< HandlerContext< R, W > >::getContext(), wangle::HandlerContext< In, Out >::getPipeline(), wangle::PipelineBase::getPipelineManager(), and wangle::PipelineManager::refreshTimeout().

Referenced by readDataAvailable(), and write().

168  {
169  auto manager = getContext()->getPipeline()->getPipelineManager();
170  if (manager) {
171  manager->refreshTimeout();
172  }
173  }
PipelineManager * getPipelineManager()
Definition: Pipeline.h:51
HandlerContext< R, W > * getContext()
Definition: Handler.h:34
virtual void refreshTimeout()
Definition: Pipeline.h:40
virtual PipelineBase * getPipeline()=0
folly::Future<folly::Unit> wangle::AsyncSocketHandler::shutdown ( Context ctx,
bool  closeWithReset 
)
inlineprivate

Definition at line 175 of file AsyncSocketHandler.h.

References detachReadCallback(), folly::makeFuture(), pipelineDeleted_, and socket_.

Referenced by close(), and writeException().

175  {
176  if (socket_) {
178  if (closeWithReset) {
179  socket_->closeWithReset();
180  } else {
181  socket_->closeNow();
182  }
183  }
184  if (!pipelineDeleted_) {
185  pipelineDeleted_ = true;
186  ctx->getPipeline()->deletePipeline();
187  }
188  return folly::makeFuture();
189  }
std::shared_ptr< folly::AsyncTransportWrapper > socket_
Future< typename std::decay< T >::type > makeFuture(T &&t)
Definition: Future-inl.h:1310
void wangle::AsyncSocketHandler::transportActive ( Context ctx)
inlineoverride

Definition at line 81 of file AsyncSocketHandler.h.

References attachReadCallback(), firedInactive_, and socket_.

81  {
82  ctx->getPipeline()->setTransport(socket_);
84  firedInactive_ = false;
85  ctx->fireTransportActive();
86  }
std::shared_ptr< folly::AsyncTransportWrapper > socket_
void wangle::AsyncSocketHandler::transportInactive ( Context ctx)
inlineoverride

Definition at line 88 of file AsyncSocketHandler.h.

References detachReadCallback().

88  {
89  // detachReadCallback invokes fireTransportInactive() if the transport
90  // is currently active.
92  ctx->getPipeline()->setTransport(nullptr);
93  }
folly::Future<folly::Unit> wangle::AsyncSocketHandler::write ( Context ctx,
std::unique_ptr< folly::IOBuf buf 
)
inlineoverride

Definition at line 99 of file AsyncSocketHandler.h.

References folly::makeFuture(), folly::gen::move, refreshTimeout(), socket_, and UNLIKELY.

101  {
102  refreshTimeout();
103  if (UNLIKELY(!buf)) {
104  return folly::makeFuture();
105  }
106 
107  if (!socket_->good()) {
108  VLOG(5) << "socket is closed in write()";
109  return folly::makeFuture<folly::Unit>(folly::AsyncSocketException(
110  folly::AsyncSocketException::AsyncSocketExceptionType::NOT_OPEN,
111  "socket is closed in write()"));
112  }
113 
114  auto cb = new WriteCallback();
115  auto future = cb->promise_.getFuture();
116  socket_->writeChain(cb, std::move(buf), ctx->getWriteFlags());
117  return future;
118  }
constexpr detail::Map< Move > move
Definition: Base-inl.h:2567
std::shared_ptr< folly::AsyncTransportWrapper > socket_
#define UNLIKELY(x)
Definition: Likely.h:48
Future< typename std::decay< T >::type > makeFuture(T &&t)
Definition: Future-inl.h:1310
folly::Future<folly::Unit> wangle::AsyncSocketHandler::writeException ( Context ctx,
folly::exception_wrapper   
)
inlineoverride

Definition at line 120 of file AsyncSocketHandler.h.

References shutdown().

121  {
122  return shutdown(ctx, true);
123  }
folly::Future< folly::Unit > shutdown(Context *ctx, bool closeWithReset)

Member Data Documentation

folly::IOBufQueue wangle::AsyncSocketHandler::bufQueue_ {folly::IOBufQueue::cacheChainLength()}
private

Definition at line 209 of file AsyncSocketHandler.h.

Referenced by getReadBuffer(), and readDataAvailable().

bool wangle::AsyncSocketHandler::firedInactive_ {false}
private

Definition at line 211 of file AsyncSocketHandler.h.

Referenced by detachReadCallback(), and transportActive().

bool wangle::AsyncSocketHandler::pipelineDeleted_ {false}
private

Definition at line 212 of file AsyncSocketHandler.h.

Referenced by shutdown().

std::shared_ptr<folly::AsyncTransportWrapper> wangle::AsyncSocketHandler::socket_ {nullptr}
private

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