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>
*/
@@ -43,9 +43,9 @@
#include <string.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->write_ptr = 0;
@@ -53,7 +53,7 @@ void sdlog2_logbuffer_init(struct sdlog2_logbuffer *lb, int 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;
@@ -64,7 +64,7 @@ int sdlog2_logbuffer_free(struct sdlog2_logbuffer *lb)
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;
@@ -75,12 +75,12 @@ int sdlog2_logbuffer_count(struct sdlog2_logbuffer *lb)
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;
}
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
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) {
// buffer overflow
return;
return false;
}
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
memcpy(&(lb->data[lb->write_ptr]), &(c[n]), p);
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
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) {
// read pointer is before write pointer, write all available bytes
n = available;
*is_part = false;
} else {
// read pointer is after write pointer, write bytes from read_ptr to end
n = lb->size - lb->read_ptr;
*is_part = true;
}
*ptr = &(lb->data[lb->read_ptr]);
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;
}
@@ -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>
*/
@@ -43,7 +43,9 @@
#ifndef SDLOG2_RINGBUFFER_H_
#define SDLOG2_RINGBUFFER_H_
struct sdlog2_logbuffer {
#include <stdbool.h>
struct logbuffer_s {
// all pointers are in bytes
int write_ptr;
int read_ptr;
@@ -51,18 +53,18 @@ struct sdlog2_logbuffer {
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
+1 -1
View File
@@ -40,4 +40,4 @@ MODULE_COMMAND = sdlog2
MODULE_PRIORITY = "SCHED_PRIORITY_MAX-30"
SRCS = sdlog2.c \
sdlog2_ringbuffer.c
logbuffer.c
File diff suppressed because it is too large Load Diff