Merge different ringbuffer structures.

remotes/origin/master-1.0.x
Victor Julien 17 years ago
parent 012e602c3f
commit 167c0295af

@ -33,7 +33,7 @@
#include "util-ringbuffer.h" #include "util-ringbuffer.h"
static RingBufferMrMw8 *ringbuffers[256]; static RingBuffer8 *ringbuffers[256];
Packet *TmqhInputRingBuffer(ThreadVars *t); Packet *TmqhInputRingBuffer(ThreadVars *t);
void TmqhOutputRingBuffer(ThreadVars *t, Packet *p); void TmqhOutputRingBuffer(ThreadVars *t, Packet *p);
@ -55,7 +55,7 @@ void TmqhRingBufferRegister (void) {
Packet *TmqhInputRingBuffer(ThreadVars *t) Packet *TmqhInputRingBuffer(ThreadVars *t)
{ {
RingBufferMrMw8 *rb = ringbuffers[t->inq->id]; RingBuffer8 *rb = ringbuffers[t->inq->id];
Packet *p = (Packet *)RingBufferMrMw8Get(rb); Packet *p = (Packet *)RingBufferMrMw8Get(rb);
@ -70,7 +70,7 @@ void TmqhInputRingBufferShutdownHandler(ThreadVars *tv) {
return; return;
} }
RingBufferMrMw8 *rb = ringbuffers[tv->inq->id]; RingBuffer8 *rb = ringbuffers[tv->inq->id];
if (rb == NULL) { if (rb == NULL) {
return; return;
} }
@ -80,7 +80,7 @@ void TmqhInputRingBufferShutdownHandler(ThreadVars *tv) {
void TmqhOutputRingBuffer(ThreadVars *t, Packet *p) void TmqhOutputRingBuffer(ThreadVars *t, Packet *p)
{ {
RingBufferMrMw8 *rb = ringbuffers[t->outq->id]; RingBuffer8 *rb = ringbuffers[t->outq->id];
RingBufferMrMw8Put(rb, (void *)p); RingBufferMrMw8Put(rb, (void *)p);
} }

@ -42,13 +42,13 @@
/* Multi Reader, Single Writer, 8 bits */ /* Multi Reader, Single Writer, 8 bits */
RingBufferMrSw8 *RingBufferMrSw8Init(void) { RingBuffer8 *RingBufferMrSw8Init(void) {
RingBufferMrSw8 *rb = SCMalloc(sizeof(RingBufferMrSw8)); RingBuffer8 *rb = SCMalloc(sizeof(RingBuffer8));
if (rb == NULL) { if (rb == NULL) {
return NULL; return NULL;
} }
memset(rb, 0x00, sizeof(RingBufferMrSw8)); memset(rb, 0x00, sizeof(RingBuffer8));
SC_ATOMIC_INIT(rb->write); SC_ATOMIC_INIT(rb->write);
SC_ATOMIC_INIT(rb->read); SC_ATOMIC_INIT(rb->read);
@ -56,7 +56,7 @@ RingBufferMrSw8 *RingBufferMrSw8Init(void) {
return rb; return rb;
} }
void RingBufferMrSw8Destroy(RingBufferMrSw8 *rb) { void RingBufferMrSw8Destroy(RingBuffer8 *rb) {
if (rb != NULL) { if (rb != NULL) {
SC_ATOMIC_DESTROY(rb->write); SC_ATOMIC_DESTROY(rb->write);
SC_ATOMIC_DESTROY(rb->read); SC_ATOMIC_DESTROY(rb->read);
@ -72,7 +72,7 @@ void RingBufferMrSw8Destroy(RingBufferMrSw8 *rb) {
* that the threads don't interfere with one another. * that the threads don't interfere with one another.
* *
*/ */
void *RingBufferMrSw8Get(RingBufferMrSw8 *rb) { void *RingBufferMrSw8Get(RingBuffer8 *rb) {
void *ptr; void *ptr;
/** local pointer for data races. If SCAtomicCompareAndSwap (CAS) /** local pointer for data races. If SCAtomicCompareAndSwap (CAS)
* fails we increase our local array idx to try the next array member * fails we increase our local array idx to try the next array member
@ -109,7 +109,7 @@ retry:
/** /**
* \brief put a ptr in the RingBuffer * \brief put a ptr in the RingBuffer
*/ */
int RingBufferMrSw8Put(RingBufferMrSw8 *rb, void *ptr) { int RingBufferMrSw8Put(RingBuffer8 *rb, void *ptr) {
SCLogDebug("ptr %p", ptr); SCLogDebug("ptr %p", ptr);
/* buffer is full, wait... */ /* buffer is full, wait... */
@ -129,13 +129,13 @@ int RingBufferMrSw8Put(RingBufferMrSw8 *rb, void *ptr) {
/* Multi Reader, Single Writer */ /* Multi Reader, Single Writer */
RingBufferMrSw *RingBufferMrSwInit(void) { RingBuffer16 *RingBufferMrSwInit(void) {
RingBufferMrSw *rb = SCMalloc(sizeof(RingBufferMrSw)); RingBuffer16 *rb = SCMalloc(sizeof(RingBuffer16));
if (rb == NULL) { if (rb == NULL) {
return NULL; return NULL;
} }
memset(rb, 0x00, sizeof(RingBufferMrSw)); memset(rb, 0x00, sizeof(RingBuffer16));
SC_ATOMIC_INIT(rb->write); SC_ATOMIC_INIT(rb->write);
SC_ATOMIC_INIT(rb->read); SC_ATOMIC_INIT(rb->read);
@ -143,7 +143,7 @@ RingBufferMrSw *RingBufferMrSwInit(void) {
return rb; return rb;
} }
void RingBufferMrSwDestroy(RingBufferMrSw *rb) { void RingBufferMrSwDestroy(RingBuffer16 *rb) {
if (rb != NULL) { if (rb != NULL) {
SC_ATOMIC_DESTROY(rb->write); SC_ATOMIC_DESTROY(rb->write);
SC_ATOMIC_DESTROY(rb->read); SC_ATOMIC_DESTROY(rb->read);
@ -159,7 +159,7 @@ void RingBufferMrSwDestroy(RingBufferMrSw *rb) {
* that the threads don't interfere with one another. * that the threads don't interfere with one another.
* *
*/ */
void *RingBufferMrSwGet(RingBufferMrSw *rb) { void *RingBufferMrSwGet(RingBuffer16 *rb) {
void *ptr; void *ptr;
/** local pointer for data races. If SCAtomicCompareAndSwap (CAS) /** local pointer for data races. If SCAtomicCompareAndSwap (CAS)
* fails we increase our local array idx to try the next array member * fails we increase our local array idx to try the next array member
@ -196,7 +196,7 @@ retry:
/** /**
* \brief put a ptr in the RingBuffer * \brief put a ptr in the RingBuffer
*/ */
int RingBufferMrSwPut(RingBufferMrSw *rb, void *ptr) { int RingBufferMrSwPut(RingBuffer16 *rb, void *ptr) {
SCLogDebug("ptr %p", ptr); SCLogDebug("ptr %p", ptr);
/* buffer is full, wait... */ /* buffer is full, wait... */
@ -216,13 +216,13 @@ int RingBufferMrSwPut(RingBufferMrSw *rb, void *ptr) {
/* Single Reader, Single Writer */ /* Single Reader, Single Writer */
RingBufferSrSw *RingBufferSrSwInit(void) { RingBuffer16 *RingBufferSrSwInit(void) {
RingBufferSrSw *rb = SCMalloc(sizeof(RingBufferSrSw)); RingBuffer16 *rb = SCMalloc(sizeof(RingBuffer16));
if (rb == NULL) { if (rb == NULL) {
return NULL; return NULL;
} }
memset(rb, 0x00, sizeof(RingBufferSrSw)); memset(rb, 0x00, sizeof(RingBuffer16));
SC_ATOMIC_INIT(rb->write); SC_ATOMIC_INIT(rb->write);
SC_ATOMIC_INIT(rb->read); SC_ATOMIC_INIT(rb->read);
@ -230,7 +230,7 @@ RingBufferSrSw *RingBufferSrSwInit(void) {
return rb; return rb;
} }
void RingBufferSrSwDestroy(RingBufferSrSw *rb) { void RingBufferSrSwDestroy(RingBuffer16 *rb) {
if (rb != NULL) { if (rb != NULL) {
SC_ATOMIC_DESTROY(rb->write); SC_ATOMIC_DESTROY(rb->write);
SC_ATOMIC_DESTROY(rb->read); SC_ATOMIC_DESTROY(rb->read);
@ -239,7 +239,7 @@ void RingBufferSrSwDestroy(RingBufferSrSw *rb) {
} }
} }
void *RingBufferSrSwGet(RingBufferSrSw *rb) { void *RingBufferSrSwGet(RingBuffer16 *rb) {
void *ptr = NULL; void *ptr = NULL;
/* buffer is empty, wait... */ /* buffer is empty, wait... */
@ -257,7 +257,7 @@ void *RingBufferSrSwGet(RingBufferSrSw *rb) {
return ptr; return ptr;
} }
int RingBufferSrSwPut(RingBufferSrSw *rb, void *ptr) { int RingBufferSrSwPut(RingBuffer16 *rb, void *ptr) {
/* buffer is full, wait... */ /* buffer is full, wait... */
while ((unsigned short)(SC_ATOMIC_GET(rb->write) + 1) == SC_ATOMIC_GET(rb->read)) { while ((unsigned short)(SC_ATOMIC_GET(rb->write) + 1) == SC_ATOMIC_GET(rb->read)) {
/* break out if the engine wants to shutdown */ /* break out if the engine wants to shutdown */
@ -274,13 +274,13 @@ int RingBufferSrSwPut(RingBufferSrSw *rb, void *ptr) {
/* Multi Reader, Multi Writer, 8 bits */ /* Multi Reader, Multi Writer, 8 bits */
RingBufferMrMw8 *RingBufferMrMw8Init(void) { RingBuffer8 *RingBufferMrMw8Init(void) {
RingBufferMrMw8 *rb = SCMalloc(sizeof(RingBufferMrMw8)); RingBuffer8 *rb = SCMalloc(sizeof(RingBuffer8));
if (rb == NULL) { if (rb == NULL) {
return NULL; return NULL;
} }
memset(rb, 0x00, sizeof(RingBufferMrMw8)); memset(rb, 0x00, sizeof(RingBuffer8));
SC_ATOMIC_INIT(rb->write); SC_ATOMIC_INIT(rb->write);
SC_ATOMIC_INIT(rb->read); SC_ATOMIC_INIT(rb->read);
@ -289,7 +289,7 @@ RingBufferMrMw8 *RingBufferMrMw8Init(void) {
return rb; return rb;
} }
void RingBufferMrMw8Destroy(RingBufferMrMw8 *rb) { void RingBufferMrMw8Destroy(RingBuffer8 *rb) {
if (rb != NULL) { if (rb != NULL) {
SC_ATOMIC_DESTROY(rb->write); SC_ATOMIC_DESTROY(rb->write);
SC_ATOMIC_DESTROY(rb->read); SC_ATOMIC_DESTROY(rb->read);
@ -306,7 +306,7 @@ void RingBufferMrMw8Destroy(RingBufferMrMw8 *rb) {
* that the threads don't interfere with one another. * that the threads don't interfere with one another.
* *
*/ */
void *RingBufferMrMw8Get(RingBufferMrMw8 *rb) { void *RingBufferMrMw8Get(RingBuffer8 *rb) {
void *ptr; void *ptr;
/** local pointer for data races. If SCAtomicCompareAndSwap (CAS) /** local pointer for data races. If SCAtomicCompareAndSwap (CAS)
* fails we increase our local array idx to try the next array member * fails we increase our local array idx to try the next array member
@ -358,7 +358,7 @@ retry:
* \retval 0 ok * \retval 0 ok
* \retval -1 wait loop interrupted because of engine flags * \retval -1 wait loop interrupted because of engine flags
*/ */
int RingBufferMrMw8Put(RingBufferMrMw8 *rb, void *ptr) { int RingBufferMrMw8Put(RingBuffer8 *rb, void *ptr) {
SCLogDebug("ptr %p", ptr); SCLogDebug("ptr %p", ptr);
/* buffer is full, wait... */ /* buffer is full, wait... */
@ -391,13 +391,13 @@ retry:
/* Multi Reader, Multi Writer, 16 bits */ /* Multi Reader, Multi Writer, 16 bits */
RingBufferMrMw *RingBufferMrMwInit(void) { RingBuffer16 *RingBufferMrMwInit(void) {
RingBufferMrMw *rb = SCMalloc(sizeof(RingBufferMrMw)); RingBuffer16 *rb = SCMalloc(sizeof(RingBuffer16));
if (rb == NULL) { if (rb == NULL) {
return NULL; return NULL;
} }
memset(rb, 0x00, sizeof(RingBufferMrMw)); memset(rb, 0x00, sizeof(RingBuffer16));
SC_ATOMIC_INIT(rb->write); SC_ATOMIC_INIT(rb->write);
SC_ATOMIC_INIT(rb->read); SC_ATOMIC_INIT(rb->read);
@ -406,7 +406,7 @@ RingBufferMrMw *RingBufferMrMwInit(void) {
return rb; return rb;
} }
void RingBufferMrMwDestroy(RingBufferMrMw *rb) { void RingBufferMrMwDestroy(RingBuffer16 *rb) {
if (rb != NULL) { if (rb != NULL) {
SC_ATOMIC_DESTROY(rb->write); SC_ATOMIC_DESTROY(rb->write);
SC_ATOMIC_DESTROY(rb->read); SC_ATOMIC_DESTROY(rb->read);
@ -423,7 +423,7 @@ void RingBufferMrMwDestroy(RingBufferMrMw *rb) {
* that the threads don't interfere with one another. * that the threads don't interfere with one another.
* *
*/ */
void *RingBufferMrMwGet(RingBufferMrMw *rb) { void *RingBufferMrMwGet(RingBuffer16 *rb) {
void *ptr; void *ptr;
/** local pointer for data races. If SCAtomicCompareAndSwap (CAS) /** local pointer for data races. If SCAtomicCompareAndSwap (CAS)
* fails we increase our local array idx to try the next array member * fails we increase our local array idx to try the next array member
@ -475,7 +475,7 @@ retry:
* \retval 0 ok * \retval 0 ok
* \retval -1 wait loop interrupted because of engine flags * \retval -1 wait loop interrupted because of engine flags
*/ */
int RingBufferMrMwPut(RingBufferMrMw *rb, void *ptr) { int RingBufferMrMwPut(RingBuffer16 *rb, void *ptr) {
SCLogDebug("ptr %p", ptr); SCLogDebug("ptr %p", ptr);
/* buffer is full, wait... */ /* buffer is full, wait... */

@ -33,92 +33,64 @@
* read and write pointer. Only the read ptr needs atomic updating. * read and write pointer. Only the read ptr needs atomic updating.
*/ */
#define RING_BUFFER_MRSW_8_SIZE 256 #define RING_BUFFER_8_SIZE 256
typedef struct RingBuffer8_ {
/** Multiple Reader, Single Writer ring buffer, fixed at
* 256 items so we can use unsigned char's that just
* wrap around */
typedef struct RingBufferMrSw8_ {
SC_ATOMIC_DECLARE(unsigned char, write); /**< idx where we put data */ SC_ATOMIC_DECLARE(unsigned char, write); /**< idx where we put data */
SC_ATOMIC_DECLARE(unsigned char, read); /**< idx where we read data */ SC_ATOMIC_DECLARE(unsigned char, read); /**< idx where we read data */
uint8_t shutdown; uint8_t shutdown;
void *array[RING_BUFFER_MRSW_8_SIZE]; SCSpinlock spin; /**< lock protecting writes for multi writer mode*/
} RingBufferMrSw8; void *array[RING_BUFFER_8_SIZE];
} RingBuffer8;
void *RingBufferMrSw8Get(RingBufferMrSw8 *); #define RING_BUFFER_16_SIZE 65536
int RingBufferMrSw8Put(RingBufferMrSw8 *, void *); typedef struct RingBuffer16_ {
RingBufferMrSw8 *RingBufferMrSw8Init(void);
void RingBufferMrSw8Destroy(RingBufferMrSw8 *);
#define RING_BUFFER_MRSW_SIZE 65536
/** Multiple Reader, Single Writer ring buffer, fixed at
* 65536 items so we can use unsigned shorts that just
* wrap around */
typedef struct RingBufferMrSw_ {
SC_ATOMIC_DECLARE(unsigned short, write); /**< idx where we put data */ SC_ATOMIC_DECLARE(unsigned short, write); /**< idx where we put data */
SC_ATOMIC_DECLARE(unsigned short, read); /**< idx where we read data */ SC_ATOMIC_DECLARE(unsigned short, read); /**< idx where we read data */
uint8_t shutdown; uint8_t shutdown;
void *array[RING_BUFFER_MRSW_SIZE]; SCSpinlock spin; /**< lock protecting writes for multi writer mode*/
} RingBufferMrSw; void *array[RING_BUFFER_16_SIZE];
} RingBuffer16;
void *RingBufferMrSwGet(RingBufferMrSw *);
int RingBufferMrSwPut(RingBufferMrSw *, void *);
RingBufferMrSw *RingBufferMrSwInit(void);
void RingBufferMrSwDestroy(RingBufferMrSw *);
#define RING_BUFFER_SRSW_SIZE 65536 /** Multiple Reader, Single Writer ring buffer, fixed at
* 256 items so we can use unsigned char's that just
* wrap around */
void *RingBufferMrSw8Get(RingBuffer8 *);
int RingBufferMrSw8Put(RingBuffer8 *, void *);
RingBuffer8 *RingBufferMrSw8Init(void);
void RingBufferMrSw8Destroy(RingBuffer8 *);
/** Single Reader, Single Writer ring buffer, fixed at /** Multiple Reader, Single Writer ring buffer, fixed at
* 65536 items so we can use unsigned shorts that just * 65536 items so we can use unsigned shorts that just
* wrap around */ * wrap around */
typedef struct RingBufferSrSw_ { void *RingBufferMrSwGet(RingBuffer16 *);
SC_ATOMIC_DECLARE(unsigned short, write); /**< idx where we put data */ int RingBufferMrSwPut(RingBuffer16 *, void *);
SC_ATOMIC_DECLARE(unsigned short, read); /**< idx where we read data */ RingBuffer16 *RingBufferMrSwInit(void);
uint8_t shutdown; void RingBufferMrSwDestroy(RingBuffer16 *);
void *array[RING_BUFFER_SRSW_SIZE];
} RingBufferSrSw;
void *RingBufferSrSwGet(RingBufferSrSw *); /** Single Reader, Single Writer ring buffer, fixed at
int RingBufferSrSwPut(RingBufferSrSw *, void *); * 65536 items so we can use unsigned shorts that just
RingBufferSrSw *RingBufferSrSwInit(void); * wrap around */
void RingBufferSrSwDestroy(RingBufferSrSw *); void *RingBufferSrSwGet(RingBuffer16 *);
int RingBufferSrSwPut(RingBuffer16 *, void *);
#define RING_BUFFER_MRMW_8_SIZE 256 RingBuffer16 *RingBufferSrSwInit(void);
void RingBufferSrSwDestroy(RingBuffer16 *);
/** Multiple Reader, Multi Writer ring buffer, fixed at /** Multiple Reader, Multi Writer ring buffer, fixed at
* 256 items so we can use unsigned char's that just * 256 items so we can use unsigned char's that just
* wrap around */ * wrap around */
typedef struct RingBufferMrMw8_ { void *RingBufferMrMw8Get(RingBuffer8 *);
SC_ATOMIC_DECLARE(unsigned char, write); /**< idx where we put data */ int RingBufferMrMw8Put(RingBuffer8 *, void *);
SC_ATOMIC_DECLARE(unsigned char, read); /**< idx where we read data */ RingBuffer8 *RingBufferMrMw8Init(void);
uint8_t shutdown; void RingBufferMrMw8Destroy(RingBuffer8 *);
SCSpinlock spin; /**< lock protecting writes */
void *array[RING_BUFFER_MRMW_8_SIZE];
} RingBufferMrMw8;
void *RingBufferMrMw8Get(RingBufferMrMw8 *);
int RingBufferMrMw8Put(RingBufferMrMw8 *, void *);
RingBufferMrMw8 *RingBufferMrMw8Init(void);
void RingBufferMrMw8Destroy(RingBufferMrMw8 *);
#define RING_BUFFER_MRMW_SIZE 65536
/** Multiple Reader, Multi Writer ring buffer, fixed at /** Multiple Reader, Multi Writer ring buffer, fixed at
* 65536 items so we can use unsigned char's that just * 65536 items so we can use unsigned char's that just
* wrap around */ * wrap around */
typedef struct RingBufferMrMw_ { void *RingBufferMrMwGet(RingBuffer16 *);
SC_ATOMIC_DECLARE(unsigned short, write); /**< idx where we put data */ int RingBufferMrMwPut(RingBuffer16 *, void *);
SC_ATOMIC_DECLARE(unsigned short, read); /**< idx where we read data */ RingBuffer16 *RingBufferMrMwInit(void);
uint8_t shutdown; void RingBufferMrMwDestroy(RingBuffer16 *);
SCSpinlock spin; /**< lock protecting writes */
void *array[RING_BUFFER_MRMW_SIZE];
} RingBufferMrMw;
void *RingBufferMrMwGet(RingBufferMrMw *);
int RingBufferMrMwPut(RingBufferMrMw *, void *);
RingBufferMrMw *RingBufferMrMwInit(void);
void RingBufferMrMwDestroy(RingBufferMrMw *);
#endif /* __UTIL_RINGBUFFER_H__ */ #endif /* __UTIL_RINGBUFFER_H__ */

Loading…
Cancel
Save