code: def _recv(self):
          
  
          # Outer loop: receive some data
          while True:
              # Wait until we can go
              self._recv_lock.release()
              gevent.sleep()  # Yield to another thread
              self._recv_lock.acquire()
  
              recv_buf = self._sock.recv(self.recv_bufsize)
  
              # If it's empty, the peer closed the other end
              if not recv_buf:
                  # Manually kill the send thread; do this manually
                  # instead of calling close() because close() will kill
                  # us, and since close() would be running in our thread
                  # context, it would never get around to killing the
                  # send thread
                  if self._send_thread:
                      self._send_thread.kill()
                      self._send_thread = None
  
                  # Manually close the socket
                  self._sock.close()
                  self._sock = None
  
                  # Make sure the manager knows we're closed
                  super(TCPTendril, self).close()
  
                  # Notify the application
                  self.closed()
  
                  # As our last step, commit seppuku; this will keep
                  # _thread_error() from notifying the application of an
                  # erroneous exit from the receive thread
                  raise gevent.GreenletExit()
  
              # Process the received data
              self._recv_frameify(recv_buf)
docs: Implementation of the receive thread.  Waits for data to
          arrive on the socket, then passes the data through the defined
          receive framer and sends it on to the application.