Per #2420, string handling of the Fortran array_of_argv argument to
MPI_COMM_SPAWN_MULTIPLE was just wrong. This commit renames a few variables to make their meaning a bit more clear and fixes up all known issues with converting a 2D array of Fortran strings to a set of C-style argv vectors. Fixes trac:2420. This commit was SVN r23217. The following Trac tickets were found above: Ticket 2420 --> https://svn.open-mpi.org/trac/ompi/ticket/2420
Этот коммит содержится в:
родитель
620c0eb160
Коммит
5d386fc678
@ -9,6 +9,7 @@
|
||||
* University of Stuttgart. All rights reserved.
|
||||
* Copyright (c) 2004-2005 The Regents of the University of California.
|
||||
* All rights reserved.
|
||||
* Copyright (c) 2010 Cisco Systems, Inc. All rights reserved.
|
||||
* $COPYRIGHT$
|
||||
*
|
||||
* Additional copyrights may follow
|
||||
@ -101,7 +102,8 @@ int ompi_fortran_string_c2f(char *cstr, char *fstr, int len)
|
||||
* creates a C argument vector from an F77 array of strings
|
||||
* (terminated by a blank string)
|
||||
*/
|
||||
int ompi_fortran_argv_f2c(char *array, int len, char ***argv)
|
||||
int ompi_fortran_argv_f2c(char *array, int string_len, int advance,
|
||||
char ***argv)
|
||||
{
|
||||
int err, argc = 0;
|
||||
char *cstr;
|
||||
@ -111,7 +113,7 @@ int ompi_fortran_argv_f2c(char *array, int len, char ***argv)
|
||||
|
||||
*argv = NULL;
|
||||
while (1) {
|
||||
if (OMPI_SUCCESS != (err = ompi_fortran_string_f2c(array, len,
|
||||
if (OMPI_SUCCESS != (err = ompi_fortran_string_f2c(array, string_len,
|
||||
&cstr))) {
|
||||
opal_argv_free(*argv);
|
||||
return err;
|
||||
@ -127,7 +129,7 @@ int ompi_fortran_argv_f2c(char *array, int len, char ***argv)
|
||||
}
|
||||
|
||||
free(cstr);
|
||||
array += len;
|
||||
array += advance;
|
||||
}
|
||||
|
||||
return OMPI_SUCCESS;
|
||||
@ -135,25 +137,27 @@ int ompi_fortran_argv_f2c(char *array, int len, char ***argv)
|
||||
|
||||
|
||||
/*
|
||||
* creates a C argument vector from an F77 array of argvs. The
|
||||
* returned array needs to be freed by the caller
|
||||
* Creates a set of C argv arrays from an F77 array of argv's. The
|
||||
* returned arrays need to be freed by the caller.
|
||||
*/
|
||||
int ompi_fortran_multiple_argvs_f2c(int count, char *array, int len,
|
||||
char ****argv)
|
||||
int ompi_fortran_multiple_argvs_f2c(int num_argv_arrays, char *array,
|
||||
int string_len, char ****argv)
|
||||
{
|
||||
char ***argv_array;
|
||||
int i;
|
||||
char *current_array = array;
|
||||
int ret;
|
||||
|
||||
argv_array = (char ***) malloc (count * sizeof(char **));
|
||||
argv_array = (char ***) malloc (num_argv_arrays * sizeof(char **));
|
||||
|
||||
for (i = 0; i < count; ++i) {
|
||||
ret = ompi_fortran_argv_f2c(current_array, len, &argv_array[i]);
|
||||
for (i = 0; i < num_argv_arrays; ++i) {
|
||||
ret = ompi_fortran_argv_f2c(current_array, string_len,
|
||||
string_len * num_argv_arrays,
|
||||
&argv_array[i]);
|
||||
if (OMPI_SUCCESS != ret) {
|
||||
return ret;
|
||||
}
|
||||
current_array += len * i;
|
||||
current_array += string_len;
|
||||
}
|
||||
*argv = argv_array;
|
||||
return OMPI_SUCCESS;
|
||||
|
@ -9,6 +9,7 @@
|
||||
* University of Stuttgart. All rights reserved.
|
||||
* Copyright (c) 2004-2005 The Regents of the University of California.
|
||||
* All rights reserved.
|
||||
* Copyright (c) 2010 Cisco Systems, Inc. All rights reserved.
|
||||
* $COPYRIGHT$
|
||||
*
|
||||
* Additional copyrights may follow
|
||||
@ -34,8 +35,8 @@ OMPI_GENERATE_F77_BINDINGS (PMPI_COMM_SPAWN,
|
||||
pmpi_comm_spawn_,
|
||||
pmpi_comm_spawn__,
|
||||
pmpi_comm_spawn_f,
|
||||
(char *command, char *argv, MPI_Fint *maxprocs, MPI_Fint *info, MPI_Fint *root, MPI_Fint *comm, MPI_Fint *intercomm, MPI_Fint *array_of_errcodes, MPI_Fint *ierr, int cmd_len, int argv_len),
|
||||
(command, argv, maxprocs, info, root, comm, intercomm, array_of_errcodes, ierr, cmd_len, argv_len) )
|
||||
(char *command, char *argv, MPI_Fint *maxprocs, MPI_Fint *info, MPI_Fint *root, MPI_Fint *comm, MPI_Fint *intercomm, MPI_Fint *array_of_errcodes, MPI_Fint *ierr, int cmd_len, int string_len),
|
||||
(command, argv, maxprocs, info, root, comm, intercomm, array_of_errcodes, ierr, cmd_len, string_len) )
|
||||
#endif
|
||||
|
||||
#if OPAL_HAVE_WEAK_SYMBOLS
|
||||
@ -51,8 +52,8 @@ OMPI_GENERATE_F77_BINDINGS (MPI_COMM_SPAWN,
|
||||
mpi_comm_spawn_,
|
||||
mpi_comm_spawn__,
|
||||
mpi_comm_spawn_f,
|
||||
(char *command, char *argv, MPI_Fint *maxprocs, MPI_Fint *info, MPI_Fint *root, MPI_Fint *comm, MPI_Fint *intercomm, MPI_Fint *array_of_errcodes, MPI_Fint *ierr, int cmd_len, int argv_len),
|
||||
(command, argv, maxprocs, info, root, comm, intercomm, array_of_errcodes, ierr, cmd_len, argv_len) )
|
||||
(char *command, char *argv, MPI_Fint *maxprocs, MPI_Fint *info, MPI_Fint *root, MPI_Fint *comm, MPI_Fint *intercomm, MPI_Fint *array_of_errcodes, MPI_Fint *ierr, int cmd_len, int string_len),
|
||||
(command, argv, maxprocs, info, root, comm, intercomm, array_of_errcodes, ierr, cmd_len, string_len) )
|
||||
#endif
|
||||
|
||||
|
||||
@ -63,7 +64,7 @@ OMPI_GENERATE_F77_BINDINGS (MPI_COMM_SPAWN,
|
||||
void mpi_comm_spawn_f(char *command, char *argv, MPI_Fint *maxprocs,
|
||||
MPI_Fint *info, MPI_Fint *root, MPI_Fint *comm,
|
||||
MPI_Fint *intercomm, MPI_Fint *array_of_errcodes,
|
||||
MPI_Fint *ierr, int cmd_len, int argv_len)
|
||||
MPI_Fint *ierr, int cmd_len, int string_len)
|
||||
{
|
||||
MPI_Comm c_comm, c_new_comm;
|
||||
MPI_Info c_info;
|
||||
@ -92,7 +93,7 @@ void mpi_comm_spawn_f(char *command, char *argv, MPI_Fint *maxprocs,
|
||||
if (OMPI_IS_FORTRAN_ARGV_NULL(argv)) {
|
||||
c_argv = MPI_ARGV_NULL;
|
||||
} else {
|
||||
ompi_fortran_argv_f2c(argv, argv_len, &c_argv);
|
||||
ompi_fortran_argv_f2c(argv, string_len, string_len, &c_argv);
|
||||
}
|
||||
|
||||
*ierr = OMPI_INT_2_FINT(MPI_Comm_spawn(c_command, c_argv,
|
||||
|
@ -9,6 +9,7 @@
|
||||
* University of Stuttgart. All rights reserved.
|
||||
* Copyright (c) 2004-2005 The Regents of the University of California.
|
||||
* All rights reserved.
|
||||
* Copyright (c) 2010 Cisco Systems, Inc. All rights reserved.
|
||||
* $COPYRIGHT$
|
||||
*
|
||||
* Additional copyrights may follow
|
||||
@ -35,8 +36,8 @@ OMPI_GENERATE_F77_BINDINGS (PMPI_COMM_SPAWN_MULTIPLE,
|
||||
pmpi_comm_spawn_multiple_,
|
||||
pmpi_comm_spawn_multiple__,
|
||||
pmpi_comm_spawn_multiple_f,
|
||||
(MPI_Fint *count, char *array_of_commands, char *array_of_argv, MPI_Fint *array_of_maxprocs, MPI_Fint *array_of_info, MPI_Fint *root, MPI_Fint *comm, MPI_Fint *intercomm, MPI_Fint *array_of_errcodes, MPI_Fint *ierr, int cmd_len, int argv_len),
|
||||
(count, array_of_commands, array_of_argv, array_of_maxprocs, array_of_info, root, comm, intercomm, array_of_errcodes, ierr, cmd_len, argv_len) )
|
||||
(MPI_Fint *count, char *array_of_commands, char *array_of_argv, MPI_Fint *array_of_maxprocs, MPI_Fint *array_of_info, MPI_Fint *root, MPI_Fint *comm, MPI_Fint *intercomm, MPI_Fint *array_of_errcodes, MPI_Fint *ierr, int cmd_string_len, int argv_string_len),
|
||||
(count, array_of_commands, array_of_argv, array_of_maxprocs, array_of_info, root, comm, intercomm, array_of_errcodes, ierr, cmd_string_len, argv_string_len) )
|
||||
#endif
|
||||
|
||||
#if OPAL_HAVE_WEAK_SYMBOLS
|
||||
@ -52,8 +53,8 @@ OMPI_GENERATE_F77_BINDINGS (MPI_COMM_SPAWN_MULTIPLE,
|
||||
mpi_comm_spawn_multiple_,
|
||||
mpi_comm_spawn_multiple__,
|
||||
mpi_comm_spawn_multiple_f,
|
||||
(MPI_Fint *count, char *array_of_commands, char *array_of_argv, MPI_Fint *array_of_maxprocs, MPI_Fint *array_of_info, MPI_Fint *root, MPI_Fint *comm, MPI_Fint *intercomm, MPI_Fint *array_of_errcodes, MPI_Fint *ierr, int cmd_len, int argv_len),
|
||||
(count, array_of_commands, array_of_argv, array_of_maxprocs, array_of_info, root, comm, intercomm, array_of_errcodes, ierr, cmd_len, argv_len) )
|
||||
(MPI_Fint *count, char *array_of_commands, char *array_of_argv, MPI_Fint *array_of_maxprocs, MPI_Fint *array_of_info, MPI_Fint *root, MPI_Fint *comm, MPI_Fint *intercomm, MPI_Fint *array_of_errcodes, MPI_Fint *ierr, int cmd_string_len, int argv_string_len),
|
||||
(count, array_of_commands, array_of_argv, array_of_maxprocs, array_of_info, root, comm, intercomm, array_of_errcodes, ierr, cmd_string_len, argv_string_len) )
|
||||
#endif
|
||||
|
||||
|
||||
@ -67,7 +68,7 @@ void mpi_comm_spawn_multiple_f(MPI_Fint *count, char *array_commands,
|
||||
MPI_Fint *array_info, MPI_Fint *root,
|
||||
MPI_Fint *comm, MPI_Fint *intercomm,
|
||||
MPI_Fint *array_errcds, MPI_Fint *ierr,
|
||||
int cmd_len, int argv_len)
|
||||
int cmd_string_len, int argv_string_len)
|
||||
{
|
||||
MPI_Comm c_comm, c_new_comm;
|
||||
MPI_Info *c_info;
|
||||
@ -99,12 +100,13 @@ void mpi_comm_spawn_multiple_f(MPI_Fint *count, char *array_commands,
|
||||
c_array_argv = MPI_ARGVS_NULL;
|
||||
} else {
|
||||
ompi_fortran_multiple_argvs_f2c(OMPI_FINT_2_INT(*count), array_argv,
|
||||
argv_len, &c_array_argv);
|
||||
argv_string_len, &c_array_argv);
|
||||
}
|
||||
|
||||
OMPI_ARRAY_FINT_2_INT(array_maxprocs, array_size);
|
||||
|
||||
ompi_fortran_argv_f2c(array_commands, cmd_len, &c_array_commands);
|
||||
ompi_fortran_argv_f2c(array_commands, cmd_string_len,
|
||||
cmd_string_len, &c_array_commands);
|
||||
|
||||
c_info = (MPI_Info *) malloc (array_size * sizeof(MPI_Info));
|
||||
for (i = 0; i < array_size; ++i) {
|
||||
|
@ -9,6 +9,7 @@
|
||||
* University of Stuttgart. All rights reserved.
|
||||
* Copyright (c) 2004-2005 The Regents of the University of California.
|
||||
* All rights reserved.
|
||||
* Copyright (c) 2010 Cisco Systems, Inc. All rights reserved.
|
||||
* $COPYRIGHT$
|
||||
*
|
||||
* Additional copyrights may follow
|
||||
@ -61,7 +62,8 @@ BEGIN_C_DECLS
|
||||
* strings.
|
||||
*
|
||||
* @param farray Array of fortran strings
|
||||
* @param len Length of fortran array
|
||||
* @param string_len Length of each fortran string in the array
|
||||
* @param advance Number of bytes to advance to get to the next string
|
||||
* @param cargv Returned argv-style array of C strings
|
||||
*
|
||||
* @retval OMPI_SUCCESS upon success
|
||||
@ -72,8 +74,20 @@ BEGIN_C_DECLS
|
||||
* strings. The argv array will be allocated and returned; it is
|
||||
* the caller's responsibility to invoke opal_argv_free() to free
|
||||
* it later (or equivalent).
|
||||
*
|
||||
* For 1D Fortran string arrays, advance will == string_len.
|
||||
*
|
||||
* However, when this function is used (indirectly) for
|
||||
* MPI_COMM_SPAWN_MULTIPLE, a 2D array of Fortran strings is
|
||||
* converted to individual C-style argv vectors. In this case,
|
||||
* Fortran will intertwine the strings of the different argv
|
||||
* vectors in memory; the displacement between the beginning of 2
|
||||
* strings in a single argv vector is (string_len *
|
||||
* number_of_argv_arrays). Hence, the advance parameter is used
|
||||
* to specify this displacement.
|
||||
*/
|
||||
OMPI_DECLSPEC int ompi_fortran_argv_f2c(char *farray, int len, char ***cargv);
|
||||
OMPI_DECLSPEC int ompi_fortran_argv_f2c(char *farray, int string_len,
|
||||
int advancex, char ***cargv);
|
||||
|
||||
/**
|
||||
* Convert an array of argvs to a C style array of argvs
|
||||
|
Загрузка…
x
Ссылка в новой задаче
Block a user