From f4274984a4969fb6eee448c2efc84b6e3deb02e3 Mon Sep 17 00:00:00 2001 From: SUMIT JAIN Date: Fri, 27 Jan 2023 16:04:23 +0530 Subject: [PATCH] dont signal occurence if client call not active --- src/grpc_client.cc | 25 ++++++++++++++++++++++--- 1 file changed, 22 insertions(+), 3 deletions(-) diff --git a/src/grpc_client.cc b/src/grpc_client.cc index c54162d6..d272ef4f 100644 --- a/src/grpc_client.cc +++ b/src/grpc_client.cc @@ -165,6 +165,7 @@ namespace grpc_labview } int32_t ClientCleanUpProc(grpc_labview::gRPCid* clientId); +void SignalOccurenceForClientCall(grpc_labview::ClientCall* clientCall); //--------------------------------------------------------------------- //--------------------------------------------------------------------- @@ -192,6 +193,22 @@ int32_t CloseClient(grpc_labview::LabVIEWgRPCClient* client) return 0; } +// Signal a lv occurence for a client call from async c++ thread +void SignalOccurenceForClientCall(grpc_labview::ClientCall* clientCall) +{ + if (clientCall == nullptr) + { + return; + } + std::lock_guard lock(clientCall->_client->clientLock); + std::list::iterator it; + it = std::find(clientCall->_client->ActiveClientCalls.begin(), clientCall->_client->ActiveClientCalls.end(), clientCall); + if (it != clientCall->_client->ActiveClientCalls.end()) + { + grpc_labview::SignalOccurrence(clientCall->_occurrence); + } +} + LIBRARY_EXPORT int32_t CloseClient(grpc_labview::gRPCid* clientId) { auto client = clientId->CastTo(); @@ -218,6 +235,8 @@ int32_t ClientCleanUpProc(grpc_labview::gRPCid* clientId) { (*activeClientCall)->Cancel(); } + + client->ActiveClientCalls.clear(); } return CloseClient(client.get()); } @@ -300,7 +319,7 @@ LIBRARY_EXPORT int32_t ClientUnaryCall( { grpc::internal::RpcMethod method(clientCall->_methodName.c_str(), grpc::internal::RpcMethod::NORMAL_RPC); clientCall->_status = grpc::internal::BlockingUnaryCall(clientCall->_client->Channel.get(), method, &(clientCall->_context.get()->gRPCClientContext) , *clientCall->_request.get(), clientCall->_response.get()); - grpc_labview::SignalOccurrence(clientCall->_occurrence); + SignalOccurenceForClientCall(clientCall); return 0; }); @@ -535,7 +554,7 @@ LIBRARY_EXPORT int32_t ClientBeginReadFromStream(grpc_labview::gRPCid* callId, g { call->_response->Clear(); auto result = reader->Read(call->_response.get()); - grpc_labview::SignalOccurrence(occurrence); + SignalOccurenceForClientCall(call.get()); return result; }); @@ -645,7 +664,7 @@ LIBRARY_EXPORT int32_t ClientCompleteClientStreamingCall(grpc_labview::gRPCid* c [call, occurrence]() { call->Finish(); - grpc_labview::SignalOccurrence(occurrence); + SignalOccurenceForClientCall(call.get()); return 0; }); return 0;