1#ifndef RINGREMOTE_INCLUDED
2#define RINGREMOTE_INCLUDED
6#define MIN(a,b) ((a) > (b) ? (b) : (a))
8#define RING_BUFFER_DECLARED 0xDEC1A8ED
9#define RING_BUFFER_ALLOCATED 0xA10CA7ED
10#define RING_BUFFER_MEM_ERROR 0xDEADF00D
11#define RING_BUFFER_ERROR 0xBEDABEDA
12#define RING_BUFFER_OK 0x0
14#define EXIT_ON_TIMEOUT 1
15#define EXIT_ON_COMPLETED 0
16#define EXIT_ON_FULL_BUFFER 2
17#define EXIT_ON_EMPTY_BUFFER 2
21typedef void *(*t_memcpy)(
void *to,
int toIndex,
const void *from,
int fromIndex,
size_t size) ;
22typedef void *(*t_bytecpy)(
void *to,
int toIndex,
void const *from,
int fromIndex,
size_t size) ;
25 #define bytesizeof(T) (sizeof(T)<<2)
27 #define bytesizeof(T) sizeof(T)
30#if defined(_WIN32) && !defined(__GNUC__)
56 t_bytecpy push_memcpy;
68 int pad[16-3-5*
sizeof(t_bytecpy)/
sizeof(
int)];
76 C_RingBufferRemote(
size_t ringbuffer_addr, t_bytecpy push_memcopy, t_bytecpy pop_memcopy){
77 Init( ringbuffer_addr, push_memcopy, pop_memcopy);
81 pop_memcpy(&
head,0,(
const void*)
head_addr,0,bytesizeof(
size_t));
85 pop_memcpy(&
tail,0,(
const void*)
tail_addr,0,bytesizeof(
size_t));
95 bool Init(
size_t ringbuffer_addr, t_bytecpy push_memcopy, t_bytecpy pop_memcopy){
115 push_memcpy=push_memcopy;
116 pop_memcpy =pop_memcopy;
118 pop_memcpy(&
data_addr,0,(
void*)ringbuffer_addr,+0*bytesizeof(
size_t),bytesizeof(
size_t));
119 pop_memcpy(&
size, 0,(
void*)ringbuffer_addr,+1*bytesizeof(
size_t),bytesizeof(
size_t));
120 pop_memcpy(&
head_addr,0,(
void*)ringbuffer_addr,+4*bytesizeof(
size_t),bytesizeof(
size_t));
121 pop_memcpy(&
tail_addr,0,(
void*)ringbuffer_addr,+5*bytesizeof(
size_t),bytesizeof(
size_t));
122 pop_memcpy(&
id, 0,(
void*)ringbuffer_addr,+6*bytesizeof(
size_t),bytesizeof(
size_t));
132 push_memcpy((
void*)ringbuffer_addr,+6*bytesizeof(
size_t),&
id,0,bytesizeof(
size_t));
134 pop_memcpy(&
id, 0,(
void*)ringbuffer_addr,+6*bytesizeof(
size_t),bytesizeof(
size_t));
141 if (
head==0xCCCCCCCC ||
tail==0xCCCCCCCC)
149 __INLINE__
bool IsFull(){
154 __INLINE__
bool IsEmpty(){
159 __INLINE__
size_t GetWriteAvail(){
164 __INLINE__
size_t GetReadAvail(){
186 bool Push(
int numElements){
189 size_t h=
head+numElements;
191 return RING_BUFFER_ERROR;
193 return RING_BUFFER_OK;
196 bool Pop(
int numElements){
199 size_t t=
tail+numElements;
201 return RING_BUFFER_ERROR;
203 return RING_BUFFER_OK;
207 size_t Push(T* pSrcElements,
size_t numElements,
int ExitMode= EXIT_ON_COMPLETED)
210 size_t initHead=
head;
223 else if (posHead<posTail)
224 diff=posTail-posHead;
225 else if (ExitMode&EXIT_ON_FULL_BUFFER)
226 return (
head-initHead);
227 else if (ExitMode&EXIT_ON_TIMEOUT){
228 if ((clock()-t0)>timeout*(CLOCKS_PER_SEC/1000))
229 return (
head-initHead);
237 count=MIN(numElements,diff);
238 if (push_memcpy((
void*)
data_addr,posHead*bytesizeof(T),pSrcElements,posSrc*bytesizeof(T),count*bytesizeof(T))){
247 return (
head-initHead);
302 size_t Pop(T* pDstElements,
size_t numElements,
int ExitMode= EXIT_ON_COMPLETED)
305 size_t initTail=
tail;
315 if (posTail<posHead )
316 diff=posHead-posTail;
317 else if (posHead<=posTail &&
head!=
tail)
319 else if (ExitMode&EXIT_ON_EMPTY_BUFFER)
320 return (
tail-initTail);
321 else if (ExitMode&EXIT_ON_TIMEOUT){
322 if ((clock()-t0)>timeout)
323 return (
tail-initTail);
331 count=MIN(numElements,diff);
332 pop_memcpy(pDstElements,posDst*bytesizeof(T),(
const void*)(
data_addr),posTail*bytesizeof(T),count*bytesizeof(T));
338 return (
tail-initTail);
341 size_t View(T* pDstElements,
size_t numElements,
int ExitMode= EXIT_ON_COMPLETED)
344 size_t initTail=
tail;
354 if (posTail<posHead )
355 diff=posHead-posTail;
356 else if (posHead<=posTail &&
head!=
tail)
358 else if (ExitMode&EXIT_ON_EMPTY_BUFFER){
359 size_t ret=
tail-initTail;
363 else if (ExitMode&EXIT_ON_TIMEOUT){
364 if ((clock()-t0)>timeout){
365 size_t ret=
tail-initTail;
376 count=MIN(numElements,diff);
377 pop_memcpy(pDstElements,posDst*bytesizeof(T),(
const void*)
data_addr,posTail*bytesizeof(T),count*bytesizeof(T));
383 size_t ret=
tail-initTail;
Definition: ringremote.h:39
size_t head
сколько элементов ОТ НАЧАЛА ПОТОКА код MASTER уже записал в буфер входных данных [заполняется MASTER]
Definition: ringremote.h:50
size_t tail
сколько элементов ОТ НАЧАЛА ПОТОКА код SLAVE уже прочитал (обработал) [заполняется SLAVE]
Definition: ringremote.h:51
size_t data_addr
физический адрес кольцевого буфера входных данных
Definition: ringremote.h:45
size_t head_addr
сколько элементов ОТ НАЧАЛА ПОТОКА код MASTER уже записал в буфер входных данных [заполняется MASTER]
Definition: ringremote.h:46
size_t id
сколько элементов ОТ НАЧАЛА ПОТОКА код SLAVE уже прочитал (обработал) [заполняется SLAVE]
Definition: ringremote.h:52
size_t size
размер кольцевого буфера входных данных (в элементах; гарантируется что это степень двойки)
Definition: ringremote.h:49
int pad[16-3-5 *sizeof(t_bytecpy)/sizeof(int)]
резервные поля
Definition: ringremote.h:68
size_t tail_addr
сколько элементов ОТ НАЧАЛА ПОТОКА код SLAVE уже прочитал (обработал) [заполняется SLAVE]
Definition: ringremote.h:47