diff options
Diffstat (limited to 'cpukit/libmisc/capture/capture_buffer.c')
-rw-r--r-- | cpukit/libmisc/capture/capture_buffer.c | 117 |
1 files changed, 117 insertions, 0 deletions
diff --git a/cpukit/libmisc/capture/capture_buffer.c b/cpukit/libmisc/capture/capture_buffer.c new file mode 100644 index 0000000000..9557f70ba8 --- /dev/null +++ b/cpukit/libmisc/capture/capture_buffer.c @@ -0,0 +1,117 @@ +/* + ------------------------------------------------------------------------ + + COPYRIGHT (c) 2014. + On-Line Applications Research Corporation (OAR). + + The license and distribution terms for this file may be + found in the file LICENSE in this distribution. + + This software with is provided ``as is'' and with NO WARRANTY. + + ------------------------------------------------------------------------ + + RTEMS Performance Monitoring and Measurement Framework. + + This is the Target Interface Command Line Interface. You need + start the RTEMS monitor. + +*/ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include <rtems.h> +#include <rtems/score/assert.h> +#include "capture_buffer.h" + +void * rtems_capture_buffer_allocate( rtems_capture_buffer_t* buffer, size_t size ) +{ + static uint32_t end; + static void *ptr; + + if ( rtems_capture_buffer_is_full( buffer ) ) + return NULL; + + if ( (buffer->count + size) > buffer->end ) + return NULL; + + /* + * Determine if the end of free space is marked with + * the end of buffer space, or the head of allocated + * space. + * + * |...|head| freespace |tail| ...| end + * + * tail|.....|head| freespace| end + * + */ + if (buffer->tail > buffer->head) { + end = buffer->tail; + } else { + end = buffer->end; + } + + /* + * Can we allocate it easily? + */ + if ((buffer->head + size) <= end) { + ptr = &buffer->buffer[ buffer->head ]; + buffer->head += size; + buffer->count = buffer->count + size; + return ptr; + } + + /* + * We have to consider wrapping around to the front of the buffer + */ + + /* If there is not room at the end of the buffer */ + /* and we have we already wrapped then we can't allocate */ + if ( end == buffer->tail ) + return NULL; + + /* Is there no room at the front of the buffer */ + if ( (buffer->tail < size )) + return NULL; + + /* change the end pointer to the last used byte, so a read will wrap when out of data */ + buffer->end = buffer->head; + + /* now return the buffer */ + ptr = buffer->buffer; + buffer->head = size; + buffer->count = buffer->count + size; + + return ptr; +} + +void *rtems_capture_buffer_free( rtems_capture_buffer_t* buffer, size_t size ) +{ + static void *ptr; + static uint32_t next; + size_t buff_size; + + if (size == 0) + return NULL; + + ptr = rtems_capture_buffer_peek(buffer, &buff_size); + next = buffer->tail + size; + + /* Check if we are freeing space past the end of the buffer */ + _Assert( ! rtems_capture_buffer_is_empty( buffer ) ); + _Assert( !((buffer->tail > buffer->head) && (next > buffer->end)) ); + _Assert( !((buffer->tail < buffer->head) && (next > buffer->head)) ); + + buffer->count = buffer->count - size; + + if (next == buffer->end) { + buffer->end = buffer->size; + buffer->tail = 0; + } else { + buffer->tail = next; + } + + return ptr; +} |