MemBuffer: add expansion call

For some of the buffer users it's hard to predict how big the data
will be. In the stats.log case this depends on chosen runmode and
number of threads.

To deal with this case a 'MemBufferExpand' call is added. This realloc's
the buffer.
pull/1234/head
Victor Julien 10 years ago
parent 75397ed750
commit 6277d2e0e4

@ -51,6 +51,34 @@ MemBuffer *MemBufferCreateNew(uint32_t size)
return buffer;
}
/** \brief expand membuffer by size of 'expand_by'
*
* If expansion failed, buffer will still be valid.
*
* \retval result 0 ok, -1 expansion failed
*/
int MemBufferExpand(MemBuffer **buffer, uint32_t expand_by) {
if (((*buffer)->size + expand_by) > MAX_LIMIT) {
SCLogWarning(SC_ERR_MEM_BUFFER_API, "Mem buffer asked to create "
"buffer with size greater than API limit - %d", MAX_LIMIT);
return -1;
}
uint32_t total_size = (*buffer)->size + sizeof(MemBuffer) + expand_by;
MemBuffer *tbuffer = SCRealloc(*buffer, total_size);
if (unlikely(tbuffer == NULL)) {
return -1;
}
*buffer = tbuffer;
(*buffer)->size += expand_by;
(*buffer)->buffer = (uint8_t *)tbuffer + sizeof(MemBuffer);
SCLogDebug("expanded buffer by %u, size is now %u", expand_by, (*buffer)->size);
return 0;
}
void MemBufferFree(MemBuffer *buffer)
{
SCFree(buffer);

@ -31,6 +31,7 @@ typedef struct MemBuffer_ {
} MemBuffer;
MemBuffer *MemBufferCreateNew(uint32_t size);
int MemBufferExpand(MemBuffer **buffer, uint32_t expand_by);
void MemBufferFree(MemBuffer *buffer);
/**
@ -53,6 +54,11 @@ void MemBufferFree(MemBuffer *buffer);
*/
#define MEMBUFFER_OFFSET(mem_buffer) (mem_buffer)->offset
/**
* \brief Get the MemBuffers current size.
*/
#define MEMBUFFER_SIZE(mem_buffer) (mem_buffer)->size
/**
* \brief Write a buffer to the file pointer.
*

Loading…
Cancel
Save