On 03/06/2016 12:59, Dan Bugnar wrote:
> Change the log buffer size and copy the messages.
> Copy the messages from the oldest to newest using the log_list.
> First time we calculate the size of the all entries. The log_entries_size
> calculates the size indifferent of the positions of the newest and oldest.
> 
> If we want to increase the log buffer size is simple, we just copy from the 
> oldest
> message to the newest all the messages into the new buffer.
> 
> In case we shrink the buffer we go over messages and decrease the entries size
> with the size of each message until the entries size is less or equal to the 
> new
> size we allocate the new buffer.
> 
> Signed-off-by: Dan Bugnar <danut...@gmail.com>
> ---
>  log/syslog.c | 36 +++++++++++++++++++++++++++---------
>  log/syslog.h |  2 +-
>  2 files changed, 28 insertions(+), 10 deletions(-)
> 
> diff --git a/log/syslog.c b/log/syslog.c
> index 2042e93..e24c678 100644
> --- a/log/syslog.c
> +++ b/log/syslog.c
> @@ -42,7 +42,7 @@
>  #define PAD(x) (x % 4) ? (((x) - (x % 4)) + 4) : (x)
>  
>  static char *log_dev = LOG_DEFAULT_SOCKET;
> -static int log_size = LOG_DEFAULT_SIZE;
> +static int log_size = 0;

static dont get defined to 0

>  static struct log_head *log, *log_end, *oldest, *newest;
>  static int current_id = 0;
>  static regex_t pat_prio;
> @@ -213,6 +213,15 @@ syslog_open(void)
>       return 0;
>  }
>  
> +static inline int 
> +log_entries_size()

void prototype ?

> +{
> +     if (newest > oldest)
> +             return (newest - oldest);
> +     else
> +             return (log_end - oldest + newest - log);
> +}
> +
>  struct log_head*
>  log_list(int count, struct log_head *h)
>  {
> @@ -237,26 +246,38 @@ log_list(int count, struct log_head *h)
>  }
>  
>  int
> -log_buffer_init(int size)
> +log_buffer_reinit(int size)
>  {
> +     if (size <= 0)
> +             size = LOG_DEFAULT_SIZE;
> +     if (log_size == size)
> +             return 0;
> +

code before variable declarations ? did this compile without warning ?

>       struct log_head *_log = malloc(size);
>  
>       if (!_log) {
> +             oldest = newest = log = NULL;
>               fprintf(stderr, "Failed to initialize log buffer with size 
> %d\n", log_size);
>               return -1;
>       }
>  
>       memset(_log, 0, size);
>  
> -     if (log && ((log_size + sizeof(struct log_head)) < size)) {
> +     if (log) {
>               struct log_head *start = _log;
>               struct log_head *end = ((void*) _log) + size;
>               struct log_head *l;
> +             int entries_size = log_entries_size();
>  
>               l = log_list(0, NULL);
>               while ((start < end) && l && l->size) {
> -                     memcpy(start, l, PAD(sizeof(struct log_head) + 
> l->size));
> -                     start = (struct log_head *) &l->data[PAD(l->size)];
> +                     int copy_len = PAD(sizeof(struct log_head)) + l->size;
> +                     if (entries_size < size) {
> +                             memcpy(start, l, copy_len);
> +                             start = (struct log_head *) 
> &start->data[l->size];
> +                     } else{
> +                             entries_size -= copy_len;
> +                     }
>                       l = log_list(0, l);
>               }
>               free(log);
> @@ -276,13 +297,10 @@ log_buffer_init(int size)
>  void
>  log_init(int _log_size)
>  {
> -     if (_log_size > 0)
> -             log_size = _log_size;

what happened to log_size ? if you dont use it anymore remove it fully
please

> -
you are removing a blank like here


>       regcomp(&pat_prio, "^<([0-9]*)>(.*)", REG_EXTENDED);
>       regcomp(&pat_tstamp, "^\[[ 0]*([0-9]*).([0-9]*)] (.*)", REG_EXTENDED);
>  
> -     if (log_buffer_init(log_size)) {
> +     if (log_buffer_reinit(_log_size)) {
>               fprintf(stderr, "Failed to allocate log memory\n");
>               exit(-1);
>       }
> diff --git a/log/syslog.h b/log/syslog.h
> index 81a039f..ed5a41b 100644
> --- a/log/syslog.h
> +++ b/log/syslog.h
> @@ -35,7 +35,7 @@ void log_shutdown(void);
>  
>  typedef void (*log_list_cb)(struct log_head *h);
>  struct log_head* log_list(int count, struct log_head *h);
> -int log_buffer_init(int size);
> +int log_buffer_reinit(int size);
>  void log_add(char *buf, int size, int source);
>  void ubus_notify_log(struct log_head *l);
>  
> 

_______________________________________________
Lede-dev mailing list
Lede-dev@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/lede-dev

Reply via email to