void AsyncMcServerWorker::addClientSocket( apache::thrift::async::TAsyncSocket::UniquePtr&& socket, void* userCtxt) { if (!onRequest_) { throw std::logic_error("can't add a socket without onRequest callback"); } if (onAccepted_) { onAccepted_(); } socket->setSendTimeout(opts_.sendTimeout.count()); socket->setMaxReadsPerEvent(opts_.maxReadsPerEvent); socket->setNoDelay(true); sessions_.push_back( McServerSession::create( std::move(socket), onRequest_, onWriteQuiescence_, [this] (McServerSession& session) { if (onClosed_) { onClosed_(session); } sessions_.erase(sessions_.iterator_to(session)); }, onShutdown_, opts_, userCtxt )); }
void McServerSession::checkClosed() { if (!inFlight_) { assert(unansweredRequests_.empty()); assert(multigetRequests_.empty()); assert(pendingWrites_.empty()); if (state_ == CLOSING) { transport_->close(); if (onClosed_) { /* Ok if nullptr */ onClosed_(weakThis_.lock()); } } } }