1
1
openmpi/ompi/mca/bcol/basesmuma/bcol_basesmuma_progress.c
2015-06-23 20:59:57 -07:00

75 строки
2.6 KiB
C

/*
* Copyright (c) 2009-2012 Oak Ridge National Laboratory. All rights reserved.
* Copyright (c) 2009-2012 Mellanox Technologies. All rights reserved.
* Copyright (c) 2014 Los Alamos National Security, LLC. All rights
* reserved.
* $COPYRIGHT$
*
* Additional copyrights may follow
*
* $HEADER$
*/
/**
* @file
*
*/
#include "ompi_config.h"
#include "ompi/constants.h"
#include "bcol_basesmuma.h"
/* the progress function to be called from the opal progress function
*/
int bcol_basesmuma_progress(void)
{
/* local variables */
volatile int32_t *cntr;
mca_bcol_basesmuma_component_t *cs = &mca_bcol_basesmuma_component;
/* check to see if release of memory blocks needs to be done */
if( opal_list_get_size(&(cs->nb_admin_barriers)) ) {
sm_nbbar_desc_t *item_ptr;
opal_list_t *list=&(cs->nb_admin_barriers);
/* process only if the list is non-empty */
if( !OPAL_THREAD_TRYLOCK(&cs->nb_admin_barriers_mutex)) {
for (item_ptr = (sm_nbbar_desc_t*) opal_list_get_first(list);
item_ptr != (sm_nbbar_desc_t*) opal_list_get_end(list);
item_ptr = (sm_nbbar_desc_t*) opal_list_get_next(item_ptr) )
{
bcol_basesmuma_rd_nb_barrier_progress_admin(item_ptr);
/* check to see if an complete */
if( NB_BARRIER_DONE == item_ptr->collective_phase ) {
/* barrier is complete - remove from the list. No need
* to put it on another list, as it is part of the memory
* bank control structure, and will be picked up
* again when needed.
*/
int index=
item_ptr->pool_index;
/* old way - ctl_struct specific */
/*
volatile uint64_t *cntr= (volatile uint64_t *)
&(item_ptr->sm_module->colls_no_user_data.
ctl_buffs_mgmt[index].bank_gen_counter);
*/
cntr= (volatile int32_t *) &(item_ptr->coll_buff->
ctl_buffs_mgmt[index].bank_gen_counter);
item_ptr=(sm_nbbar_desc_t*)opal_list_remove_item((opal_list_t *)list,
( opal_list_item_t *)item_ptr);
/* increment the generation number */
OPAL_THREAD_ADD32(cntr,1);
}
}
OPAL_THREAD_UNLOCK(&cs->nb_admin_barriers_mutex);
}
}
return OMPI_SUCCESS;
}