Linux: Fix stability problem with ethernet (#1091)

- Fix a problem where mysgw stops working and consumes a lot of cpu.
- Fix bug with tcp sockets where socket descriptor wasn't being
  freed.
This commit is contained in:
Marcelo Aquino
2018-03-24 08:16:44 +01:00
committed by Mikael Falkvidd
parent 2175c993ef
commit ea6d07cb79
2 changed files with 4 additions and 9 deletions
+2 -5
View File
@@ -220,9 +220,8 @@ void EthernetClient::stop()
gettimeofday(&startTime, NULL); gettimeofday(&startTime, NULL);
// wait up to a second for the connection to close // wait up to a second for the connection to close
uint8_t s;
do { do {
s = status(); uint8_t s = status();
if (s == ETHERNETCLIENT_W5100_CLOSED) { if (s == ETHERNETCLIENT_W5100_CLOSED) {
break; // exit the loop break; // exit the loop
} }
@@ -231,10 +230,8 @@ void EthernetClient::stop()
} while (((curTime.tv_sec - startTime.tv_sec) * 1000000) + (curTime.tv_usec - startTime.tv_usec) < } while (((curTime.tv_sec - startTime.tv_sec) * 1000000) + (curTime.tv_usec - startTime.tv_usec) <
1000000); 1000000);
// if it hasn't closed, close it forcefully // free up the socket descriptor
if (s != ETHERNETCLIENT_W5100_CLOSED) {
::close(_sock); ::close(_sock);
}
_sock = -1; _sock = -1;
} }
+1 -3
View File
@@ -155,13 +155,11 @@ size_t EthernetServer::write(uint8_t b)
size_t EthernetServer::write(const uint8_t *buffer, size_t size) size_t EthernetServer::write(const uint8_t *buffer, size_t size)
{ {
size_t n = 0; size_t n = 0;
size_t i = 0;
while (i < clients.size()) { for (size_t i = 0; i < clients.size(); ++i) {
EthernetClient client(clients[i]); EthernetClient client(clients[i]);
if (client.status() == ETHERNETCLIENT_W5100_ESTABLISHED) { if (client.status() == ETHERNETCLIENT_W5100_ESTABLISHED) {
n += client.write(buffer, size); n += client.write(buffer, size);
i++;
} }
} }