diff --git a/include/ntcore_c.h b/include/ntcore_c.h index d16afb7825..d232230b2f 100644 --- a/include/ntcore_c.h +++ b/include/ntcore_c.h @@ -329,6 +329,7 @@ unsigned int NT_CallRpc(const char *name, size_t name_len, const char *params, char *NT_GetRpcResult(int blocking, unsigned int call_uid, size_t *result_len); char *NT_GetRpcResultTimeout(int blocking, unsigned int call_uid, double time_out, size_t *result_len); +void NT_CancelBlockingRpcResult(unsigned int call_uid); char *NT_PackRpcDefinition(const struct NT_RpcDefinition *def, size_t *packed_len); diff --git a/include/ntcore_cpp.h b/include/ntcore_cpp.h index cdded65b87..48639a73e5 100644 --- a/include/ntcore_cpp.h +++ b/include/ntcore_cpp.h @@ -235,6 +235,7 @@ unsigned int CallRpc(StringRef name, StringRef params); bool GetRpcResult(bool blocking, unsigned int call_uid, std::string* result); bool GetRpcResult(bool blocking, unsigned int call_uid, double time_out, std::string* result); +void CancelBlockingRpcResult(unsigned int call_uid); std::string PackRpcDefinition(const RpcDefinition& def); bool UnpackRpcDefinition(StringRef packed, RpcDefinition *def); diff --git a/ntcore-jni.def b/ntcore-jni.def index c91b2fccca..b45a832104 100644 --- a/ntcore-jni.def +++ b/ntcore-jni.def @@ -92,6 +92,7 @@ NT_SetDefaultEntryDoubleArray @93 NT_SetDefaultEntryStringArray @94 NT_PollRpcTimeout @95 NT_GetRpcResultTimeout @96 +NT_CancelBlockingRpcResult @97 ; JNI functions JNI_OnLoad diff --git a/ntcore.def b/ntcore.def index f5d1549445..bbe649904b 100644 --- a/ntcore.def +++ b/ntcore.def @@ -92,3 +92,4 @@ NT_SetDefaultEntryDoubleArray @93 NT_SetDefaultEntryStringArray @94 NT_PollRpcTimeout @95 NT_GetRpcResultTimeout @96 +NT_CancelBlockingRpcResult @97 diff --git a/src/Storage.cpp b/src/Storage.cpp index bbf1e99b00..988b662b2b 100644 --- a/src/Storage.cpp +++ b/src/Storage.cpp @@ -1446,3 +1446,10 @@ bool Storage::GetRpcResult(bool blocking, unsigned int call_uid, double time_out return true; } } + +void Storage::CancelBlockingRpcResult(unsigned int call_uid) { + std::unique_lock lock(m_mutex); + // safe to erase even if id does not exist + m_rpc_blocking_calls.erase(call_uid); + m_rpc_results_cond.notify_all(); +} diff --git a/src/Storage.h b/src/Storage.h index 6e9964b6d2..5acab47429 100644 --- a/src/Storage.h +++ b/src/Storage.h @@ -102,6 +102,7 @@ class Storage { bool GetRpcResult(bool blocking, unsigned int call_uid, std::string* result); bool GetRpcResult(bool blocking, unsigned int call_uid, double time_out, std::string* result); + void CancelBlockingRpcResult(unsigned int call_uid); private: Storage(); diff --git a/src/ntcore_c.cpp b/src/ntcore_c.cpp index 09cf3b480a..d7d2cb2018 100644 --- a/src/ntcore_c.cpp +++ b/src/ntcore_c.cpp @@ -300,6 +300,10 @@ char *NT_GetRpcResultTimeout(int blocking, unsigned int call_uid, return result_cstr; } +void NT_CancelBlockingRpcResult(unsigned int call_uid) { + nt::CancelBlockingRpcResult(call_uid); +} + char *NT_PackRpcDefinition(const NT_RpcDefinition *def, size_t *packed_len) { auto packed = nt::PackRpcDefinition(ConvertFromC(*def)); diff --git a/src/ntcore_cpp.cpp b/src/ntcore_cpp.cpp index 976f83bf02..47bc66f96f 100644 --- a/src/ntcore_cpp.cpp +++ b/src/ntcore_cpp.cpp @@ -151,6 +151,10 @@ bool GetRpcResult(bool blocking, unsigned int call_uid, result); } +void CancelBlockingRpcResult(unsigned int call_uid) { + Storage::GetInstance().CancelBlockingRpcResult(call_uid); +} + std::string PackRpcDefinition(const RpcDefinition& def) { WireEncoder enc(0x0300); enc.Write8(def.version);