From bb20ae32f63b220bf94a90935dc938cd488ff4ec Mon Sep 17 00:00:00 2001 From: 5ooo <95404672@qq.com> Date: Thu, 1 Apr 2021 17:47:24 +0800 Subject: [PATCH] [easylogger] [demo][linux] add deinit for linux --- .../os/linux/easylogger/port/elog_file_port.c | 13 ++++- demo/os/linux/easylogger/port/elog_port.c | 13 +++++ easylogger/inc/elog.h | 2 + easylogger/plugins/file/elog_file.c | 23 ++++++--- easylogger/port/elog_port.c | 10 ++++ easylogger/src/elog.c | 49 +++++++++++++++++++ easylogger/src/elog_async.c | 32 +++++++++++- 7 files changed, 132 insertions(+), 10 deletions(-) mode change 100644 => 100755 demo/os/linux/easylogger/port/elog_file_port.c mode change 100644 => 100755 demo/os/linux/easylogger/port/elog_port.c mode change 100644 => 100755 easylogger/inc/elog.h mode change 100644 => 100755 easylogger/plugins/file/elog_file.c mode change 100644 => 100755 easylogger/port/elog_port.c mode change 100644 => 100755 easylogger/src/elog.c mode change 100644 => 100755 easylogger/src/elog_async.c diff --git a/demo/os/linux/easylogger/port/elog_file_port.c b/demo/os/linux/easylogger/port/elog_file_port.c old mode 100644 new mode 100755 index a08347e..f700517 --- a/demo/os/linux/easylogger/port/elog_file_port.c +++ b/demo/os/linux/easylogger/port/elog_file_port.c @@ -55,6 +55,8 @@ static struct sembuf const down = {0, -1, SEM_UNDO}; static void lock_init(void); static int lock_open(void); +static void lock_deinit(void); + /** * EasyLogger flile log pulgin port initialize * @@ -83,12 +85,13 @@ void inline elog_file_port_unlock(void) { semid == -1 ? -1 : semop(semid, (struct sembuf *)&up, 1); } + /** * file log deinit */ void elog_file_port_deinit(void) { - + lock_deinit(); } /** @@ -158,3 +161,11 @@ static int lock_open(void) err: return -1; } + +/** + * deinitialize the lock + */ +static void lock_deinit(void) +{ + semid = -1; +} diff --git a/demo/os/linux/easylogger/port/elog_port.c b/demo/os/linux/easylogger/port/elog_port.c old mode 100644 new mode 100755 index cde29bc..66ed238 --- a/demo/os/linux/easylogger/port/elog_port.c +++ b/demo/os/linux/easylogger/port/elog_port.c @@ -54,6 +54,19 @@ ElogErrCode elog_port_init(void) { return result; } +/** + * EasyLogger port deinitialize + * + */ +void elog_port_deinit(void) { +#ifdef ELOG_FILE_ENABLE + elog_file_deinit(); +#endif + + pthread_mutex_destroy(&output_lock); +} + + /** * output log port interface * diff --git a/easylogger/inc/elog.h b/easylogger/inc/elog.h old mode 100644 new mode 100755 index 692285c..6b94b21 --- a/easylogger/inc/elog.h +++ b/easylogger/inc/elog.h @@ -177,7 +177,9 @@ typedef enum { /* elog.c */ ElogErrCode elog_init(void); +void elog_deinit(void); void elog_start(void); +void elog_stop(void); void elog_set_output_enabled(bool enabled); bool elog_get_output_enabled(void); void elog_set_text_color_enabled(bool enabled); diff --git a/easylogger/plugins/file/elog_file.c b/easylogger/plugins/file/elog_file.c old mode 100644 new mode 100755 index e990db8..397a295 --- a/easylogger/plugins/file/elog_file.c +++ b/easylogger/plugins/file/elog_file.c @@ -143,23 +143,32 @@ void elog_file_deinit(void) { ELOG_ASSERT(init_ok); + ElogFileCfg cfg = {NULL, 0, 0}; + + elog_file_config(&cfg); + elog_file_port_deinit(); - fclose(fp); + + init_ok = false; } void elog_file_config(ElogFileCfg *cfg) { + elog_file_port_lock(); + if (fp) { fclose(fp); + fp = NULL; } - elog_file_port_lock(); - - local_cfg.name = cfg->name; - local_cfg.max_size = cfg->max_size; - local_cfg.max_rotate = cfg->max_rotate; + if (cfg != NULL) { + local_cfg.name = cfg->name; + local_cfg.max_size = cfg->max_size; + local_cfg.max_rotate = cfg->max_rotate; - fp = fopen(local_cfg.name, "a+"); + if (local_cfg.name != NULL && strlen(local_cfg.name) > 0) + fp = fopen(local_cfg.name, "a+"); + } elog_file_port_unlock(); } diff --git a/easylogger/port/elog_port.c b/easylogger/port/elog_port.c old mode 100644 new mode 100755 index a829c7c..4b5409c --- a/easylogger/port/elog_port.c +++ b/easylogger/port/elog_port.c @@ -41,6 +41,16 @@ ElogErrCode elog_port_init(void) { return result; } +/** + * EasyLogger port deinitialize + * + */ +void elog_port_deinit(void) { + + /* add your code here */ + +} + /** * output log port interface * diff --git a/easylogger/src/elog.c b/easylogger/src/elog.c old mode 100644 new mode 100755 index 828c42e..7ae5de6 --- a/easylogger/src/elog.c +++ b/easylogger/src/elog.c @@ -200,10 +200,37 @@ ElogErrCode elog_init(void) { return result; } +/** + * EasyLogger deinitialize. + * + */ +void elog_deinit(void) { + extern ElogErrCode elog_port_deinit(void); + extern ElogErrCode elog_async_deinit(void); + + if (!elog.init_ok) { + return ; + } + +#ifdef ELOG_ASYNC_OUTPUT_ENABLE + elog_async_deinit(); +#endif + + /* port deinitialize */ + elog_port_deinit(); + + elog.init_ok = false; +} + + /** * EasyLogger start after initialize. */ void elog_start(void) { + if (!elog.init_ok) { + return ; + } + /* enable output */ elog_set_output_enabled(true); @@ -217,6 +244,28 @@ void elog_start(void) { log_i("EasyLogger V%s is initialize success.", ELOG_SW_VERSION); } +/** + * EasyLogger stop after initialize. + */ +void elog_stop(void) { + if (!elog.init_ok) { + return ; + } + + /* disable output */ + elog_set_output_enabled(false); + +#if defined(ELOG_ASYNC_OUTPUT_ENABLE) + elog_async_enabled(false); +#elif defined(ELOG_BUF_OUTPUT_ENABLE) + elog_buf_enabled(false); +#endif + + /* show version */ + log_i("EasyLogger V%s is deinitialize success.", ELOG_SW_VERSION); +} + + /** * set output enable or disable * diff --git a/easylogger/src/elog_async.c b/easylogger/src/elog_async.c old mode 100644 new mode 100755 index cade4bf..4754279 --- a/easylogger/src/elog_async.c +++ b/easylogger/src/elog_async.c @@ -74,6 +74,8 @@ static pthread_t async_output_thread; /* Initialize OK flag */ static bool init_ok = false; +/* thread running flag */ +static bool thread_running = false; /* asynchronous output mode enabled flag */ static bool is_enabled = false; /* asynchronous output mode's ring buffer */ @@ -283,7 +285,7 @@ static void *async_output(void *arg) { size_t get_log_size = 0; static char poll_get_buf[ELOG_ASYNC_POLL_GET_LOG_BUF_SIZE]; - while(true) { + while(thread_running) { /* waiting log */ sem_wait(&output_notice); /* polling gets and outputs the log */ @@ -334,8 +336,10 @@ ElogErrCode elog_async_init(void) { sem_init(&output_notice, 0, 0); + thread_running = true; + pthread_attr_init(&thread_attr); - pthread_attr_setdetachstate(&thread_attr, PTHREAD_CREATE_DETACHED); + //pthread_attr_setdetachstate(&thread_attr, PTHREAD_CREATE_DETACHED); pthread_attr_setstacksize(&thread_attr, ELOG_ASYNC_OUTPUT_PTHREAD_STACK_SIZE); pthread_attr_setschedpolicy(&thread_attr, SCHED_RR); thread_sched_param.sched_priority = ELOG_ASYNC_OUTPUT_PTHREAD_PRIORITY; @@ -349,4 +353,28 @@ ElogErrCode elog_async_init(void) { return result; } +/** + * asynchronous output mode deinitialize + * + */ +void elog_async_deinit(void) { + if (!init_ok) { + return ; + } + +#ifdef ELOG_ASYNC_OUTPUT_USING_PTHREAD + thread_running = false; + + elog_async_output_notice(); + + pthread_join(async_output_thread, NULL); + + sem_destroy(&output_notice); +#endif + + init_ok = false; +} + + + #endif /* ELOG_ASYNC_OUTPUT_ENABLE */