From 1c55ca0223b2238ce3c2bcaf80857e515266fa0e Mon Sep 17 00:00:00 2001 From: lyon Date: Sun, 20 Nov 2022 00:17:34 +0800 Subject: [PATCH] fix mem break when mqtt_thread not exit --- package/mqtt/mqttclient.c | 7 ++++++- package/mqtt/platform_thread.c | 5 ++++- .../package/pikascript/pikascript-lib/mqtt/mqttclient.c | 7 ++++++- .../pikascript/pikascript-lib/mqtt/platform_thread.c | 5 ++++- 4 files changed, 20 insertions(+), 4 deletions(-) diff --git a/package/mqtt/mqttclient.c b/package/mqtt/mqttclient.c index 5016156fd..36f88bc94 100644 --- a/package/mqtt/mqttclient.c +++ b/package/mqtt/mqttclient.c @@ -1612,7 +1612,12 @@ int mqtt_set_will_options(mqtt_client_t* c, } int mqtt_release_free(mqtt_client_t* c) { - mqtt_clean_session(c); + /* wait for mqtt thread exit */ + while (c->mqtt_thread != NULL) { + } + if (CLIENT_STATE_INVALID != mqtt_get_client_state(c)) { + mqtt_clean_session(c); + } mqtt_release(c); platform_memory_free(c); return 0; diff --git a/package/mqtt/platform_thread.c b/package/mqtt/platform_thread.c index 5091c875d..4611cdc92 100644 --- a/package/mqtt/platform_thread.c +++ b/package/mqtt/platform_thread.c @@ -83,8 +83,11 @@ PIKA_WEAK void platform_thread_start(platform_thread_t* thread) { PIKA_WEAK void platform_thread_destroy(platform_thread_t* thread) { #ifdef __linux - if (NULL != thread) + if (NULL != thread){ pthread_detach(thread->thread); + platform_memory_free(thread); + thread = NULL; + } #elif PIKA_FREERTOS_ENABLE if (NULL != thread) vTaskDelete(thread->thread); diff --git a/port/linux/package/pikascript/pikascript-lib/mqtt/mqttclient.c b/port/linux/package/pikascript/pikascript-lib/mqtt/mqttclient.c index 5016156fd..36f88bc94 100644 --- a/port/linux/package/pikascript/pikascript-lib/mqtt/mqttclient.c +++ b/port/linux/package/pikascript/pikascript-lib/mqtt/mqttclient.c @@ -1612,7 +1612,12 @@ int mqtt_set_will_options(mqtt_client_t* c, } int mqtt_release_free(mqtt_client_t* c) { - mqtt_clean_session(c); + /* wait for mqtt thread exit */ + while (c->mqtt_thread != NULL) { + } + if (CLIENT_STATE_INVALID != mqtt_get_client_state(c)) { + mqtt_clean_session(c); + } mqtt_release(c); platform_memory_free(c); return 0; diff --git a/port/linux/package/pikascript/pikascript-lib/mqtt/platform_thread.c b/port/linux/package/pikascript/pikascript-lib/mqtt/platform_thread.c index 5091c875d..4611cdc92 100644 --- a/port/linux/package/pikascript/pikascript-lib/mqtt/platform_thread.c +++ b/port/linux/package/pikascript/pikascript-lib/mqtt/platform_thread.c @@ -83,8 +83,11 @@ PIKA_WEAK void platform_thread_start(platform_thread_t* thread) { PIKA_WEAK void platform_thread_destroy(platform_thread_t* thread) { #ifdef __linux - if (NULL != thread) + if (NULL != thread){ pthread_detach(thread->thread); + platform_memory_free(thread); + thread = NULL; + } #elif PIKA_FREERTOS_ENABLE if (NULL != thread) vTaskDelete(thread->thread);