InfiniTime.git

commit 09adb78b551ef7659fd7e8e71c337e7de81023d2

Author: JF <jf@codingfield.com>

Fix/Workaround a memory leak each time a device connects to BLE.

 src/CMakeLists.txt | 2 
 src/libs/mynewt-nimble/porting/npl/freertos/src/npl_os_freertos.c | 6 +


diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index be73dbfbbbc3c64d1bb6b42393c3327c2762aa86..ff2e18126dadfbf3ad20f58873d47a847b566a79 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -44,7 +44,7 @@
         # FreeRTOS
         ${NRF5_SDK_PATH}/external/freertos/source/croutine.c
         ${NRF5_SDK_PATH}/external/freertos/source/event_groups.c
-        ${NRF5_SDK_PATH}/external/freertos/source/portable/MemMang/heap_1.c
+        ${NRF5_SDK_PATH}/external/freertos/source/portable/MemMang/heap_4.c
         ${NRF5_SDK_PATH}/external/freertos/source/list.c
         ${NRF5_SDK_PATH}/external/freertos/source/queue.c
         ${NRF5_SDK_PATH}/external/freertos/source/stream_buffer.c




diff --git a/src/libs/mynewt-nimble/porting/npl/freertos/src/npl_os_freertos.c b/src/libs/mynewt-nimble/porting/npl/freertos/src/npl_os_freertos.c
index 87936bd8de33ad0259c5912ed05846b4effa7891..eb3b4c9989397dbddd66c9aba72ae8bf346c4378 100644
--- a/src/libs/mynewt-nimble/porting/npl/freertos/src/npl_os_freertos.c
+++ b/src/libs/mynewt-nimble/porting/npl/freertos/src/npl_os_freertos.c
@@ -268,10 +268,16 @@ void
 npl_freertos_callout_init(struct ble_npl_callout *co, struct ble_npl_eventq *evq,
                      ble_npl_event_fn *ev_cb, void *ev_arg)
 {
+  // I added this 'if' because nimble seems to never delete the timers. I assume it wants to recycle them.
+  // This condition ensure that a new timer is created only if 'co' points to an uninitialized structure.
+  // If the struct contains an existing timer, no new timer is created, which prevent a significant memory leak.
+  // TODO Ensure that this workaround is valid and does not generate bad side-effect.
+  if(co->handle == NULL) {
     memset(co, 0, sizeof(*co));
     co->handle = xTimerCreate("co", 1, pdFALSE, co, os_callout_timer_cb);
     co->evq = evq;
     ble_npl_event_init(&co->ev, ev_cb, ev_arg);
+  }
 }
 
 ble_npl_error_t