From d45cbcb9a0bfafc4bb83dea3e555b9514dd3bcd9 Mon Sep 17 00:00:00 2001 From: dm Date: Fri, 11 Jan 2019 01:36:58 -0800 Subject: [PATCH 1/3] Release referenced resources in destructor --- libraries/ESP8266SSDP/ESP8266SSDP.cpp | 27 ++++++++++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/libraries/ESP8266SSDP/ESP8266SSDP.cpp b/libraries/ESP8266SSDP/ESP8266SSDP.cpp index 4e5363d022..e706d30de4 100644 --- a/libraries/ESP8266SSDP/ESP8266SSDP.cpp +++ b/libraries/ESP8266SSDP/ESP8266SSDP.cpp @@ -150,7 +150,32 @@ SSDPClass::SSDPClass() : } SSDPClass::~SSDPClass() { - delete _timer; +#ifdef DEBUG_SSDP + DEBUG_SSDP.printf("SSDP end ... "); +#endif + if(_timer) { + ETSTimer* tm = &(_timer->timer); + os_timer_disarm(tm); + delete _timer; + } + + if (_server) { + _server->unref(); + _server = 0; + } + + ip_addr_t ifaddr; + ifaddr.addr = WiFi.localIP(); + ip_addr_t multicast_addr; + multicast_addr.addr = (uint32_t) SSDP_MULTICAST_ADDR; + if (igmp_leavegroup(&ifaddr, &multicast_addr) != ERR_OK ) { +#ifdef DEBUG_SSDP + DEBUG_SSDP.printf("SSDP failed to leave igmp group\n"); +#endif + } +#ifdef DEBUG_SSDP + DEBUG_SSDP.printf("ok\n"); +#endif } bool SSDPClass::begin() { From d683c946de1104a6aeeea0abefa149e16750202c Mon Sep 17 00:00:00 2001 From: dm Date: Fri, 11 Jan 2019 02:30:57 -0800 Subject: [PATCH 2/3] Release referenced resources in destructor, corrected for IPV6 --- libraries/ESP8266SSDP/ESP8266SSDP.cpp | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/libraries/ESP8266SSDP/ESP8266SSDP.cpp b/libraries/ESP8266SSDP/ESP8266SSDP.cpp index e706d30de4..5da87f65a9 100644 --- a/libraries/ESP8266SSDP/ESP8266SSDP.cpp +++ b/libraries/ESP8266SSDP/ESP8266SSDP.cpp @@ -164,11 +164,9 @@ SSDPClass::~SSDPClass() { _server = 0; } - ip_addr_t ifaddr; - ifaddr.addr = WiFi.localIP(); - ip_addr_t multicast_addr; - multicast_addr.addr = (uint32_t) SSDP_MULTICAST_ADDR; - if (igmp_leavegroup(&ifaddr, &multicast_addr) != ERR_OK ) { + IPAddress local = WiFi.localIP(); + IPAddress mcast(SSDP_MULTICAST_ADDR); + if (igmp_leavegroup(local, mcast) != ERR_OK ) { #ifdef DEBUG_SSDP DEBUG_SSDP.printf("SSDP failed to leave igmp group\n"); #endif From 6f786d3daa8ed9b46d7fdf5207a883c20e62b097 Mon Sep 17 00:00:00 2001 From: dm Date: Sat, 12 Jan 2019 00:33:10 -0800 Subject: [PATCH 3/3] Release referenced resources in destructor, per suggested changes --- libraries/ESP8266SSDP/ESP8266SSDP.cpp | 76 ++++++++++++++++----------- libraries/ESP8266SSDP/ESP8266SSDP.h | 2 + 2 files changed, 48 insertions(+), 30 deletions(-) diff --git a/libraries/ESP8266SSDP/ESP8266SSDP.cpp b/libraries/ESP8266SSDP/ESP8266SSDP.cpp index 5da87f65a9..7f5e3ceef1 100644 --- a/libraries/ESP8266SSDP/ESP8266SSDP.cpp +++ b/libraries/ESP8266SSDP/ESP8266SSDP.cpp @@ -127,7 +127,7 @@ struct SSDPTimer { SSDPClass::SSDPClass() : _server(0), - _timer(new SSDPTimer), + _timer(0), _port(80), _ttl(SSDP_MULTICAST_TTL), _respondToPort(0), @@ -150,50 +150,26 @@ SSDPClass::SSDPClass() : } SSDPClass::~SSDPClass() { -#ifdef DEBUG_SSDP - DEBUG_SSDP.printf("SSDP end ... "); -#endif - if(_timer) { - ETSTimer* tm = &(_timer->timer); - os_timer_disarm(tm); - delete _timer; - } - - if (_server) { - _server->unref(); - _server = 0; - } - - IPAddress local = WiFi.localIP(); - IPAddress mcast(SSDP_MULTICAST_ADDR); - if (igmp_leavegroup(local, mcast) != ERR_OK ) { -#ifdef DEBUG_SSDP - DEBUG_SSDP.printf("SSDP failed to leave igmp group\n"); -#endif - } -#ifdef DEBUG_SSDP - DEBUG_SSDP.printf("ok\n"); -#endif + end(); } bool SSDPClass::begin() { + end(); + _pending = false; if (strcmp(_uuid,"") == 0) { uint32_t chipId = ESP.getChipId(); sprintf(_uuid, "38323636-4558-4dda-9188-cda0e6%02x%02x%02x", (uint16_t) ((chipId >> 16) & 0xff), (uint16_t) ((chipId >> 8) & 0xff), - (uint16_t) chipId & 0xff ); + (uint16_t) chipId & 0xff); } #ifdef DEBUG_SSDP DEBUG_SSDP.printf("SSDP UUID: %s\n", (char *)_uuid); #endif - if (_server) { - _server->unref(); - _server = 0; - } + assert(NULL == _server); _server = new UdpContext; _server->ref(); @@ -222,6 +198,34 @@ bool SSDPClass::begin() { return true; } +void SSDPClass::end() { + if(!_server) + return; // object is zeroed already, nothing to do + +#ifdef DEBUG_SSDP + DEBUG_SSDP.printf_P(PSTR("SSDP end ... ")); +#endif + // undo all initializations done in begin(), in reverse order + _stopTimer(); + + _server->disconnect(); + + IPAddress local = WiFi.localIP(); + IPAddress mcast(SSDP_MULTICAST_ADDR); + + if (igmp_leavegroup(local, mcast) != ERR_OK ) { +#ifdef DEBUG_SSDP + DEBUG_SSDP.printf_P(PSTR("SSDP failed to leave igmp group\n")); +#endif + } + + _server->unref(); + _server = 0; + +#ifdef DEBUG_SSDP + DEBUG_SSDP.printf_P(PSTR("ok\n")); +#endif +} void SSDPClass::_send(ssdp_method_t method) { char buffer[1460]; IPAddress ip = WiFi.localIP(); @@ -484,6 +488,8 @@ void SSDPClass::_onTimerStatic(SSDPClass* self) { } void SSDPClass::_startTimer() { + _stopTimer(); + _timer = new SSDPTimer(); ETSTimer* tm = &(_timer->timer); const int interval = 1000; os_timer_disarm(tm); @@ -491,6 +497,16 @@ void SSDPClass::_startTimer() { os_timer_arm(tm, interval, 1 /* repeat */); } +void SSDPClass::_stopTimer() { + if(!_timer) + return; + + ETSTimer* tm = &(_timer->timer); + os_timer_disarm(tm); + delete _timer; + _timer = NULL; +} + #if !defined(NO_GLOBAL_INSTANCES) && !defined(NO_GLOBAL_SSDP) SSDPClass SSDP; #endif diff --git a/libraries/ESP8266SSDP/ESP8266SSDP.h b/libraries/ESP8266SSDP/ESP8266SSDP.h index 990199e27d..e320f058aa 100644 --- a/libraries/ESP8266SSDP/ESP8266SSDP.h +++ b/libraries/ESP8266SSDP/ESP8266SSDP.h @@ -61,6 +61,7 @@ class SSDPClass{ SSDPClass(); ~SSDPClass(); bool begin(); + void end(); void schema(WiFiClient client); void setDeviceType(const String& deviceType) { setDeviceType(deviceType.c_str()); } void setDeviceType(const char *deviceType); @@ -95,6 +96,7 @@ class SSDPClass{ void _send(ssdp_method_t method); void _update(); void _startTimer(); + void _stopTimer(); static void _onTimerStatic(SSDPClass* self); UdpContext* _server;