/** * Creates a new connection either by reusing an object off the stack or * by allocating a new one entirely */ TNonblockingServer::TConnection* TNonblockingServer::createConnection( THRIFT_SOCKET socket, const sockaddr* addr, socklen_t addrLen) { // Check the stack Guard g(connMutex_); // pick an IO thread to handle this connection -- currently round robin assert(nextIOThread_ < ioThreads_.size()); int selectedThreadIdx = nextIOThread_; nextIOThread_ = static_cast<uint32_t>((nextIOThread_ + 1) % ioThreads_.size()); TNonblockingIOThread* ioThread = ioThreads_[selectedThreadIdx].get(); // Check the connection stack to see if we can re-use TConnection* result = NULL; if (connectionStack_.empty()) { result = new TConnection(socket, ioThread, addr, addrLen); ++numTConnections_; } else { result = connectionStack_.top(); connectionStack_.pop(); result->init(socket, ioThread, addr, addrLen); } activeConnections_.push_back(result); return result; }