|  | @@ -78,13 +78,11 @@ module GRPC
 | 
	
		
			
				|  |  |      # @param requests the Enumerable of requests to send
 | 
	
		
			
				|  |  |      # @return an Enumerator of requests to yield
 | 
	
		
			
				|  |  |      def run_on_client(requests, &blk)
 | 
	
		
			
				|  |  | -      enq_th = start_write_loop(requests)
 | 
	
		
			
				|  |  | -      loop_th = start_read_loop
 | 
	
		
			
				|  |  | +      @enq_th = start_write_loop(requests)
 | 
	
		
			
				|  |  | +      @loop_th = start_read_loop
 | 
	
		
			
				|  |  |        replies = each_queued_msg
 | 
	
		
			
				|  |  |        return replies if blk.nil?
 | 
	
		
			
				|  |  |        replies.each { |r| blk.call(r) }
 | 
	
		
			
				|  |  | -      enq_th.join
 | 
	
		
			
				|  |  | -      loop_th.join
 | 
	
		
			
				|  |  |      end
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      # Begins orchestration of the Bidi stream for a server generating replies.
 | 
	
	
		
			
				|  | @@ -100,10 +98,8 @@ module GRPC
 | 
	
		
			
				|  |  |      # @param gen_each_reply [Proc] generates the BiDi stream replies.
 | 
	
		
			
				|  |  |      def run_on_server(gen_each_reply)
 | 
	
		
			
				|  |  |        replys = gen_each_reply.call(each_queued_msg)
 | 
	
		
			
				|  |  | -      enq_th = start_write_loop(replys, is_client: false)
 | 
	
		
			
				|  |  | -      loop_th = start_read_loop
 | 
	
		
			
				|  |  | -      loop_th.join
 | 
	
		
			
				|  |  | -      enq_th.join
 | 
	
		
			
				|  |  | +      @enq_th = start_write_loop(replys, is_client: false)
 | 
	
		
			
				|  |  | +      @loop_th = start_read_loop
 | 
	
		
			
				|  |  |      end
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      private
 | 
	
	
		
			
				|  | @@ -122,10 +118,13 @@ module GRPC
 | 
	
		
			
				|  |  |          logger.debug("each_queued_msg: msg##{count}")
 | 
	
		
			
				|  |  |          count += 1
 | 
	
		
			
				|  |  |          req = @readq.pop
 | 
	
		
			
				|  |  | +        logger.debug("each_queued_msg: req = #{req}")
 | 
	
		
			
				|  |  |          throw req if req.is_a? StandardError
 | 
	
		
			
				|  |  |          break if req.equal?(END_OF_READS)
 | 
	
		
			
				|  |  |          yield req
 | 
	
		
			
				|  |  |        end
 | 
	
		
			
				|  |  | +      @loop_th.join
 | 
	
		
			
				|  |  | +      @enq_th.join
 | 
	
		
			
				|  |  |      end
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      # during bidi-streaming, read the requests to send from a separate thread
 | 
	
	
		
			
				|  | @@ -136,20 +135,23 @@ module GRPC
 | 
	
		
			
				|  |  |          begin
 | 
	
		
			
				|  |  |            count = 0
 | 
	
		
			
				|  |  |            requests.each do |req|
 | 
	
		
			
				|  |  | +            logger.debug("bidi-write_loop: #{count}")
 | 
	
		
			
				|  |  |              count += 1
 | 
	
		
			
				|  |  |              payload = @marshal.call(req)
 | 
	
		
			
				|  |  |              @call.run_batch(@cq, write_tag, INFINITE_FUTURE,
 | 
	
		
			
				|  |  |                              SEND_MESSAGE => payload)
 | 
	
		
			
				|  |  |            end
 | 
	
		
			
				|  |  |            if is_client
 | 
	
		
			
				|  |  | -            logger.debug("bidi-client: sent #{count} reqs, waiting to finish")
 | 
	
		
			
				|  |  | -            @call.run_batch(@cq, write_tag, INFINITE_FUTURE,
 | 
	
		
			
				|  |  | -                            SEND_CLOSE_FROM_CLIENT => nil,
 | 
	
		
			
				|  |  | -                            RECV_STATUS_ON_CLIENT => nil)
 | 
	
		
			
				|  |  | +            logger.debug("bidi-write-loop: sent #{count}, waiting to finish")
 | 
	
		
			
				|  |  | +            batch_result = @call.run_batch(@cq, write_tag, INFINITE_FUTURE,
 | 
	
		
			
				|  |  | +                                           SEND_CLOSE_FROM_CLIENT => nil,
 | 
	
		
			
				|  |  | +                                           RECV_STATUS_ON_CLIENT => nil)
 | 
	
		
			
				|  |  | +            batch_result.check_status
 | 
	
		
			
				|  |  |            end
 | 
	
		
			
				|  |  |          rescue StandardError => e
 | 
	
		
			
				|  |  | -          logger.warn('bidi: write_loop failed')
 | 
	
		
			
				|  |  | +          logger.warn('bidi-write_loop: failed')
 | 
	
		
			
				|  |  |            logger.warn(e)
 | 
	
		
			
				|  |  | +          raise e
 | 
	
		
			
				|  |  |          end
 | 
	
		
			
				|  |  |        end
 | 
	
		
			
				|  |  |      end
 | 
	
	
		
			
				|  | @@ -163,7 +165,7 @@ module GRPC
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |            # queue the initial read before beginning the loop
 | 
	
		
			
				|  |  |            loop do
 | 
	
		
			
				|  |  | -            logger.debug("waiting for read #{count}")
 | 
	
		
			
				|  |  | +            logger.debug("bidi-read_loop: #{count}")
 | 
	
		
			
				|  |  |              count += 1
 | 
	
		
			
				|  |  |              # TODO: ensure metadata is read if available, currently it's not
 | 
	
		
			
				|  |  |              batch_result = @call.run_batch(@cq, read_tag, INFINITE_FUTURE,
 | 
	
	
		
			
				|  | @@ -171,7 +173,7 @@ module GRPC
 | 
	
		
			
				|  |  |              # handle the next message
 | 
	
		
			
				|  |  |              if batch_result.message.nil?
 | 
	
		
			
				|  |  |                @readq.push(END_OF_READS)
 | 
	
		
			
				|  |  | -              logger.debug('done reading!')
 | 
	
		
			
				|  |  | +              logger.debug('bidi-read-loop: done reading!')
 | 
	
		
			
				|  |  |                break
 | 
	
		
			
				|  |  |              end
 | 
	
		
			
				|  |  |  
 |