void * producer_proc(void *arg) { struct ringbuffer *ring_buf = (struct ringbuffer *)arg; char i; i = 0; while(1) { printf("******************************************\n"); printf("put datas to ring buffer.\n"); if (ringbuffer_is_full(ring_buf)) { printf("buffer is full !\n"); sleep(1); continue; } ringbuffer_put(ring_buf, &i, sizeof(i)); i++; printf("ring buffer length: %u\n", ringbuffer_len(ring_buf)); printf("******************************************\n"); sleep(1); } }
int ringbuffer_put(RINGBUFFER_T *buffer, char character) { //is there space in the buffer? int bufferMask = (buffer->size - 1); if ( ((buffer->write_pos + 1) & bufferMask) != (buffer->read_pos & bufferMask)) { //wrap around write position buffer->write_pos &= bufferMask; //write the character buffer->memory[buffer->write_pos++] = character; //update size info return ringbuffer_len(buffer); } else { return BUFFER_OVERFLOW; } }
void * consumer_proc(void *arg) { unsigned int cnt; struct ringbuffer *ring_buf = (struct ringbuffer *)arg; cnt = 0; while(1) { sleep(2); printf("------------------------------------------\n"); printf("get data from ring buffer.\n"); { char i; if (ringbuffer_is_empty(ring_buf)) { printf("buffer is empty !\n"); sleep(1); continue; } if (cnt !=0 && !(cnt % 16)) printf("\n"); ringbuffer_get(ring_buf, &i, sizeof(i)); printf("data is: %d \n", i); cnt++; } printf("ring buffer length: %u\n", ringbuffer_len(ring_buf)); printf("------------------------------------------\n"); } }
int getchar() { while(!ringbuffer_len(&ringbuffer)) _NOP(); return ringbuffer_get(&ringbuffer); }