From b3c38630e9b6d81426c90df48ea7b4fa0ed5a196 Mon Sep 17 00:00:00 2001 From: qintl Date: Thu, 10 Jan 2019 15:01:36 +0800 Subject: [PATCH] Fix plugin file the structure and format Signed-off-by: qintl --- demo/os/linux/Makefile | 7 +- demo/os/linux/easylogger/inc/elog_cfg.h | 2 + .../linux/easylogger/plugins/file/elog_file.c | 34 ------- .../linux/easylogger/plugins/file/elog_file.h | 30 ------ .../easylogger/plugins/file/elog_file_cfg.h | 31 +++++- .../easylogger/plugins/file/elog_file_port.c | 95 +++++++++++-------- demo/os/linux/easylogger/port/elog_port.c | 4 +- easylogger/plugins/file/elog_file.c | 87 ++++++++++++++--- easylogger/plugins/file/elog_file.h | 65 ++++++++++--- easylogger/plugins/file/elog_file_cfg.h | 31 +++++- easylogger/plugins/file/elog_file_port.c | 67 ++++++++++--- 11 files changed, 299 insertions(+), 154 deletions(-) delete mode 100644 demo/os/linux/easylogger/plugins/file/elog_file.c delete mode 100644 demo/os/linux/easylogger/plugins/file/elog_file.h diff --git a/demo/os/linux/Makefile b/demo/os/linux/Makefile index e84e61c..25cf136 100755 --- a/demo/os/linux/Makefile +++ b/demo/os/linux/Makefile @@ -1,9 +1,12 @@ CC = cc -INCLUDE = -I./easylogger/plugins/file -I./easylogger/inc -I../../../easylogger/inc + +ROOTPATH=../../.. +INCLUDE = -I./easylogger/inc -I./easylogger/plugins/ -I$(ROOTPATH)/easylogger/plugins/ -I$(ROOTPATH)/easylogger/inc LIB=-lpthread OBJ += $(patsubst %.c, %.o, $(wildcard *.c)) -OBJ += $(patsubst %.c, %.o, $(wildcard ../../../easylogger/src/*.c)) +OBJ += $(patsubst %.c, %.o, $(wildcard $(ROOTPATH)/easylogger/src/*.c)) +OBJ += $(patsubst %.c, %.o, $(wildcard $(ROOTPATH)/easylogger/plugins/file/elog_file.c)) OBJ += $(patsubst %.c, %.o, $(wildcard easylogger/port/*.c)) OBJ += $(patsubst %.c, %.o, $(wildcard easylogger/plugins/file/*.c)) diff --git a/demo/os/linux/easylogger/inc/elog_cfg.h b/demo/os/linux/easylogger/inc/elog_cfg.h index 778972b..8f3fa20 100644 --- a/demo/os/linux/easylogger/inc/elog_cfg.h +++ b/demo/os/linux/easylogger/inc/elog_cfg.h @@ -33,6 +33,8 @@ #define ELOG_OUTPUT_ENABLE /* enable log write file. default open this macro */ #define ELOG_FILE_ENABLE +/* enable flush file cache. default open this macro */ +#define ELOG_FILE_FLUSH_CAHCE_ENABLE /* setting static output log level */ #define ELOG_OUTPUT_LVL ELOG_LVL_VERBOSE /* enable assert check */ diff --git a/demo/os/linux/easylogger/plugins/file/elog_file.c b/demo/os/linux/easylogger/plugins/file/elog_file.c deleted file mode 100644 index f7f2a98..0000000 --- a/demo/os/linux/easylogger/plugins/file/elog_file.c +++ /dev/null @@ -1,34 +0,0 @@ -#include -#include -#include -#include - -#include "elog_file.h" - -/* initialize OK flag */ -static bool init_ok = false; - -ElogErrCode elog_file_init(void) -{ - ElogErrCode result = ELOG_NO_ERR; - - elog_file_port_init(); - - init_ok = true; - return result; -} - -void elog_file_write(const char *log, size_t size) -{ - ELOG_ASSERT(init_ok); - ELOG_ASSERT(log); - - elog_file_port_lock(); - elog_file_port_write(log, size); - elog_file_port_unlock(); -} - -void elog_file_deinit(void) -{ - elog_file_port_deinit(); -} diff --git a/demo/os/linux/easylogger/plugins/file/elog_file.h b/demo/os/linux/easylogger/plugins/file/elog_file.h deleted file mode 100644 index 6cc8bf6..0000000 --- a/demo/os/linux/easylogger/plugins/file/elog_file.h +++ /dev/null @@ -1,30 +0,0 @@ -#ifndef __ELOG_FILE__H__ -#define __ELOG_FILE__H__ - -#include - -/* EasyLogger file log plugin's software version number */ -#define ELOG_FILE_SW_VERSION "V1.0.0" - -#ifdef __cplusplus -extern "C" { -#endif - /* elog_file.c */ - ElogErrCode elog_file_init(void); - void elog_file_set_name(const char *name); - void elog_file_get_name(const char *name); - void elog_file_write(const char *log, size_t size); - void elog_file_deinit(void); - - /* elog_file_port.c */ - ElogErrCode elog_file_port_init(void); - void elog_file_port_write(const char *log, size_t size); - void elog_file_port_lock(void); - void elog_file_port_unlock(void); - void elog_file_port_deinit(void); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/demo/os/linux/easylogger/plugins/file/elog_file_cfg.h b/demo/os/linux/easylogger/plugins/file/elog_file_cfg.h index 42a2b36..278b48e 100644 --- a/demo/os/linux/easylogger/plugins/file/elog_file_cfg.h +++ b/demo/os/linux/easylogger/plugins/file/elog_file_cfg.h @@ -1,3 +1,31 @@ +/* + * This file is part of the EasyLogger Library. + * + * Copyright (c) 2015-2019, Qintl, + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * 'Software'), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * Function: It is the configure head file for this flash log plugin. + * Created on: 2019-01-05 + */ + #ifndef _ELOG_FILE_CFG_H_ #define _ELOG_FILE_CFG_H_ @@ -7,7 +35,4 @@ /* EasyLogger file log plugin's using file max size */ #define ELOG_FILE_MAX_SIZE (10 * 1024 * 1024) -/* EasyLogger file log plugin's using semaphore key */ -#define ELOG_FILE_SEM_KEY ((key_t)0x19910612) - #endif /* _ELOG_FILE_CFG_H_ */ diff --git a/demo/os/linux/easylogger/plugins/file/elog_file_port.c b/demo/os/linux/easylogger/plugins/file/elog_file_port.c index 9e3a2ae..cb8fc21 100644 --- a/demo/os/linux/easylogger/plugins/file/elog_file_port.c +++ b/demo/os/linux/easylogger/plugins/file/elog_file_port.c @@ -1,3 +1,31 @@ +/* + * This file is part of the EasyLogger Library. + * + * Copyright (c) 2015-2019, Qintl, + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * 'Software'), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * Function: Portable interface for EasyLogger's file log pulgin. + * Created on: 2019-01-05 + */ + #include #include #include @@ -7,9 +35,10 @@ #include -#include "elog_file.h" -#include "elog_file_cfg.h" +#include +#include +#define ELOG_FILE_SEM_KEY ((key_t)0x19910612) #ifdef _SEM_SEMUN_UNDEFINED union semun { int val; /* Value for SETVAL */ @@ -20,18 +49,12 @@ union semun { }; #endif -#define likely(x) __builtin_expect(!!(x), 1) -#define unlikely(x) __builtin_expect(!!(x), 0) - -static FILE *fp; -static int fd; static int semid = -1; static struct sembuf const up = {0, 1, SEM_UNDO}; static struct sembuf const down = {0, -1, SEM_UNDO}; static void lock_init(void); static int lock_open(void); -static inline int file_size(void); /** * EasyLogger flile log pulgin port initialize * @@ -40,49 +63,54 @@ static inline int file_size(void); ElogErrCode elog_file_port_init(void) { ElogErrCode result = ELOG_NO_ERR; - fp = fopen(ELOG_FILE_NAME, "a+"); - if (unlikely(!fp)) - goto __exit; - lock_init(); - fd = fileno(fp); -__exit: return result; } /** - * output file saved log port interface - * - * @param log file saved log - * @param size log size + * 46 * flush file cache + * 47 */ +void inline elog_file_port_flush_cache(Elog_File *file) +{ + fflush(file->fp); + fsync(file->fd); +} + +/** + * get file size */ -void elog_file_port_write(const char *log, size_t size) { - if(unlikely(file_size() >= ELOG_FILE_MAX_SIZE)) - return ; +size_t inline elog_file_port_get_size(Elog_File *file) +{ + struct stat statbuf; + + statbuf.st_size = 0; + stat(file->name, &statbuf); - fwrite(log, size, 1, fp); - fdatasync(fd); + return statbuf.st_size; } /** * file log lock */ -void elog_file_port_lock(void) { +void inline elog_file_port_lock(void) +{ semid == -1 ? -1 : semop(semid, (struct sembuf *)&down, 1); } /** * file log unlock */ -void elog_file_port_unlock(void) { +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) { - fclose(fp); +void elog_file_port_deinit(void) +{ + } /** @@ -152,16 +180,3 @@ static int lock_open(void) err: return -1; } - -/** - * gets the file size - */ -static inline int file_size() -{ - struct stat statbuf; - - statbuf.st_size = 0; - stat(ELOG_FILE_NAME, &statbuf); - - return statbuf.st_size; -} diff --git a/demo/os/linux/easylogger/port/elog_port.c b/demo/os/linux/easylogger/port/elog_port.c index 456888c..1ad3d8b 100644 --- a/demo/os/linux/easylogger/port/elog_port.c +++ b/demo/os/linux/easylogger/port/elog_port.c @@ -32,7 +32,7 @@ #include #include -#include +#include static pthread_mutex_t output_lock; /** @@ -60,7 +60,7 @@ ElogErrCode elog_port_init(void) { */ void elog_port_output(const char *log, size_t size) { /* output to terminal */ - printf("%.*s", size, log); + printf("%.*s", (int)size, log); #ifdef ELOG_FILE_ENABLE /* write the file */ elog_file_write(log, size); diff --git a/easylogger/plugins/file/elog_file.c b/easylogger/plugins/file/elog_file.c index 4fd06ba..d9ca874 100644 --- a/easylogger/plugins/file/elog_file.c +++ b/easylogger/plugins/file/elog_file.c @@ -1,38 +1,99 @@ +/* + * This file is part of the EasyLogger Library. + * + * Copyright (c) 2015-2019, Qintl, + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * 'Software'), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * Function: Save log to file. + * Created on: 2019-01-05 + */ + #include #include #include #include -#include "elog_file.h" - +#include +#include /* initialize OK flag */ static bool init_ok = false; +static Elog_File file; + +static void elog_file_config_init(Elog_File *file); +static void elog_file_config_deinit(void); ElogErrCode elog_file_init(void) { - ElogErrCode result = ELOG_NO_ERR; - if (init_ok) - goto __exit; + ElogErrCode result = ELOG_NO_ERR; + if (init_ok) + goto __exit; - elog_file_port_init(); + elog_file_config_init(&file); + elog_file_port_init(); - init_ok = true; + init_ok = true; __exit: - return result; + return result; } void elog_file_write(const char *log, size_t size) { - ELOG_ASSERT(init_ok); - ELOG_ASSERT(log); + ELOG_ASSERT(init_ok); + ELOG_ASSERT(log); + + if (unlikely(elog_file_port_get_size(&file) > file.max_size)) + return ; elog_file_port_lock(); - elog_file_port_write(log, size); + + fwrite(log, size, 1, file.fp); +#ifdef ELOG_FILE_FLUSH_CAHCE_ENABLE + elog_file_port_flush_cache(&file); +#endif + elog_file_port_unlock(); } + void elog_file_deinit(void) { - ELOG_ASSERT(init_ok); - elog_file_port_deinit(); + ELOG_ASSERT(init_ok); + + elog_file_config_deinit(); + elog_file_port_deinit(); +} + +static void elog_file_config_init(Elog_File *file) +{ + file->name = ELOG_FILE_NAME; + file->max_size = ELOG_FILE_MAX_SIZE; + file->fp = fopen(file->name, "a+"); +#ifdef linux + if (file->fp) + file->fd = fileno(file->fp); + else + file->fd = -1; +#endif } +static void elog_file_config_deinit(void) +{ + fclose(file.fp); +} diff --git a/easylogger/plugins/file/elog_file.h b/easylogger/plugins/file/elog_file.h index 6ff5806..1c5e58c 100644 --- a/easylogger/plugins/file/elog_file.h +++ b/easylogger/plugins/file/elog_file.h @@ -1,25 +1,66 @@ +/* + * This file is part of the EasyLogger Library. + * + * Copyright (c) 2015-2019, Qintl, + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * 'Software'), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * Function: It is an head file for file log plugin. You can see all be called functions. + * Created on: 2019-01-05 + */ + #ifndef __ELOG_FILE__H__ #define __ELOG_FILE__H__ - +#include #include /* EasyLogger file log plugin's software version number */ #define ELOG_FILE_SW_VERSION "V1.0.0" +#define likely(x) __builtin_expect(!!(x), 1) +#define unlikely(x) __builtin_expect(!!(x), 0) + +typedef struct { + FILE *fp; +#ifdef linux + int fd; +#endif + char *name; + size_t max_size; +} Elog_File; #ifdef __cplusplus extern "C" { #endif - /* elog_file.c */ - ElogErrCode elog_file_init(void); - void elog_file_write(const char *log, size_t size); - void elog_file_deinit(void); - - /* elog_file_port.c */ - ElogErrCode elog_flash_port_init(void); - void elog_file_port_write(const char *log, size_t size); - void elog_file_port_lock(void); - void elog_file_port_unlock(void); - void elog_file_port_deinit(void); + +/* elog_file.c */ +ElogErrCode elog_file_init(void); +void elog_file_write(const char *log, size_t size); +void elog_file_deinit(void); + +/* elog_file_port.c */ +ElogErrCode elog_file_port_init(void); +size_t elog_file_port_get_size(Elog_File *file); +void elog_file_port_flush_cache(Elog_File *file); +void elog_file_port_lock(void); +void elog_file_port_unlock(void); +void elog_file_port_deinit(void); #ifdef __cplusplus } diff --git a/easylogger/plugins/file/elog_file_cfg.h b/easylogger/plugins/file/elog_file_cfg.h index a8afe49..0dd75c9 100644 --- a/easylogger/plugins/file/elog_file_cfg.h +++ b/easylogger/plugins/file/elog_file_cfg.h @@ -1,3 +1,31 @@ +/* + * This file is part of the EasyLogger Library. + * + * Copyright (c) 2015-2019, Qintl, + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * 'Software'), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * Function: It is the configure head file for this flash log plugin. + * Created on: 2019-01-05 + */ + #ifndef _ELOG_FILE_CFG_H_ #define _ELOG_FILE_CFG_H_ @@ -7,7 +35,4 @@ /* EasyLogger file log plugin's using file max size */ #define ELOG_FILE_MAX_SIZE -/* EasyLogger file log plugin's using semaphore key */ -#define ELOG_FILE_SEM_KEY - #endif /* _ELOG_FILE_CFG_H_ */ diff --git a/easylogger/plugins/file/elog_file_port.c b/easylogger/plugins/file/elog_file_port.c index 2878664..2342df4 100644 --- a/easylogger/plugins/file/elog_file_port.c +++ b/easylogger/plugins/file/elog_file_port.c @@ -1,3 +1,31 @@ +/* + * This file is part of the EasyLogger Library. + * + * Copyright (c) 2015-2019, Qintl, + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * 'Software'), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * Function: Portable interface for EasyLogger's file log pulgin. + * Created on: 2019-01-05 + */ + #include "elog_file.h" /** @@ -5,48 +33,57 @@ * * @return result */ -ElogErrCode elog_file_port_init(void) { +ElogErrCode elog_file_port_init(void) +{ ElogErrCode result = ELOG_NO_ERR; + + /* add your code here */ + return result; +} + +/** + * flush file cache + */ +void elog_file_port_flush_cache(Elog_File *file) { + /* add your code here */ - return result; } /** - * output file saved log port interface - * - * @param log file saved log - * @param size log size + * get file current size */ -void elog_file_port_output(const char *log, size_t size) { - +size_t elog_file_port_get_size(Elog_File *file) +{ + /* add your code here */ - + + return 0; } /** * file log lock */ void elog_file_port_lock(void) { - + /* add your code here */ - + } /** * file log unlock */ void elog_file_port_unlock(void) { - + /* add your code here */ - + } /** * file log deinit */ void elog_file_port_deinit(void) { - + /* add your code here */ - + }