fix: make router socket non-blocking to prevent poll loop stalls
Validate and Test / validate-patches (push) Failing after 13s

This commit is contained in:
2026-06-24 04:45:15 -07:00
parent 31bd1d497c
commit f70a8701c9
46 changed files with 47584 additions and 1 deletions
+80
View File
@@ -0,0 +1,80 @@
/*
This file is part of the Arduino_RPClite library.
Copyright (C) Arduino s.r.l. and/or its affiliated companies
This Source Code Form is subject to the terms of the Mozilla Public
License, v. 2.0. If a copy of the MPL was not distributed with this
file, You can obtain one at http://mozilla.org/MPL/2.0/.
*/
#ifndef RPCLITE_CLIENT_H
#define RPCLITE_CLIENT_H
#include "error.h"
#include "decoder_manager.h"
class RPCClient {
RpcDecoder<>* decoder=nullptr;
public:
RpcError lastError;
explicit RPCClient(ITransport& t) : decoder(RpcDecoderManager::getInstance().getDecoder(t)) {}
operator bool() const {return decoder != nullptr;}
template<typename... Args>
void notify(const MsgPack::str_t& method, Args&&... args) {
uint32_t _id;
decoder->send_call(NOTIFY_MSG, method, _id, std::forward<Args>(args)...);
}
template<typename RType, typename... Args>
bool call(const MsgPack::str_t& method, RType& result, Args&&... args) {
uint32_t msg_id_wait;
if(!send_rpc(method, msg_id_wait, std::forward<Args>(args)...)) {
lastError.code = GENERIC_ERR;
lastError.traceback = "Failed to send RPC call";
return false;
}
// blocking call
RpcError tmp_error;
while (!get_response(msg_id_wait, result, tmp_error)) {
//delay(1);
}
return (lastError.code == NO_ERR);
}
template<typename... Args>
bool send_rpc(const MsgPack::str_t& method, uint32_t& wait_id, Args&&... args) {
uint32_t msg_id;
if (decoder->send_call(CALL_MSG, method, msg_id, std::forward<Args>(args)...)) {
wait_id = msg_id;
return true;
}
return false;
}
template<typename RType>
bool get_response(const uint32_t wait_id, RType& result, RpcError& error) {
decoder->decode();
if (decoder->get_response(wait_id, result, error)) {
lastError.copy(error);
return true;
}
return false;
}
uint32_t get_discarded_packets() const {return decoder->get_discarded_packets();}
};
#endif //RPCLITE_CLIENT_H