class_docstr: The analysis context holds the pieces needed to route analysis requests
docstr: Enqueue a request on the upward queue
  
  req - request to be enqueued. The enqueue should be done before
        req.reply is replaced.
  
  returns True if the request was enqueued, False if the analysis
  has been cancelled. It is up to the caller to send a BoundaryExited
  reply to the request.
  
  Always executes on the boundary thread.
docstr_tok: ["Enqueue","a","request","on","the","upward","queue","req","-","request","to","be","enqueued",".","The","enqueue","should","be","done","before","req.reply","is","replaced",".","returns","True","if","the","request","was","enqueued",",","False","if","the","analysis","has","been","cancelled",".","It","is","up","to","the","caller","to","send","a","BoundaryExited","reply","to","the","request",".","Always","executes","on","the","boundary","thread","."]
code: def enqueue(self, req):
      """Enqueue a request on the upward queue
  
      req - request to be enqueued. The enqueue should be done before
            req.reply is replaced.
  
      returns True if the request was enqueued, False if the analysis
      has been cancelled. It is up to the caller to send a BoundaryExited
      reply to the request.
  
      Always executes on the boundary thread.
      """
      with self.lock:
          if not self.cancelled:
              assert req not in self.reqs_pending
              self.reqs_pending.add(req)
              self.upq.put(req)
              return True
          else:
              Communicable.reply(req, BoundaryExited())
              return False
  
imports: from .communicable import Communicable
  from .communicable.reply.upstream_exit import BoundaryExited
label_desc: Use image node_id 3 for calling the AnalysisContext obj's underlying member method code with example usage: obj.enqueue(req) and returns: True, False