sdlog2 performance increased, fixes and cleanup

This commit is contained in:
Anton Babushkin
2013-06-01 13:18:03 +04:00
parent b614d2f1eb
commit 1bf8f7b47e
4 changed files with 357 additions and 182 deletions
@@ -33,9 +33,9 @@
****************************************************************************/ ****************************************************************************/
/** /**
* @file sdlog2_ringbuffer.c * @file logbuffer.c
* *
* Ring FIFO buffer for binary data. * Ring FIFO buffer for binary log data.
* *
* @author Anton Babushkin <rk3dov@gmail.com> * @author Anton Babushkin <rk3dov@gmail.com>
*/ */
@@ -43,9 +43,9 @@
#include <string.h> #include <string.h>
#include <stdlib.h> #include <stdlib.h>
#include "sdlog2_ringbuffer.h" #include "logbuffer.h"
void sdlog2_logbuffer_init(struct sdlog2_logbuffer *lb, int size) void logbuffer_init(struct logbuffer_s *lb, int size)
{ {
lb->size = size; lb->size = size;
lb->write_ptr = 0; lb->write_ptr = 0;
@@ -53,7 +53,7 @@ void sdlog2_logbuffer_init(struct sdlog2_logbuffer *lb, int size)
lb->data = malloc(lb->size); lb->data = malloc(lb->size);
} }
int sdlog2_logbuffer_free(struct sdlog2_logbuffer *lb) int logbuffer_free(struct logbuffer_s *lb)
{ {
int n = lb->read_ptr - lb->write_ptr - 1; int n = lb->read_ptr - lb->write_ptr - 1;
@@ -64,7 +64,7 @@ int sdlog2_logbuffer_free(struct sdlog2_logbuffer *lb)
return n; return n;
} }
int sdlog2_logbuffer_count(struct sdlog2_logbuffer *lb) int logbuffer_count(struct logbuffer_s *lb)
{ {
int n = lb->write_ptr - lb->read_ptr; int n = lb->write_ptr - lb->read_ptr;
@@ -75,12 +75,12 @@ int sdlog2_logbuffer_count(struct sdlog2_logbuffer *lb)
return n; return n;
} }
int sdlog2_logbuffer_is_empty(struct sdlog2_logbuffer *lb) int logbuffer_is_empty(struct logbuffer_s *lb)
{ {
return lb->read_ptr == lb->write_ptr; return lb->read_ptr == lb->write_ptr;
} }
void sdlog2_logbuffer_write(struct sdlog2_logbuffer *lb, void *ptr, int size) bool logbuffer_write(struct logbuffer_s *lb, void *ptr, int size)
{ {
// bytes available to write // bytes available to write
int available = lb->read_ptr - lb->write_ptr - 1; int available = lb->read_ptr - lb->write_ptr - 1;
@@ -90,7 +90,7 @@ void sdlog2_logbuffer_write(struct sdlog2_logbuffer *lb, void *ptr, int size)
if (size > available) { if (size > available) {
// buffer overflow // buffer overflow
return; return false;
} }
char *c = (char *) ptr; char *c = (char *) ptr;
@@ -109,9 +109,10 @@ void sdlog2_logbuffer_write(struct sdlog2_logbuffer *lb, void *ptr, int size)
int p = size - n; // number of bytes to write int p = size - n; // number of bytes to write
memcpy(&(lb->data[lb->write_ptr]), &(c[n]), p); memcpy(&(lb->data[lb->write_ptr]), &(c[n]), p);
lb->write_ptr = (lb->write_ptr + p) % lb->size; lb->write_ptr = (lb->write_ptr + p) % lb->size;
return true;
} }
int sdlog2_logbuffer_get_ptr(struct sdlog2_logbuffer *lb, void **ptr) int logbuffer_get_ptr(struct logbuffer_s *lb, void **ptr, bool *is_part)
{ {
// bytes available to read // bytes available to read
int available = lb->write_ptr - lb->read_ptr; int available = lb->write_ptr - lb->read_ptr;
@@ -125,17 +126,19 @@ int sdlog2_logbuffer_get_ptr(struct sdlog2_logbuffer *lb, void **ptr)
if (available > 0) { if (available > 0) {
// read pointer is before write pointer, write all available bytes // read pointer is before write pointer, write all available bytes
n = available; n = available;
*is_part = false;
} else { } else {
// read pointer is after write pointer, write bytes from read_ptr to end // read pointer is after write pointer, write bytes from read_ptr to end
n = lb->size - lb->read_ptr; n = lb->size - lb->read_ptr;
*is_part = true;
} }
*ptr = &(lb->data[lb->read_ptr]); *ptr = &(lb->data[lb->read_ptr]);
return n; return n;
} }
void sdlog2_logbuffer_mark_read(struct sdlog2_logbuffer *lb, int n) void logbuffer_mark_read(struct logbuffer_s *lb, int n)
{ {
lb->read_ptr = (lb->read_ptr + n) % lb->size; lb->read_ptr = (lb->read_ptr + n) % lb->size;
} }
@@ -33,9 +33,9 @@
****************************************************************************/ ****************************************************************************/
/** /**
* @file sdlog2_ringbuffer.h * @file logbuffer.h
* *
* Ring FIFO buffer for binary data. * Ring FIFO buffer for binary log data.
* *
* @author Anton Babushkin <rk3dov@gmail.com> * @author Anton Babushkin <rk3dov@gmail.com>
*/ */
@@ -43,7 +43,9 @@
#ifndef SDLOG2_RINGBUFFER_H_ #ifndef SDLOG2_RINGBUFFER_H_
#define SDLOG2_RINGBUFFER_H_ #define SDLOG2_RINGBUFFER_H_
struct sdlog2_logbuffer { #include <stdbool.h>
struct logbuffer_s {
// all pointers are in bytes // all pointers are in bytes
int write_ptr; int write_ptr;
int read_ptr; int read_ptr;
@@ -51,18 +53,18 @@ struct sdlog2_logbuffer {
char *data; char *data;
}; };
void sdlog2_logbuffer_init(struct sdlog2_logbuffer *lb, int size); void logbuffer_init(struct logbuffer_s *lb, int size);
int sdlog2_logbuffer_free(struct sdlog2_logbuffer *lb); int logbuffer_free(struct logbuffer_s *lb);
int sdlog2_logbuffer_count(struct sdlog2_logbuffer *lb); int logbuffer_count(struct logbuffer_s *lb);
int sdlog2_logbuffer_is_empty(struct sdlog2_logbuffer *lb); int logbuffer_is_empty(struct logbuffer_s *lb);
void sdlog2_logbuffer_write(struct sdlog2_logbuffer *lb, void *ptr, int size); bool logbuffer_write(struct logbuffer_s *lb, void *ptr, int size);
int sdlog2_logbuffer_get_ptr(struct sdlog2_logbuffer *lb, void **ptr); int logbuffer_get_ptr(struct logbuffer_s *lb, void **ptr, bool *is_part);
void sdlog2_logbuffer_mark_read(struct sdlog2_logbuffer *lb, int n); void logbuffer_mark_read(struct logbuffer_s *lb, int n);
#endif #endif
+1 -1
View File
@@ -40,4 +40,4 @@ MODULE_COMMAND = sdlog2
MODULE_PRIORITY = "SCHED_PRIORITY_MAX-30" MODULE_PRIORITY = "SCHED_PRIORITY_MAX-30"
SRCS = sdlog2.c \ SRCS = sdlog2.c \
sdlog2_ringbuffer.c logbuffer.c
File diff suppressed because it is too large Load Diff