[29bbef0] | 1 | #include <pthread.h> |
---|
| 2 | #include <semaphore.h> |
---|
| 3 | |
---|
[d6a56b6] | 4 | #ifndef LIBTRACE_RINGBUFFER_H |
---|
| 5 | #define LIBTRACE_RINGBUFFER_H |
---|
[29bbef0] | 6 | |
---|
| 7 | #define LIBTRACE_RINGBUFFER_BLOCKING 0 |
---|
| 8 | #define LIBTRACE_RINGBUFFER_POLLING 1 |
---|
| 9 | |
---|
| 10 | // All of start, elements and end must be accessed in the listed order |
---|
| 11 | // if LIBTRACE_RINGBUFFER_POLLING is to work. |
---|
| 12 | typedef struct libtrace_ringbuffer { |
---|
| 13 | volatile int start; |
---|
| 14 | int size; |
---|
| 15 | int mode; |
---|
| 16 | void *volatile*elements; |
---|
| 17 | pthread_mutex_t wlock; |
---|
| 18 | pthread_mutex_t rlock; |
---|
| 19 | pthread_spinlock_t swlock; |
---|
| 20 | pthread_spinlock_t srlock; |
---|
| 21 | sem_t semrlock; |
---|
| 22 | sem_t semwlock; |
---|
| 23 | sem_t emptys; |
---|
| 24 | sem_t fulls; |
---|
| 25 | // Aim to get this on a separate cache line to start - important if spinning |
---|
| 26 | volatile int end; |
---|
| 27 | |
---|
| 28 | } libtrace_ringbuffer_t; |
---|
| 29 | |
---|
| 30 | void libtrace_ringbuffer_init(libtrace_ringbuffer_t * rb, int size, int mode); |
---|
| 31 | inline void libtrace_zero_ringbuffer(libtrace_ringbuffer_t * rb); |
---|
| 32 | void libtrace_ringbuffer_destroy(libtrace_ringbuffer_t * rb); |
---|
| 33 | int libtrace_ringbuffer_is_empty(const libtrace_ringbuffer_t * rb); |
---|
| 34 | int libtrace_ringbuffer_is_full(const libtrace_ringbuffer_t * rb); |
---|
| 35 | |
---|
| 36 | void libtrace_ringbuffer_write(libtrace_ringbuffer_t * rb, void* value); |
---|
| 37 | int libtrace_ringbuffer_try_write(libtrace_ringbuffer_t * rb, void* value); |
---|
| 38 | void libtrace_ringbuffer_swrite(libtrace_ringbuffer_t * rb, void* value); |
---|
| 39 | int libtrace_ringbuffer_try_swrite(libtrace_ringbuffer_t * rb, void* value); |
---|
| 40 | int libtrace_ringbuffer_try_swrite_bl(libtrace_ringbuffer_t * rb, void* value); |
---|
| 41 | |
---|
| 42 | void* libtrace_ringbuffer_read(libtrace_ringbuffer_t *rb) ; |
---|
| 43 | int libtrace_ringbuffer_try_read(libtrace_ringbuffer_t *rb, void ** value); |
---|
| 44 | void * libtrace_ringbuffer_sread(libtrace_ringbuffer_t *rb); |
---|
| 45 | int libtrace_ringbuffer_try_sread(libtrace_ringbuffer_t *rb, void ** value); |
---|
| 46 | int libtrace_ringbuffer_try_sread_bl(libtrace_ringbuffer_t *rb, void ** value); |
---|
| 47 | |
---|
| 48 | #endif |
---|