static void circular_buffer_test(circular_buffer_t cb) { int i; test_t t; for (i = 0; i < 7; ++i) { memset(t.buf, 0, sizeof(t.buf)); t.index = i + 1; sprintf(t.buf, "the test buffer with id=>%d\n", t.index); t.len = strlen(t.buf); circular_buffer_put(cb, (const char*)&t, sizeof(t)); } fprintf(stdout, "size : %d\n", circular_buffer_size(cb)); fprintf(stdout, "circular buffer get=>%d\n", circular_buffer_get(cb, sizeof(t), (char*)&t)); fprintf(stdout, "size : %d\n", circular_buffer_size(cb)); test_show(t); for (i = 0; i < 1; ++i) { memset(t.buf, 0, sizeof(t.buf)); t.index = (i + 7) * (i + 7); sprintf(t.buf, "the test buffer with id=>%d\n", t.index); t.len = strlen(t.buf); circular_buffer_put(cb, (const char*)&t, sizeof(t)); } fprintf(stdout, "size : %d\n", circular_buffer_size(cb)); while (!circular_buffer_empty(cb)) { circular_buffer_get(cb, sizeof(t), (char*)&t); test_show(t); } fprintf(stdout, "size : %d\n", circular_buffer_size(cb)); }
size_t circular_buffer_read(circular_buffer_t* buffer, uint8_t* data, size_t size) { // Если в буфере нет данных, или размер данных равен 0 - возврат 0. if(buffer->count == 0 || size == 0) return 0; size_t n; for(n = 0; n < size; n ++) circular_buffer_get(buffer, data ++); return size; }
void mesg_queue_destroy(mesg_queue * q) { pthread_mutex_destroy(&q->lock); uint32_t queued_entries = circular_buffer_size(q->buffer); //TODO: Need better handling of the still queued entries if(queued_entries>0) { printf("%d entries still queued - unqueueing\n", (int)queued_entries); for(int i=0; i<queued_entries; ++i) { void * dummy=NULL; circular_buffer_get(q->buffer, &dummy); printf("unqueued %p\n", dummy); } } circular_buffer_free(q->buffer); free(q); }
int mesg_queue_take(mesg_queue *q, mesg_queue_entry ** entry) { if(pthread_mutex_trylock(&q->lock)!=0) return ANBPROTO_QUEUE_BUSY; void* result; int ok = circular_buffer_get(q->buffer, &result); if(ok==ECIRC_OK) { *entry = (mesg_queue_entry*)result; pthread_mutex_unlock(&q->lock); return ANBPROTO_QUEUE_OK; } if(q->poisoned==1) { pthread_mutex_unlock(&q->lock); return ANBPROTO_QUEUE_DONE; } pthread_mutex_unlock(&q->lock); return ANBPROTO_QUEUE_EMPTY; }