Acorn, thanks for the detailed and correct response. I'll go one step 
further than your fourth sentence, though, and say that there is explicitly 
no guarantee about the ordering of the Finish and Done events (or, for that 
matter, any concurrent operations on the CQ). Your solution for dealing 
with that sounds perfect.

- Vijay

On Wednesday, October 30, 2019 at 10:28:07 PM UTC-7, Acorn Pooley wrote:
>
> My understanding is that AsyncNotifyWhenDone is useful if you want to be 
> notified that the request was cancelled (either explicitly cancelled by the 
> caller or implicitly cancelled because the connection was dropped).  When 
> you see the AsyncNotifyWhenDone you can check IsCancelled to see if the rpc 
> got cancelled.  But you also get the AsyncNotifyWhenDone after the rpc is 
> finished.  I'm not sure about the order of the Finish and Done events - I'm 
> not sure it is  guaranteed they always come in the same order.  If you 
> delete the "this" pointer in either event then you have to be careful not 
> to also delete it (or otherwise dereference it) in the other event.  I deal 
> with this by using a "tag" that is not actually a pointer - I use an index 
> into an array of currently executing rpcs plus some "salt" bits that make 
> each tag unique.
>
> If you don't care if the rpc gets cancelled then I don't think there is 
> much use for the AsyncNotifyWhenDone AFAICT.
>
> Cheers,
> Acorn
>
> On Wednesday, October 30, 2019 at 3:58:57 AM UTC-7, Debashish Deka wrote:
>>
>> In the greeter example provided in the GitHub repo, we see this line: (
>> https://github.com/grpc/grpc/blob/v1.24.0/examples/cpp/helloworld/greeter_async_server.cc
>> )
>>
>> responder_.Finish(reply_, Status::OK, this);
>>
>> Because of the "this" pointer argument, cq_.Next() triggers the event and 
>> we clear the CallData object inside in the "FINISH" state as per the 
>> example provided.
>>
>> I tried to use "*AsyncNotifyWhenDone*" just before RequestsayHello():
>>
>> ctx_.*AsyncNotifyWhenDone*((void*)(*extFunction*)) where *extFunction *is 
>> some random function declared in the file. I found that, cq_.Next() 
>> triggered a new event with tag value equal to the extFunction address. 
>>
>> So, we get two events now, one because of the Finish call and the other 
>> due to the AsyncNotifyWhenDone() call. I want to ask, what could be a use 
>> of using AsyncNotifyWhenDone
>> ? I could not find any special requirements apart from deleting the 
>> CallData instance.
>>
>> If I am wrong in part of the question. Please correct me.
>> Thank you! 
>>  
>>  
>>
>

-- 
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 view this discussion on the web visit 
https://groups.google.com/d/msgid/grpc-io/04d9623e-b5f4-4551-8630-9b35a335f00e%40googlegroups.com.

Reply via email to