This source file includes following definitions.
- mca_mpool_base_tree_node_compare
- mca_mpool_base_tree_init
- mca_mpool_base_tree_fini
- mca_mpool_base_tree_insert
- mca_mpool_base_tree_delete
- mca_mpool_base_tree_find
- mca_mpool_base_tree_item_get
- mca_mpool_base_tree_item_put
- mca_mpool_base_tree_print
- condition
- action
   1 
   2 
   3 
   4 
   5 
   6 
   7 
   8 
   9 
  10 
  11 
  12 
  13 
  14 
  15 
  16 
  17 
  18 
  19 
  20 
  21 
  22 
  23 
  24 
  25 
  26 
  27 
  28 #include "opal_config.h"
  29 
  30 #include "opal/mca/mca.h"
  31 #include "opal/util/show_help.h"
  32 #include "opal/util/proc.h"
  33 #include "opal/util/printf.h"
  34 
  35 #include "opal/class/opal_rb_tree.h"
  36 #include "mpool_base_tree.h"
  37 
  38 
  39 static int num_leaks = 0;
  40 static int max_mem_leaks = -1;
  41 static char *leak_msg = NULL;
  42 
  43 static int condition(void *value);
  44 static void action(void *key, void *value);
  45 
  46 OBJ_CLASS_INSTANCE(mca_mpool_base_tree_item_t, opal_free_list_item_t, NULL, NULL);
  47 
  48 
  49 
  50 
  51 opal_rb_tree_t mca_mpool_base_tree = {{0}};
  52 opal_free_list_t mca_mpool_base_tree_item_free_list = {{{0}}};
  53 static opal_mutex_t tree_lock;
  54 
  55 
  56 
  57 
  58 int mca_mpool_base_tree_node_compare(void * key1, void * key2)
  59 {
  60     if(key1 < key2)
  61     {
  62         return -1;
  63     }
  64     else if(key1 > key2)
  65     {
  66         return 1;
  67     }
  68     else
  69     {
  70         return 0;
  71     }
  72 }
  73 
  74 
  75 
  76 
  77 int mca_mpool_base_tree_init(void) {
  78     int rc;
  79     OBJ_CONSTRUCT(&mca_mpool_base_tree, opal_rb_tree_t);
  80     OBJ_CONSTRUCT(&mca_mpool_base_tree_item_free_list, opal_free_list_t);
  81     OBJ_CONSTRUCT(&tree_lock, opal_mutex_t);
  82     rc = opal_free_list_init (&mca_mpool_base_tree_item_free_list,
  83             sizeof(mca_mpool_base_tree_item_t),
  84             opal_cache_line_size,
  85             OBJ_CLASS(mca_mpool_base_tree_item_t),
  86             0,opal_cache_line_size,
  87             0, -1 , 4, NULL, 0, NULL, NULL, NULL);
  88     if(OPAL_SUCCESS == rc) {
  89         rc = opal_rb_tree_init(&mca_mpool_base_tree, mca_mpool_base_tree_node_compare);
  90     }
  91     return rc;
  92 }
  93 
  94 
  95 
  96 
  97 int mca_mpool_base_tree_fini(void)
  98 {
  99     OBJ_DESTRUCT(&mca_mpool_base_tree);
 100     OBJ_DESTRUCT(&mca_mpool_base_tree_item_free_list);
 101     OBJ_DESTRUCT(&tree_lock);
 102     return OPAL_SUCCESS;
 103 }
 104 
 105 
 106 
 107 
 108 int mca_mpool_base_tree_insert(mca_mpool_base_tree_item_t* item) {
 109     int rc;
 110 
 111     OPAL_THREAD_LOCK(&tree_lock);
 112     rc = opal_rb_tree_insert(&mca_mpool_base_tree, item->key, item);
 113     OPAL_THREAD_UNLOCK(&tree_lock);
 114 
 115     return rc;
 116 }
 117 
 118 
 119 
 120 
 121 
 122 
 123 
 124 
 125 
 126 
 127 
 128 int mca_mpool_base_tree_delete(mca_mpool_base_tree_item_t* item) {
 129     int rc;
 130 
 131     OPAL_THREAD_LOCK(&tree_lock);
 132     rc = opal_rb_tree_delete(&mca_mpool_base_tree, item->key);
 133     OPAL_THREAD_UNLOCK(&tree_lock);
 134 
 135     return rc;
 136 }
 137 
 138 
 139 
 140 
 141 mca_mpool_base_tree_item_t* mca_mpool_base_tree_find(void* base) {
 142     mca_mpool_base_tree_item_t* item;
 143 
 144     OPAL_THREAD_LOCK(&tree_lock);
 145     item = (mca_mpool_base_tree_item_t*)opal_rb_tree_find(&mca_mpool_base_tree,
 146             base);
 147     OPAL_THREAD_UNLOCK(&tree_lock);
 148 
 149     return item;
 150 }
 151 
 152 
 153 
 154 
 155 mca_mpool_base_tree_item_t* mca_mpool_base_tree_item_get(void) {
 156     return (mca_mpool_base_tree_item_t *)
 157         opal_free_list_get (&mca_mpool_base_tree_item_free_list);
 158 }
 159 
 160 
 161 
 162 
 163 void mca_mpool_base_tree_item_put(mca_mpool_base_tree_item_t* item) {
 164     opal_free_list_return (&mca_mpool_base_tree_item_free_list,
 165                            &item->super);
 166 }
 167 
 168 
 169 
 170 
 171 
 172 
 173 void mca_mpool_base_tree_print(int show_up_to_mem_leaks)
 174 {
 175     
 176     if (0 == show_up_to_mem_leaks) {
 177         return;
 178     }
 179 
 180     num_leaks = 0;
 181     max_mem_leaks = show_up_to_mem_leaks;
 182     opal_rb_tree_traverse(&mca_mpool_base_tree, condition, action);
 183     if (0 == num_leaks) {
 184         return;
 185     }
 186 
 187     if (num_leaks <= show_up_to_mem_leaks ||
 188         show_up_to_mem_leaks < 0) {
 189         opal_show_help("help-mpool-base.txt", "all mem leaks",
 190                        true, OPAL_NAME_PRINT(OPAL_PROC_MY_NAME),
 191                        opal_proc_local_get()->proc_hostname,
 192                        getpid(), leak_msg);
 193     } else {
 194         int i = num_leaks - show_up_to_mem_leaks;
 195         opal_show_help("help-mpool-base.txt", "some mem leaks",
 196                        true, OPAL_NAME_PRINT(OPAL_PROC_MY_NAME),
 197                        opal_proc_local_get()->proc_hostname,
 198                        getpid(), leak_msg, i,
 199                        (i > 1) ? "s were" : " was",
 200                        (i > 1) ? "are" : "is");
 201     }
 202     free(leak_msg);
 203     leak_msg = NULL;
 204 }
 205 
 206 
 207 
 208 static int condition(void *value)
 209 {
 210     return 1;
 211 }
 212 
 213 
 214 
 215 static void action(void *key, void *value)
 216 {
 217     char *tmp;
 218     mca_mpool_base_tree_item_t *item = (mca_mpool_base_tree_item_t *) value;
 219 
 220     if( (++num_leaks <= max_mem_leaks) || (max_mem_leaks < 0) ) {
 221 
 222         
 223 
 224 
 225         if (NULL == leak_msg) {
 226             opal_asprintf(&leak_msg, "    %lu bytes at address 0x%lx",
 227                      (unsigned long) item->num_bytes,
 228                      (unsigned long) key);
 229         } else {
 230             opal_asprintf(&tmp, "%s\n    %lu bytes at address 0x%lx",
 231                      leak_msg, (unsigned long) item->num_bytes,
 232                      (unsigned long) key);
 233             free(leak_msg);
 234             leak_msg = tmp;
 235         }
 236     }
 237 }