aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/ruby/lib/grpc/generic/bidi_call.rb
diff options
context:
space:
mode:
Diffstat (limited to 'src/ruby/lib/grpc/generic/bidi_call.rb')
-rw-r--r--src/ruby/lib/grpc/generic/bidi_call.rb20
1 files changed, 20 insertions, 0 deletions
diff --git a/src/ruby/lib/grpc/generic/bidi_call.rb b/src/ruby/lib/grpc/generic/bidi_call.rb
index 1f6d5f365d..238f409a1d 100644
--- a/src/ruby/lib/grpc/generic/bidi_call.rb
+++ b/src/ruby/lib/grpc/generic/bidi_call.rb
@@ -69,6 +69,10 @@ module GRPC
@readq = Queue.new
@unmarshal = unmarshal
@metadata_tag = metadata_tag
+ @reads_complete = false
+ @writes_complete = false
+ @complete = false
+ @done_mutex = Mutex.new
end
# Begins orchestration of the Bidi stream for a client sending requests.
@@ -115,6 +119,16 @@ module GRPC
@op_notifier.notify(self)
end
+ # signals that a bidi operation is complete (read + write)
+ def finished
+ @done_mutex.synchronize do
+ return unless @reads_complete && @writes_complete && !@complete
+ @call.close
+ @cq.close
+ @complete = true
+ end
+ end
+
# performs a read using @call.run_batch, ensures metadata is set up
def read_using_run_batch
ops = { RECV_MESSAGE => nil }
@@ -163,12 +177,16 @@ module GRPC
SEND_CLOSE_FROM_CLIENT => nil)
GRPC.logger.debug('bidi-write-loop: done')
notify_done
+ @writes_complete = true
+ finished
end
GRPC.logger.debug('bidi-write-loop: finished')
rescue StandardError => e
GRPC.logger.warn('bidi-write-loop: failed')
GRPC.logger.warn(e)
notify_done
+ @writes_complete = true
+ finished
raise e
end
@@ -212,6 +230,8 @@ module GRPC
@readq.push(e) # let each_queued_msg terminate with this error
end
GRPC.logger.debug('bidi-read-loop: finished')
+ @reads_complete = true
+ finished
end
end
end