mirror of
https://github.com/wled/WLED.git
synced 2025-07-16 07:16:31 +00:00
Merge pull request #3648 from willmmiles/json-response-locking
Expand JSON buffer lock scope to entire web reply
This commit is contained in:
parent
51b3d7cb4a
commit
cdc8640218
@ -356,6 +356,22 @@ um_data_t* simulateSound(uint8_t simulationId);
|
|||||||
void enumerateLedmaps();
|
void enumerateLedmaps();
|
||||||
uint8_t get_random_wheel_index(uint8_t pos);
|
uint8_t get_random_wheel_index(uint8_t pos);
|
||||||
|
|
||||||
|
// RAII guard class for the JSON Buffer lock
|
||||||
|
// Modeled after std::lock_guard
|
||||||
|
class JSONBufferGuard {
|
||||||
|
bool holding_lock;
|
||||||
|
public:
|
||||||
|
inline JSONBufferGuard(uint8_t module=255) : holding_lock(requestJSONBufferLock(module)) {};
|
||||||
|
inline ~JSONBufferGuard() { if (holding_lock) releaseJSONBufferLock(); };
|
||||||
|
inline JSONBufferGuard(const JSONBufferGuard&) = delete; // Noncopyable
|
||||||
|
inline JSONBufferGuard& operator=(const JSONBufferGuard&) = delete;
|
||||||
|
inline JSONBufferGuard(JSONBufferGuard&& r) : holding_lock(r.holding_lock) { r.holding_lock = false; }; // but movable
|
||||||
|
inline JSONBufferGuard& operator=(JSONBufferGuard&& r) { holding_lock |= r.holding_lock; r.holding_lock = false; return *this; };
|
||||||
|
inline bool owns_lock() const { return holding_lock; }
|
||||||
|
explicit inline operator bool() const { return owns_lock(); };
|
||||||
|
inline void release() { if (holding_lock) releaseJSONBufferLock(); holding_lock = false; }
|
||||||
|
};
|
||||||
|
|
||||||
#ifdef WLED_ADD_EEPROM_SUPPORT
|
#ifdef WLED_ADD_EEPROM_SUPPORT
|
||||||
//wled_eeprom.cpp
|
//wled_eeprom.cpp
|
||||||
void applyMacro(byte index);
|
void applyMacro(byte index);
|
||||||
|
@ -1013,6 +1013,17 @@ void serializeModeNames(JsonArray arr)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Global buffer locking response helper class
|
||||||
|
class GlobalBufferAsyncJsonResponse: public JSONBufferGuard, public AsyncJsonResponse {
|
||||||
|
public:
|
||||||
|
inline GlobalBufferAsyncJsonResponse(bool isArray) : JSONBufferGuard(17), AsyncJsonResponse(&doc, isArray) {};
|
||||||
|
virtual ~GlobalBufferAsyncJsonResponse() {};
|
||||||
|
|
||||||
|
// Other members are inherited
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
void serveJson(AsyncWebServerRequest* request)
|
void serveJson(AsyncWebServerRequest* request)
|
||||||
{
|
{
|
||||||
byte subJson = 0;
|
byte subJson = 0;
|
||||||
@ -1043,11 +1054,12 @@ void serveJson(AsyncWebServerRequest* request)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!requestJSONBufferLock(17)) {
|
GlobalBufferAsyncJsonResponse *response = new GlobalBufferAsyncJsonResponse(subJson==JSON_PATH_FXDATA || subJson==JSON_PATH_EFFECTS); // will clear and convert JsonDocument into JsonArray if necessary
|
||||||
|
if (!response->owns_lock()) {
|
||||||
request->send(503, "application/json", F("{\"error\":3}"));
|
request->send(503, "application/json", F("{\"error\":3}"));
|
||||||
|
delete response;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
AsyncJsonResponse *response = new AsyncJsonResponse(&doc, subJson==JSON_PATH_FXDATA || subJson==JSON_PATH_EFFECTS); // will clear and convert JsonDocument into JsonArray if necessary
|
|
||||||
|
|
||||||
JsonVariant lDoc = response->getRoot();
|
JsonVariant lDoc = response->getRoot();
|
||||||
|
|
||||||
@ -1090,7 +1102,6 @@ void serveJson(AsyncWebServerRequest* request)
|
|||||||
DEBUG_PRINT(F("JSON content length: ")); DEBUG_PRINTLN(len);
|
DEBUG_PRINT(F("JSON content length: ")); DEBUG_PRINTLN(len);
|
||||||
|
|
||||||
request->send(response);
|
request->send(response);
|
||||||
releaseJSONBufferLock();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef WLED_ENABLE_JSONLIVE
|
#ifdef WLED_ENABLE_JSONLIVE
|
||||||
|
Loading…
x
Reference in New Issue
Block a user