1
1

Merge pull request #2941 from markalle/pr/mpi-info-update2

Finally Merging this in.  MPI_*_get_info/set_info().
Targeting v3.1 release.  @hjelmn were you interested in switching some internal pieces to begin using this?  Should we target v3.1 (or whatever we call the Oct 15th release?)
Этот коммит содержится в:
Geoff Paulsen 2017-05-22 09:22:04 -05:00 коммит произвёл GitHub
родитель b59eb76fcf 482d84b6e5
Коммит 50f9287c03
99 изменённых файлов: 2164 добавлений и 1052 удалений

Просмотреть файл

@ -8,7 +8,6 @@ Github.com pull request). Note that these email addresses are not
guaranteed to be current; they are simply a unique indicator of the
individual who committed them.
-----
Abhishek Joshi, Broadcom
abhishek.joshi@broadcom.com

Просмотреть файл

@ -22,6 +22,7 @@
* and Technology (RIST). All rights reserved.
* Copyright (c) 2014-2015 Intel, Inc. All rights reserved.
* Copyright (c) 2015 Mellanox Technologies. All rights reserved.
* Copyright (c) 2017 IBM Corporation. All rights reserved.
* $COPYRIGHT$
*
* Additional copyrights may follow
@ -86,7 +87,7 @@ static int ompi_comm_copy_topo (ompi_communicator_t *oldcomm,
/* idup with local group and info. the local group support is provided to support ompi_comm_set_nb */
static int ompi_comm_idup_internal (ompi_communicator_t *comm, ompi_group_t *group, ompi_group_t *remote_group,
ompi_info_t *info, ompi_communicator_t **newcomm, ompi_request_t **req);
opal_info_t *info, ompi_communicator_t **newcomm, ompi_request_t **req);
/**********************************************************************/
@ -157,6 +158,7 @@ int ompi_comm_set_nb ( ompi_communicator_t **ncomm,
/* ompi_comm_allocate */
newcomm = OBJ_NEW(ompi_communicator_t);
newcomm->super.s_info = NULL;
/* fill in the inscribing hyper-cube dimensions */
newcomm->c_cube_dim = opal_cube_dim(local_size);
newcomm->c_id_available = MPI_UNDEFINED;
@ -787,7 +789,7 @@ static int ompi_comm_split_verify (ompi_communicator_t *comm, int split_type, in
}
int ompi_comm_split_type (ompi_communicator_t *comm, int split_type, int key,
ompi_info_t *info, ompi_communicator_t **newcomm)
opal_info_t *info, ompi_communicator_t **newcomm)
{
bool need_split = false, no_reorder = false, no_undefined = false;
ompi_communicator_t *newcomp = MPI_COMM_NULL;
@ -917,6 +919,12 @@ int ompi_comm_split_type (ompi_communicator_t *comm, int split_type, int key,
break;
}
// Copy info if there is one.
newcomp->super.s_info = OBJ_NEW(opal_info_t);
if (info) {
opal_info_dup(info, &(newcomp->super.s_info));
}
/* Activate the communicator and init coll-component */
rc = ompi_comm_activate (&newcomp, comm, NULL, NULL, NULL, false, mode);
if (OPAL_UNLIKELY(OMPI_SUCCESS != rc)) {
@ -972,7 +980,7 @@ int ompi_comm_dup ( ompi_communicator_t * comm, ompi_communicator_t **newcomm )
/**********************************************************************/
/**********************************************************************/
/**********************************************************************/
int ompi_comm_dup_with_info ( ompi_communicator_t * comm, ompi_info_t *info, ompi_communicator_t **newcomm )
int ompi_comm_dup_with_info ( ompi_communicator_t * comm, opal_info_t *info, ompi_communicator_t **newcomm )
{
ompi_communicator_t *newcomp = NULL;
ompi_group_t *remote_group = NULL;
@ -1014,6 +1022,12 @@ int ompi_comm_dup_with_info ( ompi_communicator_t * comm, ompi_info_t *info, omp
snprintf(newcomp->c_name, MPI_MAX_OBJECT_NAME, "MPI COMMUNICATOR %d DUP FROM %d",
newcomp->c_contextid, comm->c_contextid );
// Copy info if there is one.
newcomp->super.s_info = OBJ_NEW(opal_info_t);
if (info) {
opal_info_dup(info, &(newcomp->super.s_info));
}
/* activate communicator and init coll-module */
rc = ompi_comm_activate (&newcomp, comm, NULL, NULL, NULL, false, mode);
if ( OMPI_SUCCESS != rc ) {
@ -1042,14 +1056,14 @@ int ompi_comm_idup (ompi_communicator_t *comm, ompi_communicator_t **newcomm, om
return ompi_comm_idup_with_info (comm, NULL, newcomm, req);
}
int ompi_comm_idup_with_info (ompi_communicator_t *comm, ompi_info_t *info, ompi_communicator_t **newcomm, ompi_request_t **req)
int ompi_comm_idup_with_info (ompi_communicator_t *comm, opal_info_t *info, ompi_communicator_t **newcomm, ompi_request_t **req)
{
return ompi_comm_idup_internal (comm, comm->c_local_group, comm->c_remote_group, info, newcomm, req);
}
/* NTH: we need a way to idup with a smaller local group so this function takes a local group */
static int ompi_comm_idup_internal (ompi_communicator_t *comm, ompi_group_t *group, ompi_group_t *remote_group,
ompi_info_t *info, ompi_communicator_t **newcomm, ompi_request_t **req)
opal_info_t *info, ompi_communicator_t **newcomm, ompi_request_t **req)
{
ompi_comm_idup_with_info_context_t *context;
ompi_comm_request_t *request;
@ -1094,6 +1108,15 @@ static int ompi_comm_idup_internal (ompi_communicator_t *comm, ompi_group_t *gro
return rc;
}
// Copy info if there is one.
{
ompi_communicator_t *newcomp = context->newcomp;
newcomp->super.s_info = OBJ_NEW(opal_info_t);
if (info) {
opal_info_dup(info, &(newcomp->super.s_info));
}
}
ompi_comm_request_schedule_append (request, ompi_comm_idup_getcid, subreq, subreq[0] ? 1 : 0);
/* assign the newcomm now */
@ -1471,6 +1494,10 @@ int ompi_comm_free( ompi_communicator_t **comm )
ompi_mpi_comm_parent = &ompi_mpi_comm_null.comm;
}
if (NULL != ((*comm)->super.s_info)) {
OBJ_RELEASE((*comm)->super.s_info);
}
/* Release the communicator */
if ( OMPI_COMM_IS_DYNAMIC (*comm) ) {
ompi_comm_num_dyncomm --;

Просмотреть файл

@ -21,6 +21,7 @@
* Copyright (c) 2015 Research Organization for Information Science
* and Technology (RIST). All rights reserved.
* Copyright (c) 2015 Intel, Inc. All rights reserved.
* Copyright (c) 2016-2017 IBM Corporation. All rights reserved.
* $COPYRIGHT$
*
* Additional copyrights may follow
@ -33,6 +34,7 @@
#include <stdio.h>
#include "opal/util/bit_ops.h"
#include "opal/util/info_subscriber.h"
#include "ompi/constants.h"
#include "ompi/mca/pml/pml.h"
#include "ompi/mca/coll/base/base.h"
@ -52,9 +54,9 @@
opal_pointer_array_t ompi_mpi_communicators = {{0}};
opal_pointer_array_t ompi_comm_f_to_c_table = {{0}};
ompi_predefined_communicator_t ompi_mpi_comm_world = {{{0}}};
ompi_predefined_communicator_t ompi_mpi_comm_self = {{{0}}};
ompi_predefined_communicator_t ompi_mpi_comm_null = {{{0}}};
ompi_predefined_communicator_t ompi_mpi_comm_world = {{{{0}}}};
ompi_predefined_communicator_t ompi_mpi_comm_self = {{{{0}}}};
ompi_predefined_communicator_t ompi_mpi_comm_null = {{{{0}}}};
ompi_communicator_t *ompi_mpi_comm_parent = NULL;
ompi_predefined_communicator_t *ompi_mpi_comm_world_addr =
@ -67,7 +69,7 @@ ompi_predefined_communicator_t *ompi_mpi_comm_null_addr =
static void ompi_comm_construct(ompi_communicator_t* comm);
static void ompi_comm_destruct(ompi_communicator_t* comm);
OBJ_CLASS_INSTANCE(ompi_communicator_t, opal_object_t,
OBJ_CLASS_INSTANCE(ompi_communicator_t, opal_infosubscriber_t,
ompi_comm_construct,
ompi_comm_destruct);
@ -219,6 +221,7 @@ ompi_communicator_t *ompi_comm_allocate ( int local_size, int remote_size )
/* create new communicator element */
new_comm = OBJ_NEW(ompi_communicator_t);
new_comm->super.s_info = NULL;
new_comm->c_local_group = ompi_group_allocate ( local_size );
if ( 0 < remote_size ) {
new_comm->c_remote_group = ompi_group_allocate (remote_size);

Просмотреть файл

@ -20,7 +20,7 @@
* Copyright (c) 2014-2015 Intel, Inc. All rights reserved.
* Copyright (c) 2015 Research Organization for Information Science
* and Technology (RIST). All rights reserved.
* Copyright (c) 2017 IBM Corporation. All rights reserved.
* Copyright (c) 2016-2017 IBM Corporation. All rights reserved.
* $COPYRIGHT$
*
* Additional copyrights may follow
@ -33,6 +33,8 @@
#include "ompi_config.h"
#include "opal/class/opal_object.h"
#include "opal/class/opal_hash_table.h"
#include "opal/util/info_subscriber.h"
#include "ompi/errhandler/errhandler.h"
#include "opal/threads/mutex.h"
#include "ompi/communicator/comm_request.h"
@ -116,7 +118,7 @@ OMPI_DECLSPEC extern opal_pointer_array_t ompi_mpi_communicators;
OMPI_DECLSPEC extern opal_pointer_array_t ompi_comm_f_to_c_table;
struct ompi_communicator_t {
opal_object_t c_base;
opal_infosubscriber_t super;
opal_mutex_t c_lock; /* mutex for name and potentially
attributes */
char c_name[MPI_MAX_OBJECT_NAME];
@ -442,7 +444,7 @@ OMPI_DECLSPEC int ompi_comm_split (ompi_communicator_t *comm, int color, int key
*/
OMPI_DECLSPEC int ompi_comm_split_type(ompi_communicator_t *comm,
int split_type, int key,
struct ompi_info_t *info,
struct opal_info_t *info,
ompi_communicator_t** newcomm);
/**
@ -473,7 +475,7 @@ OMPI_DECLSPEC int ompi_comm_idup (ompi_communicator_t *comm, ompi_communicator_t
* @param comm: input communicator
* @param newcomm: the new communicator or MPI_COMM_NULL if any error is detected.
*/
OMPI_DECLSPEC int ompi_comm_dup_with_info (ompi_communicator_t *comm, ompi_info_t *info, ompi_communicator_t **newcomm);
OMPI_DECLSPEC int ompi_comm_dup_with_info (ompi_communicator_t *comm, opal_info_t *info, ompi_communicator_t **newcomm);
/**
* dup a communicator (non-blocking) with info.
@ -483,7 +485,7 @@ OMPI_DECLSPEC int ompi_comm_dup_with_info (ompi_communicator_t *comm, ompi_info_
* @param comm: input communicator
* @param newcomm: the new communicator or MPI_COMM_NULL if any error is detected.
*/
OMPI_DECLSPEC int ompi_comm_idup_with_info (ompi_communicator_t *comm, ompi_info_t *info, ompi_communicator_t **newcomm, ompi_request_t **req);
OMPI_DECLSPEC int ompi_comm_idup_with_info (ompi_communicator_t *comm, opal_info_t *info, ompi_communicator_t **newcomm, ompi_request_t **req);
/**
* compare two communicators.

Просмотреть файл

@ -7,6 +7,7 @@
* Copyright (c) 2012-2013 Inria. All rights reserved.
* Copyright (c) 2016 Research Organization for Information Science
* and Technology (RIST). All rights reserved.
* Copyright (c) 2017 IBM Corp. All rights reserved.
* $COPYRIGHT$
*
* Additional copyrights may follow
@ -237,7 +238,7 @@ int mpidbg_init_per_image(mqs_image *image, const mqs_image_callbacks *icb,
mqs_find_type(image, "ompi_file_t", mqs_lang_c);
handle_types->hi_c_group = i_info->ompi_group_t.type;
handle_types->hi_c_info =
mqs_find_type(image, "ompi_info_t", mqs_lang_c);
mqs_find_type(image, "opal_info_t", mqs_lang_c);
/* JMS: "MPI_Offset" is a typedef (see comment about MPI_Aint above) */
handle_types->hi_c_offset =
mqs_find_type(image, "MPI_Offset", mqs_lang_c);

Просмотреть файл

@ -5,6 +5,7 @@
* of Tennessee Research Foundation. All rights
* reserved.
* Copyright (c) 2012-2013 Inria. All rights reserved.
* Copyright (c) 2016-2017 IBM Corporation. All rights reserved.
* $COPYRIGHT$
*
* Additional copyrights may follow
@ -52,8 +53,8 @@ int main(int argc, char **argv) {
/* Test Predefined communicator sizes */
printf("ompi_predefined_communicator_t = %lu bytes\n", sizeof(ompi_predefined_communicator_t));
printf("ompi_communicator_t = %lu bytes\n", sizeof(ompi_communicator_t));
GAP_CHECK("c_base", test_comm, c_base, c_base, 0);
GAP_CHECK("c_lock", test_comm, c_lock, c_base, 1);
GAP_CHECK("c_base", test_comm, super, super, 0);
GAP_CHECK("c_lock", test_comm, c_lock, super, 1);
GAP_CHECK("c_name", test_comm, c_name, c_lock, 1);
GAP_CHECK("c_contextid", test_comm, c_contextid, c_name, 1);
GAP_CHECK("c_my_rank", test_comm, c_my_rank, c_contextid, 1);
@ -120,8 +121,8 @@ int main(int argc, char **argv) {
printf("=============================================\n");
printf("ompi_predefined_win_t = %lu bytes\n", sizeof(ompi_predefined_win_t));
printf("ompi_win_t = %lu bytes\n", sizeof(ompi_win_t));
GAP_CHECK("w_base", test_win, w_base, w_base, 0);
GAP_CHECK("w_lock", test_win, w_lock, w_base, 1);
GAP_CHECK("super", test_win, super, super, 0);
GAP_CHECK("w_lock", test_win, w_lock, super, 1);
GAP_CHECK("w_name", test_win, w_name, w_lock, 1);
GAP_CHECK("w_group", test_win, w_group, w_name, 1);
GAP_CHECK("w_flags", test_win, w_flags, w_group, 1);
@ -137,8 +138,7 @@ int main(int argc, char **argv) {
printf("ompi_info_t = %lu bytes\n", sizeof(ompi_info_t));
GAP_CHECK("super", test_info, super, super, 0);
GAP_CHECK("i_f_to_c_index", test_info, i_f_to_c_index, super, 1);
GAP_CHECK("i_lock", test_info, i_lock, i_f_to_c_index, 1);
GAP_CHECK("i_freed", test_info, i_freed, i_lock, 1);
GAP_CHECK("i_freed", test_info, i_freed, i_f_to_c_index, 1);
/* Test Predefined file sizes */
printf("=============================================\n");
@ -148,8 +148,7 @@ int main(int argc, char **argv) {
GAP_CHECK("f_comm", test_file, f_comm, super, 1);
GAP_CHECK("f_filename", test_file, f_filename, f_comm, 1);
GAP_CHECK("f_amode", test_file, f_amode, f_filename, 1);
GAP_CHECK("f_info", test_file, f_info, f_amode, 1);
GAP_CHECK("f_flags", test_file, f_flags, f_info, 1);
GAP_CHECK("f_flags", test_file, f_flags, f_amode, 1);
GAP_CHECK("f_f_to_c_index", test_file, f_f_to_c_index, f_flags, 1);
GAP_CHECK("error_handler", test_file, error_handler, f_f_to_c_index, 1);
GAP_CHECK("errhandler_type", test_file, errhandler_type, error_handler, 1);

Просмотреть файл

@ -15,6 +15,7 @@
* Copyright (c) 2015 Research Organization for Information Science
* and Technology (RIST). All rights reserved.
* Copyright (c) 2016 University of Houston. All rights reserved.
* Copyright (c) 2016-2017 IBM Corporation. All rights reserved.
* $COPYRIGHT$
*
* Additional copyrights may follow
@ -44,7 +45,7 @@ opal_pointer_array_t ompi_file_f_to_c_table = {{0}};
/*
* MPI_FILE_NULL (_addr flavor is for F03 bindings)
*/
ompi_predefined_file_t ompi_mpi_file_null = {{{0}}};
ompi_predefined_file_t ompi_mpi_file_null = {{{{0}}}};
ompi_predefined_file_t *ompi_mpi_file_null_addr = &ompi_mpi_file_null;
@ -59,7 +60,7 @@ static void file_destructor(ompi_file_t *obj);
* Class instance for ompi_file_t
*/
OBJ_CLASS_INSTANCE(ompi_file_t,
opal_object_t,
opal_infosubscriber_t,
file_constructor,
file_destructor);
@ -97,7 +98,7 @@ int ompi_file_init(void)
* Back end to MPI_FILE_OPEN
*/
int ompi_file_open(struct ompi_communicator_t *comm, const char *filename,
int amode, struct ompi_info_t *info, ompi_file_t **fh)
int amode, struct opal_info_t *info, ompi_file_t **fh)
{
int ret;
ompi_file_t *file;
@ -113,17 +114,10 @@ int ompi_file_open(struct ompi_communicator_t *comm, const char *filename,
file->f_comm = comm;
OBJ_RETAIN(comm);
if (MPI_INFO_NULL != info) {
if(NULL == file->f_info) {
file->f_info = OBJ_NEW(ompi_info_t);
}
if (OMPI_SUCCESS != (ret = ompi_info_dup(info, &file->f_info))) {
OBJ_RELEASE(file);
return ret;
}
} else {
file->f_info = MPI_INFO_NULL;
OBJ_RETAIN(MPI_INFO_NULL);
/* Copy the info for the info layer */
file->super.s_info = OBJ_NEW(opal_info_t);
if (info) {
opal_info_dup(info, &(file->super.s_info));
}
file->f_amode = amode;
@ -236,7 +230,6 @@ static void file_constructor(ompi_file_t *file)
file->f_comm = NULL;
file->f_filename = NULL;
file->f_amode = 0;
file->f_info = NULL;
/* Initialize flags */
@ -316,10 +309,10 @@ static void file_destructor(ompi_file_t *file)
#endif
}
if (NULL != file->f_info) {
OBJ_RELEASE(file->f_info);
if (NULL != file->super.s_info) {
OBJ_RELEASE(file->super.s_info);
#if OPAL_ENABLE_DEBUG
file->f_info = NULL;
file->super.s_info = NULL;
#endif
}

Просмотреть файл

@ -15,6 +15,7 @@
* Copyright (c) 2015 Research Organization for Information Science
* and Technology (RIST). All rights reserved.
* Copyright (c) 2016 University of Houston. All rights reserved.
* Copyright (c) 2016-2017 IBM Corporation. All rights reserved.
* $COPYRIGHT$
*
* Additional copyrights may follow
@ -30,6 +31,7 @@
#include "opal/class/opal_list.h"
#include "ompi/errhandler/errhandler.h"
#include "opal/threads/mutex.h"
#include "opal/util/info_subscriber.h"
#include "ompi/mca/io/io.h"
/*
@ -45,7 +47,7 @@ BEGIN_C_DECLS
*/
struct ompi_file_t {
/** Base of OBJ_* interface */
opal_object_t super;
opal_infosubscriber_t super;
/** Communicator that this file was created with */
struct ompi_communicator_t *f_comm;
@ -56,10 +58,6 @@ struct ompi_file_t {
/** Amode that this file was created with */
int f_amode;
/** MPI_Info that this file was created with. Note that this is
*NOT* what should be returned from OMPI_FILE_GET_INFO! */
struct ompi_info_t *f_info;
/** Bit flags */
int32_t f_flags;
@ -153,7 +151,7 @@ int ompi_file_init(void);
* handling as well.
*/
int ompi_file_open(struct ompi_communicator_t *comm, const char *filename,
int amode, struct ompi_info_t *info,
int amode, struct opal_info_t *info,
ompi_file_t **fh);
/**

Просмотреть файл

@ -16,6 +16,7 @@
* reserved.
* Copyright (c) 2015 Research Organization for Information Science
* and Technology (RIST). All rights reserved.
* Copyright (c) 2016-2017 IBM Corporation. All rights reserved.
* $COPYRIGHT$
*
* Additional copyrights may follow
@ -43,46 +44,33 @@
#include "opal/util/opal_getcwd.h"
#include "opal/util/output.h"
#include "opal/util/strncpy.h"
#include "opal/util/info.h"
#include "ompi/info/info.h"
#include "ompi/runtime/mpiruntime.h"
#include "ompi/runtime/params.h"
/*
* Global variables
*/
ompi_predefined_info_t ompi_mpi_info_null = {{{{0}}}};
ompi_predefined_info_t ompi_mpi_info_null = {{{{{0}}}}};
ompi_predefined_info_t *ompi_mpi_info_null_addr = &ompi_mpi_info_null;
ompi_predefined_info_t ompi_mpi_info_env = {{{{0}}}};
ompi_predefined_info_t ompi_mpi_info_env = {{{{{0}}}}};
/*
* Local functions
*/
static void info_constructor(ompi_info_t *info);
static void info_destructor(ompi_info_t *info);
static void info_entry_constructor(ompi_info_entry_t *entry);
static void info_entry_destructor(ompi_info_entry_t *entry);
static ompi_info_entry_t *info_find_key (ompi_info_t *info, const char *key);
/*
* ompi_info_t classes
*/
OBJ_CLASS_INSTANCE(ompi_info_t,
opal_list_t,
opal_info_t,
info_constructor,
info_destructor);
/*
* ompi_info_entry_t classes
*/
OBJ_CLASS_INSTANCE(ompi_info_entry_t,
opal_list_item_t,
info_entry_constructor,
info_entry_destructor);
/*
* The global fortran <-> C translation table
*/
@ -93,7 +81,7 @@ opal_pointer_array_t ompi_info_f_to_c_table = {{0}};
* fortran to C translation table. It also fills in the values
* for the MPI_INFO_GET_ENV object
*/
int ompi_info_init(void)
int ompi_mpiinfo_init(void)
{
char val[OPAL_MAXHOSTNAMELEN];
char *cptr;
@ -118,35 +106,35 @@ int ompi_info_init(void)
/* command for this app_context */
if (NULL != (cptr = getenv("OMPI_COMMAND"))) {
ompi_info_set(&ompi_mpi_info_env.info, "command", cptr);
opal_info_set(&ompi_mpi_info_env.info.super, "command", cptr);
}
/* space-separated list of argv for this command */
if (NULL != (cptr = getenv("OMPI_ARGV"))) {
ompi_info_set(&ompi_mpi_info_env.info, "argv", cptr);
opal_info_set(&ompi_mpi_info_env.info.super, "argv", cptr);
}
/* max procs for the entire job */
if (NULL != (cptr = getenv("OMPI_MCA_orte_ess_num_procs"))) {
ompi_info_set(&ompi_mpi_info_env.info, "maxprocs", cptr);
opal_info_set(&ompi_mpi_info_env.info.super, "maxprocs", cptr);
/* Open MPI does not support the "soft" option, so set it to maxprocs */
ompi_info_set(&ompi_mpi_info_env.info, "soft", cptr);
opal_info_set(&ompi_mpi_info_env.info.super, "soft", cptr);
}
/* local host name */
gethostname(val, sizeof(val));
ompi_info_set(&ompi_mpi_info_env.info, "host", val);
opal_info_set(&ompi_mpi_info_env.info.super, "host", val);
/* architecture name */
if (NULL != (cptr = getenv("OMPI_MCA_orte_cpu_type"))) {
ompi_info_set(&ompi_mpi_info_env.info, "arch", cptr);
opal_info_set(&ompi_mpi_info_env.info.super, "arch", cptr);
}
#ifdef HAVE_SYS_UTSNAME_H
else {
struct utsname sysname;
uname(&sysname);
cptr = sysname.machine;
ompi_info_set(&ompi_mpi_info_env.info, "arch", cptr);
opal_info_set(&ompi_mpi_info_env.info.super, "arch", cptr);
}
#endif
@ -155,7 +143,7 @@ int ompi_info_init(void)
* of determining the value
*/
if (NULL != (cptr = getenv("OMPI_MCA_initial_wdir"))) {
ompi_info_set(&ompi_mpi_info_env.info, "wdir", cptr);
opal_info_set(&ompi_mpi_info_env.info.super, "wdir", cptr);
}
/* provide the REQUESTED thread level - may be different
@ -163,16 +151,16 @@ int ompi_info_init(void)
* ugly, but have to do a switch to find the string representation */
switch (ompi_mpi_thread_requested) {
case MPI_THREAD_SINGLE:
ompi_info_set(&ompi_mpi_info_env.info, "thread_level", "MPI_THREAD_SINGLE");
opal_info_set(&ompi_mpi_info_env.info.super, "thread_level", "MPI_THREAD_SINGLE");
break;
case MPI_THREAD_FUNNELED:
ompi_info_set(&ompi_mpi_info_env.info, "thread_level", "MPI_THREAD_FUNNELED");
opal_info_set(&ompi_mpi_info_env.info.super, "thread_level", "MPI_THREAD_FUNNELED");
break;
case MPI_THREAD_SERIALIZED:
ompi_info_set(&ompi_mpi_info_env.info, "thread_level", "MPI_THREAD_SERIALIZED");
opal_info_set(&ompi_mpi_info_env.info.super, "thread_level", "MPI_THREAD_SERIALIZED");
break;
case MPI_THREAD_MULTIPLE:
ompi_info_set(&ompi_mpi_info_env.info, "thread_level", "MPI_THREAD_MULTIPLE");
opal_info_set(&ompi_mpi_info_env.info.super, "thread_level", "MPI_THREAD_MULTIPLE");
break;
default:
/* do nothing - don't know the value */
@ -183,24 +171,24 @@ int ompi_info_init(void)
/* the number of app_contexts in this job */
if (NULL != (cptr = getenv("OMPI_NUM_APP_CTX"))) {
ompi_info_set(&ompi_mpi_info_env.info, "ompi_num_apps", cptr);
opal_info_set(&ompi_mpi_info_env.info.super, "ompi_num_apps", cptr);
}
/* space-separated list of first MPI rank of each app_context */
if (NULL != (cptr = getenv("OMPI_FIRST_RANKS"))) {
ompi_info_set(&ompi_mpi_info_env.info, "ompi_first_rank", cptr);
opal_info_set(&ompi_mpi_info_env.info.super, "ompi_first_rank", cptr);
}
/* space-separated list of num procs for each app_context */
if (NULL != (cptr = getenv("OMPI_APP_CTX_NUM_PROCS"))) {
ompi_info_set(&ompi_mpi_info_env.info, "ompi_np", cptr);
opal_info_set(&ompi_mpi_info_env.info.super, "ompi_np", cptr);
}
/* location of the directory containing any prepositioned files
* the user may have requested
*/
if (NULL != (cptr = getenv("OMPI_FILE_LOCATION"))) {
ompi_info_set(&ompi_mpi_info_env.info, "ompi_positioned_file_dir", cptr);
opal_info_set(&ompi_mpi_info_env.info.super, "ompi_positioned_file_dir", cptr);
}
/* All done */
@ -208,314 +196,69 @@ int ompi_info_init(void)
return OMPI_SUCCESS;
}
// Generally ompi_info_t processing is handled by opal_info_t now.
// But to avoid compiler warnings and to avoid having to constantly
// change code to mpiinfo->super to make MPI code use the opal_info_t
// it's convenient to have ompi_info_t wrappers for some of the opal_info_t
// related calls:
/*
* Duplicate an info
*/
int ompi_info_dup (ompi_info_t *info, ompi_info_t **newinfo)
{
int err;
opal_list_item_t *item;
ompi_info_entry_t *iterator;
OPAL_THREAD_LOCK(info->i_lock);
for (item = opal_list_get_first(&(info->super));
item != opal_list_get_end(&(info->super));
item = opal_list_get_next(iterator)) {
iterator = (ompi_info_entry_t *) item;
err = ompi_info_set(*newinfo, iterator->ie_key, iterator->ie_value);
if (MPI_SUCCESS != err) {
OPAL_THREAD_UNLOCK(info->i_lock);
return err;
}
}
OPAL_THREAD_UNLOCK(info->i_lock);
return MPI_SUCCESS;
int ompi_info_dup (ompi_info_t *info, ompi_info_t **newinfo) {
return opal_info_dup (&(info->super), (opal_info_t **)newinfo);
}
/*
* Set a value on the info
*/
int ompi_info_set (ompi_info_t *info, const char *key, const char *value)
{
char *new_value;
ompi_info_entry_t *new_info;
ompi_info_entry_t *old_info;
new_value = strdup(value);
if (NULL == new_value) {
return MPI_ERR_NO_MEM;
}
OPAL_THREAD_LOCK(info->i_lock);
old_info = info_find_key (info, key);
if (NULL != old_info) {
/*
* key already exists. remove the value associated with it
*/
free(old_info->ie_value);
old_info->ie_value = new_value;
} else {
new_info = OBJ_NEW(ompi_info_entry_t);
if (NULL == new_info) {
free(new_value);
OPAL_THREAD_UNLOCK(info->i_lock);
return MPI_ERR_NO_MEM;
}
strncpy (new_info->ie_key, key, MPI_MAX_INFO_KEY);
new_info->ie_value = new_value;
opal_list_append (&(info->super), (opal_list_item_t *) new_info);
}
OPAL_THREAD_UNLOCK(info->i_lock);
return MPI_SUCCESS;
int ompi_info_dup_mpistandard (ompi_info_t *info, ompi_info_t **newinfo) {
return opal_info_dup_mpistandard (&(info->super), (opal_info_t **)newinfo);
}
int ompi_info_set (ompi_info_t *info, const char *key, const char *value) {
return opal_info_set (&(info->super), key, value);
}
int ompi_info_set_value_enum (ompi_info_t *info, const char *key, int value,
mca_base_var_enum_t *var_enum)
{
char *string_value;
int ret;
ret = var_enum->string_from_value (var_enum, value, &string_value);
if (OPAL_SUCCESS != ret) {
return ret;
}
ret = ompi_info_set (info, key, string_value);
free (string_value);
return ret;
return opal_info_set_value_enum (&(info->super), key, value, var_enum);
}
/*
* Free an info handle and all of its keys and values.
*/
int ompi_info_free (ompi_info_t **info)
{
(*info)->i_freed = true;
OBJ_RELEASE(*info);
*info = MPI_INFO_NULL;
return MPI_SUCCESS;
}
/*
* Get a value from an info
*/
int ompi_info_get (ompi_info_t *info, const char *key, int valuelen,
char *value, int *flag)
{
ompi_info_entry_t *search;
int value_length;
OPAL_THREAD_LOCK(info->i_lock);
search = info_find_key (info, key);
if (NULL == search){
*flag = 0;
} else {
/*
* We have found the element, so we can return the value
* Set the flag, value_length and value
*/
*flag = 1;
value_length = strlen(search->ie_value);
/*
* If the stored value is shorter than valuelen, then
* we can copy the entire value out. Else, we have to
* copy ONLY valuelen bytes out
*/
if (value_length < valuelen ) {
strcpy(value, search->ie_value);
} else {
opal_strncpy(value, search->ie_value, valuelen);
if (MPI_MAX_INFO_VAL == valuelen) {
value[valuelen-1] = 0;
} else {
value[valuelen] = 0;
}
}
}
OPAL_THREAD_UNLOCK(info->i_lock);
return MPI_SUCCESS;
return opal_info_get (&(info->super), key, valuelen, value, flag);
}
int ompi_info_get_value_enum (ompi_info_t *info, const char *key, int *value,
int default_value, mca_base_var_enum_t *var_enum,
int *flag)
{
ompi_info_entry_t *search;
int ret;
*value = default_value;
OPAL_THREAD_LOCK(info->i_lock);
search = info_find_key (info, key);
if (NULL == search){
OPAL_THREAD_UNLOCK(info->i_lock);
*flag = 0;
return MPI_SUCCESS;
}
/* we found a mathing key. pass the string value to the enumerator and
* return */
*flag = 1;
ret = var_enum->value_from_string (var_enum, search->ie_value, value);
OPAL_THREAD_UNLOCK(info->i_lock);
return ret;
return opal_info_get_value_enum (&(info->super), key, value,
default_value, var_enum, flag);
}
/*
* Similar to ompi_info_get(), but cast the result into a boolean
* using some well-defined rules.
*/
int ompi_info_get_bool(ompi_info_t *info, char *key, bool *value, int *flag)
{
char *ptr;
char str[256];
str[sizeof(str) - 1] = '\0';
ompi_info_get(info, key, sizeof(str) - 1, str, flag);
if (*flag) {
*value = false;
/* Trim whitespace */
ptr = str + sizeof(str) - 1;
while (ptr >= str && isspace(*ptr)) {
*ptr = '\0';
--ptr;
}
ptr = str;
while (ptr < str + sizeof(str) - 1 && *ptr != '\0' &&
isspace(*ptr)) {
++ptr;
}
if ('\0' != *ptr) {
if (isdigit(*ptr)) {
*value = (bool) atoi(ptr);
} else if (0 == strcasecmp(ptr, "yes") ||
0 == strcasecmp(ptr, "true")) {
*value = true;
} else if (0 != strcasecmp(ptr, "no") &&
0 != strcasecmp(ptr, "false")) {
/* RHC unrecognized value -- print a warning? */
}
}
}
return MPI_SUCCESS;
int ompi_info_get_bool(ompi_info_t *info, char *key, bool *value, int *flag) {
return opal_info_get_bool(&(info->super), key, value, flag);
}
/*
* Delete a key from an info
*/
int ompi_info_delete (ompi_info_t *info, const char *key)
{
ompi_info_entry_t *search;
OPAL_THREAD_LOCK(info->i_lock);
search = info_find_key (info, key);
if (NULL == search){
OPAL_THREAD_UNLOCK(info->i_lock);
return MPI_ERR_INFO_NOKEY;
} else {
/*
* An entry with this key value was found. Remove the item
* and free the memory allocated to it.
* As this key *must* be available, we do not check for errors.
*/
opal_list_remove_item (&(info->super),
(opal_list_item_t *)search);
OBJ_RELEASE(search);
}
OPAL_THREAD_UNLOCK(info->i_lock);
return MPI_SUCCESS;
int ompi_info_delete (ompi_info_t *info, const char *key) {
return opal_info_delete (&(info->super), key);
}
/*
* Return the length of a value
*/
int ompi_info_get_valuelen (ompi_info_t *info, const char *key, int *valuelen,
int *flag)
{
ompi_info_entry_t *search;
OPAL_THREAD_LOCK(info->i_lock);
search = info_find_key (info, key);
if (NULL == search){
*flag = 0;
} else {
/*
* We have found the element, so we can return the value
* Set the flag, value_length and value
*/
*flag = 1;
*valuelen = strlen(search->ie_value);
}
OPAL_THREAD_UNLOCK(info->i_lock);
return MPI_SUCCESS;
return opal_info_get_valuelen (&(info->super), key, valuelen, flag);
}
/*
* Get the nth key
*/
int ompi_info_get_nthkey (ompi_info_t *info, int n, char *key)
int ompi_info_get_nthkey (ompi_info_t *info, int n, char *key) {
return opal_info_get_nthkey (&(info->super), n, key);
}
int ompi_info_get_nkeys(ompi_info_t *info, int *nkeys)
{
ompi_info_entry_t *iterator;
/*
* Iterate over and over till we get to the nth key
*/
OPAL_THREAD_LOCK(info->i_lock);
for (iterator = (ompi_info_entry_t *)opal_list_get_first(&(info->super));
n > 0;
--n) {
iterator = (ompi_info_entry_t *)opal_list_get_next(iterator);
if (opal_list_get_end(&(info->super)) ==
(opal_list_item_t *) iterator) {
OPAL_THREAD_UNLOCK(info->i_lock);
return MPI_ERR_ARG;
}
}
/*
* iterator is of the type opal_list_item_t. We have to
* cast it to ompi_info_entry_t before we can use it to
* access the value
*/
strncpy(key, iterator->ie_key, MPI_MAX_INFO_KEY);
OPAL_THREAD_UNLOCK(info->i_lock);
return MPI_SUCCESS;
return opal_info_get_nkeys (&(info->super), nkeys);
}
/*
* Shut down MPI_Info handling
*/
int ompi_info_finalize(void)
int ompi_mpiinfo_finalize(void)
{
size_t i, max;
ompi_info_t *info;
opal_list_item_t *item;
ompi_info_entry_t *entry;
opal_info_entry_t *entry;
bool found = false;
/* Release MPI_INFO_NULL. Do this so that we don't get a bogus
leak report on it. Plus, it's statically allocated, so we
don't want to call OBJ_RELEASE on it. */
OBJ_DESTRUCT(&ompi_mpi_info_null.info);
opal_pointer_array_set_item(&ompi_info_f_to_c_table, 0, NULL);
/* ditto for MPI_INFO_GET_ENV */
OBJ_DESTRUCT(&ompi_mpi_info_env.info);
opal_pointer_array_set_item(&ompi_info_f_to_c_table, 1, NULL);
/* Go through the f2c table and see if anything is left. Free them
all. */
@ -544,10 +287,11 @@ int ompi_info_finalize(void)
if (!info->i_freed && ompi_debug_show_handle_leaks) {
if (ompi_debug_show_handle_leaks) {
opal_output(0, "WARNING: MPI_Info still allocated at MPI_FINALIZE");
for (item = opal_list_get_first(&(info->super));
opal_list_get_end(&(info->super)) != item;
for (item = opal_list_get_first(&info->super.super);
opal_list_get_end(&(info->super.super)) != item;
item = opal_list_get_next(item)) {
entry = (ompi_info_entry_t *) item;
entry = (opal_info_entry_t *) item;
opal_output(0, "WARNING: key=\"%s\", value=\"%s\"",
entry->ie_key,
NULL != entry->ie_value ? entry->ie_value : "(null)");
@ -570,10 +314,11 @@ int ompi_info_finalize(void)
/* All done -- destroy the table */
OBJ_DESTRUCT(&ompi_info_f_to_c_table);
return OMPI_SUCCESS;
return OPAL_SUCCESS;
}
/*
* This function is invoked when OBJ_NEW() is called. Here, we add this
* info pointer to the table and then store its index as the handle
@ -582,39 +327,26 @@ static void info_constructor(ompi_info_t *info)
{
info->i_f_to_c_index = opal_pointer_array_add(&ompi_info_f_to_c_table,
info);
info->i_lock = OBJ_NEW(opal_mutex_t);
info->i_freed = false;
/* If the user doesn't want us to ever free it, then add an extra
RETAIN here */
/*
* If the user doesn't want us to ever free it, then add an extra
* RETAIN here
*/
if (ompi_debug_no_free_handles) {
OBJ_RETAIN(&(info->super));
}
}
/*
* This function is called during OBJ_DESTRUCT of "info". When this
* done, we need to remove the entry from the ompi fortran to C
* translation table
*/
* * This function is called during OBJ_DESTRUCT of "info". When this
* * done, we need to remove the entry from the opal fortran to C
* * translation table
* */
static void info_destructor(ompi_info_t *info)
{
opal_list_item_t *item;
ompi_info_entry_t *iterator;
/* Remove every key in the list */
for (item = opal_list_remove_first(&(info->super));
NULL != item;
item = opal_list_remove_first(&(info->super))) {
iterator = (ompi_info_entry_t *) item;
OBJ_RELEASE(iterator);
}
/* reset the &ompi_info_f_to_c_table entry - make sure that the
entry is in the table */
/* reset the &ompi_info_f_to_c_table entry - make sure that the
entry is in the table */
if (MPI_UNDEFINED != info->i_f_to_c_index &&
NULL != opal_pointer_array_get_item(&ompi_info_f_to_c_table,
@ -623,104 +355,16 @@ static void info_destructor(ompi_info_t *info)
info->i_f_to_c_index, NULL);
}
/* Release the lock */
OBJ_RELEASE(info->i_lock);
}
/*
* ompi_info_entry_t interface functions
* Free an info handle and all of its keys and values.
*/
static void info_entry_constructor(ompi_info_entry_t *entry)
int ompi_info_free (ompi_info_t **info)
{
memset(entry->ie_key, 0, sizeof(entry->ie_key));
entry->ie_key[MPI_MAX_INFO_KEY] = 0;
(*info)->i_freed = true;
OBJ_RELEASE(*info);
*info = MPI_INFO_NULL;
return MPI_SUCCESS;
}
static void info_entry_destructor(ompi_info_entry_t *entry)
{
if (NULL != entry->ie_value) {
free(entry->ie_value);
}
}
/*
* Find a key
*
* Do NOT thread lock in here -- the calling function is responsible
* for that.
*/
static ompi_info_entry_t *info_find_key (ompi_info_t *info, const char *key)
{
ompi_info_entry_t *iterator;
/* No thread locking in here! */
/* Iterate over all the entries. If the key is found, then
* return immediately. Else, the loop will fall of the edge
* and NULL is returned
*/
for (iterator = (ompi_info_entry_t *)opal_list_get_first(&(info->super));
opal_list_get_end(&(info->super)) != (opal_list_item_t*) iterator;
iterator = (ompi_info_entry_t *)opal_list_get_next(iterator)) {
if (0 == strcmp(key, iterator->ie_key)) {
return iterator;
}
}
return NULL;
}
int
ompi_info_value_to_int(char *value, int *interp)
{
long tmp;
char *endp;
if (NULL == value || '\0' == value[0]) return OMPI_ERR_BAD_PARAM;
errno = 0;
tmp = strtol(value, &endp, 10);
/* we found something not a number */
if (*endp != '\0') return OMPI_ERR_BAD_PARAM;
/* underflow */
if (tmp == 0 && errno == EINVAL) return OMPI_ERR_BAD_PARAM;
*interp = (int) tmp;
return OMPI_SUCCESS;
}
int
ompi_info_value_to_bool(char *value, bool *interp)
{
int tmp;
/* idiot case */
if (NULL == value || NULL == interp) return OMPI_ERR_BAD_PARAM;
/* is it true / false? */
if (0 == strcmp(value, "true")) {
*interp = true;
return OMPI_SUCCESS;
} else if (0 == strcmp(value, "false")) {
*interp = false;
return OMPI_SUCCESS;
/* is it a number? */
} else if (OMPI_SUCCESS == ompi_info_value_to_int(value, &tmp)) {
if (tmp == 0) {
*interp = false;
} else {
*interp = true;
}
return OMPI_SUCCESS;
}
return OMPI_ERR_BAD_PARAM;
}

Просмотреть файл

@ -14,6 +14,7 @@
* Copyright (c) 2009 Sun Microsystems, Inc. All rights reserved.
* Copyright (c) 2012-2015 Los Alamos National Security, LLC. All rights
* reserved.
* Copyright (c) 2016-2017 IBM Corporation. All rights reserved.
* $COPYRIGHT$
*
* Additional copyrights may follow
@ -28,32 +29,25 @@
#include <string.h>
#include "mpi.h"
#include "opal/util/info.h"
#include "opal/class/opal_list.h"
#include "opal/class/opal_pointer_array.h"
#include "opal/threads/mutex.h"
#include "opal/mca/base/mca_base_var_enum.h"
/**
* \internal
* ompi_info_t structure. MPI_Info is a pointer to this structure
*/
struct ompi_info_t {
opal_list_t super;
struct opal_info_t super;
/**< generic list pointer which is the container for (key,value)
pairs */
int i_f_to_c_index;
/**< fortran handle for info. This is needed for translation from
fortran to C and vice versa */
opal_mutex_t *i_lock;
/**< Mutex for thread safety */
bool i_freed;
/**< Whether this info has been freed or not */
};
/**
* \internal
* Convenience typedef
*/
typedef struct ompi_info_t ompi_info_t;
/**
@ -69,33 +63,8 @@ struct ompi_predefined_info_t {
};
typedef struct ompi_predefined_info_t ompi_predefined_info_t;
/**
* \internal
*
* ompi_info_entry_t object. Each item in ompi_info_list is of this
* type. It contains (key,value) pairs
*/
struct ompi_info_entry_t {
opal_list_item_t super; /**< required for opal_list_t type */
char *ie_value; /**< value part of the (key, value) pair.
* Maximum length is MPI_MAX_INFO_VAL */
char ie_key[MPI_MAX_INFO_KEY + 1]; /**< "key" part of the (key, value)
* pair */
};
/**
* \internal
* Convenience typedef
*/
typedef struct ompi_info_entry_t ompi_info_entry_t;
BEGIN_C_DECLS
/**
* Table for Fortran <-> C translation table
*/
extern opal_pointer_array_t ompi_info_f_to_c_table;
/**
* Global instance for MPI_INFO_NULL
*/
@ -106,241 +75,97 @@ OMPI_DECLSPEC extern ompi_predefined_info_t ompi_mpi_info_null;
*/
OMPI_DECLSPEC extern ompi_predefined_info_t *ompi_mpi_info_null_addr;
/**
* Global instance for MPI_INFO_ENV
*/
OMPI_DECLSPEC extern ompi_predefined_info_t ompi_mpi_info_env;
/**
* \internal
* Some declarations needed to use OBJ_NEW and OBJ_DESTRUCT macros
*/
OMPI_DECLSPEC OBJ_CLASS_DECLARATION(ompi_info_t);
/**
* \internal
* Some declarations needed to use OBJ_NEW and OBJ_DESTRUCT macros
*/
OMPI_DECLSPEC OBJ_CLASS_DECLARATION(ompi_info_entry_t);
/**
* This function is invoked during ompi_mpi_init() and sets up
* MPI_Info handling.
*/
int ompi_info_init(void);
int ompi_mpiinfo_init(void);
/**
* This function is used to free a ompi level info
*/
int ompi_info_free (ompi_info_t **info);
/**
* This functions is called during ompi_mpi_finalize() and shuts
* down MPI_Info handling.
*/
int ompi_info_finalize(void);
int ompi_mpiinfo_finalize(void);
/**
* ompi_info_dup - Duplicate an 'MPI_Info' object
*
* @param info source info object (handle)
* @param newinfo pointer to the new info object (handle)
*
* @retval MPI_SUCCESS upon success
* @retval MPI_ERR_NO_MEM if out of memory
*
* Not only will the (key, value) pairs be duplicated, the order
* of keys will be the same in 'newinfo' as it is in 'info'. When
* an info object is no longer being used, it should be freed with
* 'MPI_Info_free'.
* ompi_info_foo() wrapper around various opal_info_foo() calls
*/
int ompi_info_dup (ompi_info_t *info, ompi_info_t **newinfo);
OMPI_DECLSPEC int ompi_info_dup (ompi_info_t *info, ompi_info_t **newinfo);
/**
* Set a new key,value pair on info.
*
* @param info pointer to ompi_info_t object
* @param key pointer to the new key object
* @param value pointer to the new value object
*
* @retval MPI_SUCCESS upon success
* @retval MPI_ERR_NO_MEM if out of memory
* ompi_info_foo() wrapper around various opal_info_foo() calls
*/
OMPI_DECLSPEC int ompi_info_dup_mpistandard (ompi_info_t *info, ompi_info_t **newinfo);
/**
* ompi_info_foo() wrapper around various opal_info_foo() calls
*/
OMPI_DECLSPEC int ompi_info_set (ompi_info_t *info, const char *key, const char *value);
/**
* Set a new key,value pair from a variable enumerator.
*
* @param info pointer to ompi_info_t object
* @param key pointer to the new key object
* @param value integer value of the info key (must be valid in var_enum)
* @param var_enum variable enumerator
*
* @retval MPI_SUCCESS upon success
* @retval MPI_ERR_NO_MEM if out of memory
* @retval OPAL_ERR_VALUE_OUT_OF_BOUNDS if the value is not valid in the enumerator
* ompi_info_foo() wrapper around various opal_info_foo() calls
*/
OMPI_DECLSPEC int ompi_info_set_value_enum (ompi_info_t *info, const char *key, int value,
mca_base_var_enum_t *var_enum);
/**
* ompi_info_free - Free an 'MPI_Info' object.
*
* @param info pointer to info (ompi_info_t *) object to be freed (handle)
*
* @retval MPI_SUCCESS
* @retval MPI_ERR_ARG
*
* Upon successful completion, 'info' will be set to
* 'MPI_INFO_NULL'. Free the info handle and all of its keys and
* values.
* ompi_info_foo() wrapper around various opal_info_foo() calls
*/
int ompi_info_free (ompi_info_t **info);
/**
* Get a (key, value) pair from an 'MPI_Info' object and assign it
* into a boolen output.
*
* @param info Pointer to ompi_info_t object
* @param key null-terminated character string of the index key
* @param value Boolean output value
* @param flag true (1) if 'key' defined on 'info', false (0) if not
* (logical)
*
* @retval MPI_SUCCESS
*
* If found, the string value will be cast to the boolen output in
* the following manner:
*
* - If the string value is digits, the return value is "(bool)
* atoi(value)"
* - If the string value is (case-insensitive) "yes" or "true", the
* result is true
* - If the string value is (case-insensitive) "no" or "false", the
* result is false
* - All other values are false
*/
OMPI_DECLSPEC int ompi_info_get_bool (ompi_info_t *info, char *key, bool *value,
int *flag);
OMPI_DECLSPEC int ompi_info_get_bool (ompi_info_t *info, char *key, bool *value, int *flag);
/**
* Get a (key, value) pair from an 'MPI_Info' object and assign it
* into an integer output based on the enumerator value.
*
* @param info Pointer to ompi_info_t object
* @param key null-terminated character string of the index key
* @param value integer output value
* @param default_value value to use if the string does not conform to the
* values accepted by the enumerator
* @param var_enum variable enumerator for the value
* @param flag true (1) if 'key' defined on 'info', false (0) if not
* (logical)
*
* @retval MPI_SUCCESS
* ompi_info_foo() wrapper around various opal_info_foo() calls
*/
OMPI_DECLSPEC int ompi_info_get_value_enum (ompi_info_t *info, const char *key,
int *value, int default_value,
mca_base_var_enum_t *var_enum, int *flag);
/**
* Get a (key, value) pair from an 'MPI_Info' object
*
* @param info Pointer to ompi_info_t object
* @param key null-terminated character string of the index key
* @param valuelen maximum length of 'value' (integer)
* @param value null-terminated character string of the value
* @param flag true (1) if 'key' defined on 'info', false (0) if not
* (logical)
*
* @retval MPI_SUCCESS
*
* In C and C++, 'valuelen' should be one less than the allocated
* space to allow for for the null terminator.
* ompi_info_foo() wrapper around various opal_info_foo() calls
*/
OMPI_DECLSPEC int ompi_info_get (ompi_info_t *info, const char *key, int valuelen,
char *value, int *flag);
/**
* Delete a (key,value) pair from "info"
*
* @param info ompi_info_t pointer on which we need to operate
* @param key The key portion of the (key,value) pair that
* needs to be deleted
*
* @retval MPI_SUCCESS
* @retval MPI_ERR_NOKEY
* ompi_info_foo() wrapper around various opal_info_foo() calls
*/
int ompi_info_delete (ompi_info_t *info, const char *key);
OMPI_DECLSPEC int ompi_info_delete (ompi_info_t *info, const char *key);
/**
* @param info - ompi_info_t pointer object (handle)
* @param key - null-terminated character string of the index key
* @param valuelen - length of the value associated with 'key' (integer)
* @param flag - true (1) if 'key' defined on 'info', false (0) if not
* (logical)
*
* @retval MPI_SUCCESS
* @retval MPI_ERR_ARG
* @retval MPI_ERR_INFO_KEY
*
* The length returned in C and C++ does not include the end-of-string
* character. If the 'key' is not found on 'info', 'valuelen' is left
* alone.
* ompi_info_foo() wrapper around various opal_info_foo() calls
*/
OMPI_DECLSPEC int ompi_info_get_valuelen (ompi_info_t *info, const char *key, int *valuelen,
int *flag);
/**
* ompi_info_get_nthkey - Get a key indexed by integer from an 'MPI_Info' o
*
* @param info Pointer to ompi_info_t object
* @param n index of key to retrieve (integer)
* @param key character string of at least 'MPI_MAX_INFO_KEY' characters
*
* @retval MPI_SUCCESS
* @retval MPI_ERR_ARG
* ompi_info_foo() wrapper around various opal_info_foo() calls
*/
int ompi_info_get_nthkey (ompi_info_t *info, int n, char *key);
OMPI_DECLSPEC int ompi_info_get_nthkey (ompi_info_t *info, int n, char *key);
/**
* Convert value string to boolean
*
* Convert value string \c value into a boolean, using the
* interpretation rules specified in MPI-2 Section 4.10. The
* strings "true", "false", and integer numbers can be converted
* into booleans. All others will return \c OMPI_ERR_BAD_PARAM
*
* @param value Value string for info key to interpret
* @param interp returned interpretation of the value key
*
* @retval OMPI_SUCCESS string was successfully interpreted
* @retval OMPI_ERR_BAD_PARAM string was not able to be interpreted
* ompi_info_foo() wrapper around various opal_info_foo() calls
*/
OMPI_DECLSPEC int ompi_info_value_to_bool(char *value, bool *interp);
/**
* Convert value string to integer
*
* Convert value string \c value into a integer, using the
* interpretation rules specified in MPI-2 Section 4.10.
* All others will return \c OMPI_ERR_BAD_PARAM
*
* @param value Value string for info key to interpret
* @param interp returned interpretation of the value key
*
* @retval OMPI_SUCCESS string was successfully interpreted
* @retval OMPI_ERR_BAD_PARAM string was not able to be interpreted
* ompi_info_foo() wrapper around various opal_info_foo() calls
*/
int ompi_info_value_to_int(char *value, int *interp);
OMPI_DECLSPEC int ompi_info_get_nkeys(ompi_info_t *info, int *nkeys);
END_C_DECLS
/**
* Return whether this info has been freed already or not.
*
* @param info Pointer to ompi_info_t object.
* @param info Pointer to opal_info_t object.
*
* @retval true If the info has already been freed
* @retval false If the info has not yet been freed
*
* If the info has been freed, return true. This will likely only
* happen in a reliable manner if ompi_debug_handle_never_free is
* happen in a reliable manner if opal_debug_handle_never_free is
* true, in which case an extra OBJ_RETAIN is set on the object during
* OBJ_NEW, meaning that the user will never be able to actually free
* the underlying object. It's a good way to find out if a process is
@ -352,18 +177,5 @@ static inline bool ompi_info_is_freed(ompi_info_t *info)
}
/**
* Get the number of keys defined on on an MPI_Info object
* @param info Pointer to ompi_info_t object.
* @param nkeys Pointer to nkeys, which needs to be filled up.
*
* @retval The number of keys defined on info
*/
static inline int
ompi_info_get_nkeys(ompi_info_t *info, int *nkeys)
{
*nkeys = (int) opal_list_get_size(&(info->super));
return MPI_SUCCESS;
}
#endif /* OMPI_INFO_H */

Просмотреть файл

@ -15,6 +15,7 @@
* Copyright (c) 2015 Research Organization for Information Science
* and Technology (RIST). All rights reserved.
* Copyright (c) 2015-2017 Intel, Inc. All rights reserved.
* Copyright (c) 2017 IBM Corporation. All rights reserved.
* $COPYRIGHT$
*
* Additional copyrights may follow
@ -30,6 +31,7 @@
#include "ompi/mca/rte/rte.h"
#include "ompi/interlib/interlib.h"
#include "mpi.h"
typedef struct {
int status;

Просмотреть файл

@ -75,7 +75,7 @@ OMPI_DECLSPEC int mca_common_ompio_file_iread_at_all (mca_io_ompio_file_t *fp, O
ompi_request_t **request);
OMPI_DECLSPEC int mca_common_ompio_file_open (ompi_communicator_t *comm, const char *filename,
int amode, ompi_info_t *info,
int amode, opal_info_t *info,
mca_io_ompio_file_t *ompio_fh, bool use_sharedfp);
OMPI_DECLSPEC int mca_common_ompio_file_close (mca_io_ompio_file_t *ompio_fh);
@ -85,7 +85,7 @@ OMPI_DECLSPEC int mca_common_ompio_set_explicit_offset (mca_io_ompio_file_t *fh,
OMPI_DECLSPEC int mca_common_ompio_set_file_defaults (mca_io_ompio_file_t *fh);
OMPI_DECLSPEC int mca_common_ompio_set_view (mca_io_ompio_file_t *fh, OMPI_MPI_OFFSET_TYPE disp,
ompi_datatype_t *etype, ompi_datatype_t *filetype, const char *datarep,
ompi_info_t *info);
opal_info_t *info);
#endif /* MCA_COMMON_OMPIO_H */

Просмотреть файл

@ -13,6 +13,7 @@
* Copyright (c) 2015-2017 Research Organization for Information Science
* and Technology (RIST). All rights reserved.
* Copyright (c) 2016 Cisco Systems, Inc. All rights reserved.
* Copyright (c) 2017 IBM Corporation. All rights reserved.
* $COPYRIGHT$
*
* Additional copyrights may follow
@ -43,7 +44,7 @@
int mca_common_ompio_file_open (ompi_communicator_t *comm,
const char *filename,
int amode,
ompi_info_t *info,
opal_info_t *info,
mca_io_ompio_file_t *ompio_fh, bool use_sharedfp)
{
int ret = OMPI_SUCCESS;
@ -281,7 +282,7 @@ int mca_common_ompio_file_close (mca_io_ompio_file_t *ompio_fh)
ret = ompio_fh->f_fs->fs_file_close (ompio_fh);
}
if ( delete_flag && 0 == ompio_fh->f_rank ) {
mca_io_ompio_file_delete ( ompio_fh->f_filename, MPI_INFO_NULL );
mca_io_ompio_file_delete ( ompio_fh->f_filename, &(MPI_INFO_NULL->super) );
}
if ( NULL != ompio_fh->f_fs ) {

Просмотреть файл

@ -12,6 +12,7 @@
* Copyright (c) 2008-2016 University of Houston. All rights reserved.
* Copyright (c) 2017 Research Organization for Information Science
* and Technology (RIST). All rights reserved.
* Copyright (c) 2017 IBM Corporation. All rights reserved.
* $COPYRIGHT$
*
* Additional copyrights may follow
@ -56,7 +57,7 @@ int mca_common_ompio_set_view (mca_io_ompio_file_t *fh,
ompi_datatype_t *etype,
ompi_datatype_t *filetype,
const char *datarep,
ompi_info_t *info)
opal_info_t *info)
{
size_t max_data = 0;

Просмотреть файл

@ -15,6 +15,7 @@
* reserved.
* Copyright (c) 2015 Research Organization for Information Science
* and Technology (RIST). All rights reserved.
* Copyright (c) 2016-2017 IBM Corporation. All rights reserved.
* $COPYRIGHT$
*
* Additional copyrights may follow
@ -29,6 +30,7 @@
#include "mpi.h"
#include "ompi/mca/mca.h"
#include "opal/mca/base/base.h"
#include "ompi/info/info.h"
BEGIN_C_DECLS
@ -110,10 +112,10 @@ typedef int (*mca_fs_base_module_finalize_1_0_0_fn_t)
typedef int (*mca_fs_base_module_file_open_fn_t)(
struct ompi_communicator_t *comm, const char *filename, int amode,
struct ompi_info_t *info, struct mca_io_ompio_file_t *fh);
struct opal_info_t *info, struct mca_io_ompio_file_t *fh);
typedef int (*mca_fs_base_module_file_close_fn_t)(struct mca_io_ompio_file_t *fh);
typedef int (*mca_fs_base_module_file_delete_fn_t)(
char *filename, struct ompi_info_t *info);
char *filename, struct opal_info_t *info);
typedef int (*mca_fs_base_module_file_set_size_fn_t)
(struct mca_io_ompio_file_t *fh, OMPI_MPI_OFFSET_TYPE size);
typedef int (*mca_fs_base_module_file_get_size_fn_t)

Просмотреть файл

@ -12,6 +12,7 @@
* Copyright (c) 2008-2016 University of Houston. All rights reserved.
* Copyright (c) 2015 Research Organization for Information Science
* and Technology (RIST). All rights reserved.
* Copyright (c) 2016-2017 IBM Corporation. All rights reserved.
* $COPYRIGHT$
*
* Additional copyrights may follow
@ -60,13 +61,13 @@ OMPI_MODULE_DECLSPEC extern mca_fs_base_component_2_0_0_t mca_fs_lustre_componen
int mca_fs_lustre_file_open (struct ompi_communicator_t *comm,
const char *filename,
int amode,
struct ompi_info_t *info,
struct opal_info_t *info,
mca_io_ompio_file_t *fh);
int mca_fs_lustre_file_close (mca_io_ompio_file_t *fh);
int mca_fs_lustre_file_delete (char *filename,
struct ompi_info_t *info);
struct opal_info_t *info);
int mca_fs_lustre_file_set_size (mca_io_ompio_file_t *fh,
OMPI_MPI_OFFSET_TYPE size);

Просмотреть файл

@ -10,6 +10,7 @@
* Copyright (c) 2004-2005 The Regents of the University of California.
* All rights reserved.
* Copyright (c) 2008-2011 University of Houston. All rights reserved.
* Copyright (c) 2016-2017 IBM Corporation. All rights reserved.
* $COPYRIGHT$
*
* Additional copyrights may follow
@ -35,7 +36,7 @@
*/
int
mca_fs_lustre_file_delete (char* file_name,
struct ompi_info_t *info)
struct opal_info_t *info)
{
int ret;

Просмотреть файл

@ -12,6 +12,7 @@
* Copyright (c) 2008-2015 University of Houston. All rights reserved.
* Copyright (c) 2015 Research Organization for Information Science
* and Technology (RIST). All rights reserved.
* Copyright (c) 2016-2017 IBM Corporation. All rights reserved.
* $COPYRIGHT$
*
* Additional copyrights may follow
@ -59,7 +60,7 @@ int
mca_fs_lustre_file_open (struct ompi_communicator_t *comm,
const char* filename,
int access_mode,
struct ompi_info_t *info,
struct opal_info_t *info,
mca_io_ompio_file_t *fh)
{
int amode;
@ -94,12 +95,12 @@ mca_fs_lustre_file_open (struct ompi_communicator_t *comm,
amode = amode | O_EXCL;
ompi_info_get (info, "stripe_size", MPI_MAX_INFO_VAL, char_stripe, &flag);
opal_info_get (info, "stripe_size", MPI_MAX_INFO_VAL, char_stripe, &flag);
if ( flag ) {
sscanf ( char_stripe, "%d", &fs_lustre_stripe_size );
}
ompi_info_get (info, "stripe_width", MPI_MAX_INFO_VAL, char_stripe, &flag);
opal_info_get (info, "stripe_width", MPI_MAX_INFO_VAL, char_stripe, &flag);
if ( flag ) {
sscanf ( char_stripe, "%d", &fs_lustre_stripe_width );
}

Просмотреть файл

@ -12,6 +12,7 @@
* Copyright (c) 2008-2016 University of Houston. All rights reserved.
* Copyright (c) 2015 Research Organization for Information Science
* and Technology (RIST). All rights reserved.
* Copyright (c) 2016-2017 IBM Corporation. All rights reserved.
* $COPYRIGHT$
*
* Additional copyrights may follow
@ -52,13 +53,13 @@ OMPI_MODULE_DECLSPEC extern mca_fs_base_component_2_0_0_t mca_fs_plfs_component;
int mca_fs_plfs_file_open (struct ompi_communicator_t *comm,
const char *filename,
int amode,
struct ompi_info_t *info,
struct opal_info_t *info,
mca_io_ompio_file_t *fh);
int mca_fs_plfs_file_close (mca_io_ompio_file_t *fh);
int mca_fs_plfs_file_delete (char *filename,
struct ompi_info_t *info);
struct opal_info_t *info);
int mca_fs_plfs_file_set_size (mca_io_ompio_file_t *fh,
OMPI_MPI_OFFSET_TYPE size);

Просмотреть файл

@ -10,6 +10,7 @@
* Copyright (c) 2004-2005 The Regents of the University of California.
* All rights reserved.
* Copyright (c) 2008-2014 University of Houston. All rights reserved.
* Copyright (c) 2016-2017 IBM Corporation. All rights reserved.
* $COPYRIGHT$
*
* Additional copyrights may follow
@ -35,7 +36,7 @@
*/
int
mca_fs_plfs_file_delete (char* file_name,
struct ompi_info_t *info)
struct opal_info_t *info)
{
plfs_error_t plfs_ret;
char wpath[1024];

Просмотреть файл

@ -12,6 +12,7 @@
* Copyright (c) 2008-2014 University of Houston. All rights reserved.
* Copyright (c) 2015 Research Organization for Information Science
* and Technology (RIST). All rights reserved.
* Copyright (c) 2016-2017 IBM Corporation. All rights reserved.
* $COPYRIGHT$
*
* Additional copyrights may follow
@ -44,7 +45,7 @@ int
mca_fs_plfs_file_open (struct ompi_communicator_t *comm,
const char* filename,
int access_mode,
struct ompi_info_t *info,
struct opal_info_t *info,
mca_io_ompio_file_t *fh)
{
int rank;

Просмотреть файл

@ -12,6 +12,7 @@
* Copyright (c) 2008-2016 University of Houston. All rights reserved.
* Copyright (c) 2015 Research Organization for Information Science
* and Technology (RIST). All rights reserved.
* Copyright (c) 2016-2017 IBM Corporation. All rights reserved.
* $COPYRIGHT$
*
* Additional copyrights may follow
@ -70,13 +71,13 @@ OMPI_MODULE_DECLSPEC extern mca_fs_base_component_2_0_0_t mca_fs_pvfs2_component
int mca_fs_pvfs2_file_open (struct ompi_communicator_t *comm,
const char *filename,
int amode,
struct ompi_info_t *info,
struct opal_info_t *info,
mca_io_ompio_file_t *fh);
int mca_fs_pvfs2_file_close (mca_io_ompio_file_t *fh);
int mca_fs_pvfs2_file_delete (char *filename,
struct ompi_info_t *info);
struct opal_info_t *info);
int mca_fs_pvfs2_file_set_size (mca_io_ompio_file_t *fh,
OMPI_MPI_OFFSET_TYPE size);

Просмотреть файл

@ -10,6 +10,7 @@
* Copyright (c) 2004-2005 The Regents of the University of California.
* All rights reserved.
* Copyright (c) 2008-2011 University of Houston. All rights reserved.
* Copyright (c) 2016-2017 IBM Corporation. All rights reserved.
* $COPYRIGHT$
*
* Additional copyrights may follow
@ -38,7 +39,7 @@
*/
int
mca_fs_pvfs2_file_delete (char* file_name,
struct ompi_info_t *info)
struct opal_info_t *info)
{
PVFS_credentials credentials;
PVFS_sysresp_getparent resp_getparent;

Просмотреть файл

@ -12,6 +12,7 @@
* Copyright (c) 2008-2014 University of Houston. All rights reserved.
* Copyright (c) 2015-2017 Research Organization for Information Science
* and Technology (RIST). All rights reserved.
* Copyright (c) 2016-2017 IBM Corporation. All rights reserved.
* $COPYRIGHT$
*
* Additional copyrights may follow
@ -60,7 +61,7 @@ int
mca_fs_pvfs2_file_open (struct ompi_communicator_t *comm,
const char* filename,
int access_mode,
struct ompi_info_t *info,
struct opal_info_t *info,
mca_io_ompio_file_t *fh)
{
int ret;
@ -108,12 +109,12 @@ mca_fs_pvfs2_file_open (struct ompi_communicator_t *comm,
update mca_fs_pvfs2_stripe_width and mca_fs_pvfs2_stripe_size
before calling fake_an_open() */
ompi_info_get (info, "stripe_size", MPI_MAX_INFO_VAL, char_stripe, &flag);
opal_info_get (info, "stripe_size", MPI_MAX_INFO_VAL, char_stripe, &flag);
if ( flag ) {
sscanf ( char_stripe, "%d", &fs_pvfs2_stripe_size );
}
ompi_info_get (info, "stripe_width", MPI_MAX_INFO_VAL, char_stripe, &flag);
opal_info_get (info, "stripe_width", MPI_MAX_INFO_VAL, char_stripe, &flag);
if ( flag ) {
sscanf ( char_stripe, "%d", &fs_pvfs2_stripe_width );
}

Просмотреть файл

@ -12,6 +12,7 @@
* Copyright (c) 2008-2016 University of Houston. All rights reserved.
* Copyright (c) 2015 Research Organization for Information Science
* and Technology (RIST). All rights reserved.
* Copyright (c) 2016-2017 IBM Corporation. All rights reserved.
* $COPYRIGHT$
*
* Additional copyrights may follow
@ -50,13 +51,13 @@ OMPI_MODULE_DECLSPEC extern mca_fs_base_component_2_0_0_t mca_fs_ufs_component;
int mca_fs_ufs_file_open (struct ompi_communicator_t *comm,
const char *filename,
int amode,
struct ompi_info_t *info,
struct opal_info_t *info,
mca_io_ompio_file_t *fh);
int mca_fs_ufs_file_close (mca_io_ompio_file_t *fh);
int mca_fs_ufs_file_delete (char *filename,
struct ompi_info_t *info);
struct opal_info_t *info);
int mca_fs_ufs_file_set_size (mca_io_ompio_file_t *fh,
OMPI_MPI_OFFSET_TYPE size);

Просмотреть файл

@ -10,6 +10,7 @@
* Copyright (c) 2004-2005 The Regents of the University of California.
* All rights reserved.
* Copyright (c) 2008-2011 University of Houston. All rights reserved.
* Copyright (c) 2016-2017 IBM Corporation. All rights reserved.
* $COPYRIGHT$
*
* Additional copyrights may follow
@ -35,7 +36,7 @@
*/
int
mca_fs_ufs_file_delete (char* file_name,
struct ompi_info_t *info)
struct opal_info_t *info)
{
int ret;

Просмотреть файл

@ -12,6 +12,7 @@
* Copyright (c) 2008-2014 University of Houston. All rights reserved.
* Copyright (c) 2015 Research Organization for Information Science
* and Technology (RIST). All rights reserved.
* Copyright (c) 2016-2017 IBM Corporation. All rights reserved.
* $COPYRIGHT$
*
* Additional copyrights may follow
@ -42,7 +43,7 @@ int
mca_fs_ufs_file_open (struct ompi_communicator_t *comm,
const char* filename,
int access_mode,
struct ompi_info_t *info,
struct opal_info_t *info,
mca_io_ompio_file_t *fh)
{
int amode;

Просмотреть файл

@ -12,6 +12,7 @@
* Copyright (c) 2008 Cisco Systems, Inc. All rights reserved.
* Copyright (c) 2015 Research Organization for Information Science
* and Technology (RIST). All rights reserved.
* Copyright (c) 2016-2017 IBM Corporation. All rights reserved.
* $COPYRIGHT$
*
* Additional copyrights may follow
@ -157,7 +158,7 @@ BEGIN_C_DECLS
* module). See io.h for details.
*/
OMPI_DECLSPEC int mca_io_base_delete(const char *filename,
struct ompi_info_t *info);
struct opal_info_t *info);
OMPI_DECLSPEC int mca_io_base_register_datarep(const char *,
MPI_Datarep_conversion_function*,

Просмотреть файл

@ -12,6 +12,7 @@
* Copyright (c) 2008 Sun Microsystems, Inc. All rights reserved.
* Copyright (c) 2015 Research Organization for Information Science
* and Technology (RIST). All rights reserved.
* Copyright (c) 2016-2017 IBM Corporation. All rights reserved.
* $COPYRIGHT$
*
* Additional copyrights may follow
@ -29,6 +30,7 @@
#include "opal/class/opal_list.h"
#include "opal/util/argv.h"
#include "opal/util/output.h"
#include "opal/util/info.h"
#include "ompi/mca/mca.h"
#include "opal/mca/base/base.h"
#include "ompi/mca/io/io.h"
@ -52,19 +54,19 @@ typedef struct avail_io_t avail_io_t;
* Local functions
*/
static opal_list_t *check_components(opal_list_t *components,
const char *filename, struct ompi_info_t *info,
const char *filename, struct opal_info_t *info,
char **names, int num_names);
static avail_io_t *check_one_component(const mca_base_component_t *component,
const char *filename, struct ompi_info_t *info);
const char *filename, struct opal_info_t *info);
static avail_io_t *query(const mca_base_component_t *component,
const char *filename, struct ompi_info_t *info);
const char *filename, struct opal_info_t *info);
static avail_io_t *query_2_0_0(const mca_io_base_component_2_0_0_t *io_component,
const char *filename, struct ompi_info_t *info);
const char *filename, struct opal_info_t *info);
static void unquery(avail_io_t *avail, const char *filename, struct ompi_info_t *info);
static void unquery(avail_io_t *avail, const char *filename, struct opal_info_t *info);
static int delete_file(avail_io_t *avail, const char *filename, struct ompi_info_t *info);
static int delete_file(avail_io_t *avail, const char *filename, struct opal_info_t *info);
/*
@ -75,7 +77,7 @@ static OBJ_CLASS_INSTANCE(avail_io_t, opal_list_item_t, NULL, NULL);
/*
*/
int mca_io_base_delete(const char *filename, struct ompi_info_t *info)
int mca_io_base_delete(const char *filename, struct opal_info_t *info)
{
int err;
opal_list_t *selectable;
@ -180,7 +182,7 @@ static int avail_io_compare (opal_list_item_t **itema,
* priority order.
*/
static opal_list_t *check_components(opal_list_t *components,
const char *filename, struct ompi_info_t *info,
const char *filename, struct opal_info_t *info,
char **names, int num_names)
{
int i;
@ -249,7 +251,7 @@ static opal_list_t *check_components(opal_list_t *components,
* Check a single component
*/
static avail_io_t *check_one_component(const mca_base_component_t *component,
const char *filename, struct ompi_info_t *info)
const char *filename, struct opal_info_t *info)
{
avail_io_t *avail;
@ -282,7 +284,7 @@ static avail_io_t *check_one_component(const mca_base_component_t *component,
* module struct
*/
static avail_io_t *query(const mca_base_component_t *component,
const char *filename, struct ompi_info_t *info)
const char *filename, struct opal_info_t *info)
{
const mca_io_base_component_2_0_0_t *ioc_200;
@ -303,7 +305,7 @@ static avail_io_t *query(const mca_base_component_t *component,
static avail_io_t *query_2_0_0(const mca_io_base_component_2_0_0_t *component,
const char *filename, struct ompi_info_t *info)
const char *filename, struct opal_info_t *info)
{
bool usable;
int priority, ret;
@ -333,7 +335,7 @@ static avail_io_t *query_2_0_0(const mca_io_base_component_2_0_0_t *component,
* Unquery functions
**************************************************************************/
static void unquery(avail_io_t *avail, const char *filename, struct ompi_info_t *info)
static void unquery(avail_io_t *avail, const char *filename, struct opal_info_t *info)
{
const mca_io_base_component_2_0_0_t *ioc_200;
@ -358,7 +360,7 @@ static void unquery(avail_io_t *avail, const char *filename, struct ompi_info_t
/*
* Invoke the component's delete function
*/
static int delete_file(avail_io_t *avail, const char *filename, struct ompi_info_t *info)
static int delete_file(avail_io_t *avail, const char *filename, struct opal_info_t *info)
{
const mca_io_base_component_2_0_0_t *ioc_200;

Просмотреть файл

@ -13,6 +13,7 @@
* Copyright (c) 2008-2011 University of Houston. All rights reserved.
* Copyright (c) 2015 Research Organization for Information Science
* and Technology (RIST). All rights reserved.
* Copyright (c) 2016-2017 IBM Corporation. All rights reserved.
* $COPYRIGHT$
*
* Additional copyrights may follow
@ -30,6 +31,7 @@
#include "ompi/file/file.h"
#include "opal/util/argv.h"
#include "opal/util/output.h"
#include "opal/util/info.h"
#include "opal/class/opal_list.h"
#include "opal/class/opal_object.h"
#include "ompi/mca/mca.h"
@ -459,7 +461,7 @@ static int module_init(ompi_file_t *file)
case MCA_IO_BASE_V_2_0_0:
iom_200 = &(file->f_io_selected_module.v2_0_0);
return iom_200->io_module_file_open(file->f_comm, file->f_filename,
file->f_amode, file->f_info,
file->f_amode, file->super.s_info,
file);
break;

Просмотреть файл

@ -16,6 +16,7 @@
* Copyright (c) 2015 University of Houston. All rights reserved.
* Copyright (c) 2015 Research Organization for Information Science
* and Technology (RIST). All rights reserved.
* Copyright (c) 2016-2017 IBM Corporation. All rights reserved.
* $COPYRIGHT$
*
* Additional copyrights may follow
@ -29,6 +30,7 @@
#include "mpi.h"
#include "ompi/mca/mca.h"
#include "ompi/request/request.h"
#include "ompi/info/info.h"
/*
* Forward declaration for private data on io components and modules.
@ -89,14 +91,14 @@ typedef int (*mca_io_base_component_file_unquery_fn_t)
(struct ompi_file_t *file, struct mca_io_base_file_t *private_data);
typedef int (*mca_io_base_component_file_delete_query_fn_t)
(const char *filename, struct ompi_info_t *info,
(const char *filename, struct opal_info_t *info,
struct mca_io_base_delete_t **private_data,
bool *usable, int *priority);
typedef int (*mca_io_base_component_file_delete_select_fn_t)
(const char *filename, struct ompi_info_t *info,
(const char *filename, struct opal_info_t *info,
struct mca_io_base_delete_t *private_data);
typedef int (*mca_io_base_component_file_delete_unselect_fn_t)
(const char *filename, struct ompi_info_t *info,
(const char *filename, struct opal_info_t *info,
struct mca_io_base_delete_t *private_data);
typedef int (*mca_io_base_component_register_datarep_fn_t)(
@ -140,7 +142,7 @@ typedef union mca_io_base_components_t mca_io_base_components_t;
typedef int (*mca_io_base_module_file_open_fn_t)
(struct ompi_communicator_t *comm, const char *filename, int amode,
struct ompi_info_t *info, struct ompi_file_t *fh);
struct opal_info_t *info, struct ompi_file_t *fh);
typedef int (*mca_io_base_module_file_close_fn_t)(struct ompi_file_t *fh);
typedef int (*mca_io_base_module_file_set_size_fn_t)
@ -151,15 +153,11 @@ typedef int (*mca_io_base_module_file_get_size_fn_t)
(struct ompi_file_t *fh, MPI_Offset *size);
typedef int (*mca_io_base_module_file_get_amode_fn_t)
(struct ompi_file_t *fh, int *amode);
typedef int (*mca_io_base_module_file_set_info_fn_t)
(struct ompi_file_t *fh, struct ompi_info_t *info);
typedef int (*mca_io_base_module_file_get_info_fn_t)
(struct ompi_file_t *fh, struct ompi_info_t **info_used);
typedef int (*mca_io_base_module_file_set_view_fn_t)
(struct ompi_file_t *fh, MPI_Offset disp, struct ompi_datatype_t *etype,
struct ompi_datatype_t *filetype, const char *datarep,
struct ompi_info_t *info);
struct opal_info_t *info);
typedef int (*mca_io_base_module_file_get_view_fn_t)
(struct ompi_file_t *fh, MPI_Offset *disp,
struct ompi_datatype_t **etype, struct ompi_datatype_t **filetype,
@ -309,8 +307,6 @@ struct mca_io_base_module_2_0_0_t {
mca_io_base_module_file_preallocate_fn_t io_module_file_preallocate;
mca_io_base_module_file_get_size_fn_t io_module_file_get_size;
mca_io_base_module_file_get_amode_fn_t io_module_file_get_amode;
mca_io_base_module_file_set_info_fn_t io_module_file_set_info;
mca_io_base_module_file_get_info_fn_t io_module_file_get_info;
mca_io_base_module_file_set_view_fn_t io_module_file_set_view;
mca_io_base_module_file_get_view_fn_t io_module_file_get_view;

Просмотреть файл

@ -13,6 +13,7 @@
* Copyright (c) 2008-2016 University of Houston. All rights reserved.
* Copyright (c) 2015-2017 Research Organization for Information Science
* and Technology (RIST). All rights reserved.
* Copyright (c) 2016-2017 IBM Corporation. All rights reserved.
* $COPYRIGHT$
*
* Additional copyrights may follow
@ -209,7 +210,7 @@ struct mca_io_ompio_file_t {
const char *f_filename;
char *f_datarep;
opal_convertor_t *f_convertor;
ompi_info_t *f_info;
opal_info_t *f_info;
int32_t f_flags;
void *f_fs_ptr;
int f_atomicity;
@ -340,7 +341,7 @@ int mca_io_ompio_file_set_view (struct ompi_file_t *fh,
struct ompi_datatype_t *etype,
struct ompi_datatype_t *filetype,
const char *datarep,
struct ompi_info_t *info);
struct opal_info_t *info);
int mca_io_ompio_file_get_view (struct ompi_file_t *fh,
OMPI_MPI_OFFSET_TYPE *disp,
@ -350,11 +351,11 @@ int mca_io_ompio_file_get_view (struct ompi_file_t *fh,
int mca_io_ompio_file_open (struct ompi_communicator_t *comm,
const char *filename,
int amode,
struct ompi_info_t *info,
struct opal_info_t *info,
struct ompi_file_t *fh);
int mca_io_ompio_file_close (struct ompi_file_t *fh);
int mca_io_ompio_file_delete (const char *filename,
struct ompi_info_t *info);
struct opal_info_t *info);
int mca_io_ompio_file_set_size (struct ompi_file_t *fh,
OMPI_MPI_OFFSET_TYPE size);
int mca_io_ompio_file_preallocate (struct ompi_file_t *fh,
@ -363,10 +364,6 @@ int mca_io_ompio_file_get_size (struct ompi_file_t *fh,
OMPI_MPI_OFFSET_TYPE * size);
int mca_io_ompio_file_get_amode (struct ompi_file_t *fh,
int *amode);
int mca_io_ompio_file_set_info (struct ompi_file_t *fh,
struct ompi_info_t *info);
int mca_io_ompio_file_get_info (struct ompi_file_t *fh,
struct ompi_info_t ** info_used);
int mca_io_ompio_file_sync (struct ompi_file_t *fh);
int mca_io_ompio_file_seek (struct ompi_file_t *fh,
OMPI_MPI_OFFSET_TYPE offet,
@ -377,7 +374,7 @@ int mca_io_ompio_file_set_view (struct ompi_file_t *fh,
struct ompi_datatype_t *etype,
struct ompi_datatype_t *filetype,
const char *datarep,
struct ompi_info_t *info);
struct opal_info_t *info);
int mca_io_ompio_file_get_view (struct ompi_file_t *fh,
OMPI_MPI_OFFSET_TYPE *disp,
struct ompi_datatype_t **etype,

Просмотреть файл

@ -15,6 +15,7 @@
* reserved.
* Copyright (c) 2015 Research Organization for Information Science
* and Technology (RIST). All rights reserved.
* Copyright (c) 2016-2017 IBM Corporation. All rights reserved.
* $COPYRIGHT$
*
* Additional copyrights may follow
@ -56,11 +57,11 @@ file_query (struct ompi_file_t *file,
static int file_unquery(struct ompi_file_t *file,
struct mca_io_base_file_t *private_data);
static int delete_query(const char *filename, struct ompi_info_t *info,
static int delete_query(const char *filename, struct opal_info_t *info,
struct mca_io_base_delete_t **private_data,
bool *usable, int *priorty);
static int delete_select(const char *filename, struct ompi_info_t *info,
static int delete_select(const char *filename, struct opal_info_t *info,
struct mca_io_base_delete_t *private_data);
static int register_datarep(const char *,
@ -321,7 +322,7 @@ static int file_unquery(struct ompi_file_t *file,
}
static int delete_query(const char *filename, struct ompi_info_t *info,
static int delete_query(const char *filename, struct opal_info_t *info,
struct mca_io_base_delete_t **private_data,
bool *usable, int *priority)
{
@ -332,7 +333,7 @@ static int delete_query(const char *filename, struct ompi_info_t *info,
return OMPI_SUCCESS;
}
static int delete_select(const char *filename, struct ompi_info_t *info,
static int delete_select(const char *filename, struct opal_info_t *info,
struct mca_io_base_delete_t *private_data)
{
int ret;

Просмотреть файл

@ -13,6 +13,7 @@
* Copyright (c) 2015 Research Organization for Information Science
* and Technology (RIST). All rights reserved.
* Copyright (c) 2016 Cisco Systems, Inc. All rights reserved.
* Copyright (c) 2016-2017 IBM Corporation. All rights reserved.
* $COPYRIGHT$
*
* Additional copyrights may follow
@ -43,7 +44,7 @@
int mca_io_ompio_file_open (ompi_communicator_t *comm,
const char *filename,
int amode,
ompi_info_t *info,
opal_info_t *info,
ompi_file_t *fh)
{
int ret = OMPI_SUCCESS;
@ -78,7 +79,6 @@ int mca_io_ompio_file_open (ompi_communicator_t *comm,
return ret;
}
int mca_io_ompio_file_close (ompi_file_t *fh)
{
int ret = OMPI_SUCCESS;
@ -103,7 +103,7 @@ int mca_io_ompio_file_close (ompi_file_t *fh)
}
int mca_io_ompio_file_delete (const char *filename,
struct ompi_info_t *info)
struct opal_info_t *info)
{
int ret = OMPI_SUCCESS;
@ -322,42 +322,6 @@ int mca_io_ompio_file_get_amode (ompi_file_t *fh,
}
int mca_io_ompio_file_set_info (ompi_file_t *fh,
ompi_info_t *info)
{
int ret = OMPI_SUCCESS;
if ( MPI_INFO_NULL == fh->f_info ) {
/* OBJ_RELEASE(MPI_INFO_NULL); */
}
else {
ompi_info_free ( &fh->f_info);
fh->f_info = OBJ_NEW(ompi_info_t);
ret = ompi_info_dup (info, &fh->f_info);
}
return ret;
}
int mca_io_ompio_file_get_info (ompi_file_t *fh,
ompi_info_t ** info_used)
{
int ret = OMPI_SUCCESS;
ompi_info_t *info=NULL;
info = OBJ_NEW(ompi_info_t);
if (NULL == info) {
return MPI_ERR_INFO;
}
if (MPI_INFO_NULL != fh->f_info) {
ret = ompi_info_dup (fh->f_info, &info);
}
*info_used = info;
return ret;
}
int mca_io_ompio_file_get_type_extent (ompi_file_t *fh,
struct ompi_datatype_t *datatype,
MPI_Aint *extent)

Просмотреть файл

@ -12,6 +12,7 @@
* Copyright (c) 2008-2016 University of Houston. All rights reserved.
* Copyright (c) 2015 Research Organization for Information Science
* and Technology (RIST). All rights reserved.
* Copyright (c) 2016-2017 IBM Corporation. All rights reserved.
* $COPYRIGHT$
*
* Additional copyrights may follow
@ -59,7 +60,7 @@ int mca_io_ompio_file_set_view (ompi_file_t *fp,
ompi_datatype_t *etype,
ompi_datatype_t *filetype,
const char *datarep,
ompi_info_t *info)
opal_info_t *info)
{
int ret=OMPI_SUCCESS;
mca_io_ompio_data_t *data;

Просмотреть файл

@ -10,6 +10,7 @@
* Copyright (c) 2004-2005 The Regents of the University of California.
* All rights reserved.
* Copyright (c) 2008-2011 University of Houston. All rights reserved.
* Copyright (c) 2016-2017 IBM Corporation. All rights reserved.
* $COPYRIGHT$
*
* Additional copyrights may follow
@ -35,8 +36,6 @@ mca_io_base_module_2_0_0_t mca_io_ompio_module = {
mca_io_ompio_file_preallocate,
mca_io_ompio_file_get_size,
mca_io_ompio_file_get_amode,
mca_io_ompio_file_set_info,
mca_io_ompio_file_get_info,
mca_io_ompio_file_set_view,
mca_io_ompio_file_get_view,

Просмотреть файл

@ -12,6 +12,7 @@
* Copyright (c) 2008 Sun Microsystems, Inc. All rights reserved.
* Copyright (c) 2015 Research Organization for Information Science
* and Technology (RIST). All rights reserved.
* Copyright (c) 2016-2017 IBM Corporation. All rights reserved.
* $COPYRIGHT$
*
* Additional copyrights may follow
@ -66,11 +67,11 @@ typedef struct mca_io_romio314_data_t mca_io_romio314_data_t;
int mca_io_romio314_file_open (struct ompi_communicator_t *comm,
const char *filename,
int amode,
struct ompi_info_t *info,
struct opal_info_t *info,
ompi_file_t *fh);
int mca_io_romio314_file_close (struct ompi_file_t *fh);
int mca_io_romio314_file_delete (const char *filename,
struct ompi_info_t *info);
struct opal_info_t *info);
int mca_io_romio314_file_set_size (struct ompi_file_t *fh,
MPI_Offset size);
int mca_io_romio314_file_preallocate (struct ompi_file_t *fh,
@ -80,9 +81,9 @@ int mca_io_romio314_file_get_size (struct ompi_file_t *fh,
int mca_io_romio314_file_get_amode (struct ompi_file_t *fh,
int *amode);
int mca_io_romio314_file_set_info (struct ompi_file_t *fh,
struct ompi_info_t *info);
struct opal_info_t *info);
int mca_io_romio314_file_get_info (struct ompi_file_t *fh,
struct ompi_info_t ** info_used);
struct opal_info_t ** info_used);
/* Section 9.3 */
int mca_io_romio314_file_set_view (struct ompi_file_t *fh,
@ -90,7 +91,7 @@ int mca_io_romio314_file_set_view (struct ompi_file_t *fh,
struct ompi_datatype_t *etype,
struct ompi_datatype_t *filetype,
const char *datarep,
struct ompi_info_t *info);
struct opal_info_t *info);
int mca_io_romio314_file_get_view (struct ompi_file_t *fh,
MPI_Offset * disp,
struct ompi_datatype_t ** etype,

Просмотреть файл

@ -15,6 +15,7 @@
* reserved.
* Copyright (c) 2015 Research Organization for Information Science
* and Technology (RIST). All rights reserved.
* Copyright (c) 2016-2017 IBM Corporation. All rights reserved.
* $COPYRIGHT$
*
* Additional copyrights may follow
@ -48,10 +49,10 @@ static const struct mca_io_base_module_2_0_0_t *
static int file_unquery(struct ompi_file_t *file,
struct mca_io_base_file_t *private_data);
static int delete_query(const char *filename, struct ompi_info_t *info,
static int delete_query(const char *filename, struct opal_info_t *info,
struct mca_io_base_delete_t **private_data,
bool *usable, int *priorty);
static int delete_select(const char *filename, struct ompi_info_t *info,
static int delete_select(const char *filename, struct opal_info_t *info,
struct mca_io_base_delete_t *private_data);
static int register_datarep(const char *,
@ -222,7 +223,7 @@ static int file_unquery(struct ompi_file_t *file,
}
static int delete_query(const char *filename, struct ompi_info_t *info,
static int delete_query(const char *filename, struct opal_info_t *info,
struct mca_io_base_delete_t **private_data,
bool *usable, int *priority)
{
@ -234,15 +235,25 @@ static int delete_query(const char *filename, struct ompi_info_t *info,
}
static int delete_select(const char *filename, struct ompi_info_t *info,
static int delete_select(const char *filename, struct opal_info_t *info,
struct mca_io_base_delete_t *private_data)
{
int ret;
// An opal_info_t isn't a full ompi_info_t. so if we're using an MPI call
// below with an MPI_Info, we need to create an equivalent MPI_Info. This
// isn't ideal but it only happens a few places.
ompi_info_t *ompi_info;
ompi_info = OBJ_NEW(ompi_info_t);
if (!ompi_info) { return(MPI_ERR_NO_MEM); }
opal_info_t *opal_info = &(ompi_info->super);
opal_info_dup (info, &opal_info);
OPAL_THREAD_LOCK (&mca_io_romio314_mutex);
ret = ROMIO_PREFIX(MPI_File_delete)(filename, info);
ret = ROMIO_PREFIX(MPI_File_delete)(filename, ompi_info);
OPAL_THREAD_UNLOCK (&mca_io_romio314_mutex);
ompi_info_free(&ompi_info);
return ret;
}

Просмотреть файл

@ -11,6 +11,7 @@
* All rights reserved.
* Copyright (c) 2015 Research Organization for Information Science
* and Technology (RIST). All rights reserved.
* Copyright (c) 2016-2017 IBM Corporation. All rights reserved.
* $COPYRIGHT$
*
* Additional copyrights may follow
@ -31,18 +32,28 @@ int
mca_io_romio314_file_open (ompi_communicator_t *comm,
const char *filename,
int amode,
ompi_info_t *info,
opal_info_t *info,
ompi_file_t *fh)
{
int ret;
mca_io_romio314_data_t *data;
// An opal_info_t isn't a full ompi_info_t. so if we're using an MPI call
// below with an MPI_Info, we need to create an equivalent MPI_Info. This
// isn't ideal but it only happens a few places.
ompi_info_t *ompi_info;
ompi_info = OBJ_NEW(ompi_info_t);
if (!ompi_info) { return(MPI_ERR_NO_MEM); }
opal_info_t *opal_info = &(ompi_info->super);
opal_info_dup (info, &opal_info);
data = (mca_io_romio314_data_t *) fh->f_io_selected_data;
// OPAL_THREAD_LOCK (&mca_io_romio314_mutex);
ret = ROMIO_PREFIX(MPI_File_open)(comm, filename, amode, info,
ret = ROMIO_PREFIX(MPI_File_open)(comm, filename, amode, ompi_info,
&data->romio_fh);
// OPAL_THREAD_UNLOCK (&mca_io_romio314_mutex);
ompi_info_free(&ompi_info);
return ret;
}
@ -149,32 +160,51 @@ mca_io_romio314_file_get_amode (ompi_file_t *fh,
int
mca_io_romio314_file_set_info (ompi_file_t *fh,
ompi_info_t *info)
opal_info_t *info)
{
int ret;
mca_io_romio314_data_t *data;
// An opal_info_t isn't a full ompi_info_t. so if we're using an MPI call
// below with an MPI_Info, we need to create an equivalent MPI_Info. This
// isn't ideal but it only happens a few places.
ompi_info_t *ompi_info;
ompi_info = OBJ_NEW(ompi_info_t);
if (!ompi_info) { return(MPI_ERR_NO_MEM); }
opal_info_t *opal_info = &(ompi_info->super);
opal_info_dup (info, &opal_info);
data = (mca_io_romio314_data_t *) fh->f_io_selected_data;
OPAL_THREAD_LOCK (&mca_io_romio314_mutex);
ret = ROMIO_PREFIX(MPI_File_set_info) (data->romio_fh, info);
ret = ROMIO_PREFIX(MPI_File_set_info) (data->romio_fh, ompi_info);
OPAL_THREAD_UNLOCK (&mca_io_romio314_mutex);
ompi_info_free(&ompi_info);
return ret;
}
int
mca_io_romio314_file_get_info (ompi_file_t *fh,
ompi_info_t ** info_used)
opal_info_t ** info_used)
{
int ret;
mca_io_romio314_data_t *data;
// An opal_info_t isn't a full ompi_info_t. so if we're using an MPI call
// below with an MPI_Info, we need to create an equivalent MPI_Info. This
// isn't ideal but it only happens a few places.
ompi_info_t *ompi_info;
ompi_info = OBJ_NEW(ompi_info_t);
if (!ompi_info) { return(MPI_ERR_NO_MEM); }
data = (mca_io_romio314_data_t *) fh->f_io_selected_data;
OPAL_THREAD_LOCK (&mca_io_romio314_mutex);
ret = ROMIO_PREFIX(MPI_File_get_info) (data->romio_fh, info_used);
ret = ROMIO_PREFIX(MPI_File_get_info) (data->romio_fh, &ompi_info);
OPAL_THREAD_UNLOCK (&mca_io_romio314_mutex);
opal_info_dup (&(ompi_info->super), info_used);
ompi_info_free(&ompi_info);
return ret;
}
@ -185,18 +215,28 @@ mca_io_romio314_file_set_view (ompi_file_t *fh,
struct ompi_datatype_t *etype,
struct ompi_datatype_t *filetype,
const char *datarep,
ompi_info_t *info)
opal_info_t *info)
{
int ret;
mca_io_romio314_data_t *data;
// An opal_info_t isn't a full ompi_info_t. so if we're using an MPI call
// below with an MPI_Info, we need to create an equivalent MPI_Info. This
// isn't ideal but it only happens a few places.
ompi_info_t *ompi_info;
ompi_info = OBJ_NEW(ompi_info_t);
if (!ompi_info) { return(MPI_ERR_NO_MEM); }
opal_info_t *opal_info = &(ompi_info->super);
opal_info_dup (info, &opal_info);
data = (mca_io_romio314_data_t *) fh->f_io_selected_data;
OPAL_THREAD_LOCK (&mca_io_romio314_mutex);
ret =
ROMIO_PREFIX(MPI_File_set_view) (data->romio_fh, disp, etype, filetype,
datarep, info);
datarep, ompi_info);
OPAL_THREAD_UNLOCK (&mca_io_romio314_mutex);
ompi_info_free(&ompi_info);
return ret;
}

Просмотреть файл

@ -11,6 +11,7 @@
* All rights reserved.
* Copyright (c) 2008 Sun Microsystems, Inc. All rights reserved.
* Copyright (c) 2008 Cisco Systems, Inc. All rights reserved.
* Copyright (c) 2017 IBM Corp. All rights reserved.
* $COPYRIGHT$
*
* Additional copyrights may follow
@ -47,8 +48,6 @@ mca_io_base_module_2_0_0_t mca_io_romio314_module = {
mca_io_romio314_file_preallocate,
mca_io_romio314_file_get_size,
mca_io_romio314_file_get_amode,
mca_io_romio314_file_set_info,
mca_io_romio314_file_get_info,
mca_io_romio314_file_set_view,
mca_io_romio314_file_get_view,

Просмотреть файл

@ -7,6 +7,7 @@
* University of Stuttgart. All rights reserved.
* Copyright (c) 2004-2005 The Regents of the University of California.
* All rights reserved.
* Copyright (c) 2016-2017 IBM Corporation. All rights reserved.
* $COPYRIGHT$
*
* Additional copyrights may follow
@ -41,7 +42,7 @@ int ompi_osc_base_select(ompi_win_t *win,
size_t size,
int disp_unit,
ompi_communicator_t *comm,
ompi_info_t *info,
opal_info_t *info,
int flavor,
int *model);

Просмотреть файл

@ -10,6 +10,7 @@
* All rights reserved.
* Copyright (c) 2014 Los Alamos National Security, LLC. All rights
* reserved.
* Copyright (c) 2016-2017 IBM Corporation. All rights reserved.
* $COPYRIGHT$
*
* Additional copyrights may follow
@ -34,7 +35,7 @@ ompi_osc_base_select(ompi_win_t *win,
size_t size,
int disp_unit,
ompi_communicator_t *comm,
ompi_info_t *info,
opal_info_t *info,
int flavor,
int *model)
{

Просмотреть файл

@ -13,6 +13,7 @@
* Copyright (c) 2010 Cisco Systems, Inc. All rights reserved.
* Copyright (c) 2015-2017 Research Organization for Information Science
* and Technology (RIST). All rights reserved.
* Copyright (c) 2016-2017 IBM Corporation. All rights reserved.
* $COPYRIGHT$
*
* Additional copyrights may follow
@ -45,7 +46,7 @@ BEGIN_C_DECLS
struct ompi_win_t;
struct ompi_info_t;
struct opal_info_t;
struct ompi_communicator_t;
struct ompi_group_t;
struct ompi_datatype_t;
@ -116,7 +117,7 @@ typedef int (*ompi_osc_base_component_query_fn_t)(struct ompi_win_t *win,
size_t size,
int disp_unit,
struct ompi_communicator_t *comm,
struct ompi_info_t *info,
struct opal_info_t *info,
int flavor);
/**
@ -148,7 +149,7 @@ typedef int (*ompi_osc_base_component_select_fn_t)(struct ompi_win_t *win,
size_t size,
int disp_unit,
struct ompi_communicator_t *comm,
struct ompi_info_t *info,
struct opal_info_t *info,
int flavor,
int *model);
@ -352,9 +353,6 @@ typedef int (*ompi_osc_base_module_flush_local_fn_t)(int target,
struct ompi_win_t *win);
typedef int (*ompi_osc_base_module_flush_local_all_fn_t)(struct ompi_win_t *win);
typedef int (*ompi_osc_base_module_set_info_fn_t)(struct ompi_win_t *win, struct ompi_info_t *info);
typedef int (*ompi_osc_base_module_get_info_fn_t)(struct ompi_win_t *win, struct ompi_info_t **info_used);
/* ******************************************************************** */
@ -406,9 +404,6 @@ struct ompi_osc_base_module_3_0_0_t {
ompi_osc_base_module_flush_all_fn_t osc_flush_all;
ompi_osc_base_module_flush_local_fn_t osc_flush_local;
ompi_osc_base_module_flush_local_all_fn_t osc_flush_local_all;
ompi_osc_base_module_set_info_fn_t osc_set_info;
ompi_osc_base_module_get_info_fn_t osc_get_info;
};
typedef struct ompi_osc_base_module_3_0_0_t ompi_osc_base_module_3_0_0_t;
typedef ompi_osc_base_module_3_0_0_t ompi_osc_base_module_t;

Просмотреть файл

@ -5,6 +5,7 @@
* reserved.
* Copyright (c) 2015-2017 Research Organization for Information Science
* and Technology (RIST). All rights reserved.
* Copyright (c) 2016-2017 IBM Corporation. All rights reserved.
* $COPYRIGHT$
*
* Additional copyrights may follow
@ -281,8 +282,8 @@ int ompi_osc_portals4_flush_local(int target,
struct ompi_win_t *win);
int ompi_osc_portals4_flush_local_all(struct ompi_win_t *win);
int ompi_osc_portals4_set_info(struct ompi_win_t *win, struct ompi_info_t *info);
int ompi_osc_portals4_get_info(struct ompi_win_t *win, struct ompi_info_t **info_used);
int ompi_osc_portals4_set_info(struct ompi_win_t *win, struct opal_info_t *info);
int ompi_osc_portals4_get_info(struct ompi_win_t *win, struct opal_info_t **info_used);
static inline int
ompi_osc_portals4_complete_all(ompi_osc_portals4_module_t *module)

Просмотреть файл

@ -8,6 +8,7 @@
* Copyright (c) 2017 The University of Tennessee and The University
* of Tennessee Research Foundation. All rights
* reserved.
* Copyright (c) 2016-2017 IBM Corporation. All rights reserved.
* $COPYRIGHT$
*
* Additional copyrights may follow
@ -30,10 +31,10 @@ static int component_register(void);
static int component_init(bool enable_progress_threads, bool enable_mpi_threads);
static int component_finalize(void);
static int component_query(struct ompi_win_t *win, void **base, size_t size, int disp_unit,
struct ompi_communicator_t *comm, struct ompi_info_t *info,
struct ompi_communicator_t *comm, struct opal_info_t *info,
int flavor);
static int component_select(struct ompi_win_t *win, void **base, size_t size, int disp_unit,
struct ompi_communicator_t *comm, struct ompi_info_t *info,
struct ompi_communicator_t *comm, struct opal_info_t *info,
int flavor, int *model);
@ -108,14 +109,14 @@ ompi_osc_portals4_module_t ompi_osc_portals4_module_template = {
looks in the info structure passed by the user, then through mca
parameters. */
static bool
check_config_value_bool(char *key, ompi_info_t *info)
check_config_value_bool(char *key, opal_info_t *info)
{
char *value_string;
int value_len, ret, flag, param;
const bool *flag_value;
bool result;
ret = ompi_info_get_valuelen(info, key, &value_len, &flag);
ret = opal_info_get_valuelen(info, key, &value_len, &flag);
if (OMPI_SUCCESS != ret) goto info_not_found;
if (flag == 0) goto info_not_found;
value_len++;
@ -123,13 +124,13 @@ check_config_value_bool(char *key, ompi_info_t *info)
value_string = (char*)malloc(sizeof(char) * value_len + 1); /* Should malloc 1 char for NUL-termination */
if (NULL == value_string) goto info_not_found;
ret = ompi_info_get(info, key, value_len, value_string, &flag);
ret = opal_info_get(info, key, value_len, value_string, &flag);
if (OMPI_SUCCESS != ret) {
free(value_string);
goto info_not_found;
}
assert(flag != 0);
ret = ompi_info_value_to_bool(value_string, &result);
ret = opal_info_value_to_bool(value_string, &result);
free(value_string);
if (OMPI_SUCCESS != ret) goto info_not_found;
return result;
@ -146,14 +147,14 @@ check_config_value_bool(char *key, ompi_info_t *info)
static bool
check_config_value_equal(char *key, ompi_info_t *info, char *value)
check_config_value_equal(char *key, opal_info_t *info, char *value)
{
char *value_string;
int value_len, ret, flag, param;
const bool *flag_value;
bool result = false;
ret = ompi_info_get_valuelen(info, key, &value_len, &flag);
ret = opal_info_get_valuelen(info, key, &value_len, &flag);
if (OMPI_SUCCESS != ret) goto info_not_found;
if (flag == 0) goto info_not_found;
value_len++;
@ -161,7 +162,7 @@ check_config_value_equal(char *key, ompi_info_t *info, char *value)
value_string = (char*)malloc(sizeof(char) * value_len + 1); /* Should malloc 1 char for NUL-termination */
if (NULL == value_string) goto info_not_found;
ret = ompi_info_get(info, key, value_len, value_string, &flag);
ret = opal_info_get(info, key, value_len, value_string, &flag);
if (OMPI_SUCCESS != ret) {
free(value_string);
goto info_not_found;
@ -382,7 +383,7 @@ component_finalize(void)
static int
component_query(struct ompi_win_t *win, void **base, size_t size, int disp_unit,
struct ompi_communicator_t *comm, struct ompi_info_t *info,
struct ompi_communicator_t *comm, struct opal_info_t *info,
int flavor)
{
int ret;
@ -403,7 +404,7 @@ component_query(struct ompi_win_t *win, void **base, size_t size, int disp_unit,
static int
component_select(struct ompi_win_t *win, void **base, size_t size, int disp_unit,
struct ompi_communicator_t *comm, struct ompi_info_t *info,
struct ompi_communicator_t *comm, struct opal_info_t *info,
int flavor, int *model)
{
ompi_osc_portals4_module_t *module = NULL;
@ -684,7 +685,7 @@ ompi_osc_portals4_free(struct ompi_win_t *win)
int
ompi_osc_portals4_set_info(struct ompi_win_t *win, struct ompi_info_t *info)
ompi_osc_portals4_set_info(struct ompi_win_t *win, struct opal_info_t *info)
{
ompi_osc_portals4_module_t *module =
(ompi_osc_portals4_module_t*) win->w_osc_module;
@ -696,19 +697,19 @@ ompi_osc_portals4_set_info(struct ompi_win_t *win, struct ompi_info_t *info)
int
ompi_osc_portals4_get_info(struct ompi_win_t *win, struct ompi_info_t **info_used)
ompi_osc_portals4_get_info(struct ompi_win_t *win, struct opal_info_t **info_used)
{
ompi_osc_portals4_module_t *module =
(ompi_osc_portals4_module_t*) win->w_osc_module;
ompi_info_t *info = OBJ_NEW(ompi_info_t);
opal_info_t *info = OBJ_NEW(opal_info_t);
if (NULL == info) return OMPI_ERR_TEMP_OUT_OF_RESOURCE;
ompi_info_set(info, "no_locks", (module->state.lock == LOCK_ILLEGAL) ? "true" : "false");
opal_info_set(info, "no_locks", (module->state.lock == LOCK_ILLEGAL) ? "true" : "false");
if (module->atomic_max < mca_osc_portals4_component.matching_atomic_max) {
ompi_info_set(info, "accumulate_ordering", "none");
opal_info_set(info, "accumulate_ordering", "none");
} else {
ompi_info_set(info, "accumulate_ordering", "rar,war,raw,waw");
opal_info_set(info, "accumulate_ordering", "rar,war,raw,waw");
}
*info_used = info;

Просмотреть файл

@ -15,6 +15,7 @@
* Copyright (c) 2015-2017 Research Organization for Information Science
* and Technology (RIST). All rights reserved.
* Copyright (c) 2016 FUJITSU LIMITED. All rights reserved.
* Copyright (c) 2016-2017 IBM Corporation. All rights reserved.
* $COPYRIGHT$
*
* Additional copyrights may follow
@ -470,8 +471,8 @@ int ompi_osc_pt2pt_flush_local(int target,
struct ompi_win_t *win);
int ompi_osc_pt2pt_flush_local_all(struct ompi_win_t *win);
int ompi_osc_pt2pt_set_info(struct ompi_win_t *win, struct ompi_info_t *info);
int ompi_osc_pt2pt_get_info(struct ompi_win_t *win, struct ompi_info_t **info_used);
int ompi_osc_pt2pt_set_info(struct ompi_win_t *win, struct opal_info_t *info);
int ompi_osc_pt2pt_get_info(struct ompi_win_t *win, struct opal_info_t **info_used);
int ompi_osc_pt2pt_component_irecv(ompi_osc_pt2pt_module_t *module,
void *buf,

Просмотреть файл

@ -16,6 +16,7 @@
* Copyright (c) 2012-2013 Sandia National Laboratories. All rights reserved.
* Copyright (c) 2015-2016 Research Organization for Information Science
* and Technology (RIST). All rights reserved.
* Copyright (c) 2016-2017 IBM Corporation. All rights reserved.
* $COPYRIGHT$
*
* Additional copyrights may follow
@ -38,10 +39,10 @@ static int component_register(void);
static int component_init(bool enable_progress_threads, bool enable_mpi_threads);
static int component_finalize(void);
static int component_query(struct ompi_win_t *win, void **base, size_t size, int disp_unit,
struct ompi_communicator_t *comm, struct ompi_info_t *info,
struct ompi_communicator_t *comm, struct opal_info_t *info,
int flavor);
static int component_select(struct ompi_win_t *win, void **base, size_t size, int disp_unit,
struct ompi_communicator_t *comm, struct ompi_info_t *info,
struct ompi_communicator_t *comm, struct opal_info_t *info,
int flavor, int *model);
ompi_osc_pt2pt_component_t mca_osc_pt2pt_component = {
@ -103,9 +104,6 @@ ompi_osc_pt2pt_module_t ompi_osc_pt2pt_module_template = {
ompi_osc_pt2pt_flush_all,
ompi_osc_pt2pt_flush_local,
ompi_osc_pt2pt_flush_local_all,
ompi_osc_pt2pt_set_info,
ompi_osc_pt2pt_get_info
}
};
@ -114,11 +112,11 @@ bool ompi_osc_pt2pt_no_locks = false;
/* look up parameters for configuring this window. The code first
looks in the info structure passed by the user, then through mca
parameters. */
static bool check_config_value_bool(char *key, ompi_info_t *info, bool result)
static bool check_config_value_bool(char *key, opal_info_t *info, bool result)
{
int flag;
(void) ompi_info_get_bool (info, key, &result, &flag);
(void) opal_info_get_bool (info, key, &result, &flag);
return result;
}
@ -282,7 +280,7 @@ component_finalize(void)
static int
component_query(struct ompi_win_t *win, void **base, size_t size, int disp_unit,
struct ompi_communicator_t *comm, struct ompi_info_t *info,
struct ompi_communicator_t *comm, struct opal_info_t *info,
int flavor)
{
if (MPI_WIN_FLAVOR_SHARED == flavor) return -1;
@ -293,7 +291,7 @@ component_query(struct ompi_win_t *win, void **base, size_t size, int disp_unit,
static int
component_select(struct ompi_win_t *win, void **base, size_t size, int disp_unit,
struct ompi_communicator_t *comm, struct ompi_info_t *info,
struct ompi_communicator_t *comm, struct opal_info_t *info,
int flavor, int *model)
{
ompi_osc_pt2pt_module_t *module = NULL;
@ -442,7 +440,7 @@ component_select(struct ompi_win_t *win, void **base, size_t size, int disp_unit
int
ompi_osc_pt2pt_set_info(struct ompi_win_t *win, struct ompi_info_t *info)
ompi_osc_pt2pt_set_info(struct ompi_win_t *win, struct opal_info_t *info)
{
ompi_osc_pt2pt_module_t *module =
(ompi_osc_pt2pt_module_t*) win->w_osc_module;
@ -454,9 +452,9 @@ ompi_osc_pt2pt_set_info(struct ompi_win_t *win, struct ompi_info_t *info)
int
ompi_osc_pt2pt_get_info(struct ompi_win_t *win, struct ompi_info_t **info_used)
ompi_osc_pt2pt_get_info(struct ompi_win_t *win, struct opal_info_t **info_used)
{
ompi_info_t *info = OBJ_NEW(ompi_info_t);
opal_info_t *info = OBJ_NEW(opal_info_t);
if (NULL == info) return OMPI_ERR_TEMP_OUT_OF_RESOURCE;
*info_used = info;

Просмотреть файл

@ -16,6 +16,7 @@
* Copyright (c) 2012-2015 Sandia National Laboratories. All rights reserved.
* Copyright (c) 2015 NVIDIA Corporation. All rights reserved.
* Copyright (c) 2015 Intel, Inc. All rights reserved.
* Copyright (c) 2016-2017 IBM Corporation. All rights reserved.
* $COPYRIGHT$
*
* Additional copyrights may follow
@ -43,6 +44,7 @@
#if OPAL_CUDA_SUPPORT
#include "opal/datatype/opal_datatype_cuda.h"
#endif /* OPAL_CUDA_SUPPORT */
#include "opal/util/info_subscriber.h"
#include "ompi/info/info.h"
#include "ompi/communicator/communicator.h"
@ -58,17 +60,19 @@ static int ompi_osc_rdma_component_register (void);
static int ompi_osc_rdma_component_init (bool enable_progress_threads, bool enable_mpi_threads);
static int ompi_osc_rdma_component_finalize (void);
static int ompi_osc_rdma_component_query (struct ompi_win_t *win, void **base, size_t size, int disp_unit,
struct ompi_communicator_t *comm, struct ompi_info_t *info,
struct ompi_communicator_t *comm, struct opal_info_t *info,
int flavor);
static int ompi_osc_rdma_component_select (struct ompi_win_t *win, void **base, size_t size, int disp_unit,
struct ompi_communicator_t *comm, struct ompi_info_t *info,
struct ompi_communicator_t *comm, struct opal_info_t *info,
int flavor, int *model);
static int ompi_osc_rdma_set_info (struct ompi_win_t *win, struct ompi_info_t *info);
static int ompi_osc_rdma_get_info (struct ompi_win_t *win, struct ompi_info_t **info_used);
static int ompi_osc_rdma_set_info (struct ompi_win_t *win, struct opal_info_t *info);
static int ompi_osc_rdma_get_info (struct ompi_win_t *win, struct opal_info_t **info_used);
static int ompi_osc_rdma_query_btls (ompi_communicator_t *comm, struct mca_btl_base_module_t **btl);
static char* ompi_osc_rdma_set_no_lock_info(opal_infosubscriber_t *obj, char *key, char *value);
static char *ompi_osc_rdma_btl_names;
ompi_osc_rdma_component_t mca_osc_rdma_component = {
@ -126,21 +130,18 @@ ompi_osc_base_module_t ompi_osc_rdma_module_rdma_template = {
.osc_flush_all = ompi_osc_rdma_flush_all,
.osc_flush_local = ompi_osc_rdma_flush_local,
.osc_flush_local_all = ompi_osc_rdma_flush_local_all,
.osc_set_info = ompi_osc_rdma_set_info,
.osc_get_info = ompi_osc_rdma_get_info
};
/* look up parameters for configuring this window. The code first
looks in the info structure passed by the user, then it checks
for a matching MCA variable. */
static bool check_config_value_bool (char *key, ompi_info_t *info)
static bool check_config_value_bool (char *key, opal_info_t *info)
{
int ret, flag, param;
bool result = false;
const bool *flag_value = &result;
ret = ompi_info_get_bool (info, key, &result, &flag);
ret = opal_info_get_bool (info, key, &result, &flag);
if (OMPI_SUCCESS == ret && flag) {
return result;
}
@ -322,7 +323,7 @@ int ompi_osc_rdma_component_finalize (void)
static int ompi_osc_rdma_component_query (struct ompi_win_t *win, void **base, size_t size, int disp_unit,
struct ompi_communicator_t *comm, struct ompi_info_t *info,
struct ompi_communicator_t *comm, struct opal_info_t *info,
int flavor)
{
@ -1014,7 +1015,7 @@ static int ompi_osc_rdma_check_parameters (ompi_osc_rdma_module_t *module, int d
static int ompi_osc_rdma_component_select (struct ompi_win_t *win, void **base, size_t size, int disp_unit,
struct ompi_communicator_t *comm, struct ompi_info_t *info,
struct ompi_communicator_t *comm, struct opal_info_t *info,
int flavor, int *model)
{
ompi_osc_rdma_module_t *module = NULL;
@ -1117,6 +1118,15 @@ static int ompi_osc_rdma_component_select (struct ompi_win_t *win, void **base,
} else {
module->state_size += mca_osc_rdma_component.max_attach * module->region_size;
}
/*
* These are the info's that this module is interested in
*/
opal_infosubscribe_subscribe(&win->super, "no_locks", "false", ompi_osc_rdma_set_no_lock_info);
/*
* TODO: same_size, same_disp_unit have w_flag entries, but do not appear
* to be used anywhere. If that changes, they should be subscribed
*/
/* fill in the function pointer part */
memcpy(&module->super, &ompi_osc_rdma_module_rdma_template, sizeof(module->super));
@ -1201,7 +1211,42 @@ static int ompi_osc_rdma_component_select (struct ompi_win_t *win, void **base,
}
static int ompi_osc_rdma_set_info (struct ompi_win_t *win, struct ompi_info_t *info)
static char* ompi_osc_rdma_set_no_lock_info(opal_infosubscriber_t *obj, char *key, char *value)
{
struct ompi_win_t *win = (struct ompi_win_t*) obj;
ompi_osc_rdma_module_t *module = GET_MODULE(win);
bool temp;
temp = opal_str_to_bool(value);
if (temp && !module->no_locks) {
/* clean up the lock hash. it is up to the user to ensure no lock is
* outstanding from this process when setting the info key */
OBJ_DESTRUCT(&module->outstanding_locks);
OBJ_CONSTRUCT(&module->outstanding_locks, opal_hash_table_t);
module->no_locks = true;
} else if (!temp && module->no_locks) {
int world_size = ompi_comm_size (module->comm);
int init_limit = world_size > 256 ? 256 : world_size;
int ret;
ret = opal_hash_table_init (&module->outstanding_locks, init_limit);
if (OPAL_SUCCESS != ret) {
module->no_locks = true;
}
module->no_locks = false;
}
/* enforce collectiveness... */
module->comm->c_coll->coll_barrier(module->comm, module->comm->c_coll->coll_barrier_module);
/*
* Accept any value
*/
return module->no_locks ? "true" : "false";
}
static int ompi_osc_rdma_set_info (struct ompi_win_t *win, struct opal_info_t *info)
{
ompi_osc_rdma_module_t *module = GET_MODULE(win);
bool temp;
@ -1235,9 +1280,9 @@ static int ompi_osc_rdma_set_info (struct ompi_win_t *win, struct ompi_info_t *i
}
static int ompi_osc_rdma_get_info (struct ompi_win_t *win, struct ompi_info_t **info_used)
static int ompi_osc_rdma_get_info (struct ompi_win_t *win, struct opal_info_t **info_used)
{
ompi_info_t *info = OBJ_NEW(ompi_info_t);
opal_info_t *info = OBJ_NEW(opal_info_t);
if (NULL == info) {
return OMPI_ERR_TEMP_OUT_OF_RESOURCE;

Просмотреть файл

@ -5,6 +5,7 @@
* reserved.
* Copyright (c) 2015-2017 Research Organization for Information Science
* and Technology (RIST). All rights reserved.
* Copyright (c) 2016-2017 IBM Corporation. All rights reserved.
* $COPYRIGHT$
*
* Additional copyrights may follow
@ -235,7 +236,7 @@ int ompi_osc_sm_flush_local(int target,
struct ompi_win_t *win);
int ompi_osc_sm_flush_local_all(struct ompi_win_t *win);
int ompi_osc_sm_set_info(struct ompi_win_t *win, struct ompi_info_t *info);
int ompi_osc_sm_get_info(struct ompi_win_t *win, struct ompi_info_t **info_used);
int ompi_osc_sm_set_info(struct ompi_win_t *win, struct opal_info_t *info);
int ompi_osc_sm_get_info(struct ompi_win_t *win, struct opal_info_t **info_used);
#endif

Просмотреть файл

@ -10,6 +10,7 @@
* Copyright (c) 2017 The University of Tennessee and The University
* of Tennessee Research Foundation. All rights
* reserved.
* Copyright (c) 2016-2017 IBM Corporation. All rights reserved.
* $COPYRIGHT$
*
* Additional copyrights may follow
@ -25,6 +26,7 @@
#include "ompi/request/request.h"
#include "opal/util/sys_limits.h"
#include "opal/include/opal/align.h"
#include "opal/util/info_subscriber.h"
#include "osc_sm.h"
@ -32,11 +34,13 @@ static int component_open(void);
static int component_init(bool enable_progress_threads, bool enable_mpi_threads);
static int component_finalize(void);
static int component_query(struct ompi_win_t *win, void **base, size_t size, int disp_unit,
struct ompi_communicator_t *comm, struct ompi_info_t *info,
struct ompi_communicator_t *comm, struct opal_info_t *info,
int flavor);
static int component_select(struct ompi_win_t *win, void **base, size_t size, int disp_unit,
struct ompi_communicator_t *comm, struct ompi_info_t *info,
struct ompi_communicator_t *comm, struct opal_info_t *info,
int flavor, int *model);
static char* component_set_blocking_fence_info(opal_infosubscriber_t *obj, char *key, char *val);
static char* component_set_alloc_shared_noncontig_info(opal_infosubscriber_t *obj, char *key, char *val);
ompi_osc_sm_component_t mca_osc_sm_component = {
@ -98,9 +102,6 @@ ompi_osc_sm_module_t ompi_osc_sm_module_template = {
.osc_flush_all = ompi_osc_sm_flush_all,
.osc_flush_local = ompi_osc_sm_flush_local,
.osc_flush_local_all = ompi_osc_sm_flush_local_all,
.osc_set_info = ompi_osc_sm_set_info,
.osc_get_info = ompi_osc_sm_get_info
}
};
@ -146,7 +147,7 @@ check_win_ok(ompi_communicator_t *comm, int flavor)
static int
component_query(struct ompi_win_t *win, void **base, size_t size, int disp_unit,
struct ompi_communicator_t *comm, struct ompi_info_t *info,
struct ompi_communicator_t *comm, struct opal_info_t *info,
int flavor)
{
int ret;
@ -163,7 +164,7 @@ component_query(struct ompi_win_t *win, void **base, size_t size, int disp_unit,
static int
component_select(struct ompi_win_t *win, void **base, size_t size, int disp_unit,
struct ompi_communicator_t *comm, struct ompi_info_t *info,
struct ompi_communicator_t *comm, struct opal_info_t *info,
int flavor, int *model)
{
ompi_osc_sm_module_t *module = NULL;
@ -181,6 +182,17 @@ component_select(struct ompi_win_t *win, void **base, size_t size, int disp_unit
OBJ_CONSTRUCT(&module->lock, opal_mutex_t);
ret = opal_infosubscribe_subscribe(&(win->super), "blocking_fence", "false",
component_set_blocking_fence_info);
module->global_state->use_barrier_for_fence = 1;
if (OPAL_SUCCESS != ret) goto error;
ret = opal_infosubscribe_subscribe(&(win->super), "alloc_shared_contig", "false", component_set_alloc_shared_noncontig_info);
if (OPAL_SUCCESS != ret) goto error;
/* fill in the function pointer part */
memcpy(module, &ompi_osc_sm_module_template,
sizeof(ompi_osc_base_module_t));
@ -227,7 +239,7 @@ component_select(struct ompi_win_t *win, void **base, size_t size, int disp_unit
if (NULL == rbuf) return OMPI_ERR_TEMP_OUT_OF_RESOURCE;
module->noncontig = false;
if (OMPI_SUCCESS != ompi_info_get_bool(info, "alloc_shared_noncontig",
if (OMPI_SUCCESS != opal_info_get_bool(info, "alloc_shared_noncontig",
&module->noncontig, &flag)) {
goto error;
}
@ -344,7 +356,7 @@ component_select(struct ompi_win_t *win, void **base, size_t size, int disp_unit
bool blocking_fence=false;
int flag;
if (OMPI_SUCCESS != ompi_info_get_bool(info, "blocking_fence",
if (OMPI_SUCCESS != opal_info_get_bool(info, "blocking_fence",
&blocking_fence, &flag)) {
goto error;
}
@ -497,7 +509,7 @@ ompi_osc_sm_free(struct ompi_win_t *win)
int
ompi_osc_sm_set_info(struct ompi_win_t *win, struct ompi_info_t *info)
ompi_osc_sm_set_info(struct ompi_win_t *win, struct opal_info_t *info)
{
ompi_osc_sm_module_t *module =
(ompi_osc_sm_module_t*) win->w_osc_module;
@ -508,19 +520,42 @@ ompi_osc_sm_set_info(struct ompi_win_t *win, struct ompi_info_t *info)
}
static char*
component_set_blocking_fence_info(opal_infosubscriber_t *obj, char *key, char *val)
{
ompi_osc_sm_module_t *module = (ompi_osc_sm_module_t*) ((struct ompi_win_t*) obj)->w_osc_module;
/*
* Assuming that you can't change the default.
*/
return module->global_state->use_barrier_for_fence ? "true" : "false";
}
static char*
component_set_alloc_shared_noncontig_info(opal_infosubscriber_t *obj, char *key, char *val)
{
ompi_osc_sm_module_t *module = (ompi_osc_sm_module_t*) ((struct ompi_win_t*) obj)->w_osc_module;
/*
* Assuming that you can't change the default.
*/
return module->noncontig ? "true" : "false";
}
int
ompi_osc_sm_get_info(struct ompi_win_t *win, struct ompi_info_t **info_used)
ompi_osc_sm_get_info(struct ompi_win_t *win, struct opal_info_t **info_used)
{
ompi_osc_sm_module_t *module =
(ompi_osc_sm_module_t*) win->w_osc_module;
ompi_info_t *info = OBJ_NEW(ompi_info_t);
opal_info_t *info = OBJ_NEW(opal_info_t);
if (NULL == info) return OMPI_ERR_TEMP_OUT_OF_RESOURCE;
if (module->flavor == MPI_WIN_FLAVOR_SHARED) {
ompi_info_set(info, "blocking_fence",
opal_info_set(info, "blocking_fence",
(1 == module->global_state->use_barrier_for_fence) ? "true" : "false");
ompi_info_set(info, "alloc_shared_noncontig",
opal_info_set(info, "alloc_shared_noncontig",
(module->noncontig) ? "true" : "false");
}

Просмотреть файл

@ -6,6 +6,7 @@
* Copyright (c) 2014-2016 Research Organization for Information Science
* and Technology (RIST). All rights reserved.
* Copyright (c) 2015 Intel, Inc. All rights reserved.
* Copyright (c) 2016-2017 IBM Corporation. All rights reserved.
* $COPYRIGHT$
*
* Additional copyrights may follow
@ -37,7 +38,6 @@ struct opal_proc_t;
#include "orte/util/name_fns.h"
#include "orte/util/proc_info.h"
#include "ompi/info/info.h"
struct ompi_proc_t;
struct ompi_communicator_t;

Просмотреть файл

@ -10,6 +10,7 @@
* Copyright (c) 2004-2005 The Regents of the University of California.
* All rights reserved.
* Copyright (c) 2013-2016 University of Houston. All rights reserved.
* Copyright (c) 2016-2017 IBM Corporation. All rights reserved.
* $COPYRIGHT$
*
* Additional copyrights may follow
@ -58,7 +59,7 @@ int mca_sharedfp_addproc_get_position (mca_io_ompio_file_t *fh,
int mca_sharedfp_addproc_file_open (struct ompi_communicator_t *comm,
const char* filename,
int amode,
struct ompi_info_t *info,
struct opal_info_t *info,
mca_io_ompio_file_t *fh);
int mca_sharedfp_addproc_file_close (mca_io_ompio_file_t *fh);
int mca_sharedfp_addproc_read (mca_io_ompio_file_t *fh,

Просмотреть файл

@ -10,6 +10,7 @@
* Copyright (c) 2004-2005 The Regents of the University of California.
* All rights reserved.
* Copyright (c) 2013-2016 University of Houston. All rights reserved.
* Copyright (c) 2016-2017 IBM Corporation. All rights reserved.
* $COPYRIGHT$
*
* Additional copyrights may follow
@ -34,7 +35,7 @@
int mca_sharedfp_addproc_file_open (struct ompi_communicator_t *comm,
const char* filename,
int amode,
struct ompi_info_t *info,
struct opal_info_t *info,
mca_io_ompio_file_t *fh)
{
int ret = OMPI_SUCCESS, err;

Просмотреть файл

@ -10,6 +10,7 @@
* Copyright (c) 2004-2005 The Regents of the University of California.
* All rights reserved.
* Copyright (c) 2013-2015 University of Houston. All rights reserved.
* Copyright (c) 2016-2017 IBM Corporation. All rights reserved.
* $COPYRIGHT$
*
* Additional copyrights may follow
@ -72,7 +73,7 @@ struct mca_sharedfp_base_module_1_0_0_t * mca_sharedfp_individual_component_file
int amode;
bool wronly_flag=false;
bool relaxed_order_flag=false;
MPI_Info info;
opal_info_t *info;
int flag;
int valuelen;
char value[MPI_MAX_INFO_VAL+1];
@ -101,9 +102,9 @@ struct mca_sharedfp_base_module_1_0_0_t * mca_sharedfp_individual_component_file
/*---------------------------------------------------------*/
/* 2. Did the user specify MPI_INFO relaxed ordering flag? */
info = fh->f_info;
if ( info != MPI_INFO_NULL ){
if ( info != &(MPI_INFO_NULL->super) ){
valuelen = MPI_MAX_INFO_VAL;
ompi_info_get ( info,"OMPIO_SHAREDFP_RELAXED_ORDERING", valuelen, value, &flag);
opal_info_get ( info,"OMPIO_SHAREDFP_RELAXED_ORDERING", valuelen, value, &flag);
if ( flag ) {
if ( mca_sharedfp_individual_verbose ) {
opal_output(ompi_sharedfp_base_framework.framework_output,

Просмотреть файл

@ -12,6 +12,7 @@
* Copyright (c) 2013-2016 University of Houston. All rights reserved.
* Copyright (c) 2015 Research Organization for Information Science
* and Technology (RIST). All rights reserved.
* Copyright (c) 2016-2017 IBM Corporation. All rights reserved.
* $COPYRIGHT$
*
* Additional copyrights may follow
@ -57,7 +58,7 @@ int mca_sharedfp_individual_seek (mca_io_ompio_file_t *fh,
int mca_sharedfp_individual_file_open (struct ompi_communicator_t *comm,
const char* filename,
int amode,
struct ompi_info_t *info,
struct opal_info_t *info,
mca_io_ompio_file_t *fh);
int mca_sharedfp_individual_file_close (mca_io_ompio_file_t *fh);
int mca_sharedfp_individual_read (mca_io_ompio_file_t *fh,

Просмотреть файл

@ -12,6 +12,7 @@
* Copyright (c) 2013-2016 University of Houston. All rights reserved.
* Copyright (c) 2015 Research Organization for Information Science
* and Technology (RIST). All rights reserved.
* Copyright (c) 2016-2017 IBM Corporation. All rights reserved.
* $COPYRIGHT$
*
* Additional copyrights may follow
@ -33,7 +34,7 @@
int mca_sharedfp_individual_file_open (struct ompi_communicator_t *comm,
const char* filename,
int amode,
struct ompi_info_t *info,
struct opal_info_t *info,
mca_io_ompio_file_t *fh)
{
int err = 0;
@ -113,7 +114,7 @@ int mca_sharedfp_individual_file_open (struct ompi_communicator_t *comm,
}
err = mca_common_ompio_file_open(MPI_COMM_SELF, datafilename,
MPI_MODE_RDWR | MPI_MODE_CREATE | MPI_MODE_DELETE_ON_CLOSE,
MPI_INFO_NULL, datafilehandle, false);
&(MPI_INFO_NULL->super), datafilehandle, false);
if ( OMPI_SUCCESS != err) {
opal_output(0, "mca_sharedfp_individual_file_open: Error during datafile file open\n");
free (shfileHandle );
@ -156,7 +157,7 @@ int mca_sharedfp_individual_file_open (struct ompi_communicator_t *comm,
}
err = mca_common_ompio_file_open ( MPI_COMM_SELF,metadatafilename,
MPI_MODE_RDWR | MPI_MODE_CREATE | MPI_MODE_DELETE_ON_CLOSE,
MPI_INFO_NULL, metadatafilehandle, false);
&(MPI_INFO_NULL->super), metadatafilehandle, false);
if ( OMPI_SUCCESS != err) {
opal_output(0, "mca_sharedfp_individual_file_open: Error during metadatafile file open\n");
free (shfileHandle );

Просмотреть файл

@ -12,6 +12,7 @@
* Copyright (c) 2013-2016 University of Houston. All rights reserved.
* Copyright (c) 2015 Research Organization for Information Science
* and Technology (RIST). All rights reserved.
* Copyright (c) 2016-2017 IBM Corporation. All rights reserved.
* $COPYRIGHT$
*
* Additional copyrights may follow
@ -57,7 +58,7 @@ int mca_sharedfp_lockedfile_get_position (mca_io_ompio_file_t *fh,
int mca_sharedfp_lockedfile_file_open (struct ompi_communicator_t *comm,
const char* filename,
int amode,
struct ompi_info_t *info,
struct opal_info_t *info,
mca_io_ompio_file_t *fh);
int mca_sharedfp_lockedfile_file_close (mca_io_ompio_file_t *fh);
int mca_sharedfp_lockedfile_read (mca_io_ompio_file_t *fh,

Просмотреть файл

@ -12,6 +12,7 @@
* Copyright (c) 2013-2017 University of Houston. All rights reserved.
* Copyright (c) 2015 Research Organization for Information Science
* and Technology (RIST). All rights reserved.
* Copyright (c) 2016-2017 IBM Corporation. All rights reserved.
* $COPYRIGHT$
*
* Additional copyrights may follow
@ -38,7 +39,7 @@
int mca_sharedfp_lockedfile_file_open (struct ompi_communicator_t *comm,
const char* filename,
int amode,
struct ompi_info_t *info,
struct opal_info_t *info,
mca_io_ompio_file_t *fh)
{
int err = MPI_SUCCESS;
@ -67,7 +68,7 @@ int mca_sharedfp_lockedfile_file_open (struct ompi_communicator_t *comm,
ompio_fh->f_etype,
ompio_fh->f_orig_filetype,
ompio_fh->f_datarep,
MPI_INFO_NULL);
&(MPI_INFO_NULL->super));
/*Memory is allocated here for the sh structure*/

Просмотреть файл

@ -15,6 +15,7 @@
* reserved.
* Copyright (c) 2015 Research Organization for Information Science
* and Technology (RIST). All rights reserved.
* Copyright (c) 2016-2017 IBM Corporation. All rights reserved.
* $COPYRIGHT$
*
* Additional copyrights may follow
@ -30,6 +31,7 @@
#include "ompi/mca/mca.h"
#include "opal/mca/base/base.h"
#include "ompi/request/request.h"
#include "ompi/info/info.h"
BEGIN_C_DECLS
@ -176,7 +178,7 @@ typedef int (*mca_sharedfp_base_module_read_ordered_end_fn_t)(
ompi_status_public_t *status);
typedef int (*mca_sharedfp_base_module_file_open_fn_t)(
struct ompi_communicator_t *comm, const char *filename, int amode,
struct ompi_info_t *info, struct mca_io_ompio_file_t *fh);
struct opal_info_t *info, struct mca_io_ompio_file_t *fh);
typedef int (*mca_sharedfp_base_module_file_close_fn_t)(struct mca_io_ompio_file_t *fh);

Просмотреть файл

@ -13,6 +13,7 @@
* Copyright (c) 2015 Cisco Systems, Inc. All rights reserved.
* Copyright (c) 2015 Research Organization for Information Science
* and Technology (RIST). All rights reserved.
* Copyright (c) 2016-2017 IBM Corporation. All rights reserved.
* $COPYRIGHT$
*
* Additional copyrights may follow
@ -57,7 +58,7 @@ int mca_sharedfp_sm_get_position (mca_io_ompio_file_t *fh,
int mca_sharedfp_sm_file_open (struct ompi_communicator_t *comm,
const char* filename,
int amode,
struct ompi_info_t *info,
struct opal_info_t *info,
mca_io_ompio_file_t *fh);
int mca_sharedfp_sm_file_close (mca_io_ompio_file_t *fh);
int mca_sharedfp_sm_read (mca_io_ompio_file_t *fh,

Просмотреть файл

@ -14,6 +14,7 @@
* Copyright (c) 2015 Research Organization for Information Science
* and Technology (RIST). All rights reserved.
* Copyright (c) 2015 Cisco Systems, Inc. All rights reserved.
* Copyright (c) 2016-2017 IBM Corporation. All rights reserved.
* $COPYRIGHT$
*
* Additional copyrights may follow
@ -48,7 +49,7 @@
int mca_sharedfp_sm_file_open (struct ompi_communicator_t *comm,
const char* filename,
int amode,
struct ompi_info_t *info,
struct opal_info_t *info,
mca_io_ompio_file_t *fh)
{
int err = OMPI_SUCCESS;
@ -86,7 +87,7 @@ int mca_sharedfp_sm_file_open (struct ompi_communicator_t *comm,
ompio_fh->f_etype,
ompio_fh->f_orig_filetype,
ompio_fh->f_datarep,
MPI_INFO_NULL);
&(MPI_INFO_NULL->super));
/*Memory is allocated here for the sh structure*/
if ( mca_sharedfp_sm_verbose ) {

Просмотреть файл

@ -15,6 +15,7 @@
* Copyright (c) 2012-2013 Inria. All rights reserved.
* Copyright (c) 2014-2015 Research Organization for Information Science
* and Technology (RIST). All rights reserved.
* Copyright (c) 2016-2017 IBM Corporation. All rights reserved.
* $COPYRIGHT$
*
* Additional copyrights may follow
@ -171,7 +172,7 @@ mca_topo_base_dist_graph_create(mca_topo_base_module_t* module,
ompi_communicator_t *old_comm,
int n, const int nodes[],
const int degrees[], const int targets[], const int weights[],
ompi_info_t *info, int reorder,
opal_info_t *info, int reorder,
ompi_communicator_t **new_comm);
OMPI_DECLSPEC int
@ -180,7 +181,7 @@ mca_topo_base_dist_graph_create_adjacent(mca_topo_base_module_t* module,
int indegree, const int sources[],
const int sourceweights[], int outdegree,
const int destinations[], const int destweights[],
ompi_info_t *info, int reorder,
opal_info_t *info, int reorder,
ompi_communicator_t **comm_dist_graph);
OMPI_DECLSPEC int

Просмотреть файл

@ -10,7 +10,7 @@
* Copyright (c) 2011-2013 Université Bordeaux 1
* Copyright (c) 2014-2015 Research Organization for Information Science
* and Technology (RIST). All rights reserved.
* Copyright (c) 2016 IBM Corporation. All rights reserved.
* Copyright (c) 2016-2017 IBM Corporation. All rights reserved.
*/
#include "ompi_config.h"
@ -284,7 +284,7 @@ int mca_topo_base_dist_graph_create(mca_topo_base_module_t* module,
int n, const int nodes[],
const int degrees[], const int targets[],
const int weights[],
ompi_info_t *info, int reorder,
opal_info_t *info, int reorder,
ompi_communicator_t **newcomm)
{
int err;
@ -295,6 +295,14 @@ int mca_topo_base_dist_graph_create(mca_topo_base_module_t* module,
OBJ_RELEASE(module);
return err;
}
// But if there is an info object, the above call didn't make use
// of it, so we'll do a dup-with-info to get the final comm and
// free the above intermediate newcomm:
if (info && info != &(MPI_INFO_NULL->super)) {
ompi_communicator_t *intermediate_comm = *newcomm;
ompi_comm_dup_with_info (intermediate_comm, info, newcomm);
ompi_comm_free(&intermediate_comm);
}
assert(NULL == (*newcomm)->c_topo);
(*newcomm)->c_topo = module;

Просмотреть файл

@ -10,6 +10,7 @@
* Copyright (c) 2011-2013 Université Bordeaux 1
* Copyright (c) 2014-2015 Research Organization for Information Science
* and Technology (RIST). All rights reserved.
* Copyright (c) 2017 IBM Corp. All rights reserved.
*/
#include "ompi_config.h"
@ -26,7 +27,7 @@ int mca_topo_base_dist_graph_create_adjacent(mca_topo_base_module_t* module,
int outdegree,
const int destinations[],
const int destweights[],
ompi_info_t *info, int reorder,
opal_info_t *info, int reorder,
ompi_communicator_t **newcomm)
{
mca_topo_base_comm_dist_graph_2_2_0_t *topo = NULL;
@ -37,6 +38,15 @@ int mca_topo_base_dist_graph_create_adjacent(mca_topo_base_module_t* module,
newcomm)) ) {
return err;
}
// But if there is an info object, the above call didn't make use
// of it, so we'll do a dup-with-info to get the final comm and
// free the above intermediate newcomm:
if (info && info != &(MPI_INFO_NULL->super)) {
ompi_communicator_t *intermediate_comm = *newcomm;
ompi_comm_dup_with_info (intermediate_comm, info, newcomm);
ompi_comm_free(&intermediate_comm);
}
err = OMPI_ERR_OUT_OF_RESOURCE; /* suppose by default something bad will happens */
assert( NULL == (*newcomm)->c_topo );

Просмотреть файл

@ -16,6 +16,7 @@
* and Technology (RIST). All rights reserved.
* Copyright (c) 2015 Los Alamos National Security, LLC. All rights
* reserved.
* Copyright (c) 2016-2017 IBM Corporation. All rights reserved.
* $COPYRIGHT$
*
* Additional copyrights may follow
@ -252,7 +253,7 @@ typedef int (*mca_topo_base_module_dist_graph_create_fn_t)
struct ompi_communicator_t *old_comm,
int n, const int nodes[],
const int degrees[], const int targets[], const int weights[],
struct ompi_info_t *info, int reorder,
struct opal_info_t *info, int reorder,
struct ompi_communicator_t **new_comm);
/* Back end for MPI_DIST_GRAPH_CREATE_ADJACENT */
@ -264,7 +265,7 @@ typedef int (*mca_topo_base_module_dist_graph_create_adjacent_fn_t)
int outdegree,
const int destinations[],
const int destweights[],
struct ompi_info_t *info, int reorder,
struct opal_info_t *info, int reorder,
ompi_communicator_t **comm_dist_graph);
/* Back end for MPI_DIST_GRAPH_NEIGHBORS */

Просмотреть файл

@ -6,6 +6,7 @@
* Copyright (c) 2011-2015 Bordeaux Polytechnic Institute
* Copyright (c) 2015 Research Organization for Information Science
* and Technology (RIST). All rights reserved.
* Copyright (c) 2016-2017 IBM Corporation. All rights reserved.
* $COPYRIGHT$
*
* Additional copyrights may follow
@ -69,7 +70,7 @@ int mca_topo_treematch_dist_graph_create(mca_topo_base_module_t* module,
int n, const int nodes[],
const int degrees[], const int targets[],
const int weights[],
struct ompi_info_t *info, int reorder,
struct opal_info_t *info, int reorder,
ompi_communicator_t **newcomm);
/*
* ******************************************************************

Просмотреть файл

@ -11,6 +11,7 @@
* Copyright (c) 2016 Los Alamos National Security, LLC. All rights
* reserved.
* Copyright (c) 2017 Cisco Systems, Inc. All rights reserved
* Copyright (c) 2016-2017 IBM Corporation. All rights reserved.
* $COPYRIGHT$
*
* Additional copyrights may follow
@ -119,7 +120,7 @@ int mca_topo_treematch_dist_graph_create(mca_topo_base_module_t* topo_module,
int n, const int nodes[],
const int degrees[], const int targets[],
const int weights[],
struct ompi_info_t *info, int reorder,
struct opal_info_t *info, int reorder,
ompi_communicator_t **newcomm)
{
int err;

Просмотреть файл

@ -16,6 +16,7 @@
* reserved.
* Copyright (c) 2015 Research Organization for Information Science
* and Technology (RIST). All rights reserved.
* Copyright (c) 2016-2017 IBM Corporation. All rights reserved.
* $COPYRIGHT$
*
* Additional copyrights may follow
@ -67,7 +68,7 @@ int MPI_Comm_dup_with_info(MPI_Comm comm, MPI_Info info, MPI_Comm *newcomm)
OPAL_CR_ENTER_LIBRARY();
rc = ompi_comm_dup_with_info (comm, info, newcomm);
rc = ompi_comm_dup_with_info (comm, &info->super, newcomm);
OMPI_ERRHANDLER_RETURN(rc, comm, rc, FUNC_NAME);
}

Просмотреть файл

@ -3,6 +3,7 @@
* Copyright (c) 2014 Cisco Systems, Inc. All rights reserved.
* Copyright (c) 2015 Research Organization for Information Science
* and Technology (RIST). All rights reserved.
* Copyright (c) 2016-2017 IBM Corporation. All rights reserved.
* $COPYRIGHT$
*
* Additional copyrights may follow
@ -46,13 +47,22 @@ int MPI_Comm_get_info(MPI_Comm comm, MPI_Info *info_used)
}
}
/* At the moment, we do not support any communicator hints. So
just return a new, empty info obect handle. */
if (NULL == comm->super.s_info) {
/*
* Setup any defaults if MPI_Win_set_info was never called
*/
opal_infosubscribe_change_info(&comm->super, &MPI_INFO_NULL->super);
}
(*info_used) = OBJ_NEW(ompi_info_t);
if (NULL == (*info_used)) {
return OMPI_ERRHANDLER_INVOKE(MPI_COMM_WORLD, MPI_ERR_NO_MEM,
return OMPI_ERRHANDLER_INVOKE(MPI_COMM_WORLD, MPI_ERR_NO_MEM,
FUNC_NAME);
}
opal_info_t *opal_info_used = &(*info_used)->super;
opal_info_dup_mpistandard(comm->super.s_info, &opal_info_used);
return MPI_SUCCESS;
}

Просмотреть файл

@ -3,6 +3,7 @@
* Copyright (c) 2014 Cisco Systems, Inc. All rights reserved.
* Copyright (c) 2015 Research Organization for Information Science
* and Technology (RIST). All rights reserved.
* Copyright (c) 2016-2017 IBM Corporation. All rights reserved.
* $COPYRIGHT$
*
* Additional copyrights may follow
@ -16,7 +17,7 @@
#include "ompi/runtime/params.h"
#include "ompi/communicator/communicator.h"
#include "ompi/errhandler/errhandler.h"
#include "ompi/info/info.h"
#include "opal/util/info_subscriber.h"
#include <stdlib.h>
#include <string.h>
@ -47,7 +48,9 @@ int MPI_Comm_set_info(MPI_Comm comm, MPI_Info info)
}
}
/* At the moment, we do not support any communicator hints.
So... do nothing */
OPAL_CR_ENTER_LIBRARY();
opal_infosubscribe_change_info(&(comm->super), &(info->super));
return MPI_SUCCESS;
}

Просмотреть файл

@ -13,6 +13,7 @@
* Copyright (c) 2012 Sandia National Laboratories. All rights reserved.
* Copyright (c) 2015 Research Organization for Information Science
* and Technology (RIST). All rights reserved.
* Copyright (c) 2017 IBM Corporation. All rights reserved.
* $COPYRIGHT$
*
* Additional copyrights may follow
@ -92,7 +93,7 @@ int MPI_Comm_split_type(MPI_Comm comm, int split_type, int key,
*newcomm = MPI_COMM_NULL;
rc = MPI_SUCCESS;
} else {
rc = ompi_comm_split_type( (ompi_communicator_t*)comm, split_type, key, info,
rc = ompi_comm_split_type( (ompi_communicator_t*)comm, split_type, key, &(info->super),
(ompi_communicator_t**)newcomm);
}
OMPI_ERRHANDLER_RETURN ( rc, comm, rc, FUNC_NAME);

Просмотреть файл

@ -8,6 +8,7 @@
* reserved.
* Copyright (c) 2015 Research Organization for Information Science
* and Technology (RIST). All rights reserved.
* Copyright (c) 2017 IBM Corporation. All rights reserved.
* $COPYRIGHT$
*
* Additional copyrights may follow
@ -88,7 +89,7 @@ int MPI_Dist_graph_create(MPI_Comm comm_old, int n, const int sources[],
}
err = topo->topo.dist_graph.dist_graph_create(topo, comm_old, n, sources, degrees,
destinations, weights, info,
destinations, weights, &(info->super),
reorder, newcomm);
OMPI_ERRHANDLER_RETURN(err, comm_old, err, FUNC_NAME);
}

Просмотреть файл

@ -12,6 +12,7 @@
* Copyright (c) 2012-2013 Inria. All rights reserved.
* Copyright (c) 2015 Research Organization for Information Science
* and Technology (RIST). All rights reserved.
* Copyright (c) 2017 IBM Corporation. All rights reserved.
* $COPYRIGHT$
*
* Additional copyrights may follow
@ -100,7 +101,7 @@ int MPI_Dist_graph_create_adjacent(MPI_Comm comm_old,
err = topo->topo.dist_graph.dist_graph_create_adjacent(topo, comm_old, indegree,
sources, sourceweights, outdegree,
destinations, destweights, info,
destinations, destweights, &(info->super),
reorder, comm_dist_graph);
OMPI_ERRHANDLER_RETURN(err, comm_old, err, FUNC_NAME);
}

Просмотреть файл

@ -14,6 +14,7 @@
* reserved.
* Copyright (c) 2015 Research Organization for Information Science
* and Technology (RIST). All rights reserved.
* Copyright (c) 2017 IBM Corporation. All rights reserved.
* $COPYRIGHT$
*
* Additional copyrights may follow
@ -78,6 +79,6 @@ int MPI_File_delete(const char *filename, MPI_Info info)
/* Since there is no MPI_File handle associated with this
function, the MCA has to do a selection and perform the
action */
rc = mca_io_base_delete(filename, info);
rc = mca_io_base_delete(filename, &(info->super));
OMPI_ERRHANDLER_RETURN(rc, MPI_FILE_NULL, rc, FUNC_NAME);
}

Просмотреть файл

@ -12,6 +12,7 @@
* Copyright (c) 2008 Sun Microsystems, Inc. All rights reserved.
* Copyright (c) 2015 Research Organization for Information Science
* and Technology (RIST). All rights reserved.
* Copyright (c) 2016-2017 IBM Corporation. All rights reserved.
* $COPYRIGHT$
*
* Additional copyrights may follow
@ -24,6 +25,7 @@
#include "ompi/mpi/c/bindings.h"
#include "ompi/runtime/params.h"
#include "ompi/errhandler/errhandler.h"
#include "ompi/communicator/communicator.h"
#include "ompi/file/file.h"
#if OMPI_BUILD_MPI_PROFILING
@ -38,36 +40,34 @@ static const char FUNC_NAME[] = "MPI_File_get_info";
int MPI_File_get_info(MPI_File fh, MPI_Info *info_used)
{
int rc;
OPAL_CR_NOOP_PROGRESS();
if (MPI_PARAM_CHECK) {
rc = MPI_SUCCESS;
OMPI_ERR_INIT_FINALIZE(FUNC_NAME);
if (ompi_file_invalid(fh)) {
rc = MPI_ERR_FILE;
fh = MPI_FILE_NULL;
} else if (NULL == info_used) {
rc = MPI_ERR_ARG;
if (NULL == info_used) {
return OMPI_ERRHANDLER_INVOKE(fh, MPI_ERR_INFO, FUNC_NAME);
}
if (ompi_file_invalid(fh)) {
return OMPI_ERRHANDLER_INVOKE(MPI_COMM_WORLD, MPI_ERR_COMM,
FUNC_NAME);
}
OMPI_ERRHANDLER_CHECK(rc, fh, rc, FUNC_NAME);
}
OPAL_CR_ENTER_LIBRARY();
/* Call the back-end io component function */
switch (fh->f_io_version) {
case MCA_IO_BASE_V_2_0_0:
rc = fh->f_io_selected_module.v2_0_0.
io_module_file_get_info(fh, info_used);
break;
default:
rc = MPI_ERR_INTERN;
break;
if (NULL == fh->super.s_info) {
/*
* Setup any defaults if MPI_Win_set_info was never called
*/
opal_infosubscribe_change_info(&fh->super, &MPI_INFO_NULL->super);
}
/* All done */
OMPI_ERRHANDLER_RETURN(rc, fh, rc, FUNC_NAME);
(*info_used) = OBJ_NEW(ompi_info_t);
if (NULL == (*info_used)) {
return OMPI_ERRHANDLER_INVOKE(fh, MPI_ERR_NO_MEM, FUNC_NAME);
}
opal_info_t *opal_info_used = &(*info_used)->super;
opal_info_dup_mpistandard(fh->super.s_info, &opal_info_used);
return OMPI_SUCCESS;
}

Просмотреть файл

@ -16,6 +16,7 @@
* Copyright (c) 2015 Research Organization for Information Science
* and Technology (RIST). All rights reserved.
* Copyright (c) 2016 University of Houston. All rights reserved.
* Copyright (c) 2017 IBM Corporation. All rights reserved.
* $COPYRIGHT$
*
* Additional copyrights may follow
@ -105,7 +106,7 @@ int MPI_File_open(MPI_Comm comm, const char *filename, int amode,
/* Create an empty MPI_File handle */
*fh = MPI_FILE_NULL;
rc = ompi_file_open(comm, filename, amode, info, fh);
rc = ompi_file_open(comm, filename, amode, &(info->super), fh);
/* Creating the file handle also selects a component to use,
creates a module, and calls file_open() on the module. So

Просмотреть файл

@ -12,6 +12,7 @@
* Copyright (c) 2008 Sun Microsystems, Inc. All rights reserved.
* Copyright (c) 2015 Research Organization for Information Science
* and Technology (RIST). All rights reserved.
* Copyright (c) 2016-2017 IBM Corporation. All rights reserved.
* $COPYRIGHT$
*
* Additional copyrights may follow
@ -25,6 +26,8 @@
#include "ompi/runtime/params.h"
#include "ompi/errhandler/errhandler.h"
#include "ompi/info/info.h"
#include "ompi/communicator/communicator.h"
#include "opal/util/info_subscriber.h"
#include "ompi/file/file.h"
#if OMPI_BUILD_MPI_PROFILING
@ -39,34 +42,27 @@ static const char FUNC_NAME[] = "MPI_File_set_info";
int MPI_File_set_info(MPI_File fh, MPI_Info info)
{
int rc;
int ret;
OPAL_CR_NOOP_PROGRESS();
if (MPI_PARAM_CHECK) {
rc = MPI_SUCCESS;
OMPI_ERR_INIT_FINALIZE(FUNC_NAME);
if (ompi_file_invalid(fh)) {
fh = MPI_FILE_NULL;
rc = MPI_ERR_FILE;
return OMPI_ERRHANDLER_INVOKE(MPI_COMM_WORLD, MPI_ERR_FILE, FUNC_NAME);
}
if (NULL == info || MPI_INFO_NULL == info ||
ompi_info_is_freed(info)) {
return OMPI_ERRHANDLER_INVOKE(fh, MPI_ERR_INFO,
FUNC_NAME);
}
OMPI_ERRHANDLER_CHECK(rc, fh, rc, FUNC_NAME);
}
OPAL_CR_ENTER_LIBRARY();
/* Call the back-end io component function */
ret = opal_infosubscribe_change_info(&fh->super, &info->super);
switch (fh->f_io_version) {
case MCA_IO_BASE_V_2_0_0:
rc = fh->f_io_selected_module.v2_0_0.
io_module_file_set_info(fh, info);
break;
default:
rc = MPI_ERR_INTERN;
break;
}
/* All done */
OMPI_ERRHANDLER_RETURN(rc, fh, rc, FUNC_NAME);
OMPI_ERRHANDLER_RETURN(ret, fh, ret, FUNC_NAME);
}

Просмотреть файл

@ -15,6 +15,7 @@
* reserved.
* Copyright (c) 2015 Research Organization for Information Science
* and Technology (RIST). All rights reserved.
* Copyright (c) 2017 IBM Corporation. All rights reserved.
* $COPYRIGHT$
*
* Additional copyrights may follow
@ -73,7 +74,7 @@ int MPI_File_set_view(MPI_File fh, MPI_Offset disp, MPI_Datatype etype,
switch (fh->f_io_version) {
case MCA_IO_BASE_V_2_0_0:
rc = fh->f_io_selected_module.v2_0_0.
io_module_file_set_view(fh, disp, etype, filetype, datarep, info);
io_module_file_set_view(fh, disp, etype, filetype, datarep, &(info->super));
break;
default:

Просмотреть файл

@ -14,6 +14,7 @@
* reserved.
* Copyright (c) 2015 Research Organization for Information Science
* and Technology (RIST). All rights reserved.
* Copyright (c) 2016-2017 IBM Corporation. All rights reserved.
* $COPYRIGHT$
*
* Additional copyrights may follow
@ -100,6 +101,6 @@ int MPI_Info_get(MPI_Info info, const char *key, int valuelen,
OPAL_CR_ENTER_LIBRARY();
err = ompi_info_get (info, key, valuelen, value, flag);
err = ompi_info_get(info, key, valuelen, value, flag);
OMPI_ERRHANDLER_RETURN(err, MPI_COMM_WORLD, err, FUNC_NAME);
}

Просмотреть файл

@ -12,6 +12,7 @@
* Copyright (c) 2006 Cisco Systems, Inc. All rights reserved.
* Copyright (c) 2015 Research Organization for Information Science
* and Technology (RIST). All rights reserved.
* Copyright (c) 2017 IBM Corporation. All rights reserved.
* $COPYRIGHT$
*
* Additional copyrights may follow
@ -77,7 +78,7 @@ int MPI_Win_allocate(MPI_Aint size, int disp_unit, MPI_Info info,
OPAL_CR_ENTER_LIBRARY();
/* create window and return */
ret = ompi_win_allocate((size_t)size, disp_unit, info,
ret = ompi_win_allocate((size_t)size, disp_unit, &(info->super),
comm, baseptr, win);
if (OMPI_SUCCESS != ret) {
*win = MPI_WIN_NULL;

Просмотреть файл

@ -15,6 +15,7 @@
* reserved.
* Copyright (c) 2015 Research Organization for Information Science
* and Technology (RIST). All rights reserved.
* Copyright (c) 2017 IBM Corporation. All rights reserved.
* $COPYRIGHT$
*
* Additional copyrights may follow
@ -78,7 +79,7 @@ int MPI_Win_allocate_shared(MPI_Aint size, int disp_unit, MPI_Info info,
OPAL_CR_ENTER_LIBRARY();
/* create window and return */
ret = ompi_win_allocate_shared((size_t)size, disp_unit, info,
ret = ompi_win_allocate_shared((size_t)size, disp_unit, &(info->super),
comm, baseptr, win);
if (OMPI_SUCCESS != ret) {
*win = MPI_WIN_NULL;

Просмотреть файл

@ -12,6 +12,7 @@
* Copyright (c) 2006 Cisco Systems, Inc. All rights reserved.
* Copyright (c) 2015 Research Organization for Information Science
* and Technology (RIST). All rights reserved.
* Copyright (c) 2017 IBM Corporation. All rights reserved.
* $COPYRIGHT$
*
* Additional copyrights may follow
@ -78,7 +79,7 @@ int MPI_Win_create(void *base, MPI_Aint size, int disp_unit,
/* create window and return */
ret = ompi_win_create(base, (size_t)size, disp_unit, comm,
info, win);
&(info->super), win);
if (OMPI_SUCCESS != ret) {
*win = MPI_WIN_NULL;
OPAL_CR_EXIT_LIBRARY();

Просмотреть файл

@ -12,6 +12,7 @@
* Copyright (c) 2006 Cisco Systems, Inc. All rights reserved.
* Copyright (c) 2015 Research Organization for Information Science
* and Technology (RIST). All rights reserved.
* Copyright (c) 2017 IBM Corporation. All rights reserved.
* $COPYRIGHT$
*
* Additional copyrights may follow
@ -73,7 +74,7 @@ int MPI_Win_create_dynamic(MPI_Info info, MPI_Comm comm, MPI_Win *win)
OPAL_CR_ENTER_LIBRARY();
/* create_dynamic window and return */
ret = ompi_win_create_dynamic(info, comm, win);
ret = ompi_win_create_dynamic(&(info->super), comm, win);
if (OMPI_SUCCESS != ret) {
*win = MPI_WIN_NULL;
OPAL_CR_EXIT_LIBRARY();

Просмотреть файл

@ -5,6 +5,7 @@
* reserved.
* Copyright (c) 2015 Research Organization for Information Science
* and Technology (RIST). All rights reserved.
* Copyright (c) 2016-2017 IBM Corporation. All rights reserved.
* $COPYRIGHT$
*
* Additional copyrights may follow
@ -18,6 +19,8 @@
#include "ompi/runtime/params.h"
#include "ompi/errhandler/errhandler.h"
#include "ompi/win/win.h"
#include "opal/util/info.h"
#include "opal/util/info_subscriber.h"
#if OMPI_BUILD_MPI_PROFILING
#if OPAL_HAVE_WEAK_SYMBOLS
@ -28,15 +31,12 @@
static const char FUNC_NAME[] = "MPI_Win_get_info";
static void _win_info_set (ompi_info_t *info, const char *key, int set)
{
ompi_info_set (info, key, set ? "true" : "false");
}
int MPI_Win_get_info(MPI_Win win, MPI_Info *info_used)
{
int ret;
OPAL_CR_NOOP_PROGRESS();
if (MPI_PARAM_CHECK) {
OMPI_ERR_INIT_FINALIZE(FUNC_NAME);
@ -49,18 +49,20 @@ int MPI_Win_get_info(MPI_Win win, MPI_Info *info_used)
}
}
OPAL_CR_ENTER_LIBRARY();
ret = win->w_osc_module->osc_get_info(win, info_used);
if (OMPI_SUCCESS == ret && *info_used) {
/* set standard info keys based on what the OSC module is using */
_win_info_set (*info_used, "no_locks", win->w_flags & OMPI_WIN_NO_LOCKS);
_win_info_set (*info_used, "same_size", win->w_flags & OMPI_WIN_SAME_SIZE);
_win_info_set (*info_used, "same_disp_unit", win->w_flags & OMPI_WIN_SAME_DISP);
ompi_info_set_value_enum (*info_used, "accumulate_ops", win->w_acc_ops, ompi_win_accumulate_ops);
if (NULL == win->super.s_info) {
/*
* Setup any defaults if MPI_Win_set_info was never called
*/
opal_infosubscribe_change_info(&win->super, &MPI_INFO_NULL->super);
}
(*info_used) = OBJ_NEW(ompi_info_t);
if (NULL == (*info_used)) {
return OMPI_ERRHANDLER_INVOKE(win, MPI_ERR_NO_MEM, FUNC_NAME);
}
opal_info_t *opal_info_used = &(*info_used)->super;
ret = opal_info_dup_mpistandard(win->super.s_info, &opal_info_used);
OMPI_ERRHANDLER_RETURN(ret, win, ret, FUNC_NAME);
}

Просмотреть файл

@ -2,6 +2,7 @@
* Copyright (c) 2013 Sandia National Laboratories. All rights reserved.
* Copyright (c) 2015 Research Organization for Information Science
* and Technology (RIST). All rights reserved.
* Copyright (c) 2016-2017 IBM Corporation. All rights reserved.
* $COPYRIGHT$
*
* Additional copyrights may follow
@ -15,6 +16,8 @@
#include "ompi/runtime/params.h"
#include "ompi/errhandler/errhandler.h"
#include "ompi/win/win.h"
#include "ompi/communicator/communicator.h"
#include "opal/util/info_subscriber.h"
#if OMPI_BUILD_MPI_PROFILING
#if OPAL_HAVE_WEAK_SYMBOLS
@ -45,6 +48,7 @@ int MPI_Win_set_info(MPI_Win win, MPI_Info info)
OPAL_CR_ENTER_LIBRARY();
ret = win->w_osc_module->osc_set_info(win, info);
ret = opal_infosubscribe_change_info(&(win->super), &(info->super));
OMPI_ERRHANDLER_RETURN(ret, win, ret, FUNC_NAME);
}

Просмотреть файл

@ -6,6 +6,7 @@
* of Tennessee Research Foundation. All rights
* reserved.
* Copyright (c) 2012 Cisco Systems, Inc. All rights reserved.
* Copyright (c) 2016-2017 IBM Corporation. All rights reserved.
* $COPYRIGHT$
*
* Additional copyrights may follow
@ -76,7 +77,7 @@ int OMPI_CR_Quiesce_start(MPI_Comm commP, MPI_Info *info)
/*
* (Old) info logic
*/
/*ompi_info_set((ompi_info_t*)*info, "target", cur_datum.target_dir);*/
/*opal_info_set((opal_info_t*)*info, "target", cur_datum.target_dir);*/
return ret;
}
@ -123,7 +124,7 @@ int OMPI_CR_Quiesce_start(MPI_Comm commP, MPI_Info *info)
* 1 = Memory must be in user space (i.e., not on network card
*
*/
static int extract_info_into_datum(ompi_info_t *info, orte_snapc_base_quiesce_t *datum)
static int extract_info_into_datum(opal_info_t *info, orte_snapc_base_quiesce_t *datum)
{
int info_flag = false;
int max_crs_len = 32;
@ -135,7 +136,7 @@ static int extract_info_into_datum(ompi_info_t *info, orte_snapc_base_quiesce_t
/*
* Key: crs
*/
ompi_info_get(info, "crs", max_crs_len, info_char, &info_flag);
opal_info_get(info, "crs", max_crs_len, info_char, &info_flag);
if( info_flag) {
datum->crs_name = strdup(info_char);
}
@ -143,7 +144,7 @@ static int extract_info_into_datum(ompi_info_t *info, orte_snapc_base_quiesce_t
/*
* Key: cmdline
*/
ompi_info_get(info, "cmdline", OPAL_PATH_MAX, info_char, &info_flag);
opal_info_get(info, "cmdline", OPAL_PATH_MAX, info_char, &info_flag);
if( info_flag) {
datum->cmdline = strdup(info_char);
}
@ -151,7 +152,7 @@ static int extract_info_into_datum(ompi_info_t *info, orte_snapc_base_quiesce_t
/*
* Key: handle
*/
ompi_info_get(info, "handle", OPAL_PATH_MAX, info_char, &info_flag);
opal_info_get(info, "handle", OPAL_PATH_MAX, info_char, &info_flag);
if( info_flag) {
datum->handle = strdup(info_char);
}
@ -159,7 +160,7 @@ static int extract_info_into_datum(ompi_info_t *info, orte_snapc_base_quiesce_t
/*
* Key: target
*/
ompi_info_get(info, "target", OPAL_PATH_MAX, info_char, &info_flag);
opal_info_get(info, "target", OPAL_PATH_MAX, info_char, &info_flag);
if( info_flag) {
datum->target_dir = strdup(info_char);
}
@ -167,7 +168,7 @@ static int extract_info_into_datum(ompi_info_t *info, orte_snapc_base_quiesce_t
/*
* Key: restarting
*/
ompi_info_get_bool(info, "restarting", &info_bool, &info_flag);
opal_info_get_bool(info, "restarting", &info_bool, &info_flag);
if( info_flag ) {
datum->restarting = info_bool;
} else {
@ -177,7 +178,7 @@ static int extract_info_into_datum(ompi_info_t *info, orte_snapc_base_quiesce_t
/*
* Key: checkpointing
*/
ompi_info_get_bool(info, "checkpointing", &info_bool, &info_flag);
opal_info_get_bool(info, "checkpointing", &info_bool, &info_flag);
if( info_flag ) {
datum->checkpointing = info_bool;
} else {

Просмотреть файл

@ -20,6 +20,7 @@
* Copyright (c) 2016 Research Organization for Information Science
* and Technology (RIST). All rights reserved.
*
* Copyright (c) 2016-2017 IBM Corporation. All rights reserved.
* $COPYRIGHT$
*
* Additional copyrights may follow
@ -426,7 +427,7 @@ int ompi_mpi_finalize(void)
}
/* free info resources */
if (OMPI_SUCCESS != (ret = ompi_info_finalize())) {
if (OMPI_SUCCESS != (ret = ompi_mpiinfo_finalize())) {
goto done;
}

Просмотреть файл

@ -22,6 +22,7 @@
* and Technology (RIST). All rights reserved.
* Copyright (c) 2016 Mellanox Technologies Ltd. All rights reserved.
*
* Copyright (c) 2016-2017 IBM Corporation. All rights reserved.
* $COPYRIGHT$
*
* Additional copyrights may follow
@ -748,7 +749,7 @@ int ompi_mpi_init(int argc, char **argv, int requested, int *provided)
}
/* initialize info */
if (OMPI_SUCCESS != (ret = ompi_info_init())) {
if (OMPI_SUCCESS != (ret = ompi_mpiinfo_init())) {
error = "ompi_info_init() failed";
goto error;
}

Просмотреть файл

@ -16,6 +16,7 @@
* reserved.
* Copyright (c) 2015-2016 Research Organization for Information Science
* and Technology (RIST). All rights reserved.
* Copyright (c) 2016-2017 IBM Corporation. All rights reserved.
* $COPYRIGHT$
*
* Additional copyrights may follow
@ -25,6 +26,8 @@
#include "ompi_config.h"
#include "opal/util/info_subscriber.h"
#include "mpi.h"
#include "ompi/win/win.h"
#include "ompi/errhandler/errhandler.h"
@ -43,7 +46,7 @@
*/
opal_pointer_array_t ompi_mpi_windows = {{0}};
ompi_predefined_win_t ompi_mpi_win_null = {{{0}}};
ompi_predefined_win_t ompi_mpi_win_null = {{{{0}}}};
ompi_predefined_win_t *ompi_mpi_win_null_addr = &ompi_mpi_win_null;
mca_base_var_enum_t *ompi_win_accumulate_ops = NULL;
mca_base_var_enum_flag_t *ompi_win_accumulate_order = NULL;
@ -67,7 +70,7 @@ static mca_base_var_enum_value_flag_t accumulate_order_flags[] = {
static void ompi_win_construct(ompi_win_t *win);
static void ompi_win_destruct(ompi_win_t *win);
OBJ_CLASS_INSTANCE(ompi_win_t, opal_object_t,
OBJ_CLASS_INSTANCE(ompi_win_t, opal_infosubscriber_t,
ompi_win_construct, ompi_win_destruct);
int
@ -136,7 +139,7 @@ int ompi_win_finalize(void)
return OMPI_SUCCESS;
}
static int alloc_window(struct ompi_communicator_t *comm, ompi_info_t *info, int flavor, ompi_win_t **win_out)
static int alloc_window(struct ompi_communicator_t *comm, opal_info_t *info, int flavor, ompi_win_t **win_out)
{
ompi_win_t *win;
ompi_group_t *group;
@ -148,7 +151,7 @@ static int alloc_window(struct ompi_communicator_t *comm, ompi_info_t *info, int
return OMPI_ERR_OUT_OF_RESOURCE;
}
ret = ompi_info_get_value_enum (info, "accumulate_ops", &acc_ops,
ret = opal_info_get_value_enum (info, "accumulate_ops", &acc_ops,
OMPI_WIN_ACCUMULATE_OPS_SAME_OP_NO_OP,
ompi_win_accumulate_ops, &flag);
if (OMPI_SUCCESS != ret) {
@ -158,7 +161,7 @@ static int alloc_window(struct ompi_communicator_t *comm, ompi_info_t *info, int
win->w_acc_ops = (ompi_win_accumulate_ops_t)acc_ops;
ret = ompi_info_get_value_enum (info, "accumulate_order", &acc_order,
ret = opal_info_get_value_enum (info, "accumulate_order", &acc_order,
OMPI_WIN_ACC_ORDER_RAR | OMPI_WIN_ACC_ORDER_WAR |
OMPI_WIN_ACC_ORDER_RAW | OMPI_WIN_ACC_ORDER_WAW,
&(ompi_win_accumulate_order->super), &flag);
@ -176,6 +179,12 @@ static int alloc_window(struct ompi_communicator_t *comm, ompi_info_t *info, int
OBJ_RETAIN(group);
win->w_group = group;
/* Copy the info for the info layer */
win->super.s_info = OBJ_NEW(opal_info_t);
if (info) {
opal_info_dup(info, &(win->super.s_info));
}
*win_out = win;
return OMPI_SUCCESS;
@ -221,7 +230,7 @@ config_window(void *base, size_t size, int disp_unit,
int
ompi_win_create(void *base, size_t size,
int disp_unit, ompi_communicator_t *comm,
ompi_info_t *info,
opal_info_t *info,
ompi_win_t** newwin)
{
ompi_win_t *win;
@ -252,7 +261,7 @@ ompi_win_create(void *base, size_t size,
int
ompi_win_allocate(size_t size, int disp_unit, ompi_info_t *info,
ompi_win_allocate(size_t size, int disp_unit, opal_info_t *info,
ompi_communicator_t *comm, void *baseptr, ompi_win_t **newwin)
{
ompi_win_t *win;
@ -285,7 +294,7 @@ ompi_win_allocate(size_t size, int disp_unit, ompi_info_t *info,
int
ompi_win_allocate_shared(size_t size, int disp_unit, ompi_info_t *info,
ompi_win_allocate_shared(size_t size, int disp_unit, opal_info_t *info,
ompi_communicator_t *comm, void *baseptr, ompi_win_t **newwin)
{
ompi_win_t *win;
@ -318,7 +327,7 @@ ompi_win_allocate_shared(size_t size, int disp_unit, ompi_info_t *info,
int
ompi_win_create_dynamic(ompi_info_t *info, ompi_communicator_t *comm, ompi_win_t **newwin)
ompi_win_create_dynamic(opal_info_t *info, ompi_communicator_t *comm, ompi_win_t **newwin)
{
ompi_win_t *win;
int model;
@ -358,6 +367,10 @@ ompi_win_free(ompi_win_t *win)
NULL);
}
if (NULL != (win->super.s_info)) {
OBJ_RELEASE(win->super.s_info);
}
if (OMPI_SUCCESS == ret) {
OBJ_RELEASE(win);
}

Просмотреть файл

@ -14,6 +14,7 @@
* Copyright (c) 2009 Sun Microsystems, Inc. All rights reserved.
* Copyright (c) 2013-2015 Los Alamos National Security, LLC. All rights
* reserved.
* Copyright (c) 2016-2017 IBM Corporation. All rights reserved.
* $COPYRIGHT$
*
* Additional copyrights may follow
@ -29,6 +30,7 @@
#include "opal/class/opal_object.h"
#include "opal/class/opal_hash_table.h"
#include "opal/util/info_subscriber.h"
#include "ompi/errhandler/errhandler.h"
#include "ompi/info/info.h"
#include "ompi/communicator/communicator.h"
@ -73,12 +75,12 @@ OMPI_DECLSPEC extern mca_base_var_enum_flag_t *ompi_win_accumulate_order;
OMPI_DECLSPEC extern opal_pointer_array_t ompi_mpi_windows;
struct ompi_win_t {
opal_object_t w_base;
opal_infosubscriber_t super;
opal_mutex_t w_lock;
char w_name[MPI_MAX_OBJECT_NAME];
/* Group associated with this window. */
ompi_group_t *w_group;
@ -132,13 +134,13 @@ int ompi_win_init(void);
int ompi_win_finalize(void);
int ompi_win_create(void *base, size_t size, int disp_unit,
ompi_communicator_t *comm, ompi_info_t *info,
ompi_communicator_t *comm, opal_info_t *info,
ompi_win_t **newwin);
int ompi_win_allocate(size_t size, int disp_unit, ompi_info_t *info,
int ompi_win_allocate(size_t size, int disp_unit, opal_info_t *info,
ompi_communicator_t *comm, void *baseptr, ompi_win_t **newwin);
int ompi_win_allocate_shared(size_t size, int disp_unit, ompi_info_t *info,
int ompi_win_allocate_shared(size_t size, int disp_unit, opal_info_t *info,
ompi_communicator_t *comm, void *baseptr, ompi_win_t **newwin);
int ompi_win_create_dynamic(ompi_info_t *info, ompi_communicator_t *comm, ompi_win_t **newwin);
int ompi_win_create_dynamic(opal_info_t *info, ompi_communicator_t *comm, ompi_win_t **newwin);
int ompi_win_free(ompi_win_t *win);

Просмотреть файл

@ -11,7 +11,7 @@
* Copyright (c) 2004-2005 The Regents of the University of California.
* All rights reserved.
* Copyright (c) 2009 Sun Microsystems, Inc. All rights reserved.
* Copyright (c) 2010 IBM Corporation. All rights reserved.
* Copyright (c) 2010-2017 IBM Corporation. All rights reserved.
* Copyright (c) 2015 Los Alamos National Security, LLC. All rights
* reserved.
* $COPYRIGHT$
@ -28,20 +28,7 @@
#include "base.h"
#include "mpool_base_tree.h"
#include "opal/threads/mutex.h"
struct opal_info_t {
opal_list_t super;
/**< generic list pointer which is the container for (key,value)
pairs */
int i_f_to_c_index;
/**< fortran handle for info. This is needed for translation from
fortran to C and vice versa */
opal_mutex_t *i_lock;
/**< Mutex for thread safety */
bool i_freed;
/**< Whether this info has been freed or not */
};
typedef struct opal_info_t opal_info_t;
#include "opal/util/info.h"
static void unregister_tree_item(mca_mpool_base_tree_item_t *mpool_tree_item)

Просмотреть файл

@ -16,6 +16,7 @@
# reserved.
# Copyright (c) 2016 Research Organization for Information Science
# and Technology (RIST). All rights reserved.
# Copyright (c) 2016-2017 IBM Corporation. All rights reserved.
# $COPYRIGHT$
#
# Additional copyrights may follow
@ -70,7 +71,9 @@ headers = \
strncpy.h \
sys_limits.h \
timings.h \
uri.h
uri.h \
info_subscriber.h \
info.h
libopalutil_la_SOURCES = \
$(headers) \
@ -105,7 +108,9 @@ libopalutil_la_SOURCES = \
stacktrace.c \
strncpy.c \
sys_limits.c \
uri.c
uri.c \
info_subscriber.c \
info.c
if OPAL_COMPILE_TIMING
libopalutil_la_SOURCES += timings.c

606
opal/util/info.c Обычный файл
Просмотреть файл

@ -0,0 +1,606 @@
/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil -*- */
/*
* Copyright (c) 2004-2005 The Trustees of Indiana University and Indiana
* University Research and Technology
* Corporation. All rights reserved.
* Copyright (c) 2004-2007 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 (c) 2007-2015 Cisco Systems, Inc. All rights reserved.
* Copyright (c) 2009 Sun Microsystems, Inc. All rights reserved.
* Copyright (c) 2012-2015 Los Alamos National Security, LLC. All rights
* reserved.
* Copyright (c) 2015 Research Organization for Information Science
* and Technology (RIST). All rights reserved.
* Copyright (c) 2016-2017 IBM Corporation. All rights reserved.
* $COPYRIGHT$
*
* Additional copyrights may follow
*
* $HEADER$
*/
#include <string.h>
#include <errno.h>
#include <stdlib.h>
#ifdef HAVE_UNISTD_H
#include <unistd.h>
#endif
#include <limits.h>
#include <ctype.h>
#ifdef HAVE_SYS_UTSNAME_H
#include <sys/utsname.h>
#endif
#include <assert.h>
#include "opal/util/argv.h"
#include "opal/util/opal_getcwd.h"
#include "opal/util/output.h"
#include "opal/util/strncpy.h"
#include "opal/util/info.h"
#ifdef XXX
#include "ompi/runtime/mpiruntime.h"
#include "ompi/runtime/params.h"
#endif
/*
* Local functions
*/
static void info_constructor(opal_info_t *info);
static void info_destructor(opal_info_t *info);
static void info_entry_constructor(opal_info_entry_t *entry);
static void info_entry_destructor(opal_info_entry_t *entry);
static opal_info_entry_t *info_find_key (opal_info_t *info, const char *key);
/*
* opal_info_t classes
*/
OBJ_CLASS_INSTANCE(opal_info_t,
opal_list_t,
info_constructor,
info_destructor);
/*
* opal_info_entry_t classes
*/
OBJ_CLASS_INSTANCE(opal_info_entry_t,
opal_list_item_t,
info_entry_constructor,
info_entry_destructor);
/*
* Duplicate an info
*/
int opal_info_dup (opal_info_t *info, opal_info_t **newinfo)
{
int err;
opal_list_item_t *item;
opal_info_entry_t *iterator;
OPAL_THREAD_LOCK(info->i_lock);
for (item = opal_list_get_first(&(info->super));
item != opal_list_get_end(&(info->super));
item = opal_list_get_next(iterator)) {
iterator = (opal_info_entry_t *) item;
err = opal_info_set(*newinfo, iterator->ie_key, iterator->ie_value);
if (MPI_SUCCESS != err) {
OPAL_THREAD_UNLOCK(info->i_lock);
return err;
}
}
OPAL_THREAD_UNLOCK(info->i_lock);
return MPI_SUCCESS;
}
/*
* An object's info can be set, but those settings can be modified by
* system callbacks. When those callbacks happen, we save a "__IN_<key>"/"val"
* copy of changed or erased values.
*
* extra options for how to dup:
* include_system_extras (default 1)
* omit_ignored (default 1)
* show_modifications (default 0)
*/
static
int opal_info_dup_mode (opal_info_t *info, opal_info_t **newinfo,
int include_system_extras, // (k/v with no corresponding __IN_k)
int omit_ignored, // (__IN_k with no k/v)
int show_modifications) // (pick v from k/v or __IN_k/v)
{
int err, flag;
opal_list_item_t *item;
opal_info_entry_t *iterator;
char savedkey[MPI_MAX_INFO_KEY];
char savedval[MPI_MAX_INFO_VAL];
char *valptr, *pkey;
int is_IN_key;
int exists_IN_key, exists_reg_key;
OPAL_THREAD_LOCK(info->i_lock);
for (item = opal_list_get_first(&(info->super));
item != opal_list_get_end(&(info->super));
item = opal_list_get_next(iterator)) {
iterator = (opal_info_entry_t *) item;
// If we see an __IN_<key> key but no <key>, decide what to do based on mode.
// If we see an __IN_<key> and a <key>, skip since it'll be handled when
// we process <key>.
is_IN_key = 0;
exists_IN_key = 0;
exists_reg_key = 0;
pkey = iterator->ie_key;
if (0 == strncmp(iterator->ie_key, "__IN_", 5)) {
pkey += 5;
is_IN_key = 1;
exists_IN_key = 1;
opal_info_get (info, pkey, 0, NULL, &flag);
if (flag) {
exists_reg_key = 1;
}
} else {
is_IN_key = 0;
exists_reg_key = 1;
// see if there is an __IN_<key> for the current <key>
if (strlen(iterator->ie_key) + 5 < MPI_MAX_INFO_KEY) {
sprintf(savedkey, "__IN_%s", iterator->ie_key);
err = opal_info_get (info, savedkey, MPI_MAX_INFO_VAL,
savedval, &flag);
} else {
flag = 0;
}
if (flag) {
exists_IN_key = 1;
}
}
if (is_IN_key) {
if (exists_reg_key) {
// we're processing __IN_<key> and there exists a <key> so we'll handle it then
continue;
} else {
// we're processing __IN_<key> and no <key> exists
// this would mean <key> was set by the user but ignored by the system
// so base our behavior on the omit_ignored
if (!omit_ignored) {
err = opal_info_set(*newinfo, pkey, iterator->ie_value);
if (MPI_SUCCESS != err) {
OPAL_THREAD_UNLOCK(info->i_lock);
return err;
}
}
}
} else {
valptr = 0;
if (!exists_IN_key) {
// we're processing <key> and no __IN_<key> <key> exists
// this would mean it's a system setting, not something that came from the user
if (include_system_extras) {
valptr = iterator->ie_value;
}
} else {
// we're processing <key> and __IN_<key> also exists
// pick which value to use
if (!show_modifications) {
valptr = savedval;
} else {
valptr = iterator->ie_value;
}
}
if (valptr) {
err = opal_info_set(*newinfo, pkey, valptr);
if (MPI_SUCCESS != err) {
OPAL_THREAD_UNLOCK(info->i_lock);
return err;
}
}
}
}
OPAL_THREAD_UNLOCK(info->i_lock);
return MPI_SUCCESS;
}
/*
* Implement opal_info_dup_mpistandard by using whatever mode
* settings represent our interpretation of the standard
*/
int opal_info_dup_mpistandard (opal_info_t *info, opal_info_t **newinfo)
{
return opal_info_dup_mode (info, newinfo, 1, 1, 0);
}
/*
* Set a value on the info
*/
int opal_info_set (opal_info_t *info, const char *key, const char *value)
{
char *new_value;
opal_info_entry_t *new_info;
opal_info_entry_t *old_info;
new_value = strdup(value);
if (NULL == new_value) {
return MPI_ERR_NO_MEM;
}
OPAL_THREAD_LOCK(info->i_lock);
old_info = info_find_key (info, key);
if (NULL != old_info) {
/*
* key already exists. remove the value associated with it
*/
free(old_info->ie_value);
old_info->ie_value = new_value;
} else {
new_info = OBJ_NEW(opal_info_entry_t);
if (NULL == new_info) {
free(new_value);
OPAL_THREAD_UNLOCK(info->i_lock);
return MPI_ERR_NO_MEM;
}
strncpy (new_info->ie_key, key, MPI_MAX_INFO_KEY);
new_info->ie_value = new_value;
opal_list_append (&(info->super), (opal_list_item_t *) new_info);
}
OPAL_THREAD_UNLOCK(info->i_lock);
return MPI_SUCCESS;
}
int opal_info_set_value_enum (opal_info_t *info, const char *key, int value,
mca_base_var_enum_t *var_enum)
{
char *string_value;
int ret;
ret = var_enum->string_from_value (var_enum, value, &string_value);
if (OPAL_SUCCESS != ret) {
return ret;
}
return opal_info_set (info, key, string_value);
}
/*
* Get a value from an info
*/
int opal_info_get (opal_info_t *info, const char *key, int valuelen,
char *value, int *flag)
{
opal_info_entry_t *search;
int value_length;
OPAL_THREAD_LOCK(info->i_lock);
search = info_find_key (info, key);
if (NULL == search){
*flag = 0;
} else if (value && valuelen) {
/*
* We have found the element, so we can return the value
* Set the flag, value_length and value
*/
*flag = 1;
value_length = strlen(search->ie_value);
/*
* If the stored value is shorter than valuelen, then
* we can copy the entire value out. Else, we have to
* copy ONLY valuelen bytes out
*/
if (value_length < valuelen ) {
strcpy(value, search->ie_value);
} else {
opal_strncpy(value, search->ie_value, valuelen);
if (MPI_MAX_INFO_VAL == valuelen) {
value[valuelen-1] = 0;
} else {
value[valuelen] = 0;
}
}
}
OPAL_THREAD_UNLOCK(info->i_lock);
return MPI_SUCCESS;
}
int opal_info_get_value_enum (opal_info_t *info, const char *key, int *value,
int default_value, mca_base_var_enum_t *var_enum,
int *flag)
{
opal_info_entry_t *search;
int ret;
*value = default_value;
OPAL_THREAD_LOCK(info->i_lock);
search = info_find_key (info, key);
if (NULL == search){
OPAL_THREAD_UNLOCK(info->i_lock);
*flag = 0;
return MPI_SUCCESS;
}
/* we found a mathing key. pass the string value to the enumerator and
* return */
*flag = 1;
ret = var_enum->value_from_string (var_enum, search->ie_value, value);
OPAL_THREAD_UNLOCK(info->i_lock);
return ret;
}
/*
* Similar to opal_info_get(), but cast the result into a boolean
* using some well-defined rules.
*/
int opal_info_get_bool(opal_info_t *info, char *key, bool *value, int *flag)
{
char str[256];
str[sizeof(str) - 1] = '\0';
opal_info_get(info, key, sizeof(str) - 1, str, flag);
if (*flag) {
*value = opal_str_to_bool(str);
}
return MPI_SUCCESS;
}
bool
opal_str_to_bool(char *str)
{
bool result = false;
char *ptr;
/* Trim whitespace */
ptr = str + sizeof(str) - 1;
while (ptr >= str && isspace(*ptr)) {
*ptr = '\0';
--ptr;
}
ptr = str;
while (ptr < str + sizeof(str) - 1 && *ptr != '\0' &&
isspace(*ptr)) {
++ptr;
}
if ('\0' != *ptr) {
if (isdigit(*ptr)) {
result = (bool) atoi(ptr);
} else if (0 == strcasecmp(ptr, "yes") ||
0 == strcasecmp(ptr, "true")) {
result = true;
} else if (0 != strcasecmp(ptr, "no") &&
0 != strcasecmp(ptr, "false")) {
/* RHC unrecognized value -- print a warning? */
}
}
return result;
}
/*
* Delete a key from an info
*/
int opal_info_delete(opal_info_t *info, const char *key)
{
opal_info_entry_t *search;
OPAL_THREAD_LOCK(info->i_lock);
search = info_find_key (info, key);
if (NULL == search){
OPAL_THREAD_UNLOCK(info->i_lock);
return MPI_ERR_INFO_NOKEY;
} else {
/*
* An entry with this key value was found. Remove the item
* and free the memory allocated to it.
* As this key *must* be available, we do not check for errors.
*/
opal_list_remove_item (&(info->super),
(opal_list_item_t *)search);
OBJ_RELEASE(search);
}
OPAL_THREAD_UNLOCK(info->i_lock);
return MPI_SUCCESS;
}
/*
* Return the length of a value
*/
int opal_info_get_valuelen (opal_info_t *info, const char *key, int *valuelen,
int *flag)
{
opal_info_entry_t *search;
OPAL_THREAD_LOCK(info->i_lock);
search = info_find_key (info, key);
if (NULL == search){
*flag = 0;
} else {
/*
* We have found the element, so we can return the value
* Set the flag, value_length and value
*/
*flag = 1;
*valuelen = strlen(search->ie_value);
}
OPAL_THREAD_UNLOCK(info->i_lock);
return MPI_SUCCESS;
}
/*
* Get the nth key
*/
int opal_info_get_nthkey (opal_info_t *info, int n, char *key)
{
opal_info_entry_t *iterator;
/*
* Iterate over and over till we get to the nth key
*/
OPAL_THREAD_LOCK(info->i_lock);
for (iterator = (opal_info_entry_t *)opal_list_get_first(&(info->super));
n > 0;
--n) {
iterator = (opal_info_entry_t *)opal_list_get_next(iterator);
if (opal_list_get_end(&(info->super)) ==
(opal_list_item_t *) iterator) {
OPAL_THREAD_UNLOCK(info->i_lock);
return MPI_ERR_ARG;
}
}
/*
* iterator is of the type opal_list_item_t. We have to
* cast it to opal_info_entry_t before we can use it to
* access the value
*/
strncpy(key, iterator->ie_key, MPI_MAX_INFO_KEY);
OPAL_THREAD_UNLOCK(info->i_lock);
return MPI_SUCCESS;
}
/*
* This function is invoked when OBJ_NEW() is called. Here, we add this
* info pointer to the table and then store its index as the handle
*/
static void info_constructor(opal_info_t *info)
{
info->i_lock = OBJ_NEW(opal_mutex_t);
}
/*
* This function is called during OBJ_DESTRUCT of "info". When this
* done, we need to remove the entry from the opal fortran to C
* translation table
*/
static void info_destructor(opal_info_t *info)
{
opal_list_item_t *item;
opal_info_entry_t *iterator;
/* Remove every key in the list */
for (item = opal_list_remove_first(&(info->super));
NULL != item;
item = opal_list_remove_first(&(info->super))) {
iterator = (opal_info_entry_t *) item;
OBJ_RELEASE(iterator);
}
/* Release the lock */
OBJ_RELEASE(info->i_lock);
}
/*
* opal_info_entry_t interface functions
*/
static void info_entry_constructor(opal_info_entry_t *entry)
{
memset(entry->ie_key, 0, sizeof(entry->ie_key));
entry->ie_key[MPI_MAX_INFO_KEY] = 0;
}
static void info_entry_destructor(opal_info_entry_t *entry)
{
if (NULL != entry->ie_value) {
free(entry->ie_value);
}
}
/*
* Find a key
*
* Do NOT thread lock in here -- the calling function is responsible
* for that.
*/
static opal_info_entry_t *info_find_key (opal_info_t *info, const char *key)
{
opal_info_entry_t *iterator;
/* No thread locking in here! */
/* Iterate over all the entries. If the key is found, then
* return immediately. Else, the loop will fall of the edge
* and NULL is returned
*/
for (iterator = (opal_info_entry_t *)opal_list_get_first(&(info->super));
opal_list_get_end(&(info->super)) != (opal_list_item_t*) iterator;
iterator = (opal_info_entry_t *)opal_list_get_next(iterator)) {
if (0 == strcmp(key, iterator->ie_key)) {
return iterator;
}
}
return NULL;
}
int
opal_info_value_to_int(char *value, int *interp)
{
long tmp;
char *endp;
if (NULL == value || '\0' == value[0]) return OPAL_ERR_BAD_PARAM;
errno = 0;
tmp = strtol(value, &endp, 10);
/* we found something not a number */
if (*endp != '\0') return OPAL_ERR_BAD_PARAM;
/* underflow */
if (tmp == 0 && errno == EINVAL) return OPAL_ERR_BAD_PARAM;
*interp = (int) tmp;
return OPAL_SUCCESS;
}
int
opal_info_value_to_bool(char *value, bool *interp)
{
int tmp;
/* idiot case */
if (NULL == value || NULL == interp) return OPAL_ERR_BAD_PARAM;
/* is it true / false? */
if (0 == strcmp(value, "true")) {
*interp = true;
return OPAL_SUCCESS;
} else if (0 == strcmp(value, "false")) {
*interp = false;
return OPAL_SUCCESS;
/* is it a number? */
} else if (OPAL_SUCCESS == opal_info_value_to_int(value, &tmp)) {
if (tmp == 0) {
*interp = false;
} else {
*interp = true;
}
return OPAL_SUCCESS;
}
return OPAL_ERR_BAD_PARAM;
}

335
opal/util/info.h Обычный файл
Просмотреть файл

@ -0,0 +1,335 @@
/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil -*- */
/*
* Copyright (c) 2004-2010 The Trustees of Indiana University and Indiana
* University Research and Technology
* Corporation. All rights reserved.
* Copyright (c) 2004-2007 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 (c) 2007-2012 Cisco Systems, Inc. All rights reserved.
* Copyright (c) 2009 Sun Microsystems, Inc. All rights reserved.
* Copyright (c) 2012-2015 Los Alamos National Security, LLC. All rights
* reserved.
* Copyright (c) 2017 IBM Corporation. All rights reserved.
* $COPYRIGHT$
*
* Additional copyrights may follow
*
* $HEADER$
*/
#ifndef OPAL_INFO_H
#define OPAL_INFO_H
#include <string.h>
#include "mpi.h"
#include "opal/class/opal_list.h"
#include "opal/class/opal_pointer_array.h"
#include "opal/threads/mutex.h"
#include "opal/mca/base/mca_base_var_enum.h"
/**
* \internal
* opal_info_t structure. MPI_Info is a pointer to this structure
*/
struct opal_info_t {
opal_list_t super;
opal_mutex_t *i_lock;
};
/**
* \internal
* Convenience typedef
*/
typedef struct opal_info_t opal_info_t;
/**
* Table for Fortran <-> C translation table
*/
extern opal_pointer_array_t ompi_info_f_to_c_table;
/**
* \internal
*
* opal_info_entry_t object. Each item in opal_info_list is of this
* type. It contains (key,value) pairs
*/
struct opal_info_entry_t {
opal_list_item_t super; /**< required for opal_list_t type */
char *ie_value; /**< value part of the (key, value) pair.
* Maximum length is MPI_MAX_INFO_VAL */
char ie_key[MPI_MAX_INFO_KEY + 1]; /**< "key" part of the (key, value)
* pair */
};
/**
* \internal
* Convenience typedef
*/
typedef struct opal_info_entry_t opal_info_entry_t;
BEGIN_C_DECLS
/**
* \internal
* Some declarations needed to use OBJ_NEW and OBJ_DESTRUCT macros
*/
OMPI_DECLSPEC OBJ_CLASS_DECLARATION(opal_info_t);
/**
* \internal
* Some declarations needed to use OBJ_NEW and OBJ_DESTRUCT macros
*/
OMPI_DECLSPEC OBJ_CLASS_DECLARATION(opal_info_entry_t);
int opal_mpiinfo_init(void*);
/**
* opal_info_dup - Duplicate an 'MPI_Info' object
*
* @param info source info object (handle)
* @param newinfo pointer to the new info object (handle)
*
* @retval MPI_SUCCESS upon success
* @retval MPI_ERR_NO_MEM if out of memory
*
* Not only will the (key, value) pairs be duplicated, the order
* of keys will be the same in 'newinfo' as it is in 'info'. When
* an info object is no longer being used, it should be freed with
* 'MPI_Info_free'.
*/
int opal_info_dup (opal_info_t *info, opal_info_t **newinfo);
/**
* opal_info_dup_mpistandard - Duplicate an 'MPI_Info' object
*
* @param info source info object (handle)
* @param newinfo pointer to the new info object (handle)
*
* @retval MPI_SUCCESS upon success
* @retval MPI_ERR_NO_MEM if out of memory
*
* The user sets an info object with key/value pairs and once processed,
* we keep key/val pairs that might have been modified vs what the user
* provided, and some user inputs might have been ignored too. The original
* user inpust are kept as __IN_<key>/<val>.
*
* This routine then outputs key/value pairs as:
*
* if <key> and __IN_<key> both exist:
* This means the user set a k/v pair and it was used.
* output: <key> / value(__IN_<key>), the original user input
* if <key> exists but __IN_<key> doesn't:
* This is a system-provided setting.
* output: <key>/value(<key>)
* if __IN_<key> exists but <key> doesn't:
* The user provided a setting that was rejected (ignored) by the system
* output: nothing for this key
*/
int opal_info_dup_mpistandard (opal_info_t *info, opal_info_t **newinfo);
/**
* Set a new key,value pair on info.
*
* @param info pointer to opal_info_t object
* @param key pointer to the new key object
* @param value pointer to the new value object
*
* @retval MPI_SUCCESS upon success
* @retval MPI_ERR_NO_MEM if out of memory
*/
OMPI_DECLSPEC int opal_info_set (opal_info_t *info, const char *key, const char *value);
/**
* Set a new key,value pair from a variable enumerator.
*
* @param info pointer to opal_info_t object
* @param key pointer to the new key object
* @param value integer value of the info key (must be valid in var_enum)
* @param var_enum variable enumerator
*
* @retval MPI_SUCCESS upon success
* @retval MPI_ERR_NO_MEM if out of memory
* @retval OPAL_ERR_VALUE_OUT_OF_BOUNDS if the value is not valid in the enumerator
*/
OMPI_DECLSPEC int opal_info_set_value_enum (opal_info_t *info, const char *key, int value,
mca_base_var_enum_t *var_enum);
/**
* opal_info_free - Free an 'MPI_Info' object.
*
* @param info pointer to info (opal_info_t *) object to be freed (handle)
*
* @retval MPI_SUCCESS
* @retval MPI_ERR_ARG
*
* Upon successful completion, 'info' will be set to
* 'MPI_INFO_NULL'. Free the info handle and all of its keys and
* values.
*/
int opal_info_free (opal_info_t **info);
/**
* Get a (key, value) pair from an 'MPI_Info' object and assign it
* into a boolen output.
*
* @param info Pointer to opal_info_t object
* @param key null-terminated character string of the index key
* @param value Boolean output value
* @param flag true (1) if 'key' defined on 'info', false (0) if not
* (logical)
*
* @retval MPI_SUCCESS
*
* If found, the string value will be cast to the boolen output in
* the following manner:
*
* - If the string value is digits, the return value is "(bool)
* atoi(value)"
* - If the string value is (case-insensitive) "yes" or "true", the
* result is true
* - If the string value is (case-insensitive) "no" or "false", the
* result is false
* - All other values are false
*/
OMPI_DECLSPEC int opal_info_get_bool (opal_info_t *info, char *key, bool *value,
int *flag);
/**
* Get a (key, value) pair from an 'MPI_Info' object and assign it
* into an integer output based on the enumerator value.
*
* @param info Pointer to opal_info_t object
* @param key null-terminated character string of the index key
* @param value integer output value
* @param default_value value to use if the string does not conform to the
* values accepted by the enumerator
* @param var_enum variable enumerator for the value
* @param flag true (1) if 'key' defined on 'info', false (0) if not
* (logical)
*
* @retval MPI_SUCCESS
*/
OMPI_DECLSPEC int opal_info_get_value_enum (opal_info_t *info, const char *key,
int *value, int default_value,
mca_base_var_enum_t *var_enum, int *flag);
/**
* Get a (key, value) pair from an 'MPI_Info' object
*
* @param info Pointer to opal_info_t object
* @param key null-terminated character string of the index key
* @param valuelen maximum length of 'value' (integer)
* @param value null-terminated character string of the value
* @param flag true (1) if 'key' defined on 'info', false (0) if not
* (logical)
*
* @retval MPI_SUCCESS
*
* In C and C++, 'valuelen' should be one less than the allocated
* space to allow for for the null terminator.
*/
OMPI_DECLSPEC int opal_info_get (opal_info_t *info, const char *key, int valuelen,
char *value, int *flag);
/**
* Delete a (key,value) pair from "info"
*
* @param info opal_info_t pointer on which we need to operate
* @param key The key portion of the (key,value) pair that
* needs to be deleted
*
* @retval MPI_SUCCESS
* @retval MPI_ERR_NOKEY
*/
int opal_info_delete(opal_info_t *info, const char *key);
/**
* @param info - opal_info_t pointer object (handle)
* @param key - null-terminated character string of the index key
* @param valuelen - length of the value associated with 'key' (integer)
* @param flag - true (1) if 'key' defined on 'info', false (0) if not
* (logical)
*
* @retval MPI_SUCCESS
* @retval MPI_ERR_ARG
* @retval MPI_ERR_INFO_KEY
*
* The length returned in C and C++ does not include the end-of-string
* character. If the 'key' is not found on 'info', 'valuelen' is left
* alone.
*/
OMPI_DECLSPEC int opal_info_get_valuelen (opal_info_t *info, const char *key, int *valuelen,
int *flag);
/**
* opal_info_get_nthkey - Get a key indexed by integer from an 'MPI_Info' o
*
* @param info Pointer to opal_info_t object
* @param n index of key to retrieve (integer)
* @param key character string of at least 'MPI_MAX_INFO_KEY' characters
*
* @retval MPI_SUCCESS
* @retval MPI_ERR_ARG
*/
int opal_info_get_nthkey (opal_info_t *info, int n, char *key);
/**
* Convert value string to boolean
*
* Convert value string \c value into a boolean, using the
* interpretation rules specified in MPI-2 Section 4.10. The
* strings "true", "false", and integer numbers can be converted
* into booleans. All others will return \c OMPI_ERR_BAD_PARAM
*
* @param value Value string for info key to interpret
* @param interp returned interpretation of the value key
*
* @retval OMPI_SUCCESS string was successfully interpreted
* @retval OMPI_ERR_BAD_PARAM string was not able to be interpreted
*/
OMPI_DECLSPEC int opal_info_value_to_bool(char *value, bool *interp);
/**
* Convert value string to integer
*
* Convert value string \c value into a integer, using the
* interpretation rules specified in MPI-2 Section 4.10.
* All others will return \c OMPI_ERR_BAD_PARAM
*
* @param value Value string for info key to interpret
* @param interp returned interpretation of the value key
*
* @retval OMPI_SUCCESS string was successfully interpreted
* @retval OMPI_ERR_BAD_PARAM string was not able to be interpreted
*/
int opal_info_value_to_int(char *value, int *interp);
END_C_DECLS
/**
* Get the number of keys defined on on an MPI_Info object
* @param info Pointer to opal_info_t object.
* @param nkeys Pointer to nkeys, which needs to be filled up.
*
* @retval The number of keys defined on info
*/
static inline int
opal_info_get_nkeys(opal_info_t *info, int *nkeys)
{
*nkeys = (int) opal_list_get_size(&(info->super));
return MPI_SUCCESS;
}
bool opal_str_to_bool(char*);
#endif /* OPAL_INFO_H */

425
opal/util/info_subscriber.c Обычный файл
Просмотреть файл

@ -0,0 +1,425 @@
/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil -*- */
/*
* Copyright (c) 2004-2005 The Trustees of Indiana University and Indiana
* University Research and Technology
* Corporation. All rights reserved.
* Copyright (c) 2004-2007 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 (c) 2007-2015 Cisco Systems, Inc. All rights reserved.
* Copyright (c) 2009 Sun Microsystems, Inc. All rights reserved.
* Copyright (c) 2012-2015 Los Alamos National Security, LLC. All rights
* reserved.
* Copyright (c) 2015 Research Organization for Information Science
* and Technology (RIST). All rights reserved.
* Copyright (c) 2016-2017 IBM Corporation. All rights reserved.
* $COPYRIGHT$
*
* Additional copyrights may follow
*
* $HEADER$
*/
#include <string.h>
#include <errno.h>
#include <stdlib.h>
#ifdef HAVE_UNISTD_H
#include <unistd.h>
#endif
#include <limits.h>
#include <ctype.h>
#ifdef HAVE_SYS_UTSNAME_H
#include <sys/utsname.h>
#endif
#include <assert.h>
#include "opal/util/argv.h"
#include "opal/util/opal_getcwd.h"
#include "opal/util/output.h"
#include "opal/util/strncpy.h"
#include "opal/util/info_subscriber.h"
static char* opal_infosubscribe_inform_subscribers(opal_infosubscriber_t * object, char *key, char *new_value, int *found_callback);
static void infosubscriber_construct(opal_infosubscriber_t *obj);
static void infosubscriber_destruct(opal_infosubscriber_t *obj);
/*
* Local structures
*/
typedef struct opal_callback_list_t opal_callback_list_t;
struct opal_callback_list_item_t {
opal_list_item_t super;
char *default_value;
opal_key_interest_callback_t *callback;
};
typedef struct opal_callback_list_item_t opal_callback_list_item_t;
OPAL_DECLSPEC OBJ_CLASS_DECLARATION(opal_infosubscriber_t);
OBJ_CLASS_INSTANCE(opal_infosubscriber_t,
opal_object_t,
infosubscriber_construct,
infosubscriber_destruct);
OPAL_DECLSPEC OBJ_CLASS_DECLARATION(opal_callback_list_item_t);
static void opal_callback_list_item_destruct(opal_callback_list_item_t *obj);
OBJ_CLASS_INSTANCE(opal_callback_list_item_t,
opal_list_item_t,
NULL,
opal_callback_list_item_destruct);
static void infosubscriber_construct(opal_infosubscriber_t *obj) {
OBJ_CONSTRUCT(&obj->s_subscriber_table, opal_hash_table_t);
opal_hash_table_init(&obj->s_subscriber_table, 10);
}
static void infosubscriber_destruct(opal_infosubscriber_t *obj) {
opal_hash_table_t *table = &obj->s_subscriber_table;
void *node = NULL;
int err;
char *next_key;
size_t key_size;
opal_list_t *list = NULL;
err = opal_hash_table_get_first_key_ptr(table,
(void**) &next_key, &key_size, (void**) &list, &node);
while (list && err == OPAL_SUCCESS) {
OPAL_LIST_RELEASE(list);
err = opal_hash_table_get_next_key_ptr(table,
(void**) &next_key, &key_size, (void**) &list, node, &node);
}
OBJ_DESTRUCT(&obj->s_subscriber_table);
}
static void opal_callback_list_item_destruct(opal_callback_list_item_t *obj) {
if (obj->default_value) {
free(obj->default_value); // came from a strdup()
}
}
static char* opal_infosubscribe_inform_subscribers(opal_infosubscriber_t *object, char *key, char *new_value, int *found_callback)
{
opal_hash_table_t *table = &object->s_subscriber_table;
opal_list_t *list = NULL;
opal_callback_list_item_t *item;
char *updated_value = NULL;
if (found_callback) { *found_callback = 0; }
/*
* Present the new value to each subscriber. They can decide to accept it, ignore it, or
* over-ride it with their own value (like ignore, but they specify what value they want it to have).
*
* Since multiple subscribers could set values, only the last setting is kept as the
* returned value.
*/
if (table) {
opal_hash_table_get_value_ptr(table, key, strlen(key), (void**) &list);
if (list) {
updated_value = new_value;
OPAL_LIST_FOREACH(item, list, opal_callback_list_item_t) {
updated_value = item->callback(object, key, updated_value);
if (found_callback) { *found_callback = 1; }
}
}
}
return updated_value;
}
/*
* Testing-only static data, all paths using this code should be
* inactive in a normal run. In particular ntesting_callbacks is 0
* unless testing is in play.
*/
static int ntesting_callbacks = 0;
static opal_key_interest_callback_t *testing_callbacks[5];
static char *testing_keys[5];
static char *testing_initialvals[5];
// User-level call, user adds their own callback function to be subscribed
// to every object:
int opal_infosubscribe_testcallback(opal_key_interest_callback_t *callback,
char *key, char *val);
int
opal_infosubscribe_testcallback(opal_key_interest_callback_t *callback,
char *key, char *val)
{
int i = ntesting_callbacks;
if (ntesting_callbacks >= 5) { return -1; }
testing_callbacks[i] = callback;
testing_keys[i] = key;
testing_initialvals[i] = val;
++ntesting_callbacks;
return 0;
}
int opal_infosubscribe_testregister(opal_infosubscriber_t *object);
int
opal_infosubscribe_testregister(opal_infosubscriber_t *object)
{
opal_hash_table_t *table = &object->s_subscriber_table;
opal_callback_list_item_t *item;
opal_list_t *list = NULL;
// The testing section should only ever be activated if the testing callback
// above is used.
if (ntesting_callbacks != 0) {
int i;
for (i=0; i<ntesting_callbacks; ++i) {
// The testing-code only wants to add test-subscriptions
// once for an obj. So before adding a test-subscription, see
// if it's already there.
int found = 0;
opal_hash_table_get_value_ptr(table, testing_keys[i],
strlen(testing_keys[i]), (void**) &list);
if (list) {
OPAL_LIST_FOREACH(item, list, opal_callback_list_item_t) {
if (0 ==
strcmp(item->default_value, testing_initialvals[i])
&&
item->callback == testing_callbacks[i])
{
found = 1;
}
}
}
list = NULL;
if (!found) {
opal_infosubscribe_subscribe(object,
testing_keys[i],
testing_initialvals[i], testing_callbacks[i]);
}
}
}
// For testing-mode only, while we're here, lets walk the whole list
// to see if there are any duplicates.
if (ntesting_callbacks != 0) {
int err;
void *node = NULL;
size_t key_size;
char *next_key;
opal_callback_list_item_t *item1, *item2;
err = opal_hash_table_get_first_key_ptr(table, (void**) &next_key,
&key_size, (void**) &list, &node);
while (list && err == OPAL_SUCCESS) {
int counter = 0;
OPAL_LIST_FOREACH(item1, list, opal_callback_list_item_t) {
OPAL_LIST_FOREACH(item2, list, opal_callback_list_item_t) {
if (0 ==
strcmp(item1->default_value, item2->default_value)
&&
item1->callback == item2->callback)
{
++counter;
}
}
}
if (counter > 1) {
printf("ERROR: duplicate info key/val subscription found "
"in hash table\n");
exit(-1);
}
err = opal_hash_table_get_next_key_ptr(table,
(void**) &next_key, &key_size, (void**) &list, node, &node);
}
}
return OPAL_SUCCESS;
}
// This routine is to be used after making a callback for a
// key/val pair. The callback would have ggiven a new value to associate
// with <key>, and this function saves the previous value under
// __IN_<key>.
//
// The last argument indicates whether to overwrite a previous
// __IN_<key> or not.
static int
save_original_key_val(opal_info_t *info, char *key, char *val, int overwrite)
{
char modkey[MPI_MAX_INFO_KEY];
int flag, err;
// Checking strlen, even though it should be unnecessary.
// This should only happen on predefined keys with short lengths.
if (strlen(key) + 5 < MPI_MAX_INFO_KEY) {
sprintf(modkey, "__IN_%s", key);
flag = 0;
opal_info_get(info, modkey, 0, NULL, &flag);
if (!flag || overwrite) {
err = opal_info_set(info, modkey, val);
if (MPI_SUCCESS != err) {
return err;
}
}
// FIXME: use whatever the Open MPI convention is for DEBUG options like this
// Even though I don't expect this codepath to happen, if it somehow DID happen
// in a real run with user-keys, I'd rather it be silent at that point rather
// being noisy and/or aborting.
#ifdef OMPI_DEBUG
} else {
printf("WARNING: Unexpected key length [%s]\n", key);
#endif
}
return MPI_SUCCESS;
}
int
opal_infosubscribe_change_info(opal_infosubscriber_t *object, opal_info_t *new_info)
{
int err;
opal_info_entry_t *iterator;
char *updated_value;
/* for each key/value in new info, let subscribers know of new value */
int found_callback;
if (!object->s_info) {
object->s_info = OBJ_NEW(opal_info_t);
}
if (NULL != new_info) {
OPAL_LIST_FOREACH(iterator, &new_info->super, opal_info_entry_t) {
updated_value = opal_infosubscribe_inform_subscribers(object, iterator->ie_key, iterator->ie_value, &found_callback);
if (updated_value) {
err = opal_info_set(object->s_info, iterator->ie_key, updated_value);
} else {
// This path would happen if there was no callback for this key,
// or if there was a callback and it returned null. One way the
// setting was unrecognized the other way it was recognized and ignored,
// either way it shouldn't be set, which we'll ensure with an unset
// in case a previous value exists.
err = opal_info_delete(object->s_info, iterator->ie_key);
err = MPI_SUCCESS; // we don't care if the key was found or not
}
if (MPI_SUCCESS != err) {
return err;
}
// Save the original at "__IN_<key>":"original"
// And if multiple set-info calls happen, the last would be the most relevant
// to save, so overwrite a previously saved value if there is one.
save_original_key_val(object->s_info,
iterator->ie_key, iterator->ie_value, 1);
}}
return OPAL_SUCCESS;
}
// Callers can provide a callback for processing info k/v pairs.
//
// Currently the callback() is expected to return a static string, and the
// callers of callback() do not try to free the string it returns. for example
// current callbacks do things like
// return some_condition ? "true" : "false";
// the caller of callback() uses the return value in an opal_info_set() which
// strdups the string. The string returned from callback() is not kept beyond
// that. Currently if the callback() did malloc/strdup/etc for its return value
// the caller of callback() would have no way to know whether it needed freeing
// or not, so that string would be leaked.
//
// For future consideration I'd propose a model where callback() is expected
// to always strdup() its return value, so the value returned by callback()
// would either be NULL or it would be a string that needs free()ed. It seems
// to me this might be required if the strings become more dynamic than the
// simple true/false values seen in the current code. It'll be an easy change,
// callback() is only used two places.
int opal_infosubscribe_subscribe(opal_infosubscriber_t *object, char *key, char *value, opal_key_interest_callback_t *callback)
{
opal_list_t *list = NULL;
opal_hash_table_t *table = &object->s_subscriber_table;
opal_callback_list_item_t *callback_list_item;
if (table) {
opal_hash_table_get_value_ptr(table, key, strlen(key), (void**) &list);
if (!list) {
list = OBJ_NEW(opal_list_t);
opal_hash_table_set_value_ptr(table, key, strlen(key), list);
}
callback_list_item = OBJ_NEW(opal_callback_list_item_t);
callback_list_item->callback = callback;
if (value) {
callback_list_item->default_value = strdup(value);
} else {
callback_list_item->default_value = NULL;
}
opal_list_append(list, (opal_list_item_t*) callback_list_item);
// Trigger callback() on either the default value or the info that's in the
// object if there is one. Unfortunately there's some code duplication as
// this is similar to the job of opal_infosubscribe_change_info().
//
// The value we store for key is whatever the callback() returns.
// We also leave a backup __IN_* key with the previous value.
// - is there an info object yet attached to this object
if (NULL == object->s_info) {
object->s_info = OBJ_NEW(opal_info_t);
}
// - is there a value already associated with key in this obj's info:
// to use in the callback()
char *buffer = malloc(MPI_MAX_INFO_VAL+1); // (+1 shouldn't be needed)
char *val = value; // start as default value
int flag = 0;
char *updated_value;
int err;
opal_info_get(object->s_info, key, MPI_MAX_INFO_VAL, buffer, &flag);
if (flag) {
val = buffer; // become info value if this key was in info
}
// - callback() and modify the val in info
updated_value = callback(object, key, val);
if (updated_value) {
err = opal_info_set(object->s_info, key, updated_value);
} else {
err = opal_info_delete(object->s_info, key);
err = MPI_SUCCESS; // we don't care if the key was found or not
}
if (MPI_SUCCESS != err) {
free(buffer);
return err;
}
// - save the previous val under key __IN_*
// This function might be called separately for the same key multiple
// times (multiple modules might register an interest in the same key),
// so we only save __IN_<key> for the first.
// Note we're saving the first k/v regardless of whether it was the default
// or whether it came from info. This means system settings will show
// up if the user queries later with get_info.
save_original_key_val(object->s_info, key, val, 0);
free(buffer);
} else {
/*
* TODO: This should not happen
*/
}
return OPAL_SUCCESS;
}
/*
OBJ_DESTRUCT(&opal_comm_info_hashtable);
OBJ_DESTRUCT(&opal_win_info_hashtable);
OBJ_DESTRUCT(&opal_file_info_hashtable);
*/

84
opal/util/info_subscriber.h Обычный файл
Просмотреть файл

@ -0,0 +1,84 @@
/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil -*- */
/*
* Copyright (c) 2004-2010 The Trustees of Indiana University and Indiana
* University Research and Technology
* Corporation. All rights reserved.
* Copyright (c) 2004-2007 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 (c) 2007-2012 Cisco Systems, Inc. All rights reserved.
* Copyright (c) 2009 Sun Microsystems, Inc. All rights reserved.
* Copyright (c) 2012-2015 Los Alamos National Security, LLC. All rights
* reserved.
* Copyright (c) 2017 IBM Corporation. All rights reserved.
* $COPYRIGHT$
*
* Additional copyrights may follow
*
* $HEADER$
*/
#ifndef OMPI_INFOSUBSCRIBE_H
#define OMPI_INFOSUBSCRIBE_H
#include <string.h>
#include "opal/class/opal_list.h"
#include "opal/class/opal_pointer_array.h"
#include "opal/class/opal_hash_table.h"
#include "opal/threads/mutex.h"
#include "opal/util/info.h"
#include "opal/mca/base/mca_base_var_enum.h"
#define INFO_SUBSCRIBER_SIZE 5
struct opal_infosubscriber_t {
opal_object_t s_base;
opal_hash_table_t s_subscriber_table;
opal_info_t *s_info;
};
typedef struct opal_infosubscriber_t opal_infosubscriber_t;
OPAL_DECLSPEC OBJ_CLASS_DECLARATION(opal_infosubscriber_t);
typedef char*(opal_key_interest_callback_t)(opal_infosubscriber_t*, char*, char*);
/**
* opal_infosubscribe_change_info - Make changes to a Comm/Win/File Info
*
* @param type Comm/Win/File
* @param object corresponding Com/Win/File object
* @param old_info previous info setting
* @param new_info new info setting
*
* @retval OPAL status
*
* Notifies subscribers of info's that have gone away and new info settings
*/
int opal_infosubscribe_change_info(opal_infosubscriber_t*, opal_info_t *);
/**
* opal_infosubscribe_subscribe - Request to be updated about info changes to a Comm/Win/File Info
*
* @param type Comm/Win/File of obj
* @param obj either a comm, win or file
* @param key info key being set
* @param initial_value default value (or NULL if none)
* @param callback callback to be called when key changes
*
* @retval OPAL status
*
* Notifies subscribers of info's that have gone away and new info settings
* Does not try to optimize settings that are the same between old and new
* info's.
*/
int opal_infosubscribe_subscribe(opal_infosubscriber_t*, char *, char *, opal_key_interest_callback_t);
#endif /* OMPI_INFO_H */

Просмотреть файл

@ -2,6 +2,7 @@
* Copyright (c) 2013 Mellanox Technologies, Inc.
* All rights reserved.
* Copyright (c) 2014 Cisco Systems, Inc. All rights reserved.
* Copyright (c) 2016-2017 IBM Corporation. All rights reserved.
* $COPYRIGHT$
*
* Additional copyrights may follow
@ -57,7 +58,7 @@ int oshmem_info_register_framework_params(opal_pointer_array_t *component_map)
}
/* Do OMPI interface call */
rc = ompi_info_register_framework_params(component_map);
rc = opal_info_register_framework_params(component_map);
if (OMPI_SUCCESS != rc) {
return rc;
}
@ -74,7 +75,7 @@ void oshmem_info_close_components(void)
}
/* Do OMPI interface call */
ompi_info_close_components();
opal_info_close_components();
}
void oshmem_info_show_oshmem_version(const char *scope)

Просмотреть файл

@ -3,6 +3,7 @@
* All rights reserved.
* Copyright (c) 2014 Intel, Inc. All rights reserved.
*
* Copyright (c) 2016-2017 IBM Corporation. All rights reserved.
* $COPYRIGHT$
*
* Additional copyrights may follow
@ -111,7 +112,7 @@ int main(int argc, char *argv[])
#endif
/* add in the ompi frameworks */
ompi_info_register_types(&mca_types);
opal_info_register_types(&mca_types);
/* add in the oshmem frameworks */
oshmem_info_register_types(&mca_types);

Просмотреть файл

@ -5,6 +5,7 @@
* Copyright (c) 2014-2015 Cisco Systems, Inc. All rights reserved.
* Copyright (c) 2014-2016 Research Organization for Information Science
* and Technology (RIST). All rights reserved.
* Copyright (c) 2016-2017 IBM Corporation. All rights reserved.
* $COPYRIGHT$
*
* Additional copyrights may follow
@ -46,7 +47,7 @@
#include "oshmem/tools/oshmem_info/oshmem_info.h"
const char *ompi_info_deprecated_value = "deprecated-ompi-info-value";
const char *opal_info_deprecated_value = "deprecated-ompi-info-value";
static void append(char *dest, size_t max, int *first, char *src)
{
@ -297,7 +298,7 @@ void oshmem_info_do_config(bool want_all)
opal_info_out("Fort use mpi", "bindings:use_mpi",
fortran_usempi);
opal_info_out("Fort use mpi size", "bindings:use_mpi:size",
ompi_info_deprecated_value);
opal_info_deprecated_value);
opal_info_out("Fort use mpi_f08", "bindings:use_mpi_f08",
fortran_usempif08);
opal_info_out("Fort mpi_f08 compliance", "bindings:use_mpi_f08:compliance",