[29bbef0] | 1 | #include <pthread.h> |
---|
| 2 | #include <semaphore.h> |
---|
[ead9478] | 3 | #include "../libtrace.h" |
---|
[29bbef0] | 4 | |
---|
[d6a56b6] | 5 | #ifndef LIBTRACE_RINGBUFFER_H |
---|
| 6 | #define LIBTRACE_RINGBUFFER_H |
---|
[29bbef0] | 7 | |
---|
| 8 | #define LIBTRACE_RINGBUFFER_BLOCKING 0 |
---|
| 9 | #define LIBTRACE_RINGBUFFER_POLLING 1 |
---|
| 10 | |
---|
| 11 | // All of start, elements and end must be accessed in the listed order |
---|
| 12 | // if LIBTRACE_RINGBUFFER_POLLING is to work. |
---|
| 13 | typedef struct libtrace_ringbuffer { |
---|
[ead9478] | 14 | volatile size_t start; |
---|
| 15 | size_t size; |
---|
[29bbef0] | 16 | int mode; |
---|
| 17 | void *volatile*elements; |
---|
| 18 | pthread_mutex_t wlock; |
---|
| 19 | pthread_mutex_t rlock; |
---|
| 20 | pthread_spinlock_t swlock; |
---|
| 21 | pthread_spinlock_t srlock; |
---|
[a49a9eb] | 22 | // We need to ensure that broadcasts dont get lost hence |
---|
| 23 | // these locks below |
---|
| 24 | // We avoid using semaphores since they don't allow |
---|
| 25 | // multiple releases. |
---|
| 26 | pthread_mutex_t empty_lock; |
---|
| 27 | pthread_mutex_t full_lock; |
---|
| 28 | pthread_cond_t empty_cond; // Signal when empties are ready |
---|
| 29 | pthread_cond_t full_cond; // Signal when fulls are ready |
---|
[29bbef0] | 30 | // Aim to get this on a separate cache line to start - important if spinning |
---|
[ead9478] | 31 | volatile size_t end; |
---|
[29bbef0] | 32 | } libtrace_ringbuffer_t; |
---|
| 33 | |
---|
[04bf7c5] | 34 | DLLEXPORT int libtrace_ringbuffer_init(libtrace_ringbuffer_t * rb, size_t size, int mode); |
---|
[ead9478] | 35 | DLLEXPORT void libtrace_zero_ringbuffer(libtrace_ringbuffer_t * rb); |
---|
| 36 | DLLEXPORT void libtrace_ringbuffer_destroy(libtrace_ringbuffer_t * rb); |
---|
| 37 | DLLEXPORT int libtrace_ringbuffer_is_empty(const libtrace_ringbuffer_t * rb); |
---|
| 38 | DLLEXPORT int libtrace_ringbuffer_is_full(const libtrace_ringbuffer_t * rb); |
---|
[29bbef0] | 39 | |
---|
[ead9478] | 40 | DLLEXPORT void libtrace_ringbuffer_write(libtrace_ringbuffer_t * rb, void* value); |
---|
| 41 | DLLEXPORT int libtrace_ringbuffer_try_write(libtrace_ringbuffer_t * rb, void* value); |
---|
| 42 | DLLEXPORT void libtrace_ringbuffer_swrite(libtrace_ringbuffer_t * rb, void* value); |
---|
| 43 | DLLEXPORT int libtrace_ringbuffer_try_swrite(libtrace_ringbuffer_t * rb, void* value); |
---|
| 44 | DLLEXPORT int libtrace_ringbuffer_try_swrite_bl(libtrace_ringbuffer_t * rb, void* value); |
---|
[29bbef0] | 45 | |
---|
[ead9478] | 46 | DLLEXPORT void* libtrace_ringbuffer_read(libtrace_ringbuffer_t *rb) ; |
---|
| 47 | DLLEXPORT int libtrace_ringbuffer_try_read(libtrace_ringbuffer_t *rb, void ** value); |
---|
| 48 | DLLEXPORT void * libtrace_ringbuffer_sread(libtrace_ringbuffer_t *rb); |
---|
| 49 | DLLEXPORT int libtrace_ringbuffer_try_sread(libtrace_ringbuffer_t *rb, void ** value); |
---|
| 50 | DLLEXPORT int libtrace_ringbuffer_try_sread_bl(libtrace_ringbuffer_t *rb, void ** value); |
---|
[29bbef0] | 51 | |
---|
[a49a9eb] | 52 | |
---|
| 53 | |
---|
| 54 | DLLEXPORT size_t libtrace_ringbuffer_write_bulk(libtrace_ringbuffer_t *rb, void *values[], size_t nb_buffers, size_t min_nb_buffers); |
---|
| 55 | DLLEXPORT size_t libtrace_ringbuffer_read_bulk(libtrace_ringbuffer_t *rb, void *values[], size_t nb_buffers, size_t min_nb_buffers); |
---|
| 56 | DLLEXPORT size_t libtrace_ringbuffer_sread_bulk(libtrace_ringbuffer_t *rb, void *values[], size_t nb_buffers, size_t min_nb_buffers); |
---|
| 57 | DLLEXPORT size_t libtrace_ringbuffer_swrite_bulk(libtrace_ringbuffer_t *rb, void *values[], size_t nb_buffers, size_t min_nb_buffers); |
---|
| 58 | |
---|
[29bbef0] | 59 | #endif |
---|