Hello Sree, Thank you for your suggestion. I sent a PR to update the documentation.
在 2018年8月16日星期四 UTC+8上午3:37:12,Sree Kuchibhotla写道: > > Hi Neil, > To me it sounds very reasonable to expect that if you call > *grpc_call_start_batch* with empty batch, the tag is put in the > completion queue right away (and thereby would kick a thread calling > grpc_completion_queue_next()/pluck() to pick up that tag). > > However, since it is not explicitly documented in the API (in grpc.h), > there is a theoretical possibility that someone might change the > implementation in future to assert a non zero batch size :), I recommend > you to submit a PR by changing the comments of *grpc_call_start_batch *API. > This way, it will have more eyes on the PR and will formalize the contract. > > thanks, > Sree > > > On Thursday, August 9, 2018 at 4:22:02 AM UTC-7, Neil Shen wrote: >> >> I find that if I call `*grpc_call_start_batch*` with an empty batch of >> grpc_op, >> then it will kick its completion queue immediately[1] and the call to >> `grpc_call_start_batch` becomes thread-safe[2] because it does not >> contain any >> send operations or receive operations. >> >> Does it well-document or undefined behavior to start an empty batch? >> >> I am working on grpc-rs[3], a rust implementation, and trying to replace >> alarms >> with calls to kick completion queues. >> >> >> 1: Code about an empty batch, >> >> https://github.com/grpc/grpc/blob/v1.14.1/src/core/lib/surface/call.cc#L1595-L1607 >> >> 2: Quote from grpc.h: >> >> /** Start a batch of operations defined in the array ops; when complete, >>> post a >>> completion of type 'tag' to the completion queue bound to the call. >>> The order of ops specified in the batch has no significance. >>> Only one operation of each type can be active at once in any given >>> batch. >>> If a call to grpc_call_start_batch returns GRPC_CALL_OK you must call >>> grpc_completion_queue_next or grpc_completion_queue_pluck on the >>> completion >>> queue associated with 'call' for work to be performed. If a call to >>> grpc_call_start_batch returns any value other than GRPC_CALL_OK it is >>> guaranteed that no state associated with 'call' is changed and it is >>> not >>> appropriate to call grpc_completion_queue_next or >>> grpc_completion_queue_pluck consequent to the failed >>> grpc_call_start_batch >>> call. >>> THREAD SAFETY: access to grpc_call_start_batch in multi-threaded >>> environment >>> needs to be synchronized. As an optimization, you may synchronize >>> batches >>> containing just send operations independently from batches >>> containing just >>> receive operations. */ >>> GRPCAPI grpc_call_error grpc_call_start_batch(grpc_call* call, >>> const grpc_op* ops, size_t >>> nops, >>> void* tag, void* reserved); >> >> >> 3: https://github.com/pingcap/grpc-rs/ >> > -- You received this message because you are subscribed to the Google Groups "grpc.io" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. To post to this group, send email to [email protected]. Visit this group at https://groups.google.com/group/grpc-io. To view this discussion on the web visit https://groups.google.com/d/msgid/grpc-io/fc5a6f12-b6ac-4b15-969d-cf615d32fbfb%40googlegroups.com. For more options, visit https://groups.google.com/d/optout.
