#include #include #include #include #include "lf_ring_buffer.h" #define BUFFER_LEN 5000000 //static rb_data_t data[BUFFER_LEN][RB_DATA_LEN]; static int64_t time_diff(struct timespec *t0, struct timespec *t1) { return ((t1->tv_sec * 1000000000) + t1->tv_nsec) - ((t0->tv_sec * 1000000000) + t0->tv_nsec); } /* static void print_now(char* s) { fprintf(stdout,s); fflush(stdout); } */ static void report( char* op, int n, uint64_t dt, int redo ) { fprintf(stdout,"\t%9d %s operations in %4d [ms] => %7d [us] => %10d [ns]\t >>> %6d [ns/op]\t%4d redone operations\n", n, op, (int)(dt/1000000), (int)(dt/1000), (int)dt, (int)(dt/n), redo ); } struct thread_params { lf_ring_buffer_t *ring; int n; int flags; uint64_t dt; }; /* static void feed_data( int n){ int i; for(i=0; in, sequential_writes( params->ring, params->n, params->flags ) ); params->dt = sequential_writes( params->ring, params->n, params->flags ); return NULL; } void* reader_thread( void* param ) { struct thread_params *params = (struct thread_params*)param; //report( "read ", params->n, sequential_reads( params->ring, params->n, params->flags ) ); params->dt = sequential_reads( params->ring, params->n, params->flags ); return NULL; } static void parallel_op( int op, int nt, lf_ring_buffer_t *ring, int n, int flags ) { int i; uint64_t dt; pthread_t *threads = malloc( sizeof(pthread_t)*nt); struct thread_params *params = malloc( sizeof(struct thread_params)*nt); for(i=0; i %7d [us] => %10d [ns]\t >>> %6d [ns/op]\n",(int)(dt/1000000), (int)(dt/1000), (int)dt, (int)(dt/(n/nt)) ); /* empty the ring */ free(threads); free(params); } int main( int argc, char** argv ) { int i; int b_len = BUFFER_LEN; lf_ring_buffer_t *ring; ring = lf_ring_buffer_create( b_len ); if(ring==NULL){ fprintf(stderr,"ERROR : lf_ring_buffer_create( %d );\n",b_len); exit( EXIT_FAILURE ); } /* print_now("feed the data ... "); feed_data(b_len); printf("done.\n"); */ printf("sequential non blocking write operations ...\n"); sequential_writes( ring, b_len, 0 ); printf("sequential non blocking read operations ...\n"); sequential_reads( ring, b_len, 0 ); if(!lf_ring_buffer_empty(ring)) { fprintf(stderr,"ring should be empty but is not\n"); exit( EXIT_FAILURE ); } printf("sequential blocking write operations ...\n"); sequential_writes( ring, b_len, LFRB_NO_BLOCK ); printf("sequential blocking read operations ...\n"); sequential_reads( ring, b_len, LFRB_NO_BLOCK ); if(!lf_ring_buffer_empty(ring)) { fprintf(stderr,"ring should be empty but is not\n"); exit( EXIT_FAILURE ); } for(i=5; i<=100;i*=2) { printf("%d parallel blocking with backoff inc write operations .... \n",i); parallel_op( 0, i, ring, b_len, 0 ); printf("parallel blocking read operations ...\n"); sequential_reads( ring, b_len, 0 ); if(!lf_ring_buffer_empty(ring)) { fprintf(stderr,"ring should be empty but is not\n"); exit( EXIT_FAILURE ); } } for(i=5; i<=100;i*=2) { printf("%d parallel non blocking write operations .... \n",i); parallel_op( 0, i, ring, b_len, LFRB_NO_BLOCK ); printf("non blocking read operations ...\n"); sequential_reads( ring, b_len, LFRB_NO_BLOCK ); if(!lf_ring_buffer_empty(ring)) { fprintf(stderr,"ring should be empty but is not\n"); exit( EXIT_FAILURE ); } } for(i=10; i<=100;i*=2) { printf("%d parallel blocking write and read operations .... \n",i*2); parallel_op( 3, i, ring, b_len, 0 ); if(!lf_ring_buffer_empty(ring)) { fprintf(stderr,"ring should be empty but is not\n"); exit( EXIT_FAILURE ); } } lf_ring_buffer_destroy( ring ); return EXIT_SUCCESS; }