#include <stdint.h>
#include <unistd.h> 


typedef struct {
    int targetId;        //target thread id
    int sourceId;        //source thread id
    int readIdx;         //read index ringbuffer
    int lastReadIdx;     //read index multiple read
    int writeIdx;        //write index ringbuffer
    size_t buffsize;     //buffersize
    uint8_t  *buffer;    //pointer to buffer
} rb_handle_t;


//return:
//pointer to handle if successful,
//else NULL
extern rb_handle_t *initRb (int targetId,
			    int sourceId,
			    size_t buffsize);

//return:
//  1: successful
// -1: parameters invalid, wrong target/source id
// -2: not enough space left
extern int writeRb (rb_handle_t *h,
			int targetId,
			int sourceId,
			const void *item,
			size_t itemsize);

//return:
//-2: parameters invalid, wrong target/source id
//-1: part of item read, but not complete (another read necessary)
// 0: empty buffer, nothing to read
// 2: sucessful
// *itemsize: actually read number of bytes
extern int readRb (rb_handle_t *h,
		       int targetId,
		       int sourceId,
		       void *item,
		       size_t *itemsize);

//return:
// 1: successful
extern int freeRb (rb_handle_t *h);

