Skip to content

Commit 7b3d4a0

Browse files
committed
more safety guards
1 parent d523821 commit 7b3d4a0

4 files changed

Lines changed: 23 additions & 16 deletions

File tree

src/display.cpp

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -296,6 +296,7 @@ int LEDDisplay::getColorOrder() const {
296296
void LEDDisplay::show(){
297297
if (!_dengine) return;
298298
if (_use_db){
299+
std::lock_guard<std::mutex> lock(_dbuff_mtx);
299300
// save buffer content
300301
_dengine->copyFront2Back();
301302
}
@@ -310,15 +311,18 @@ void LEDDisplay::show(){
310311
_dengine->show();
311312

312313
if (_use_db){
314+
std::lock_guard<std::mutex> lock(_dbuff_mtx);
313315
// restore buffer content
314316
_dengine->flipBuffer();
315317
}
316318
};
317319

318320
void LEDDisplay::canvasProtect(bool v){
319-
if (_dengine)
321+
if (_dengine){
322+
std::lock_guard<std::mutex> lock(_dbuff_mtx);
320323
_dengine->doubleBuffer(v);
321-
_use_db = v;
324+
_use_db = v;
325+
}
322326
}
323327

324328
void LEDDisplay::attachOverlay( overlay_cb_t f){

src/display.hpp

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,8 @@ class LEDDisplay {
113113
*/
114114
std::list< overlay_cb_t > _stack;
115115
std::mutex _stack_mtx;
116+
// double buff mutex
117+
std::mutex _dbuff_mtx;
116118

117119

118120
bool _start_rmt(const JsonDocument& doc);
@@ -172,7 +174,12 @@ class LEDDisplay {
172174
//void overlay_render();
173175

174176
// Wipe all layers and buffers
175-
void clear(){ if (_dengine) _dengine->clear(); };
177+
void clear(){
178+
if (_dengine){
179+
std::lock_guard<std::mutex> lock(_dbuff_mtx);
180+
_dengine->clear();
181+
}
182+
};
176183

177184
// backend brightness control
178185
uint8_t brightness(uint8_t brt);

src/effectworker.cpp

Lines changed: 8 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -322,13 +322,7 @@ void EffConfiguration::_savecfg(JsonVariant doc){
322322
for (const auto& i: _controls){
323323
a[i.getName()] = i.getVal();
324324
}
325-
/*
326-
for (const auto& i: _controls){
327-
JsonObject kv = a.add<JsonObject>();
328-
kv[P_id] = i.getName();
329-
kv[P_value] = i.getVal();
330-
}
331-
*/
325+
332326
String fname(effects_cfg_fldr);
333327
fname += EffectsListItem_t::getLbl(_eid);
334328
fname += T__json;
@@ -688,7 +682,7 @@ void EffectWorker::_spawn(effect_t eid, bool rnd_ctrls){
688682
// apply effect's controls
689683
rnd_ctrls ? applyRandomControls() : applyControls();
690684

691-
display.canvasProtect (worker->getCanvasProtect()); // set 'persistent' frambuffer flag if effect's manifest demands it
685+
display.canvasProtect(worker->getCanvasProtect()); // set 'persistent' frambuffer flag if effect's manifest demands it
692686

693687
// release mutex after effect init has complete
694688
lock.unlock();
@@ -994,6 +988,8 @@ void EffectWorker::_runnerHndlr(){
994988
continue;
995989

996990
if (worker->run()){
991+
// release mutex
992+
lock.unlock();
997993
// effect has rendered a data in buffer, need to call the engine draw it
998994
display.show();
999995

@@ -1007,11 +1003,11 @@ void EffectWorker::_runnerHndlr(){
10071003
t = millis();
10081004
}
10091005
#endif
1006+
} else {
1007+
// effectcalc returned no data
1008+
// release mutex
1009+
lock.unlock();
10101010
}
1011-
// effectcalc returned no data
1012-
1013-
// release mutex
1014-
lock.unlock();
10151011
}
10161012
// Task must self-terminate (if ever)
10171013
vTaskDelete(NULL);

src/lamp.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -334,7 +334,7 @@ void Lamp::_switcheffect(effswitch_t action, bool fade, effect_t effnb) {
334334
// затухание не требуется, переключаемся непосредственно на нужный эффект
335335
if(opts.flag.wipeOnEffChange || effwrkr.getCurrentEffectNumber() == effect_t::empty){ // для пустышки или для случая когда включена опция - чистим матрицу
336336
if (display.getCanvas())
337-
display.getCanvas()->clear();
337+
display.clear();
338338
}
339339

340340
// if current worker's effect is same as the target one, then I do not need to do actual switch

0 commit comments

Comments
 (0)