diff options
author | David Crocker <dcrocker@eschertech.com> | 2020-07-20 00:35:49 +0300 |
---|---|---|
committer | David Crocker <dcrocker@eschertech.com> | 2020-07-20 00:35:49 +0300 |
commit | a245796ed4a1eba52172c9bacd7bcf2f992be06c (patch) | |
tree | 2a674fef30d949b7a0cdbaaa46351cb96aaf0f12 /src/Networking | |
parent | 79bd393659a46b352c7e235cc5575ef1648b61e5 (diff) |
Fix (I hope) for strange network task crashes on Duet 3 Mini WiFi
Diffstat (limited to 'src/Networking')
-rw-r--r-- | src/Networking/ESP8266WiFi/WiFiInterface.cpp | 2 | ||||
-rw-r--r-- | src/Networking/HttpResponder.cpp | 26 | ||||
-rw-r--r-- | src/Networking/HttpResponder.h | 2 |
3 files changed, 18 insertions, 12 deletions
diff --git a/src/Networking/ESP8266WiFi/WiFiInterface.cpp b/src/Networking/ESP8266WiFi/WiFiInterface.cpp index 1303b8bc..17b2e8cb 100644 --- a/src/Networking/ESP8266WiFi/WiFiInterface.cpp +++ b/src/Networking/ESP8266WiFi/WiFiInterface.cpp @@ -1604,6 +1604,7 @@ static void spi_slave_dma_setup(uint32_t dataOutSize, uint32_t dataInSize) noexc #endif #if USE_DMAC || USE_XDMAC || USE_DMAC_MANAGER + spi_dma_disable(); // if we don't do this we get strange crashes on the Duet 3 Mini DisableSpi(); spi_rx_dma_setup(&bufferIn, dataInSize + sizeof(MessageHeaderEspToSam)); spi_tx_dma_setup(&bufferOut, dataOutSize + sizeof(MessageHeaderSamToEsp)); @@ -1679,7 +1680,6 @@ void WiFiInterface::SetupSpi() noexcept #endif #if SAME5x - // Set up the correct SPI mode etc. (I am assuming that we don't need to reset the SPI between transactions) WiFiSpiSercom->SPI.INTENCLR.reg = 0xFF; // disable all interrupts WiFiSpiSercom->SPI.INTFLAG.reg = 0xFF; // clear any pending interrupts #else diff --git a/src/Networking/HttpResponder.cpp b/src/Networking/HttpResponder.cpp index 7bdb7b11..fa0323da 100644 --- a/src/Networking/HttpResponder.cpp +++ b/src/Networking/HttpResponder.cpp @@ -735,17 +735,25 @@ bool HttpResponder::RemoveAuthentication() noexcept return false; } - for (size_t k = i + 1; k < numSessions; ++k) - { - sessions[k - 1] = sessions[k]; - } - numSessions--; + RemoveSession(i); return true; } } return false; } +/*static*/ void HttpResponder::RemoveSession(size_t sessionToRemove) noexcept +{ + if (sessionToRemove < numSessions) + { + --numSessions; + for (size_t k = sessionToRemove; k < numSessions; ++k) + { + sessions[k] = sessions[k + 1]; + } + } +} + void HttpResponder::SendFile(const char* nameOfFileToSend, bool isWebFile) noexcept { #if HAS_MASS_STORAGE @@ -1443,13 +1451,9 @@ void HttpResponder::Diagnostics(MessageType mt) const noexcept for (size_t i = numSessions; i != 0; ) { --i; - if ((now - sessions[i].lastQueryTime) > HttpSessionTimeout) + if (now - sessions[i].lastQueryTime > HttpSessionTimeout) { - for (size_t k = i + 1; k < numSessions; k++) - { - sessions[k - 1] = sessions[k]; - } - numSessions--; + RemoveSession(i); clientsTimedOut++; } } diff --git a/src/Networking/HttpResponder.h b/src/Networking/HttpResponder.h index c329210a..eb975f04 100644 --- a/src/Networking/HttpResponder.h +++ b/src/Networking/HttpResponder.h @@ -96,6 +96,8 @@ private: const char* GetKeyValue(const char *key) const noexcept; // return the value of the specified key, or nullptr if not present + static void RemoveSession(size_t sessionToRemove) noexcept; + HttpParseState parseState; // Buffers for processing HTTP input |