Skip to content

Commit cb1ace8

Browse files
committed
feat: DecoderManager.size # of active decoders. RPCServer.get_rpc as bool. warn: Stream constructors create multiple decoders on the same transport
1 parent 2bfb4c7 commit cb1ace8

File tree

3 files changed

+14
-2
lines changed

3 files changed

+14
-2
lines changed

src/client.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ class RPCClient {
1414

1515
RPCClient(ITransport& t) : decoder(&RpcDecoderManager<>::getDecoder(t)) {}
1616

17+
// TODO This is problematic becasue 'new' makes different Transport objs and different transports make different decoders
1718
RPCClient(Stream& stream) {
1819
ITransport* transport = (ITransport*) new SerialTransport(stream);
1920
decoder = &RpcDecoderManager<>::getDecoder(*transport);

src/decoder_manager.h

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ class RpcDecoderManager {
2323
entry.transport = &transport;
2424
// In-place construct
2525
entry.decoder = new (&entry.decoder_storage.instance) RpcDecoder<>(transport);
26+
decoders_size++;
2627
return *entry.decoder;
2728
}
2829
}
@@ -31,6 +32,10 @@ class RpcDecoderManager {
3132
while (true);
3233
}
3334

35+
static size_t size() {
36+
return decoders_size;
37+
}
38+
3439
private:
3540
struct DecoderStorage {
3641
union {
@@ -49,10 +54,14 @@ class RpcDecoderManager {
4954
};
5055

5156
static std::array<Entry, MaxTransports> decoders_;
57+
static size_t decoders_size;
5258
};
5359

5460
// Definition of the static member
5561
template<size_t MaxTransports>
5662
std::array<typename RpcDecoderManager<MaxTransports>::Entry, MaxTransports> RpcDecoderManager<MaxTransports>::decoders_;
5763

64+
template<size_t MaxTransports>
65+
size_t RpcDecoderManager<MaxTransports>::decoders_size = 0;
66+
5867
#endif //RPCLITE_DECODER_MANAGER_H

src/server.h

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ class RPCServer {
1616
public:
1717
RPCServer(ITransport& t) : decoder(&RpcDecoderManager<>::getDecoder(t)) {}
1818

19+
// TODO This is problematic becasue 'new' makes different Transport objs and different transports make different decoders
1920
RPCServer(Stream& stream) {
2021
ITransport* transport = (ITransport*) new SerialTransport(stream);
2122
decoder = &RpcDecoderManager<>::getDecoder(*transport);
@@ -34,10 +35,11 @@ class RPCServer {
3435
}
3536

3637
protected:
37-
void get_rpc() {
38+
bool get_rpc() {
3839
decoder->decode();
39-
if (_rpc_size > 0) return; // Already have a request
40+
if (_rpc_size > 0) return true; // Already have a request
4041
_rpc_size = decoder->get_request(_rpc_buffer, RPC_BUFFER_SIZE);
42+
return _rpc_size > 0;
4143
}
4244

4345
void process_request() {

0 commit comments

Comments
 (0)