Skip to content

Commit 9f1b167

Browse files
committed
Add memory management for clients
1 parent 1a68dcf commit 9f1b167

File tree

2 files changed

+59
-2
lines changed

2 files changed

+59
-2
lines changed

src/ArduinoCellular.cpp

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11

22

33
#include "ArduinoCellular.h"
4-
#include "ManagedTinyGsmClient.h"
54

65
#if defined(ARDUINO_ARCH_MBED)
76
#include "Watchdog.h"
@@ -17,6 +16,10 @@ unsigned long ArduinoCellular::getTime() {
1716
ArduinoCellular::ArduinoCellular() {
1817
}
1918

19+
ArduinoCellular::~ArduinoCellular() {
20+
cleanup();
21+
}
22+
2023
void ArduinoCellular::begin() {
2124
modem.init();
2225

@@ -177,14 +180,34 @@ HttpClient ArduinoCellular::getHTTPClient(const char * server, const int port){
177180

178181
#if defined(ARDUINO_CELLULAR_BEARSSL)
179182
HttpClient ArduinoCellular::getHTTPSClient(const char * server, const int port){
180-
return HttpClient(* new BearSSLClient(* new ManagedTinyGsmClient(modem)), server, port);
183+
auto gsmClient = std::make_unique<ManagedTinyGsmClient>(modem);
184+
auto sslClient = std::make_unique<BearSSLClient>(*gsmClient);
185+
auto& sslRef = *sslClient;
186+
187+
managedGsmClients.push_back(std::move(gsmClient));
188+
managedSslClients.push_back(std::move(sslClient));
189+
return HttpClient(sslRef, server, port);
181190
}
182191

183192
BearSSLClient ArduinoCellular::getSecureNetworkClient(){
184193
return BearSSLClient(* new ManagedTinyGsmClient(modem));
185194
}
186195
#endif
187196

197+
void ArduinoCellular::cleanup() {
198+
/*
199+
It's necessary to to manage the lifetime of the clients created by the library
200+
because the HttpClient and also BearSSLClient classes expect callers to manage the lifetime of the clients.
201+
For convenience, the library provides factory functions that allocate these objects on behalf of the caller.
202+
*/
203+
managedSslClients.clear(); // Destroys BearSSLClient instances
204+
managedGsmClients.clear(); // Destroys ManagedTinyGsmClient instances
205+
}
206+
207+
size_t ArduinoCellular::getManagedClientCount() const {
208+
return managedSslClients.size();
209+
}
210+
188211
bool ArduinoCellular::isConnectedToOperator(){
189212
return modem.isNetworkConnected();
190213
}

src/ArduinoCellular.h

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030

3131
#include <ModemInterface.h>
3232
#include <TimeUtils.h>
33+
#include "ManagedTinyGsmClient.h"
3334

3435
/**
3536
* @enum ModemModel
@@ -100,6 +101,20 @@ class ArduinoCellular {
100101
*/
101102
ArduinoCellular();
102103

104+
/**
105+
* @brief Destructor for the ArduinoCellular class.
106+
* Cleans up any resources used by the class.
107+
*/
108+
~ArduinoCellular();
109+
110+
// Delete copy operations (since unique_ptr can't be copied)
111+
ArduinoCellular(const ArduinoCellular&) = delete;
112+
ArduinoCellular& operator=(const ArduinoCellular&) = delete;
113+
114+
// Enable move operations
115+
ArduinoCellular(ArduinoCellular&&) = default;
116+
ArduinoCellular& operator=(ArduinoCellular&&) = default;
117+
103118
/**
104119
* @brief Initializes the modem.
105120
* This function must be called before using any other functions in the library.
@@ -238,6 +253,7 @@ class ArduinoCellular {
238253
/**
239254
* @brief Gets a HTTP client for the specified server and port.
240255
* The maximum number of HTTP clients is limited by the number of sockets available.
256+
* Call `cleanup()` to release the resources used by the clients once you are done with them.
241257
* @param server The server address.
242258
* @param port The server port.
243259
* @return The HTTP client.
@@ -247,12 +263,26 @@ class ArduinoCellular {
247263
/**
248264
* @brief Gets a HTTPS client for the specified server and port.
249265
* The maximum number of HTTP clients is limited by the number of sockets available.
266+
* Call `cleanup()` to release the resources used by the clients once you are done with them.
250267
* @param server The server address.
251268
* @param port The server port.
252269
* @return The HTTPS client.
253270
*/
254271
HttpClient getHTTPSClient(const char * server, const int port);
255272

273+
/**
274+
* @brief Cleans up the clients and releases the resources used by them.
275+
* It's necessary to call this function to free up the memory used by the client
276+
* objects that are created by the library internally.
277+
*/
278+
void cleanup();
279+
280+
/**
281+
* @brief Gets the number of managed clients.
282+
* The clients are managed in the sense of memory management.
283+
*/
284+
size_t getManagedClientCount() const;
285+
256286
/**
257287
* @brief Gets the local IP address.
258288
* @return The local IP address.
@@ -282,6 +312,10 @@ class ArduinoCellular {
282312
SimStatus getSimStatus();
283313

284314
private:
315+
// Each instance manages its own connections
316+
std::vector<std::unique_ptr<ManagedTinyGsmClient>> managedGsmClients;
317+
std::vector<std::unique_ptr<BearSSLClient>> managedSslClients;
318+
285319
bool connectToGPRS(const char * apn, const char * gprsUser, const char * gprsPass);
286320

287321

0 commit comments

Comments
 (0)