diff --git a/test/class/Makefile.am b/test/class/Makefile.am index 8c441eee00..dbb075bb52 100644 --- a/test/class/Makefile.am +++ b/test/class/Makefile.am @@ -9,6 +9,7 @@ AM_CPPFLAGS = -I$(top_srcdir)/test/support -DOMPI_ENABLE_DEBUG_OVERRIDE=1 noinst_PROGRAMS = \ ompi_bitmap \ ompi_circular_buffer_fifo \ + ompi_fifo \ ompi_hash_table \ ompi_list \ ompi_value_array \ @@ -34,6 +35,13 @@ ompi_circular_buffer_fifo_LDADD = \ $(top_builddir)/src/util/libutil.la ompi_circular_buffer_fifo_DEPENDENCIES = $(ompi_circular_buffer_fifo_LDADD) +ompi_fifo_SOURCES = ompi_fifo.c +ompi_fifo_LDADD = \ + $(top_builddir)/src/threads/mutex_spinlock.lo \ + $(top_builddir)/test/support/libsupport.la \ + $(top_builddir)/src/util/libutil.la +ompi_fifo_DEPENDENCIES = $(ompi_fifo_LDADD) + ompi_list_SOURCES = ompi_list.c ompi_list_LDADD = \ $(top_builddir)/src/class/ompi_list.lo \ diff --git a/test/class/ompi_fifo.c b/test/class/ompi_fifo.c new file mode 100644 index 0000000000..ce507ea55a --- /dev/null +++ b/test/class/ompi_fifo.c @@ -0,0 +1,221 @@ + +/* + * $HEADER$ + */ + +#include + +#include "support.h" +#include "mca/mpool/mpool.h" + +static void *malloc_noalign(size_t size, size_t dummy) { + return malloc(size); +} + +#include "class/ompi_fifo.h" + +/* simple allocator for some simple tests */ +mca_mpool_base_module_t pool = { + NULL, /* component structure */ + NULL, /* mca_mpool_base_module_address_fn_t */ + malloc_noalign, /* mca_mpool_base_module_alloc_fn_t */ + realloc, /* ca_mpool_base_module_realloc_fn_t */ + free, /*mca_mpool_base_module_free_fn_t */ + NULL, /* mca_mpool_base_module_register_fn_t */ + NULL, /* mca_mpool_base_module_deregister_fn_t */ + NULL /* mca_mpool_base_module_finalize_fn_t */ +}; + + +int main(int argc, char **argv) { + + /* local variables */ + ompi_fifo_t fifo; + int i,j,size_of_fifo,lazy_free,return_status,error_cnt,loop_cnt; + void *ptr; + cb_slot_t *slot_data; + size_t cnt; + + /* get queue size */ + size_of_fifo=atoi(argv[1]); + lazy_free=atoi(argv[2]); + loop_cnt=atoi(argv[3]); + + /* init result tracking */ + test_init("ompi_circular_buffer_fifo"); + + /* init fifo */ + return_status=ompi_fifo_init(size_of_fifo,lazy_free,0,0,0,&fifo, + &pool); + /* check to see that retrun status is success */ + if( OMPI_SUCCESS == return_status ) { + test_success(); + } else { + test_failure(" ompi_fifo_init \n"); + } + + /* populate fifo */ + error_cnt=0; + for( i=0 ; i < loop_cnt*ompi_cb_fifo_size( (ompi_cb_fifo_t *) + &(fifo.head->cb_fifo)); i++ ) { + return_status=ompi_fifo_write_to_head((void *)(i+5), + (ompi_fifo_t *)&(fifo)); + if( OMPI_CB_ERROR == return_status ) { + test_failure(" ompi_cb_fifo_write_to_head\n"); + error_cnt++; + } + } + if( 0 == error_cnt ) { + test_success(); + } + /* pop items off the queue */ + error_cnt=0; + for( i=0 ; i < loop_cnt*ompi_cb_fifo_size( (ompi_cb_fifo_t *) + &(fifo.head->cb_fifo)); i++ ) { + ptr=ompi_fifo_read_from_tail(&fifo); + if( (void *)(i+5) != ptr ) { + test_failure(" ompi_cb_fifo_read_from_tail\n"); + error_cnt++; + } + } + if( 0 == error_cnt ) { + test_success(); + } + + /* free fifo */ + return_status=ompi_fifo_free(&fifo,&pool); + if( OMPI_SUCCESS == return_status ) { + test_success(); + } else { + test_failure(" ompi_fifo_free \n"); + } + + /* + * test slot reservation + */ + cnt=sizeof(cb_slot_t)*loop_cnt; + cnt*=fifo.head->cb_fifo.size; + slot_data=malloc(cnt); + if( !slot_data ) { + test_failure(" can't allocate memory for slot_data"); + goto ERRORS; + } + + /* init fifo */ + return_status=ompi_fifo_init(size_of_fifo,lazy_free,0,0,0,&fifo, + &pool); + /* check to see that retrun status is success */ + if( OMPI_SUCCESS == return_status ) { + test_success(); + } else { + test_failure(" ompi_fifo_init \n"); + } + + /* reserve slot fifo */ + error_cnt=0; + for( i=0 ; i < loop_cnt*ompi_cb_fifo_size( (ompi_cb_fifo_t *) + &(fifo.head->cb_fifo)); i++ ) { + slot_data[i]=ompi_fifo_get_slot((ompi_fifo_t *)&(fifo)); + if( 0 > slot_data[i].index ) { + test_failure(" ompi_fifo_get_slot \n"); + error_cnt++; + } + } + if( 0 == error_cnt ) { + test_success(); + } + + /* populate the reserved slots */ + error_cnt=0; + for( i=0 ; i < loop_cnt*ompi_cb_fifo_size( (ompi_cb_fifo_t *) + &(fifo.head->cb_fifo)); i++ ) { + return_status=ompi_fifo_write_to_slot(&(slot_data[i]), + (void *)(i+5) ); + if( OMPI_CB_ERROR == return_status ) { + test_failure(" ompi_fifo_write_to_slot \n"); + error_cnt++; + } + } + if( 0 == error_cnt ) { + test_success(); + } + + /* pop items off the queue */ + error_cnt=0; + for( i=0 ; i < loop_cnt*ompi_cb_fifo_size( (ompi_cb_fifo_t *) + &(fifo.head->cb_fifo)); i++ ) { + ptr=ompi_fifo_read_from_tail(&fifo); + if( (void *)(i+5) != ptr ) { + test_failure(" ompi_cb_fifo_read_from_tail II\n"); + error_cnt++; + } + } + if( 0 == error_cnt ) { + test_success(); + } + + /* free fifo */ + return_status=ompi_fifo_free(&fifo,&pool); + if( OMPI_SUCCESS == return_status ) { + test_success(); + } else { + test_failure(" ompi_fifo_free II\n"); + } + + /* + * re-use slots + */ + /* init fifo */ + return_status=ompi_fifo_init(size_of_fifo,lazy_free,0,0,0,&fifo, + &pool); + /* check to see that retrun status is success */ + if( OMPI_SUCCESS == return_status ) { + test_success(); + } else { + test_failure(" ompi_fifo_init \n"); + } + + /* populate fifo */ + for( j=0 ; j < loop_cnt ; j++ ) { + error_cnt=0; + for( i=0 ; i < ompi_cb_fifo_size( (ompi_cb_fifo_t *) + &(fifo.head->cb_fifo)); i++ ) { + return_status=ompi_fifo_write_to_head((void *)((i+5)*(j+1)), + (ompi_fifo_t *)&(fifo)); + if( OMPI_CB_ERROR == return_status ) { + test_failure(" ompi_cb_fifo_write_to_head\n"); + error_cnt++; + } + } + if( 0 == error_cnt ) { + test_success(); + } + + /* pop items off the queue */ + error_cnt=0; + for( i=0 ; i < ompi_cb_fifo_size( (ompi_cb_fifo_t *) + &(fifo.head->cb_fifo)); i++ ) { + ptr=ompi_fifo_read_from_tail(&fifo); + if( (void *)((i+5)*(j+1)) != ptr ) { + test_failure(" ompi_cb_fifo_read_from_tail\n"); + error_cnt++; + } + } + if( 0 == error_cnt ) { + test_success(); + } + } + + /* free fifo */ + return_status=ompi_fifo_free(&fifo,&pool); + if( OMPI_SUCCESS == return_status ) { + test_success(); + } else { + test_failure(" ompi_fifo_free \n"); + } + +ERRORS: + + /* finalize result tracking */ + return test_finalize(); +}