1
1
openmpi/orte/dss/dss_open_close.c
Tim Prins e058266c96 Change the ORTE datatype service in 2 ways:
1. Remove a unneeded field, bytes_avail, from orte_buffer_t. It is a calcualed value, and updating it everywhere is worse then just calculating it in the one place it is acutally used.
2. Change it so the default size of a orte_buffer is 128 bytes instead of 1024 bytes. We then double the size of the buffer up to 1024 bytes, then we additively increase the size by 1024 bytes at a time as was done before.

This commit was SVN r14252.
2007-04-06 19:40:29 +00:00

502 строки
22 KiB
C

/*
* Copyright (c) 2004-2007 The Trustees of Indiana University and Indiana
* University Research and Technology
* Corporation. All rights reserved.
* Copyright (c) 2004-2006 The University of Tennessee and The University
* of Tennessee Research Foundation. 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:
*
*/
#include "orte_config.h"
#include "orte/orte_types.h"
#include "opal/mca/base/mca_base_param.h"
#include "orte/mca/errmgr/errmgr.h"
#include "orte/mca/ns/ns.h"
#include "orte/dss/dss_internal.h"
/**
* globals
*/
bool orte_dss_initialized = false;
bool orte_dss_debug = false;
int orte_dss_verbose = -1; /* by default disabled */
int orte_dss_initial_size;
int orte_dss_threshold_size;
orte_pointer_array_t *orte_dss_types;
orte_data_type_t orte_dss_num_reg_types;
orte_dss_buffer_type_t default_buf_type;
orte_dss_t orte_dss = {
orte_dss_set,
orte_dss_get,
orte_dss_arith,
orte_dss_increment,
orte_dss_decrement,
orte_dss_set_buffer_type,
orte_dss_pack,
orte_dss_unpack,
orte_dss_copy,
orte_dss_compare,
orte_dss_size,
orte_dss_print,
orte_dss_release,
orte_dss_peek,
orte_dss_unload,
orte_dss_load,
orte_dss_register,
orte_dss_lookup_data_type,
orte_dss_dump_data_types,
orte_dss_dump
};
/**
* Object constructors, destructors, and instantiations
*/
/** Data Value **/
/* constructor - used to initialize state of data value instance */
static void orte_data_value_construct(orte_data_value_t* ptr)
{
ptr->type = ORTE_UNDEF;
ptr->data = NULL;
}
/* destructor - used to release data value instance */
static void orte_data_value_destruct(orte_data_value_t* ptr)
{
if (NULL != ptr->data) {
orte_dss.release(ptr);
}
}
/* define instance of opal_class_t */
OBJ_CLASS_INSTANCE(
orte_data_value_t, /* type name */
opal_object_t, /* parent "class" name */
orte_data_value_construct, /* constructor */
orte_data_value_destruct); /* destructor */
static void orte_buffer_construct (orte_buffer_t* buffer)
{
/** set the default buffer type */
buffer->type = default_buf_type;
/* Make everything NULL to begin with */
buffer->base_ptr = buffer->pack_ptr = buffer->unpack_ptr = NULL;
buffer->bytes_allocated = buffer->bytes_used = 0;
}
static void orte_buffer_destruct (orte_buffer_t* buffer)
{
if (NULL != buffer) {
if (NULL != buffer->base_ptr) {
free (buffer->base_ptr);
}
}
}
OBJ_CLASS_INSTANCE(orte_buffer_t,
opal_object_t,
orte_buffer_construct,
orte_buffer_destruct);
static void orte_dss_type_info_construct(orte_dss_type_info_t *obj)
{
obj->odti_name = NULL;
obj->odti_pack_fn = NULL;
obj->odti_unpack_fn = NULL;
obj->odti_copy_fn = NULL;
obj->odti_compare_fn = NULL;
obj->odti_size_fn = NULL;
obj->odti_print_fn = NULL;
obj->odti_release_fn = NULL;
obj->odti_structured = false;
}
static void orte_dss_type_info_destruct(orte_dss_type_info_t *obj)
{
if (NULL != obj->odti_name) {
free(obj->odti_name);
}
}
OBJ_CLASS_INSTANCE(orte_dss_type_info_t, opal_object_t,
orte_dss_type_info_construct,
orte_dss_type_info_destruct);
int orte_dss_open(void)
{
char *enviro_val;
int id, rc;
orte_data_type_t tmp;
int def_type;
if (orte_dss_initialized) {
return ORTE_SUCCESS;
}
enviro_val = getenv("ORTE_dss_debug");
if (NULL != enviro_val) { /* debug requested */
orte_dss_debug = true;
} else {
orte_dss_debug = false;
}
/** set the default buffer type. If we are in debug mode, then we default
* to fully described buffers. Otherwise, we default to non-described for brevity
* and performance
*/
#if OMPI_ENABLE_DEBUG
def_type = ORTE_DSS_BUFFER_FULLY_DESC;
#else
def_type = ORTE_DSS_BUFFER_NON_DESC;
#endif
id = mca_base_param_register_int("dss", "buffer", "type",
"Set the default mode for OpenRTE buffers (0=non-described, 1=described",
def_type);
mca_base_param_lookup_int(id, &rc);
default_buf_type = rc;
/* setup the initial size of the buffer. */
id = mca_base_param_register_int("dss", "buffer_initial", "size", NULL,
ORTE_DSS_DEFAULT_INITIAL_SIZE);
mca_base_param_lookup_int(id, &orte_dss_initial_size);
/* the threshold as to where to stop doubling the size of the buffer
* allocated memory and start doing additive increases */
id = mca_base_param_register_int("dss", "buffer_threshold", "size", NULL,
ORTE_DSS_DEFAULT_THRESHOLD_SIZE);
mca_base_param_lookup_int(id, &orte_dss_threshold_size);
/* Setup the types array */
if (ORTE_SUCCESS != (rc = orte_pointer_array_init(&orte_dss_types,
ORTE_DSS_ID_DYNAMIC,
ORTE_DSS_ID_MAX,
ORTE_DSS_ID_MAX))) {
ORTE_ERROR_LOG(rc);
return rc;
}
orte_dss_num_reg_types = 0;
/* Register all the intrinsic types */
tmp = ORTE_NULL;
if (ORTE_SUCCESS != (rc = orte_dss.register_type(orte_dss_pack_null,
orte_dss_unpack_null,
(orte_dss_copy_fn_t)orte_dss_copy_null,
(orte_dss_compare_fn_t)orte_dss_compare_null,
(orte_dss_size_fn_t)orte_dss_std_size,
(orte_dss_print_fn_t)orte_dss_print_null,
(orte_dss_release_fn_t)orte_dss_std_release,
ORTE_DSS_UNSTRUCTURED,
"ORTE_NULL", &tmp))) {
ORTE_ERROR_LOG(rc);
return rc;
}
tmp = ORTE_BYTE;
if (ORTE_SUCCESS != (rc = orte_dss.register_type(orte_dss_pack_byte,
orte_dss_unpack_byte,
(orte_dss_copy_fn_t)orte_dss_std_copy,
(orte_dss_compare_fn_t)orte_dss_compare_byte,
(orte_dss_size_fn_t)orte_dss_std_size,
(orte_dss_print_fn_t)orte_dss_print_byte,
(orte_dss_release_fn_t)orte_dss_std_release,
ORTE_DSS_UNSTRUCTURED,
"ORTE_BYTE", &tmp))) {
ORTE_ERROR_LOG(rc);
return rc;
}
tmp = ORTE_BOOL;
if (ORTE_SUCCESS != (rc = orte_dss.register_type(orte_dss_pack_bool,
orte_dss_unpack_bool,
(orte_dss_copy_fn_t)orte_dss_std_copy,
(orte_dss_compare_fn_t)orte_dss_compare_bool,
(orte_dss_size_fn_t)orte_dss_std_size,
(orte_dss_print_fn_t)orte_dss_print_bool,
(orte_dss_release_fn_t)orte_dss_std_release,
ORTE_DSS_UNSTRUCTURED,
"ORTE_BOOL", &tmp))) {
ORTE_ERROR_LOG(rc);
return rc;
}
tmp = ORTE_INT;
if (ORTE_SUCCESS != (rc = orte_dss.register_type(orte_dss_pack_int,
orte_dss_unpack_int,
(orte_dss_copy_fn_t)orte_dss_std_copy,
(orte_dss_compare_fn_t)orte_dss_compare_int,
(orte_dss_size_fn_t)orte_dss_std_size,
(orte_dss_print_fn_t)orte_dss_print_int,
(orte_dss_release_fn_t)orte_dss_std_release,
ORTE_DSS_UNSTRUCTURED,
"ORTE_INT", &tmp))) {
ORTE_ERROR_LOG(rc);
return rc;
}
tmp = ORTE_UINT;
if (ORTE_SUCCESS != (rc = orte_dss.register_type(orte_dss_pack_int,
orte_dss_unpack_int,
(orte_dss_copy_fn_t)orte_dss_std_copy,
(orte_dss_compare_fn_t)orte_dss_compare_uint,
(orte_dss_size_fn_t)orte_dss_std_size,
(orte_dss_print_fn_t)orte_dss_print_uint,
(orte_dss_release_fn_t)orte_dss_std_release,
ORTE_DSS_UNSTRUCTURED,
"ORTE_UINT", &tmp))) {
ORTE_ERROR_LOG(rc);
return rc;
}
tmp = ORTE_INT8;
if (ORTE_SUCCESS != (rc = orte_dss.register_type(orte_dss_pack_byte,
orte_dss_unpack_byte,
(orte_dss_copy_fn_t)orte_dss_std_copy,
(orte_dss_compare_fn_t)orte_dss_compare_int8,
(orte_dss_size_fn_t)orte_dss_std_size,
(orte_dss_print_fn_t)orte_dss_print_int8,
(orte_dss_release_fn_t)orte_dss_std_release,
ORTE_DSS_UNSTRUCTURED,
"ORTE_INT8", &tmp))) {
ORTE_ERROR_LOG(rc);
return rc;
}
tmp = ORTE_UINT8;
if (ORTE_SUCCESS != (rc = orte_dss.register_type(orte_dss_pack_byte,
orte_dss_unpack_byte,
(orte_dss_copy_fn_t)orte_dss_std_copy,
(orte_dss_compare_fn_t)orte_dss_compare_uint8,
(orte_dss_size_fn_t)orte_dss_std_size,
(orte_dss_print_fn_t)orte_dss_print_uint8,
(orte_dss_release_fn_t)orte_dss_std_release,
ORTE_DSS_UNSTRUCTURED,
"ORTE_UINT8", &tmp))) {
ORTE_ERROR_LOG(rc);
return rc;
}
tmp = ORTE_INT16;
if (ORTE_SUCCESS != (rc = orte_dss.register_type(orte_dss_pack_int16,
orte_dss_unpack_int16,
(orte_dss_copy_fn_t)orte_dss_std_copy,
(orte_dss_compare_fn_t)orte_dss_compare_int16,
(orte_dss_size_fn_t)orte_dss_std_size,
(orte_dss_print_fn_t)orte_dss_print_int16,
(orte_dss_release_fn_t)orte_dss_std_release,
ORTE_DSS_UNSTRUCTURED,
"ORTE_INT16", &tmp))) {
ORTE_ERROR_LOG(rc);
return rc;
}
tmp = ORTE_UINT16;
if (ORTE_SUCCESS != (rc = orte_dss.register_type(orte_dss_pack_int16,
orte_dss_unpack_int16,
(orte_dss_copy_fn_t)orte_dss_std_copy,
(orte_dss_compare_fn_t)orte_dss_compare_uint16,
(orte_dss_size_fn_t)orte_dss_std_size,
(orte_dss_print_fn_t)orte_dss_print_uint16,
(orte_dss_release_fn_t)orte_dss_std_release,
ORTE_DSS_UNSTRUCTURED,
"ORTE_UINT16", &tmp))) {
ORTE_ERROR_LOG(rc);
return rc;
}
tmp = ORTE_INT32;
if (ORTE_SUCCESS != (rc = orte_dss.register_type(orte_dss_pack_int32,
orte_dss_unpack_int32,
(orte_dss_copy_fn_t)orte_dss_std_copy,
(orte_dss_compare_fn_t)orte_dss_compare_int32,
(orte_dss_size_fn_t)orte_dss_std_size,
(orte_dss_print_fn_t)orte_dss_print_int32,
(orte_dss_release_fn_t)orte_dss_std_release,
ORTE_DSS_UNSTRUCTURED,
"ORTE_INT32", &tmp))) {
ORTE_ERROR_LOG(rc);
return rc;
}
tmp = ORTE_UINT32;
if (ORTE_SUCCESS != (rc = orte_dss.register_type(orte_dss_pack_int32,
orte_dss_unpack_int32,
(orte_dss_copy_fn_t)orte_dss_std_copy,
(orte_dss_compare_fn_t)orte_dss_compare_uint32,
(orte_dss_size_fn_t)orte_dss_std_size,
(orte_dss_print_fn_t)orte_dss_print_uint32,
(orte_dss_release_fn_t)orte_dss_std_release,
ORTE_DSS_UNSTRUCTURED,
"ORTE_UINT32", &tmp))) {
ORTE_ERROR_LOG(rc);
return rc;
}
tmp = ORTE_INT64;
if (ORTE_SUCCESS != (rc = orte_dss.register_type(orte_dss_pack_int64,
orte_dss_unpack_int64,
(orte_dss_copy_fn_t)orte_dss_std_copy,
(orte_dss_compare_fn_t)orte_dss_compare_int64,
(orte_dss_size_fn_t)orte_dss_std_size,
(orte_dss_print_fn_t)orte_dss_print_int64,
(orte_dss_release_fn_t)orte_dss_std_release,
ORTE_DSS_UNSTRUCTURED,
"ORTE_INT64", &tmp))) {
ORTE_ERROR_LOG(rc);
return rc;
}
tmp = ORTE_UINT64;
if (ORTE_SUCCESS != (rc = orte_dss.register_type(orte_dss_pack_int64,
orte_dss_unpack_int64,
(orte_dss_copy_fn_t)orte_dss_std_copy,
(orte_dss_compare_fn_t)orte_dss_compare_uint64,
(orte_dss_size_fn_t)orte_dss_std_size,
(orte_dss_print_fn_t)orte_dss_print_uint64,
(orte_dss_release_fn_t)orte_dss_std_release,
ORTE_DSS_UNSTRUCTURED,
"ORTE_UINT64", &tmp))) {
ORTE_ERROR_LOG(rc);
return rc;
}
tmp = ORTE_SIZE;
if (ORTE_SUCCESS != (rc = orte_dss.register_type(orte_dss_pack_sizet,
orte_dss_unpack_sizet,
(orte_dss_copy_fn_t)orte_dss_std_copy,
(orte_dss_compare_fn_t)orte_dss_compare_size,
(orte_dss_size_fn_t)orte_dss_std_size,
(orte_dss_print_fn_t)orte_dss_print_size,
(orte_dss_release_fn_t)orte_dss_std_release,
ORTE_DSS_UNSTRUCTURED,
"ORTE_SIZE", &tmp))) {
ORTE_ERROR_LOG(rc);
return rc;
}
tmp = ORTE_PID;
if (ORTE_SUCCESS != (rc = orte_dss.register_type(orte_dss_pack_pid,
orte_dss_unpack_pid,
(orte_dss_copy_fn_t)orte_dss_std_copy,
(orte_dss_compare_fn_t)orte_dss_compare_pid,
(orte_dss_size_fn_t)orte_dss_std_size,
(orte_dss_print_fn_t)orte_dss_print_pid,
(orte_dss_release_fn_t)orte_dss_std_release,
ORTE_DSS_UNSTRUCTURED,
"ORTE_PID", &tmp))) {
ORTE_ERROR_LOG(rc);
return rc;
}
tmp = ORTE_STRING;
if (ORTE_SUCCESS != (rc = orte_dss.register_type(orte_dss_pack_string,
orte_dss_unpack_string,
(orte_dss_copy_fn_t)orte_dss_copy_string,
(orte_dss_compare_fn_t)orte_dss_compare_string,
(orte_dss_size_fn_t)orte_dss_size_string,
(orte_dss_print_fn_t)orte_dss_print_string,
(orte_dss_release_fn_t)orte_dss_std_release,
ORTE_DSS_STRUCTURED,
"ORTE_STRING", &tmp))) {
ORTE_ERROR_LOG(rc);
return rc;
}
tmp = ORTE_STD_CNTR;
if (ORTE_SUCCESS != (rc = orte_dss.register_type(orte_dss_pack_std_cntr,
orte_dss_unpack_std_cntr,
(orte_dss_copy_fn_t)orte_dss_std_copy,
(orte_dss_compare_fn_t)orte_dss_compare_std_cntr,
(orte_dss_size_fn_t)orte_dss_std_size,
(orte_dss_print_fn_t)orte_dss_print_std_cntr,
(orte_dss_release_fn_t)orte_dss_std_release,
ORTE_DSS_UNSTRUCTURED,
"ORTE_STD_CNTR", &tmp))) {
ORTE_ERROR_LOG(rc);
return rc;
}
tmp = ORTE_DATA_TYPE;
if (ORTE_SUCCESS != (rc = orte_dss.register_type(orte_dss_pack_data_type,
orte_dss_unpack_data_type,
(orte_dss_copy_fn_t)orte_dss_std_copy,
(orte_dss_compare_fn_t)orte_dss_compare_dt,
(orte_dss_size_fn_t)orte_dss_std_size,
(orte_dss_print_fn_t)orte_dss_print_data_type,
(orte_dss_release_fn_t)orte_dss_std_release,
ORTE_DSS_UNSTRUCTURED,
"ORTE_DATA_TYPE", &tmp))) {
ORTE_ERROR_LOG(rc);
return rc;
}
tmp = ORTE_DATA_VALUE;
if (ORTE_SUCCESS != (rc = orte_dss.register_type(orte_dss_pack_data_value,
orte_dss_unpack_data_value,
(orte_dss_copy_fn_t)orte_dss_copy_data_value,
(orte_dss_compare_fn_t)orte_dss_compare_data_value,
(orte_dss_size_fn_t)orte_dss_size_data_value,
(orte_dss_print_fn_t)orte_dss_print_data_value,
(orte_dss_release_fn_t)orte_dss_std_obj_release,
ORTE_DSS_STRUCTURED,
"ORTE_DATA_VALUE", &tmp))) {
ORTE_ERROR_LOG(rc);
return rc;
}
#if OPAL_ENABLE_FT == 1
tmp = ORTE_CKPT_CMD;
if (ORTE_SUCCESS != (rc = orte_dss.register_type(orte_dss_pack_ckpt_cmd,
orte_dss_unpack_ckpt_cmd,
(orte_dss_copy_fn_t)orte_dss_std_copy,
(orte_dss_compare_fn_t)orte_dss_compare_ckpt_cmd,
(orte_dss_size_fn_t)orte_dss_std_size,
(orte_dss_print_fn_t)orte_dss_print_ckpt_cmd,
(orte_dss_release_fn_t)orte_dss_std_release,
ORTE_DSS_UNSTRUCTURED,
"ORTE_DATA_TYPE", &tmp))) {
ORTE_ERROR_LOG(rc);
return rc;
}
#endif
tmp = ORTE_BYTE_OBJECT;
if (ORTE_SUCCESS != (rc = orte_dss.register_type(orte_dss_pack_byte_object,
orte_dss_unpack_byte_object,
(orte_dss_copy_fn_t)orte_dss_copy_byte_object,
(orte_dss_compare_fn_t)orte_dss_compare_byte_object,
(orte_dss_size_fn_t)orte_dss_size_byte_object,
(orte_dss_print_fn_t)orte_dss_print_byte_object,
(orte_dss_release_fn_t)orte_dss_release_byte_object,
ORTE_DSS_STRUCTURED,
"ORTE_BYTE_OBJECT", &tmp))) {
ORTE_ERROR_LOG(rc);
return rc;
}
/* All done */
return ORTE_SUCCESS;
}
int orte_dss_close(void)
{
orte_std_cntr_t i;
orte_dss_initialized = false;
for (i = 0 ; i < orte_pointer_array_get_size(orte_dss_types) ; ++i) {
orte_dss_type_info_t *info = (orte_dss_type_info_t*)orte_pointer_array_get_item(orte_dss_types, i);
if (NULL != info) {
OBJ_RELEASE(info);
}
}
OBJ_RELEASE(orte_dss_types);
return ORTE_SUCCESS;
}