Skip to content

Commit 3870348

Browse files
committed
More smart pointer usage adjustments
1 parent 7a4b6fe commit 3870348

File tree

4 files changed

+84
-74
lines changed

4 files changed

+84
-74
lines changed

src/CommandHandler.cpp

Lines changed: 40 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@ const char* const TAG = "CommandHandler";
1313
#include "events/Events.h"
1414
#include "Logging.h"
1515
#include "radio/RFTransmitter.h"
16-
#include "ReadWriteMutex.h"
1716
#include "SimpleMutex.h"
1817
#include "util/TaskUtils.h"
1918

@@ -38,10 +37,32 @@ struct KnownShocker {
3837
int64_t lastActivityTimestamp;
3938
};
4039

41-
static OpenShock::ReadWriteMutex s_rfTransmitterMutex = {};
42-
static std::unique_ptr<OpenShock::RFTransmitter> s_rfTransmitter = nullptr;
40+
static OpenShock::SimpleMutex s_rfTransmitterMutex = {};
41+
static std::shared_ptr<OpenShock::RFTransmitter> s_rfTransmitter = nullptr;
4342

44-
static OpenShock::ReadWriteMutex s_keepAliveMutex = {};
43+
static std::shared_ptr<OpenShock::RFTransmitter> GetTransmitter()
44+
{
45+
ScopedLock lock__(&s_rfTransmitterMutex);
46+
return s_rfTransmitter;
47+
}
48+
static bool TryCreateTransmitter(gpio_num_t txPin)
49+
{
50+
auto transmitter = std::make_shared<OpenShock::RFTransmitter>(txPin);
51+
if (!transmitter->ok()) {
52+
return false;
53+
}
54+
55+
ScopedLock lock__(&s_rfTransmitterMutex);
56+
s_rfTransmitter = std::move(transmitter);
57+
return true;
58+
}
59+
static void DestroyTransmitter()
60+
{
61+
ScopedLock lock__(&s_rfTransmitterMutex);
62+
s_rfTransmitter = nullptr;
63+
}
64+
65+
static OpenShock::SimpleMutex s_keepAliveMutex = {};
4566
static QueueHandle_t s_keepAliveQueue = nullptr;
4667
static TaskHandle_t s_keepAliveTaskHandle = nullptr;
4768

@@ -86,13 +107,13 @@ static void commandhandler_keepalivetask(void* arg)
86107
if (cmdRef.lastActivityTimestamp + KEEP_ALIVE_INTERVAL < now) {
87108
OS_LOGV(TAG, "Sending keep-alive for shocker %u", cmdRef.shockerId);
88109

89-
ScopedReadLock rfLock__(&s_rfTransmitterMutex);
90-
if (s_rfTransmitter == nullptr) {
110+
auto transmitter = GetTransmitter();
111+
if (transmitter == nullptr) {
91112
OS_LOGW(TAG, "RF Transmitter is not initialized, ignoring keep-alive");
92113
break;
93114
}
94115

95-
if (!s_rfTransmitter->SendCommand(cmdRef.model, cmdRef.shockerId, ShockerCommandType::Vibrate, 0, KEEP_ALIVE_DURATION, false)) {
116+
if (!transmitter->SendCommand(cmdRef.model, cmdRef.shockerId, ShockerCommandType::Vibrate, 0, KEEP_ALIVE_DURATION, false)) {
96117
OS_LOGW(TAG, "Failed to send keep-alive for shocker %u", cmdRef.shockerId);
97118
}
98119

@@ -112,7 +133,7 @@ bool _internalSetKeepAliveEnabled(bool enabled)
112133
return true;
113134
}
114135

115-
ScopedWriteLock lock__(&s_keepAliveMutex);
136+
ScopedLock lock__(&s_keepAliveMutex);
116137

117138
if (enabled) {
118139
OS_LOGV(TAG, "Enabling keep-alive task");
@@ -200,10 +221,8 @@ bool CommandHandler::Init()
200221
}
201222
}
202223

203-
s_rfTransmitter = std::make_unique<RFTransmitter>(txPin);
204-
if (!s_rfTransmitter->ok()) {
224+
if (!TryCreateTransmitter(txPin)) {
205225
OS_LOGE(TAG, "Failed to initialize RF Transmitter");
206-
s_rfTransmitter = nullptr;
207226
return false;
208227
}
209228

@@ -230,8 +249,7 @@ bool CommandHandler::Init()
230249

231250
bool CommandHandler::Ok()
232251
{
233-
ScopedReadLock lock__(&s_rfTransmitterMutex);
234-
return s_rfTransmitter != nullptr;
252+
return GetTransmitter() != nullptr;
235253
}
236254

237255
SetGPIOResultCode CommandHandler::SetRfTxPin(gpio_num_t txPin)
@@ -240,16 +258,10 @@ SetGPIOResultCode CommandHandler::SetRfTxPin(gpio_num_t txPin)
240258
return SetGPIOResultCode::InvalidPin;
241259
}
242260

243-
ScopedWriteLock lock__(&s_rfTransmitterMutex);
244-
245-
if (s_rfTransmitter != nullptr) {
246-
OS_LOGV(TAG, "Destroying existing RF transmitter");
247-
s_rfTransmitter = nullptr;
248-
}
261+
DestroyTransmitter();
249262

250263
OS_LOGV(TAG, "Creating new RF transmitter");
251-
auto rfxmit = std::make_unique<RFTransmitter>(txPin);
252-
if (!rfxmit->ok()) {
264+
if (!TryCreateTransmitter(txPin)) {
253265
OS_LOGE(TAG, "Failed to initialize RF transmitter");
254266
return SetGPIOResultCode::InternalError;
255267
}
@@ -259,8 +271,6 @@ SetGPIOResultCode CommandHandler::SetRfTxPin(gpio_num_t txPin)
259271
return SetGPIOResultCode::InternalError;
260272
}
261273

262-
s_rfTransmitter = std::move(rfxmit);
263-
264274
return SetGPIOResultCode::Success;
265275
}
266276

@@ -280,9 +290,9 @@ bool CommandHandler::SetKeepAliveEnabled(bool enabled)
280290

281291
gpio_num_t CommandHandler::GetRfTxPin()
282292
{
283-
ScopedReadLock lock__(&s_rfTransmitterMutex);
284-
if (s_rfTransmitter != nullptr) {
285-
return s_rfTransmitter->GetTxPin();
293+
auto transmitter = GetTransmitter();
294+
if (transmitter != nullptr) {
295+
return transmitter->GetTxPin();
286296
}
287297

288298
gpio_num_t txPin;
@@ -296,17 +306,15 @@ gpio_num_t CommandHandler::GetRfTxPin()
296306

297307
bool CommandHandler::HandleCommand(ShockerModelType model, uint16_t shockerId, ShockerCommandType type, uint8_t intensity, uint16_t durationMs)
298308
{
299-
ScopedReadLock lock__rf(&s_rfTransmitterMutex);
300-
301-
if (s_rfTransmitter == nullptr) {
309+
auto transmitter = GetTransmitter();
310+
if (transmitter == nullptr) {
302311
OS_LOGW(TAG, "RF Transmitter is not initialized, ignoring command");
303312
return false;
304313
}
305314

306-
bool ok = s_rfTransmitter->SendCommand(model, shockerId, type, intensity, durationMs);
315+
bool ok = transmitter->SendCommand(model, shockerId, type, intensity, durationMs);
307316

308-
lock__rf.unlock();
309-
ScopedReadLock lock__ka(&s_keepAliveMutex);
317+
ScopedLock lock__ka(&s_keepAliveMutex);
310318

311319
if (ok && s_keepAliveQueue != nullptr) {
312320
KnownShocker cmd {.killTask = false, .model = model, .shockerId = shockerId, .lastActivityTimestamp = OpenShock::millis() + durationMs};

src/VisualStateManager.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -34,8 +34,8 @@ const uint64_t kWiFiScanningFlag = 1 << 7;
3434
const uint64_t kStatusOKMask = kWebSocketConnectedFlag | kHasIpAddressFlag | kWiFiConnectedFlag;
3535

3636
static std::atomic<uint64_t> s_stateFlags = 0;
37-
static std::shared_ptr<OpenShock::PinPatternManager> s_builtInLedManager;
38-
static std::shared_ptr<OpenShock::RGBPatternManager> s_RGBLedManager;
37+
static std::unique_ptr<OpenShock::PinPatternManager> s_builtInLedManager;
38+
static std::unique_ptr<OpenShock::RGBPatternManager> s_RGBLedManager;
3939

4040
inline void _setStateFlag(uint64_t flag, bool state)
4141
{
@@ -359,7 +359,7 @@ bool VisualStateManager::Init()
359359
bool ledActive = false;
360360

361361
if (OPENSHOCK_LED_GPIO != GPIO_NUM_NC) {
362-
s_builtInLedManager = std::make_shared<PinPatternManager>(static_cast<gpio_num_t>(OPENSHOCK_LED_GPIO));
362+
s_builtInLedManager = std::make_unique<PinPatternManager>(static_cast<gpio_num_t>(OPENSHOCK_LED_GPIO));
363363
if (!s_builtInLedManager->IsValid()) {
364364
OS_LOGE(TAG, "Failed to initialize built-in LED manager");
365365
return false;
@@ -368,7 +368,7 @@ bool VisualStateManager::Init()
368368
}
369369

370370
if (OPENSHOCK_LED_WS2812B != GPIO_NUM_NC) {
371-
s_RGBLedManager = std::make_shared<RGBPatternManager>(static_cast<gpio_num_t>(OPENSHOCK_LED_WS2812B));
371+
s_RGBLedManager = std::make_unique<RGBPatternManager>(static_cast<gpio_num_t>(OPENSHOCK_LED_WS2812B));
372372
if (!s_RGBLedManager->IsValid()) {
373373
OS_LOGE(TAG, "Failed to initialize RGB LED manager");
374374
return false;

src/captiveportal/Manager.cpp

Lines changed: 37 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -28,11 +28,27 @@ static std::atomic<bool> s_alwaysEnabled = false;
2828
static std::atomic<bool> s_forceClosed = false;
2929
static esp_timer_handle_t s_captivePortalUpdateLoopTimer = nullptr;
3030
static SimpleMutex s_instanceMutex;
31-
static std::unique_ptr<CaptivePortal::CaptivePortalInstance> s_instance = nullptr;
31+
static std::shared_ptr<CaptivePortal::CaptivePortalInstance> s_instance = nullptr;
32+
33+
static std::shared_ptr<CaptivePortal::CaptivePortalInstance> GetInstance()
34+
{
35+
ScopedLock lock__(&s_instanceMutex);
36+
return s_instance;
37+
}
38+
static void CreateInstance()
39+
{
40+
ScopedLock lock__(&s_instanceMutex);
41+
s_instance = std::make_shared<CaptivePortal::CaptivePortalInstance>();
42+
}
43+
static void DestroyInstance()
44+
{
45+
ScopedLock lock__(&s_instanceMutex);
46+
s_instance = nullptr;
47+
}
3248

3349
static bool captiveportal_start()
3450
{
35-
if (s_instance != nullptr) {
51+
if (GetInstance() != nullptr) {
3652
OS_LOGD(TAG, "Already started");
3753
return true;
3854
}
@@ -63,20 +79,20 @@ static bool captiveportal_start()
6379
hostname = OPENSHOCK_FW_HOSTNAME;
6480
}
6581

66-
s_instance = std::make_unique<CaptivePortal::CaptivePortalInstance>();
82+
CreateInstance();
6783

6884
return true;
6985
}
7086
static void captiveportal_stop()
7187
{
72-
if (s_instance == nullptr) {
88+
if (GetInstance() == nullptr) {
7389
OS_LOGD(TAG, "Already stopped");
7490
return;
7591
}
7692

7793
OS_LOGI(TAG, "Stopping captive portal");
7894

79-
s_instance = nullptr;
95+
DestroyInstance();
8096

8197
WiFi.softAPdisconnect(true);
8298
}
@@ -87,9 +103,7 @@ static void captiveportal_updateloop(void*)
87103
bool commandHandlerOk = CommandHandler::Ok();
88104
bool shouldBeRunning = (s_alwaysEnabled || !gatewayConnected || !commandHandlerOk) && !s_forceClosed;
89105

90-
ScopedLock lock__(&s_instanceMutex);
91-
92-
if (s_instance == nullptr) {
106+
if (GetInstance() == nullptr) {
93107
if (shouldBeRunning) {
94108
OS_LOGD(TAG, "Starting captive portal");
95109
OS_LOGD(TAG, " alwaysEnabled: %s", s_alwaysEnabled ? "true" : "false");
@@ -155,10 +169,7 @@ bool CaptivePortal::ForceClose(uint32_t timeoutMs)
155169
{
156170
s_forceClosed = true;
157171

158-
{
159-
ScopedLock lock__(&s_instanceMutex);
160-
if (s_instance == nullptr) return true;
161-
}
172+
if (GetInstance() == nullptr) return true;
162173

163174
while (timeoutMs > 0) {
164175
uint32_t delay = std::min(timeoutMs, static_cast<uint32_t>(10U));
@@ -167,55 +178,51 @@ bool CaptivePortal::ForceClose(uint32_t timeoutMs)
167178

168179
timeoutMs -= delay;
169180

170-
{
171-
ScopedLock lock__(&s_instanceMutex);
172-
if (s_instance == nullptr) return true;
173-
}
181+
if (GetInstance() == nullptr) return true;
174182
}
175183

176184
return false;
177185
}
178186

179187
bool CaptivePortal::IsRunning()
180188
{
181-
ScopedLock lock__(&s_instanceMutex);
182-
return s_instance != nullptr;
189+
return GetInstance() != nullptr;
183190
}
184191

185192
bool CaptivePortal::SendMessageTXT(uint8_t socketId, std::string_view data)
186193
{
187-
ScopedLock lock__(&s_instanceMutex);
188-
if (s_instance == nullptr) return false;
194+
auto instance = GetInstance();
195+
if (instance == nullptr) return false;
189196

190-
s_instance->sendMessageTXT(socketId, data);
197+
instance->sendMessageTXT(socketId, data);
191198

192199
return true;
193200
}
194201
bool CaptivePortal::SendMessageBIN(uint8_t socketId, tcb::span<const uint8_t> data)
195202
{
196-
ScopedLock lock__(&s_instanceMutex);
197-
if (s_instance == nullptr) return false;
203+
auto instance = GetInstance();
204+
if (instance == nullptr) return false;
198205

199-
s_instance->sendMessageBIN(socketId, data);
206+
instance->sendMessageBIN(socketId, data);
200207

201208
return true;
202209
}
203210

204211
bool CaptivePortal::BroadcastMessageTXT(std::string_view data)
205212
{
206-
ScopedLock lock__(&s_instanceMutex);
207-
if (s_instance == nullptr) return false;
213+
auto instance = GetInstance();
214+
if (instance == nullptr) return false;
208215

209-
s_instance->broadcastMessageTXT(data);
216+
instance->broadcastMessageTXT(data);
210217

211218
return true;
212219
}
213220
bool CaptivePortal::BroadcastMessageBIN(tcb::span<const uint8_t> data)
214221
{
215-
ScopedLock lock__(&s_instanceMutex);
216-
if (s_instance == nullptr) return false;
222+
auto instance = GetInstance();
223+
if (instance == nullptr) return false;
217224

218-
s_instance->broadcastMessageBIN(data);
225+
instance->broadcastMessageBIN(data);
219226

220227
return true;
221228
}

src/http/HTTPRequestManager.cpp

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -89,19 +89,14 @@ static std::shared_ptr<OpenShock::RateLimiter> createRateLimiterForURL(std::stri
8989
return nullptr;
9090
}
9191

92-
s_rateLimitsMutex.lock(portMAX_DELAY);
92+
OpenShock::ScopedLock lock__(&s_rateLimitsMutex);
9393

9494
auto it = s_rateLimits.find(domain);
9595
if (it == s_rateLimits.end()) {
96-
s_rateLimits.emplace(domain, createRateLimiterForDomain(domain));
97-
it = s_rateLimits.find(domain);
96+
it = s_rateLimits.emplace(domain, createRateLimiterForDomain(domain)).first;
9897
}
9998

100-
auto result = it->second;
101-
102-
s_rateLimitsMutex.unlock();
103-
104-
return result;
99+
return it->second;
105100
}
106101

107102
struct StreamReaderResult {

0 commit comments

Comments
 (0)