1
1
openmpi/ompi/mca/rcache/rb/rcache_rb_mru.c
Galen Shipman 9fe5844071 decrement ref count on removal of registration from mru and tree.
add misc asserts to check for proper reference counting. 

ugly hack 1 -- use mallopt to never release memory ala sbrk - this is
commented out in mca_btl_mvapi_component_init

ugly hack 2 -- test registrations comming out of the tree via rcache_find, for
an unknown reason the tree is returning registrations where the address is not
within the base or bound of the registration. If this happens, we return
NULL. 

comment out code to enable mem hooks if leave_pinned is set, note we can do
this via an mca param and will default it to leave_pinned with mem_hooks when
we iron out these issues. 

I am adding a unit test for the rcache. Note that we have a unit test for the
rb tree but the compare function is significantly different than that used for
registrations. After we have tracked down the issues with rcache_rb we will
remove the above hacks. 

This commit was SVN r7499.
2005-09-24 00:24:49 +00:00

100 строки
2.9 KiB
C

/**
* Copyright (c) 2004-2005 The Trustees of Indiana University.
* All rights reserved.
* Copyright (c) 2004-2005 The Trustees of the University of Tennessee.
* All rights reserved.
* Copyright (c) 2004-2005 High Performance Computing Center Stuttgart,
* University of Stuttgart. All rights reserved.
* Copyright (c) 2004-2005 The Regents of the University of California.
* All rights reserved.
* $COPYRIGHT$
*
* Additional copyrights may follow
*
* $HEADER$
*/
/**
* @file
* Description of the Registration Cache framework
*/
#include "mca/mca.h"
#include "rcache_rb_mru.h"
#include "mca/mpool/mpool.h"
/*
* initialize the rb mru
*/
int mca_rcache_rb_mru_init(mca_rcache_rb_module_t* rcache){
OBJ_CONSTRUCT(&rcache->mru_list, opal_list_t);
rcache->reg_mru_len = mca_rcache_rb_component.reg_mru_len;
return OMPI_SUCCESS;
}
/*
* insert an item in the rb mru
*/
int mca_rcache_rb_mru_insert(
mca_rcache_rb_module_t* rcache,
mca_mpool_base_registration_t* reg
) {
mca_mpool_base_registration_t* old_reg;
if(rcache->reg_mru_len <= rcache->mru_list.opal_list_length) {
/* call deregister - which removes the registration from
* the tree and mru list. memory will be deregistered when
* the reference count goes to zero.
*/
old_reg = (mca_mpool_base_registration_t*)
opal_list_get_first(&rcache->mru_list);
old_reg->mpool->mpool_retain(old_reg->mpool, old_reg);
old_reg->mpool->mpool_deregister(old_reg->mpool, old_reg);
}
opal_list_append(&rcache->mru_list,(opal_list_item_t*) reg);
return OMPI_SUCCESS;
}
/*
* remove an item from
the rb mru
*/
int mca_rcache_rb_mru_delete(
mca_rcache_rb_module_t* rcache,
mca_mpool_base_registration_t *reg
){
int rc;
if(NULL == opal_list_remove_item(
&rcache->mru_list,
(opal_list_item_t*) reg
)) {
rc = OMPI_ERROR;
} else {
rc = OMPI_SUCCESS;
}
return rc;
}
/*
* touch an item in the mru list
*/
int mca_rcache_rb_mru_touch(
mca_rcache_rb_module_t* rcache,
mca_mpool_base_registration_t* reg
){
int rc;
if(NULL == opal_list_remove_item(
&rcache->mru_list,
(opal_list_item_t*) reg
)) {
rc = OMPI_ERROR;
} else {
opal_list_append(&rcache->mru_list, (opal_list_item_t*) reg);
rc = OMPI_SUCCESS;
}
return rc;
}