コード例 #1
0
ファイル: main.c プロジェクト: hbfhaapy/study
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));
}
コード例 #2
0
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;
}
コード例 #3
0
ファイル: mesg_queue.c プロジェクト: mikeando/anbproto
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);
}
コード例 #4
0
ファイル: mesg_queue.c プロジェクト: mikeando/anbproto
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;
}