This source file includes following definitions.
- mca_base_pvar_init
- mca_base_pvar_find
- mca_base_pvar_find_by_name
- mca_base_pvar_finalize
- mca_base_pvar_get_count
- mca_base_pvar_default_get_value
- mca_base_pvar_default_set_value
- mca_base_pvar_notify_ignore
- mca_base_pvar_register
- mca_base_component_pvar_register
- mca_base_pvar_get_internal
- mca_base_pvar_get
- mca_base_pvar_mark_invalid
- mca_base_pvar_notify
- mca_base_pvar_update_all_handles
- mca_base_pvar_handle_alloc
- mca_base_pvar_handle_free
- mca_base_pvar_handle_update
- mca_base_pvar_handle_read_value
- mca_base_pvar_handle_write_value
- mca_base_pvar_handle_start
- mca_base_pvar_handle_stop
- mca_base_pvar_handle_reset
- mca_base_pvar_dump
- mca_base_pvar_contructor
- mca_base_pvar_destructor
- opal_mpi_pvar_session_constructor
- opal_mpi_pvar_session_destructor
- mca_base_pvar_handle_constructor
- mca_base_pvar_handle_destructor
   1 
   2 
   3 
   4 
   5 
   6 
   7 
   8 
   9 
  10 
  11 
  12 
  13 
  14 
  15 
  16 
  17 
  18 
  19 #include "opal/mca/base/mca_base_pvar.h"
  20 #include "opal/mca/base/mca_base_vari.h"
  21 
  22 #include <stddef.h>
  23 #include <sys/time.h>
  24 #include <sys/resource.h>
  25 
  26 #include "opal/class/opal_pointer_array.h"
  27 #include "opal/class/opal_hash_table.h"
  28 #include "opal/util/printf.h"
  29 
  30 static opal_hash_table_t mca_base_pvar_index_hash;
  31 static opal_pointer_array_t registered_pvars;
  32 static bool mca_base_pvar_initialized = false;
  33 static int pvar_count = 0;
  34 
  35 #define min(a,b) ((a) < (b) ? (a) : (b))
  36 #define max(a,b) ((a) > (b) ? (a) : (b))
  37 
  38 static int mca_base_pvar_get_internal (int index, mca_base_pvar_t **pvar, bool invalidok);
  39 
  40 
  41 static const char *pvar_class_names[] = {
  42     "state",
  43     "level",
  44     "size",
  45     "percentage",
  46     "high watermark",
  47     "low watermark",
  48     "counter",
  49     "aggregate",
  50     "timer",
  51     "generic"
  52 };
  53 
  54 int mca_base_pvar_init (void)
  55 {
  56     int ret = OPAL_SUCCESS;
  57 
  58     if (!mca_base_pvar_initialized) {
  59         mca_base_pvar_initialized = true;
  60 
  61         OBJ_CONSTRUCT(®istered_pvars, opal_pointer_array_t);
  62         opal_pointer_array_init(®istered_pvars, 128, 2048, 128);
  63 
  64         OBJ_CONSTRUCT(&mca_base_pvar_index_hash, opal_hash_table_t);
  65         ret = opal_hash_table_init (&mca_base_pvar_index_hash, 1024);
  66         if (OPAL_SUCCESS != ret) {
  67             mca_base_pvar_initialized = false;
  68             OBJ_DESTRUCT(®istered_pvars);
  69             OBJ_DESTRUCT(&mca_base_pvar_index_hash);
  70         }
  71     }
  72 
  73     return ret;
  74 }
  75 
  76 int mca_base_pvar_find (const char *project, const char *framework, const char *component, const char *name)
  77 {
  78     char *full_name;
  79     int ret, index;
  80 
  81     ret = mca_base_var_generate_full_name4 (NULL, framework, component, name, &full_name);
  82     if (OPAL_SUCCESS != ret) {
  83         return OPAL_ERROR;
  84     }
  85 
  86     ret = mca_base_pvar_find_by_name (full_name, MCA_BASE_PVAR_CLASS_ANY, &index);
  87     free (full_name);
  88 
  89     
  90 
  91     return (OPAL_SUCCESS != ret) ? ret : index;
  92 }
  93 
  94 int mca_base_pvar_find_by_name (const char *full_name, int var_class, int *index)
  95 {
  96     mca_base_pvar_t *pvar;
  97     void *tmp;
  98     int rc;
  99 
 100     rc = opal_hash_table_get_value_ptr (&mca_base_pvar_index_hash, full_name, strlen (full_name),
 101                                         &tmp);
 102     if (OPAL_SUCCESS != rc) {
 103         return rc;
 104     }
 105 
 106     rc = mca_base_pvar_get_internal ((int)(uintptr_t) tmp, &pvar, false);
 107     if (OPAL_SUCCESS != rc) {
 108         return rc;
 109     }
 110 
 111     if (MCA_BASE_PVAR_CLASS_ANY != var_class && pvar->var_class != var_class) {
 112         return OPAL_ERR_NOT_FOUND;
 113     }
 114 
 115     *index = (int)(uintptr_t) tmp;
 116 
 117     return OPAL_SUCCESS;
 118 }
 119 
 120 int mca_base_pvar_finalize (void)
 121 {
 122     int i;
 123 
 124     if (mca_base_pvar_initialized)  {
 125         mca_base_pvar_initialized = false;
 126 
 127         for (i = 0 ; i < pvar_count ; ++i) {
 128             mca_base_pvar_t *pvar = opal_pointer_array_get_item (®istered_pvars, i);
 129             if (pvar) {
 130                 OBJ_RELEASE(pvar);
 131             }
 132         }
 133 
 134         pvar_count = 0;
 135 
 136         OBJ_DESTRUCT(®istered_pvars);
 137         OBJ_DESTRUCT(&mca_base_pvar_index_hash);
 138     }
 139 
 140     return OPAL_SUCCESS;
 141 }
 142 
 143 int mca_base_pvar_get_count (int *count)
 144 {
 145     *count = pvar_count;
 146     return OPAL_SUCCESS;
 147 }
 148 
 149 static int mca_base_pvar_default_get_value (const mca_base_pvar_t *pvar, void *value, void *obj_handle)
 150 {
 151     
 152     (void) obj_handle;
 153 
 154     memmove (value, pvar->ctx, ompi_var_type_sizes[pvar->type]);
 155 
 156     return OPAL_SUCCESS;
 157 }
 158 
 159 static int mca_base_pvar_default_set_value (mca_base_pvar_t *pvar, const void *value, void *obj_handle)
 160 {
 161     
 162     (void) obj_handle;
 163 
 164     memmove (pvar->ctx, value, ompi_var_type_sizes[pvar->type]);
 165 
 166     return OPAL_SUCCESS;
 167 }
 168 
 169 static int mca_base_pvar_notify_ignore (mca_base_pvar_t *pvar, mca_base_pvar_event_t event, void *obj_handle, int *count)
 170 {
 171     
 172     (void) pvar;
 173     (void) obj_handle;
 174 
 175     
 176     if (MCA_BASE_PVAR_HANDLE_BIND == event) {
 177         *count = 1;
 178     }
 179 
 180     return OPAL_SUCCESS;
 181 }
 182 
 183 int mca_base_pvar_register (const char *project, const char *framework, const char *component, const char *name,
 184                             const char *description, mca_base_var_info_lvl_t verbosity,
 185                             int var_class, mca_base_var_type_t type, mca_base_var_enum_t *enumerator,
 186                             int bind, mca_base_pvar_flag_t flags, mca_base_get_value_fn_t get_value,
 187                             mca_base_set_value_fn_t set_value, mca_base_notify_fn_t notify, void *ctx)
 188 {
 189     int ret, group_index, pvar_index;
 190     mca_base_pvar_t *pvar;
 191 
 192     
 193     if (!get_value && !ctx) {
 194         return OPAL_ERR_BAD_PARAM;
 195     }
 196 
 197     
 198     assert (!(flags & 0x3f));
 199 
 200     flags &= ~MCA_BASE_PVAR_FLAG_INVALID;
 201 
 202     
 203     switch (var_class) {
 204     case MCA_BASE_PVAR_CLASS_STATE:
 205         
 206         if (MCA_BASE_VAR_TYPE_INT != type) {
 207             return OPAL_ERR_BAD_PARAM;
 208         }
 209         break;
 210     case MCA_BASE_PVAR_CLASS_COUNTER:
 211         
 212         if (MCA_BASE_VAR_TYPE_DOUBLE == type) {
 213             return OPAL_ERR_BAD_PARAM;
 214         }
 215         
 216     case MCA_BASE_PVAR_CLASS_LEVEL:
 217     case MCA_BASE_PVAR_CLASS_SIZE:
 218     case MCA_BASE_PVAR_CLASS_HIGHWATERMARK:
 219     case MCA_BASE_PVAR_CLASS_LOWWATERMARK:
 220     case MCA_BASE_PVAR_CLASS_AGGREGATE:
 221     case MCA_BASE_PVAR_CLASS_TIMER:
 222         if (MCA_BASE_VAR_TYPE_UNSIGNED_INT != type &&
 223             MCA_BASE_VAR_TYPE_UNSIGNED_LONG != type &&
 224             MCA_BASE_VAR_TYPE_UNSIGNED_LONG_LONG != type &&
 225             MCA_BASE_VAR_TYPE_DOUBLE != type) {
 226             return OPAL_ERR_BAD_PARAM;
 227         }
 228         break;
 229     case MCA_BASE_PVAR_CLASS_PERCENTAGE:
 230         
 231         if (MCA_BASE_VAR_TYPE_DOUBLE != type) {
 232             return OPAL_ERR_BAD_PARAM;
 233         }
 234         break;
 235     case MCA_BASE_PVAR_CLASS_GENERIC:
 236         
 237 
 238         break;
 239     default:
 240         return OPAL_ERR_BAD_PARAM;
 241     }
 242 
 243     
 244     assert (verbosity >= OPAL_INFO_LVL_1 && verbosity <= OPAL_INFO_LVL_9);
 245 
 246     
 247     ret = mca_base_pvar_find (project, framework, component, name);
 248     if (OPAL_SUCCESS <= ret) {
 249         ret = mca_base_pvar_get_internal (ret, &pvar, true);
 250         if (OPAL_SUCCESS != ret) {
 251             
 252             return OPAL_ERROR;
 253         }
 254 
 255         if (pvar->enumerator) {
 256             OBJ_RELEASE(pvar->enumerator);
 257         }
 258     } else {
 259         
 260         group_index = mca_base_var_group_register (project, framework, component, NULL);
 261         if (-1 > group_index) {
 262             return group_index;
 263         }
 264 
 265         
 266         pvar = OBJ_NEW(mca_base_pvar_t);
 267         if (NULL == pvar) {
 268             return OPAL_ERR_OUT_OF_RESOURCE;
 269         }
 270 
 271         do {
 272             
 273             ret = mca_base_var_generate_full_name4 (NULL, framework, component, name, &pvar->name);
 274             if (OPAL_SUCCESS != ret) {
 275                 ret = OPAL_ERR_OUT_OF_RESOURCE;
 276                 break;
 277             }
 278 
 279             if (NULL != description) {
 280                 pvar->description = strdup(description);
 281                 if (NULL == pvar->description) {
 282                     ret = OPAL_ERR_OUT_OF_RESOURCE;
 283                     break;
 284                 }
 285             }
 286 
 287             pvar_index = opal_pointer_array_add (®istered_pvars, pvar);
 288             if (0 > pvar_index) {
 289                 break;
 290             }
 291             pvar->pvar_index = pvar_index;
 292 
 293             
 294             if (0 <= group_index) {
 295                 ret = mca_base_var_group_add_pvar (group_index, pvar_index);
 296                 if (0 > ret) {
 297                     break;
 298                 }
 299             }
 300 
 301             pvar->pvar_index = pvar_count;
 302             opal_hash_table_set_value_ptr (&mca_base_pvar_index_hash, pvar->name, strlen (pvar->name),
 303                                            (void *)(uintptr_t) pvar->pvar_index);
 304 
 305             pvar_count++;
 306             ret = OPAL_SUCCESS;
 307         } while (0);
 308 
 309         if (OPAL_SUCCESS != ret) {
 310             OBJ_RELEASE(pvar);
 311             return ret;
 312         }
 313 
 314         pvar->group_index = group_index;
 315     }
 316 
 317     pvar->verbosity   = verbosity;
 318     pvar->var_class   = var_class;
 319     pvar->type        = type;
 320     pvar->enumerator  = enumerator;
 321     if (enumerator) {
 322         OBJ_RETAIN(enumerator);
 323     }
 324 
 325     pvar->bind = bind;
 326     pvar->flags = flags;
 327 
 328     pvar->get_value = get_value ? get_value : mca_base_pvar_default_get_value;
 329     pvar->notify = notify ? notify : mca_base_pvar_notify_ignore;
 330 
 331     if (!(flags & MCA_BASE_PVAR_FLAG_READONLY)) {
 332         pvar->set_value = set_value ? set_value : mca_base_pvar_default_set_value;
 333     }
 334 
 335     pvar->ctx        = ctx;
 336 
 337     return pvar->pvar_index;
 338 }
 339 
 340 int mca_base_component_pvar_register (const mca_base_component_t *component, const char *name,
 341                                       const char *description, mca_base_var_info_lvl_t verbosity,
 342                                       int var_class, mca_base_var_type_t type, mca_base_var_enum_t *enumerator,
 343                                       int bind, mca_base_pvar_flag_t flags, mca_base_get_value_fn_t get_value,
 344                                       mca_base_set_value_fn_t set_value, mca_base_notify_fn_t notify, void *ctx)
 345 {
 346     
 347     return mca_base_pvar_register(component->mca_project_name, component->mca_type_name, component->mca_component_name,
 348                                   name, description, verbosity, var_class, type, enumerator, bind,
 349                                   flags | MCA_BASE_PVAR_FLAG_IWG, get_value, set_value, notify, ctx);
 350 }
 351 
 352 static int mca_base_pvar_get_internal (int index, mca_base_pvar_t **pvar, bool invalidok)
 353 {
 354     if (index >= pvar_count) {
 355         return OPAL_ERR_VALUE_OUT_OF_BOUNDS;
 356     }
 357 
 358     *pvar = opal_pointer_array_get_item (®istered_pvars, index);
 359 
 360     
 361     assert (*pvar);
 362 
 363     if (((*pvar)->flags & MCA_BASE_PVAR_FLAG_INVALID) && !invalidok) {
 364         *pvar = NULL;
 365         return OPAL_ERR_VALUE_OUT_OF_BOUNDS;
 366     }
 367 
 368     return OPAL_SUCCESS;
 369 }
 370 
 371 int mca_base_pvar_get (int index, const mca_base_pvar_t **pvar)
 372 {
 373     return mca_base_pvar_get_internal (index, (mca_base_pvar_t **) pvar, false);
 374 }
 375 
 376 int mca_base_pvar_mark_invalid (int index)
 377 {
 378     mca_base_pvar_t *pvar;
 379     int ret;
 380 
 381     ret = mca_base_pvar_get_internal (index, &pvar, false);
 382     if (OPAL_SUCCESS != ret) {
 383         return ret;
 384     }
 385 
 386     pvar->flags |= MCA_BASE_PVAR_FLAG_INVALID;
 387 
 388     return OPAL_SUCCESS;
 389 }
 390 
 391 int mca_base_pvar_notify (mca_base_pvar_handle_t *handle, mca_base_pvar_event_t event, int *count)
 392 {
 393     if (mca_base_pvar_is_invalid (handle->pvar)) {
 394         return OPAL_ERR_NOT_BOUND;
 395     }
 396 
 397     return handle->pvar->notify (handle->pvar, event, handle->obj_handle, count);
 398 }
 399 
 400 int mca_base_pvar_update_all_handles (int index, const void *obj)
 401 {
 402     mca_base_pvar_handle_t *handle, *next;
 403     mca_base_pvar_t *pvar;
 404     int ret;
 405 
 406     ret = mca_base_pvar_get_internal (index, &pvar, false);
 407     if (OPAL_SUCCESS != ret) {
 408         return ret;
 409     }
 410 
 411     if (0 == opal_list_get_size (&pvar->bound_handles)) {
 412         
 413         return OPAL_SUCCESS;
 414     }
 415 
 416     
 417     OPAL_LIST_FOREACH_SAFE(handle, next, &pvar->bound_handles, mca_base_pvar_handle_t) {
 418         handle = (mca_base_pvar_handle_t *)((char *) handle - offsetof (mca_base_pvar_handle_t, list2));
 419 
 420         if (handle->obj_handle != obj) {
 421             continue;
 422         }
 423 
 424         (void) mca_base_pvar_handle_update (handle);
 425     }
 426 
 427     return OPAL_SUCCESS;
 428 }
 429 
 430 int mca_base_pvar_handle_alloc (mca_base_pvar_session_t *session, int index, void *obj_handle,
 431                                 mca_base_pvar_handle_t **handle, int *count)
 432 {
 433     mca_base_pvar_handle_t *pvar_handle = NULL;
 434     size_t datatype_size;
 435     mca_base_pvar_t *pvar;
 436     int ret;
 437 
 438     do {
 439         
 440         ret = mca_base_pvar_get_internal (index, &pvar, false);
 441         if (OPAL_SUCCESS != ret) {
 442             break;
 443         }
 444 
 445         if (0 == pvar->bind) {
 446             
 447             obj_handle = NULL;
 448         } else if (0 != pvar->bind && NULL == obj_handle) {
 449             
 450             ret = OPAL_ERR_BAD_PARAM;
 451             break;
 452         }
 453 
 454         
 455         pvar_handle = OBJ_NEW(mca_base_pvar_handle_t);
 456         if (NULL == pvar_handle) {
 457             ret = OPAL_ERR_OUT_OF_RESOURCE;
 458             break;
 459         }
 460 
 461         pvar_handle->obj_handle = (NULL == obj_handle ? NULL : *(void**)obj_handle);
 462         pvar_handle->pvar = pvar;
 463 
 464         *handle = pvar_handle;
 465 
 466         
 467 
 468 
 469         ret = mca_base_pvar_notify (pvar_handle, MCA_BASE_PVAR_HANDLE_BIND, count);
 470         if (0 > ret) {
 471             ret = OPAL_ERROR;
 472             break;
 473         }
 474 
 475         pvar_handle->count = *count;
 476 
 477         
 478 
 479         datatype_size = ompi_var_type_sizes[pvar->type];
 480         if (0 == datatype_size) {
 481             ret = OPAL_ERROR;
 482             break;
 483         }
 484 
 485         if (!mca_base_pvar_is_continuous (pvar) || mca_base_pvar_is_sum (pvar) ||
 486             mca_base_pvar_is_watermark (pvar)) {
 487             
 488 
 489 
 490             pvar_handle->current_value = calloc (*count, datatype_size);
 491             if (NULL == pvar_handle->current_value) {
 492                 ret = OPAL_ERR_OUT_OF_RESOURCE;
 493                 break;
 494             }
 495         }
 496 
 497         if (mca_base_pvar_is_sum (pvar) || mca_base_pvar_is_watermark (pvar)) {
 498             
 499 
 500 
 501 
 502             pvar_handle->tmp_value = calloc (*count, datatype_size);
 503             if (NULL == pvar_handle->tmp_value) {
 504                 ret = OPAL_ERR_OUT_OF_RESOURCE;
 505                 break;
 506             }
 507 
 508             pvar_handle->last_value = calloc (*count, datatype_size);
 509             if (NULL == pvar_handle->last_value) {
 510                 ret = OPAL_ERR_OUT_OF_RESOURCE;
 511                 break;
 512             }
 513 
 514             
 515 
 516 
 517             if (mca_base_pvar_is_continuous (pvar)) {
 518                 if (mca_base_pvar_is_sum (pvar)) {
 519                     ret = pvar->get_value (pvar, pvar_handle->last_value, pvar_handle->obj_handle);
 520                 } else {
 521                     
 522                     ret = pvar->get_value (pvar, pvar_handle->current_value, pvar_handle->obj_handle);
 523                 }
 524 
 525                 if (OPAL_SUCCESS != ret) {
 526                     return ret;
 527                 }
 528             }
 529         }
 530 
 531         pvar_handle->session = session;
 532 
 533         
 534         opal_list_append (&session->handles, &pvar_handle->super);
 535         opal_list_append (&pvar->bound_handles, &pvar_handle->list2);
 536 
 537         if (mca_base_pvar_is_continuous (pvar)) {
 538             
 539             pvar_handle->started = true;
 540         }
 541 
 542         ret = OPAL_SUCCESS;
 543     } while (0);
 544 
 545     if (OPAL_SUCCESS != ret && pvar_handle) {
 546         OBJ_RELEASE(pvar_handle);
 547     }
 548 
 549     return ret;
 550 }
 551 
 552 int mca_base_pvar_handle_free (mca_base_pvar_handle_t *handle)
 553 {
 554     OBJ_RELEASE(handle);
 555 
 556     return OPAL_SUCCESS;
 557 }
 558 
 559 int mca_base_pvar_handle_update (mca_base_pvar_handle_t *handle)
 560 {
 561     int i, ret;
 562     void *tmp;
 563 
 564     if (mca_base_pvar_is_invalid (handle->pvar)) {
 565         return OPAL_ERR_NOT_BOUND;
 566     }
 567 
 568     if (!mca_base_pvar_handle_is_running (handle)) {
 569         return OPAL_SUCCESS;
 570     }
 571 
 572     if (mca_base_pvar_is_sum (handle->pvar) || mca_base_pvar_is_watermark (handle->pvar)) {
 573         ret = handle->pvar->get_value (handle->pvar, handle->tmp_value, handle->obj_handle);
 574         if (OPAL_SUCCESS != ret) {
 575             return OPAL_ERROR;
 576         }
 577 
 578         if (mca_base_pvar_is_sum (handle->pvar)) {
 579             for (i = 0 ; i < handle->count ; ++i) {
 580                 
 581 
 582                 switch (handle->pvar->type) {
 583                 case MCA_BASE_VAR_TYPE_UNSIGNED_INT:
 584                     ((unsigned *) handle->current_value)[i] += ((unsigned *) handle->tmp_value)[i] -
 585                         ((unsigned *) handle->last_value)[i];
 586                     break;
 587                 case MCA_BASE_VAR_TYPE_UNSIGNED_LONG:
 588                     ((unsigned long *) handle->current_value)[i] += ((unsigned long *) handle->tmp_value)[i] -
 589                         ((unsigned long *) handle->last_value)[i];
 590                     break;
 591                 case MCA_BASE_VAR_TYPE_UNSIGNED_LONG_LONG:
 592                     ((unsigned long long *) handle->current_value)[i] += ((unsigned long long *) handle->tmp_value)[i] -
 593                         ((unsigned long long *) handle->last_value)[i];
 594                     break;
 595                 case MCA_BASE_VAR_TYPE_DOUBLE:
 596                     ((double *) handle->current_value)[i] += ((double *) handle->tmp_value)[i] -
 597                         ((double *) handle->last_value)[i];
 598                     break;
 599                 default:
 600                     
 601                     break;
 602                 }
 603             }
 604 
 605             tmp = handle->tmp_value;
 606             handle->tmp_value = handle->last_value;
 607             handle->last_value = tmp;
 608         } else {
 609             for (i = 0 ; i < handle->count ; ++i) {
 610                 if (MCA_BASE_PVAR_CLASS_LOWWATERMARK == handle->pvar->var_class) {
 611                     switch (handle->pvar->type) {
 612                     case MCA_BASE_VAR_TYPE_UNSIGNED_INT:
 613                         ((unsigned *) handle->current_value)[i] = min(((unsigned *) handle->tmp_value)[i],
 614                                                                       ((unsigned *) handle->current_value)[i]);
 615                         break;
 616                     case MCA_BASE_VAR_TYPE_UNSIGNED_LONG:
 617                         ((unsigned long *) handle->current_value)[i] = min(((unsigned long *) handle->tmp_value)[i],
 618                                                                            ((unsigned long *) handle->current_value)[i]);
 619                         break;
 620                     case MCA_BASE_VAR_TYPE_UNSIGNED_LONG_LONG:
 621                         ((unsigned long long *) handle->current_value)[i] = min(((unsigned long long *) handle->tmp_value)[i],
 622                                                                                 ((unsigned long long *) handle->current_value)[i]);
 623                         break;
 624                     case MCA_BASE_VAR_TYPE_DOUBLE:
 625                         ((double *) handle->current_value)[i] = min(((double *) handle->tmp_value)[i],
 626                                                                     ((double *) handle->current_value)[i]);
 627                         break;
 628                     default:
 629                         
 630                         break;
 631                     }
 632                 } else {
 633                     switch (handle->pvar->type) {
 634                     case MCA_BASE_VAR_TYPE_UNSIGNED_INT:
 635                         ((unsigned *) handle->current_value)[i] = max(((unsigned *) handle->tmp_value)[i],
 636                                                                       ((unsigned *) handle->current_value)[i]);
 637                         break;
 638                     case MCA_BASE_VAR_TYPE_UNSIGNED_LONG:
 639                         ((unsigned long *) handle->current_value)[i] = max(((unsigned long *) handle->tmp_value)[i],
 640                                                                            ((unsigned long *) handle->current_value)[i]);
 641                         break;
 642                     case MCA_BASE_VAR_TYPE_UNSIGNED_LONG_LONG:
 643                         ((unsigned long long *) handle->current_value)[i] = max(((unsigned long long *) handle->tmp_value)[i],
 644                                                                                 ((unsigned long long *) handle->current_value)[i]);
 645                         break;
 646                     case MCA_BASE_VAR_TYPE_DOUBLE:
 647                         ((double *) handle->current_value)[i] = max(((double *) handle->tmp_value)[i],
 648                                                                     ((double *) handle->current_value)[i]);
 649                         break;
 650                     default:
 651                         
 652                         break;
 653                     }
 654                 }
 655             }
 656         }
 657     } else if (!mca_base_pvar_is_continuous (handle->pvar)) {
 658         
 659         ret = handle->pvar->get_value (handle->pvar, handle->current_value, handle->obj_handle);
 660         if (OPAL_SUCCESS != ret) {
 661             return ret;
 662         }
 663     }
 664 
 665     
 666 
 667     return OPAL_SUCCESS;
 668 }
 669 
 670 int mca_base_pvar_handle_read_value (mca_base_pvar_handle_t *handle, void *value)
 671 {
 672     int ret;
 673 
 674     if (mca_base_pvar_is_invalid (handle->pvar)) {
 675         return OPAL_ERR_NOT_BOUND;
 676     }
 677 
 678     
 679     ret = mca_base_pvar_handle_update (handle);
 680     if (OPAL_SUCCESS != ret) {
 681         return ret;
 682     }
 683 
 684     if (mca_base_pvar_is_sum (handle->pvar) || mca_base_pvar_is_watermark (handle->pvar) ||
 685         !mca_base_pvar_handle_is_running (handle)) {
 686         
 687         memmove (value, handle->current_value, handle->count * ompi_var_type_sizes[handle->pvar->type]);
 688     } else {
 689         
 690         ret = handle->pvar->get_value (handle->pvar, value, handle->obj_handle);
 691     }
 692 
 693     return ret;
 694 }
 695 
 696 int mca_base_pvar_handle_write_value (mca_base_pvar_handle_t *handle, const void *value)
 697 {
 698     int ret;
 699 
 700     if (mca_base_pvar_is_invalid (handle->pvar)) {
 701         return OPAL_ERR_NOT_BOUND;
 702     }
 703 
 704     if (mca_base_pvar_is_readonly (handle->pvar)) {
 705         return OPAL_ERR_PERM;
 706     }
 707 
 708     
 709     ret = handle->pvar->set_value (handle->pvar, value, handle->obj_handle);
 710 
 711     ret = mca_base_pvar_handle_update (handle);
 712     if (OPAL_SUCCESS != ret) {
 713         return ret;
 714     }
 715 
 716     memmove (handle->current_value, value, handle->count * ompi_var_type_sizes[handle->pvar->type]);
 717     
 718     ret = handle->pvar->set_value (handle->pvar, value, handle->obj_handle);
 719 
 720     return OPAL_SUCCESS;
 721 }
 722 
 723 int mca_base_pvar_handle_start (mca_base_pvar_handle_t *handle)
 724 {
 725     int ret;
 726 
 727     
 728     if ((handle->pvar->flags & MCA_BASE_PVAR_FLAG_CONTINUOUS) ||
 729         handle->started) {
 730         return OPAL_ERR_NOT_SUPPORTED;
 731     }
 732 
 733     
 734     ret = mca_base_pvar_notify (handle, MCA_BASE_PVAR_HANDLE_START, NULL);
 735     if (OPAL_SUCCESS != ret) {
 736         return ret;
 737     }
 738 
 739     handle->started = true;
 740 
 741     if (mca_base_pvar_is_sum (handle->pvar)) {
 742         
 743         ret = handle->pvar->get_value (handle->pvar, handle->last_value, handle->obj_handle);
 744         if (OPAL_SUCCESS != ret) {
 745             return ret;
 746         }
 747     } else if (mca_base_pvar_is_watermark (handle->pvar)) {
 748         
 749 
 750         ret = handle->pvar->get_value (handle->pvar, handle->current_value, handle->obj_handle);
 751         if (OPAL_SUCCESS != ret) {
 752             return ret;
 753         }
 754     }
 755 
 756     return OPAL_SUCCESS;
 757 }
 758 
 759 int mca_base_pvar_handle_stop (mca_base_pvar_handle_t *handle)
 760 {
 761     int ret;
 762 
 763     if (mca_base_pvar_is_invalid (handle->pvar)) {
 764         return OPAL_ERR_NOT_BOUND;
 765     }
 766 
 767     
 768     if (!mca_base_pvar_handle_is_running (handle) || mca_base_pvar_is_continuous (handle->pvar)) {
 769         return OPAL_ERR_NOT_SUPPORTED;
 770     }
 771 
 772     ret = mca_base_pvar_handle_update (handle);
 773     if (OPAL_SUCCESS != ret) {
 774         return ret;
 775     }
 776 
 777     
 778     (void) mca_base_pvar_notify (handle, MCA_BASE_PVAR_HANDLE_STOP, NULL);
 779 
 780     
 781     handle->started = false;
 782 
 783     return OPAL_SUCCESS;
 784 }
 785 
 786 int mca_base_pvar_handle_reset (mca_base_pvar_handle_t *handle)
 787 {
 788     int ret = OPAL_SUCCESS;
 789 
 790     if (mca_base_pvar_is_invalid (handle->pvar)) {
 791         return OPAL_ERR_NOT_BOUND;
 792     }
 793 
 794     
 795     if (mca_base_pvar_is_sum (handle->pvar)) {
 796         
 797         memset (handle->current_value, 0, handle->count * ompi_var_type_sizes[handle->pvar->type]);
 798 
 799         if (mca_base_pvar_handle_is_running (handle)) {
 800             ret = handle->pvar->get_value (handle->pvar, handle->last_value, handle->obj_handle);
 801         }
 802     } else if (mca_base_pvar_handle_is_running (handle) && mca_base_pvar_is_watermark (handle->pvar)) {
 803             
 804 
 805         ret = handle->pvar->get_value (handle->pvar, handle->current_value, handle->obj_handle);
 806     } else if (mca_base_pvar_is_readonly (handle->pvar)) {
 807         return OPAL_ERR_PERM;
 808     }
 809     
 810 
 811     return ret;
 812 }
 813 
 814 int mca_base_pvar_dump(int index, char ***out, mca_base_var_dump_type_t output_type)
 815 {
 816     const char *framework, *component, *full_name;
 817     mca_base_var_group_t *group;
 818     int line = 0, line_count, i;
 819     const mca_base_pvar_t *pvar;
 820     int ret, enum_count = 0;
 821     char *tmp;
 822 
 823     ret = mca_base_pvar_get (index, &pvar);
 824     if (OPAL_SUCCESS != ret) {
 825         return ret;
 826     }
 827 
 828     ret = mca_base_var_group_get_internal (pvar->group_index, &group, true);
 829     if (OPAL_SUCCESS != ret) {
 830         return ret;
 831     }
 832 
 833     framework = group->group_framework;
 834     component = group->group_component ? group->group_component : "base";
 835     full_name = pvar->name;
 836 
 837     if (NULL != pvar->enumerator) {
 838         (void) pvar->enumerator->get_count(pvar->enumerator, &enum_count);
 839     }
 840 
 841     if (MCA_BASE_VAR_DUMP_PARSABLE == output_type) {
 842         line_count = 5 + !!(pvar->description) + enum_count;
 843 
 844         *out = (char **) calloc (line_count + 1, sizeof (char *));
 845         if (NULL == *out) {
 846             return OPAL_ERR_OUT_OF_RESOURCE;
 847         }
 848 
 849         
 850         (void)opal_asprintf(&tmp, "mca:%s:%s:pvar:%s:", framework, component, full_name);
 851 
 852         (void)opal_asprintf(out[0] + line++, "%sclass:%s", tmp, pvar_class_names[pvar->var_class]);
 853         (void)opal_asprintf(out[0] + line++, "%sread-only:%s", tmp, mca_base_pvar_is_readonly(pvar) ? "true" : "false");
 854         (void)opal_asprintf(out[0] + line++, "%scontinuous:%s", tmp, mca_base_pvar_is_continuous(pvar) ? "true" : "false");
 855         (void)opal_asprintf(out[0] + line++, "%satomic:%s", tmp, mca_base_pvar_is_atomic(pvar) ? "true" : "false");
 856 
 857         
 858         if (pvar->description) {
 859             (void)opal_asprintf(out[0] + line++, "%shelp:%s", tmp, pvar->description);
 860         }
 861 
 862         if (NULL != pvar->enumerator) {
 863             for (i = 0 ; i < enum_count ; ++i) {
 864                 const char *enum_string = NULL;
 865                 int enum_value;
 866 
 867                 ret = pvar->enumerator->get_value(pvar->enumerator, i, &enum_value,
 868                                                      &enum_string);
 869                 if (OPAL_SUCCESS != ret) {
 870                     continue;
 871                 }
 872 
 873                 (void)opal_asprintf(out[0] + line++, "%senumerator:value:%d:%s", tmp, enum_value, enum_string);
 874             }
 875         }
 876 
 877         (void)opal_asprintf(out[0] + line++, "%stype:%s", tmp, ompi_var_type_names[pvar->type]);
 878         free(tmp);  
 879     } else {
 880         
 881         *out = (char **) calloc (3, sizeof (char *));
 882         if (NULL == *out) {
 883             return OPAL_ERR_OUT_OF_RESOURCE;
 884         }
 885 
 886         (void)opal_asprintf (out[0] + line++, "performance \"%s\" (type: %s, class: %s)", full_name,
 887                         ompi_var_type_names[pvar->type], pvar_class_names[pvar->var_class]);
 888 
 889         if (pvar->description) {
 890             (void)opal_asprintf(out[0] + line++, "%s", pvar->description);
 891         }
 892 
 893         if (NULL != pvar->enumerator) {
 894             char *values;
 895 
 896             ret = pvar->enumerator->dump(pvar->enumerator, &values);
 897             if (OPAL_SUCCESS == ret) {
 898                 (void)opal_asprintf (out[0] + line++, "Values: %s", values);
 899                 free (values);
 900             }
 901         }
 902     }
 903 
 904     return OPAL_SUCCESS;
 905 }
 906 
 907 
 908 static void mca_base_pvar_contructor (mca_base_pvar_t *pvar)
 909 {
 910     memset ((char *) pvar + sizeof (pvar->super), 0, sizeof (*pvar) - sizeof (pvar->super));
 911     OBJ_CONSTRUCT(&pvar->bound_handles, opal_list_t);
 912 }
 913 
 914 static void mca_base_pvar_destructor (mca_base_pvar_t *pvar)
 915 {
 916     if (pvar->name) {
 917         free (pvar->name);
 918     }
 919 
 920     if (pvar->description) {
 921         free (pvar->description);
 922     }
 923 
 924     if (NULL != pvar->enumerator) {
 925         OBJ_RELEASE(pvar->enumerator);
 926     }
 927 
 928     OBJ_DESTRUCT(&pvar->bound_handles);
 929 }
 930 
 931 OBJ_CLASS_INSTANCE(mca_base_pvar_t, opal_object_t, mca_base_pvar_contructor, mca_base_pvar_destructor);
 932 
 933 
 934 static void opal_mpi_pvar_session_constructor (mca_base_pvar_session_t *session)
 935 {
 936     OBJ_CONSTRUCT(&session->handles, opal_list_t);
 937 }
 938 
 939 static void opal_mpi_pvar_session_destructor (mca_base_pvar_session_t *session)
 940 {
 941     mca_base_pvar_handle_t *handle, *next;
 942 
 943     
 944 
 945 
 946     OPAL_LIST_FOREACH_SAFE(handle, next, &session->handles, mca_base_pvar_handle_t) {
 947         OBJ_DESTRUCT(handle);
 948     }
 949 
 950     OBJ_DESTRUCT(&session->handles);
 951 }
 952 
 953 OBJ_CLASS_INSTANCE(mca_base_pvar_session_t, opal_object_t, opal_mpi_pvar_session_constructor,
 954                    opal_mpi_pvar_session_destructor);
 955 
 956 
 957 static void mca_base_pvar_handle_constructor (mca_base_pvar_handle_t *handle)
 958 {
 959     memset ((char *) handle + sizeof (handle->super), 0, sizeof (*handle) - sizeof (handle->super));
 960 
 961     OBJ_CONSTRUCT(&handle->list2, opal_list_item_t);
 962 }
 963 
 964 static void mca_base_pvar_handle_destructor (mca_base_pvar_handle_t *handle)
 965 {
 966     if (handle->pvar) {
 967         (void) mca_base_pvar_notify (handle, MCA_BASE_PVAR_HANDLE_UNBIND, NULL);
 968     }
 969 
 970     if (NULL != handle->last_value) {
 971         free (handle->last_value);
 972     }
 973 
 974     if (NULL != handle->current_value) {
 975         free (handle->current_value);
 976     }
 977 
 978     if (NULL != handle->tmp_value) {
 979         free (handle->tmp_value);
 980     }
 981 
 982     
 983     if (handle->pvar) {
 984         opal_list_remove_item (&handle->pvar->bound_handles, &handle->list2);
 985     }
 986 
 987     OBJ_DESTRUCT(&handle->list2);
 988 
 989     
 990     if (handle->session) {
 991         opal_list_remove_item (&handle->session->handles, &handle->super);
 992     }
 993 }
 994 
 995 OBJ_CLASS_INSTANCE(mca_base_pvar_handle_t, opal_list_item_t, mca_base_pvar_handle_constructor,
 996                    mca_base_pvar_handle_destructor);