Update PMIx to official v3.1.4 release
Signed-off-by: Ralph Castain <rhc@pmix.org>
Этот коммит содержится в:
родитель
cb3ed472e5
Коммит
167ca31a31
@ -21,6 +21,28 @@ example, a bug might be fixed in the master, and then moved to
|
||||
multiple release branches.
|
||||
|
||||
|
||||
3.1.4 -- 9 Aug 2019
|
||||
----------------------
|
||||
- PR #1342: Fix if_linux_ipv6_open interface filter
|
||||
- PR #1344: Remove unnecessary libtool init for c++
|
||||
- PR #1346: Fix incorrect pointer casts/deref
|
||||
- PR #1347/#1348: Fix use of gethostname
|
||||
- PR #1353/#1357: util/environ: use setenv() if available
|
||||
- PR #1354: Plug a misc memory leak in the pmix_query_caddy_t destructor
|
||||
- PR #1356: Fix another pointer cast/deref in test suite
|
||||
- PR #1358: Implement support for class-based info arrays
|
||||
- PR #1359: Plug misc minor memory leaks
|
||||
- PR #1368: Backport support for libev
|
||||
- PR #1369: Fix legacy support for PMI-1
|
||||
- PR #1370: Cleanup handling of data requests for different nspaces
|
||||
- PR #1193: Resolve get of proc-specific job-level info from another nspace
|
||||
- PR #1376: Fix problems in the Log code path, updates to simple test suite
|
||||
- PR #1377: Skip fastpath/dstore for NULL keys
|
||||
- PR #1379: Change IF_NAMESIZE to PMIX_IF_NAMESIZE and set to safe size
|
||||
- PR #1385: Check for EINVAL return from posix_fallocate
|
||||
- PR #1389: Plug misc memory leaks in configure
|
||||
|
||||
|
||||
3.1.3 -- 2 July 2019
|
||||
----------------------
|
||||
- PR #1096: Restore PMIX_NUM_SLOTS for backward compatibility
|
||||
@ -120,6 +142,45 @@ multiple release branches.
|
||||
- Fix a bug when registering default event handlers
|
||||
|
||||
|
||||
3.1.0 -- 17 Jan 2019
|
||||
----------------------
|
||||
**** THIS RELEASE MARKS THE STARTING POINT FOR FULL COMPLIANCE
|
||||
**** WITH THE PMIX v3 STANDARD. ALL API BEHAVIORS AND ATTRIBUTE
|
||||
**** DEFINITIONS MEET THE v3 STANDARD SPECIFICATIONS.
|
||||
- Add a new, faster dstore GDS component 'ds21'
|
||||
- Performance optimizations for the dstore GDS components.
|
||||
- Plug miscellaneous memory leaks
|
||||
- Silence an unnecessary warning message when checking connection
|
||||
to a non-supporting server
|
||||
- Ensure lost-connection events get delivered to default event
|
||||
handlers
|
||||
- Correctly handle cache refresh for queries
|
||||
- Protect against race conditions between host and internal library
|
||||
when dealing with async requests
|
||||
- Cleanup tool operations and add support for connections to
|
||||
remote servers. Initial support for debugger direct/indirect
|
||||
launch verified with PRRTE. Cleanup setting of tmpdir options.
|
||||
Drop rendezvous files when acting as a launcher
|
||||
- Automatically store the server URI for easy access by client
|
||||
- Provide MCA parameter to control TCP connect retry/timeout
|
||||
- Update event notification system to properly evict oldest events
|
||||
when more space is needed
|
||||
- Fix a number of error paths
|
||||
- Update IOF cache code to properly drop oldest message. Provide
|
||||
MCA parameter for setting cache size.
|
||||
- Handle setsockopt(SO_RCVTIMEO) not being supported
|
||||
- Ensure that epilogs get run even when connections unexpectedly
|
||||
terminate. Properly split epilog strings to process multiple
|
||||
paths
|
||||
- Pass the tool's command line to the server so it can be returned
|
||||
in queries
|
||||
- Add support for C11 atomics
|
||||
- Support collection and forwarding of fabric-specific envars
|
||||
- Improve handling of hwloc configure option
|
||||
- Fix PMIx_server_generate_regex to preserve node ordering
|
||||
- Fix a bug when registering default event handlers
|
||||
|
||||
|
||||
3.0.2 -- 18 Sept 2018
|
||||
----------------------
|
||||
- Ensure we cleanup any active sensors when a peer departs. Allow the
|
||||
|
@ -15,7 +15,7 @@
|
||||
|
||||
major=3
|
||||
minor=1
|
||||
release=3
|
||||
release=4
|
||||
|
||||
# greek is used for alpha or beta release tags. If it is non-empty,
|
||||
# it will be appended to the version number. It does not have to be
|
||||
@ -30,7 +30,7 @@ greek=
|
||||
# command, or with the date (if "git describe" fails) in the form of
|
||||
# "date<date>".
|
||||
|
||||
repo_rev=gitc10fd1d4
|
||||
repo_rev=gite6837057
|
||||
|
||||
# If tarball_version is not empty, it is used as the version string in
|
||||
# the tarball filename, regardless of all other versions listed in
|
||||
@ -44,7 +44,7 @@ tarball_version=
|
||||
|
||||
# The date when this release was created
|
||||
|
||||
date="Jul 02, 2019"
|
||||
date="Aug 09, 2019"
|
||||
|
||||
# The shared library version of each of PMIx's public libraries.
|
||||
# These versions are maintained in accordance with the "Library
|
||||
@ -75,8 +75,8 @@ date="Jul 02, 2019"
|
||||
# Version numbers are described in the Libtool current:revision:age
|
||||
# format.
|
||||
|
||||
libpmix_so_version=4:23:2
|
||||
libpmi_so_version=1:0:0
|
||||
libpmix_so_version=4:24:2
|
||||
libpmi_so_version=1:1:0
|
||||
libpmi2_so_version=1:0:0
|
||||
|
||||
# "Common" components install standalone libraries that are run-time
|
||||
@ -84,4 +84,4 @@ libpmi2_so_version=1:0:0
|
||||
# # well. Yuck; this somewhat breaks the
|
||||
# # components-don't-affect-the-build-system abstraction.
|
||||
#
|
||||
libmca_common_dstore_so_version=1:0:0
|
||||
libmca_common_dstore_so_version=1:1:0
|
||||
|
@ -11,9 +11,9 @@ dnl University of Stuttgart. All rights reserved.
|
||||
dnl Copyright (c) 2004-2005 The Regents of the University of California.
|
||||
dnl All rights reserved.
|
||||
dnl Copyright (c) 2009 Sun Microsystems, Inc. All rights reserved.
|
||||
dnl Copyright (c) 2014-2015 Intel, Inc. All rights reserved.
|
||||
dnl Copyright (c) 2015 Research Organization for Information Science
|
||||
dnl and Technology (RIST). All rights reserved.
|
||||
dnl Copyright (c) 2014-2019 Intel, Inc. All rights reserved.
|
||||
dnl Copyright (c) 2015-2019 Research Organization for Information Science
|
||||
dnl and Technology (RIST). All rights reserved.
|
||||
dnl $COPYRIGHT$
|
||||
dnl
|
||||
dnl Additional copyrights may follow
|
||||
@ -44,7 +44,9 @@ AC_DEFUN([PMIX_C_GET_ALIGNMENT],[
|
||||
FILE *f=fopen("conftestval", "w");
|
||||
if (!f) exit(1);
|
||||
diff = ((char *)&p->x) - ((char *)&p->c);
|
||||
free(p);
|
||||
fprintf(f, "%d\n", (diff >= 0) ? diff : -diff);
|
||||
fclose(f);
|
||||
]])], [AS_TR_SH([pmix_cv_c_align_$1])=`cat conftestval`],
|
||||
[AC_MSG_WARN([*** Problem running configure test!])
|
||||
AC_MSG_WARN([*** See config.log for details.])
|
||||
|
@ -663,7 +663,7 @@ AC_DEFUN([PMIX_SETUP_CORE],[
|
||||
# -lrt might be needed for clock_gettime
|
||||
PMIX_SEARCH_LIBS_CORE([clock_gettime], [rt])
|
||||
|
||||
AC_CHECK_FUNCS([asprintf snprintf vasprintf vsnprintf strsignal socketpair strncpy_s usleep statfs statvfs getpeereid getpeerucred strnlen posix_fallocate tcgetpgrp])
|
||||
AC_CHECK_FUNCS([asprintf snprintf vasprintf vsnprintf strsignal socketpair strncpy_s usleep statfs statvfs getpeereid getpeerucred strnlen posix_fallocate tcgetpgrp setpgid ptsname openpty setenv])
|
||||
|
||||
# On some hosts, htonl is a define, so the AC_CHECK_FUNC will get
|
||||
# confused. On others, it's in the standard library, but stubbed with
|
||||
@ -754,8 +754,22 @@ AC_DEFUN([PMIX_SETUP_CORE],[
|
||||
##################################
|
||||
pmix_show_title "Libevent"
|
||||
|
||||
PMIX_LIBEV_CONFIG
|
||||
PMIX_LIBEVENT_CONFIG
|
||||
|
||||
AS_IF([test $pmix_libevent_support -eq 1 && test $pmix_libev_support -eq 1],
|
||||
[AC_MSG_WARN([Both libevent and libev support have been specified.])
|
||||
AC_MSG_WARN([Only one can be configured against at a time. Please])
|
||||
AC_MSG_WARN([remove one from the configure command line.])
|
||||
AC_MSG_ERROR([Cannot continue])])
|
||||
|
||||
AS_IF([test $pmix_libevent_support -eq 0 && test $pmix_libev_support -eq 0],
|
||||
[AC_MSG_WARN([Either libevent or libev support is required, but neither])
|
||||
AC_MSG_WARN([was found. Please use the configure options to point us])
|
||||
AC_MSG_WARN([to where we can find one or the other library])
|
||||
AC_MSG_ERROR([Cannot continue])])
|
||||
|
||||
|
||||
##################################
|
||||
# HWLOC
|
||||
##################################
|
||||
|
@ -1,7 +1,9 @@
|
||||
dnl -*- shell-script -*-
|
||||
dnl
|
||||
dnl Copyright (c) 2009 Oak Ridge National Labs. All rights reserved.
|
||||
dnl Copyright (c) 2013-2017 Intel, Inc. All rights reserved.
|
||||
dnl Copyright (c) 2013-2019 Intel, Inc. All rights reserved.
|
||||
dnl Copyright (c) 2019 Research Organization for Information Science
|
||||
dnl and Technology (RIST). All rights reserved.
|
||||
dnl
|
||||
dnl $COPYRIGHT$
|
||||
dnl
|
||||
@ -43,6 +45,7 @@ int main (int argc, char * argv[])
|
||||
f=fopen("conftestval", "w");
|
||||
if (!f) exit(1);
|
||||
fprintf (f, "%d", PLATFORM_COMPILER_$1);
|
||||
fclose(f);
|
||||
return 0;
|
||||
}
|
||||
], [
|
||||
@ -75,6 +78,7 @@ int main (int argc, char * argv[])
|
||||
f=fopen("conftestval", "w");
|
||||
if (!f) exit(1);
|
||||
fprintf (f, "%s", PLATFORM_COMPILER_$1);
|
||||
fclose(f);
|
||||
return 0;
|
||||
}
|
||||
], [
|
||||
@ -110,6 +114,7 @@ int main (int argc, char * argv[])
|
||||
f=fopen("conftestval", "w");
|
||||
if (!f) exit(1);
|
||||
fprintf (f, "%s", _STRINGIFY(PLATFORM_COMPILER_$1));
|
||||
fclose(f);
|
||||
return 0;
|
||||
}
|
||||
], [
|
||||
|
@ -10,9 +10,9 @@ dnl Copyright (c) 2004-2005 High Performance Computing Center Stuttgart,
|
||||
dnl University of Stuttgart. All rights reserved.
|
||||
dnl Copyright (c) 2004-2005 The Regents of the University of California.
|
||||
dnl All rights reserved.
|
||||
dnl Copyright (c) 2014 Intel, Inc. All rights reserved.
|
||||
dnl Copyright (c) 2016 Research Organization for Information Science
|
||||
dnl and Technology (RIST). All rights reserved.
|
||||
dnl Copyright (c) 2014-2019 Intel, Inc. All rights reserved.
|
||||
dnl Copyright (c) 2016-2019 Research Organization for Information Science
|
||||
dnl and Technology (RIST). All rights reserved.
|
||||
dnl $COPYRIGHT$
|
||||
dnl
|
||||
dnl Additional copyrights may follow
|
||||
@ -45,6 +45,7 @@ int main ()
|
||||
func (4711, "Help %d [%s]\n", 10, "ten");
|
||||
f=fopen ("conftestval", "w");
|
||||
if (!f) exit (1);
|
||||
fclose(f);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
96
opal/mca/pmix/pmix3x/pmix/config/pmix_setup_libev.m4
Обычный файл
96
opal/mca/pmix/pmix3x/pmix/config/pmix_setup_libev.m4
Обычный файл
@ -0,0 +1,96 @@
|
||||
# -*- shell-script -*-
|
||||
#
|
||||
# Copyright (c) 2009-2015 Cisco Systems, Inc. All rights reserved.
|
||||
# Copyright (c) 2013 Los Alamos National Security, LLC. All rights reserved.
|
||||
# Copyright (c) 2013-2019 Intel, Inc. All rights reserved.
|
||||
# Copyright (c) 2017-2019 Research Organization for Information Science
|
||||
# and Technology (RIST). All rights reserved.
|
||||
# $COPYRIGHT$
|
||||
#
|
||||
# Additional copyrights may follow
|
||||
#
|
||||
# $HEADER$
|
||||
#
|
||||
|
||||
# MCA_libev_CONFIG([action-if-found], [action-if-not-found])
|
||||
# --------------------------------------------------------------------
|
||||
AC_DEFUN([PMIX_LIBEV_CONFIG],[
|
||||
PMIX_VAR_SCOPE_PUSH([pmix_libev_dir pmix_libev_libdir pmix_libev_standard_header_location pmix_libev_standard_lib_location])
|
||||
|
||||
AC_ARG_WITH([libev],
|
||||
[AC_HELP_STRING([--with-libev=DIR],
|
||||
[Search for libev headers and libraries in DIR ])])
|
||||
PMIX_CHECK_WITHDIR([libev], [$with_libev], [include/event.h])
|
||||
|
||||
AC_ARG_WITH([libev-libdir],
|
||||
[AC_HELP_STRING([--with-libev-libdir=DIR],
|
||||
[Search for libev libraries in DIR ])])
|
||||
PMIX_CHECK_WITHDIR([libev-libdir], [$with_livev_libdir], [libev.*])
|
||||
|
||||
pmix_libev_support=0
|
||||
|
||||
AS_IF([test -n "$with_libev" && test "$with_libev" != "no"],
|
||||
[AC_MSG_CHECKING([for libev in])
|
||||
pmix_check_libev_save_CPPFLAGS="$CPPFLAGS"
|
||||
pmix_check_libeve_save_LDFLAGS="$LDFLAGS"
|
||||
pmix_check_libev_save_LIBS="$LIBS"
|
||||
if test "$with_libev" != "yes"; then
|
||||
pmix_libev_dir=$with_libev/include
|
||||
pmix_libev_standard_header_location=no
|
||||
pmix_libev_standard_lib_location=no
|
||||
AS_IF([test -z "$with_libev_libdir" || test "$with_libev_libdir" = "yes"],
|
||||
[if test -d $with_libev/lib; then
|
||||
pmix_libev_libdir=$with_libev/lib
|
||||
elif test -d $with_libev/lib64; then
|
||||
pmix_libev_libdir=$with_libev/lib64
|
||||
else
|
||||
AC_MSG_RESULT([Could not find $with_libev/lib or $with_libev/lib64])
|
||||
AC_MSG_ERROR([Can not continue])
|
||||
fi
|
||||
AC_MSG_RESULT([$pmix_libev_dir and $pmix_libev_libdir])],
|
||||
[AC_MSG_RESULT([$with_libev_libdir])])
|
||||
else
|
||||
AC_MSG_RESULT([(default search paths)])
|
||||
pmix_libev_standard_header_location=yes
|
||||
pmix_libev_standard_lib_location=yes
|
||||
fi
|
||||
AS_IF([test ! -z "$with_libev_libdir" && test "$with_libev_libdir" != "yes"],
|
||||
[pmix_libev_libdir="$with_libev_libdir"
|
||||
pmix_libev_standard_lib_location=no])
|
||||
|
||||
PMIX_CHECK_PACKAGE([pmix_libev],
|
||||
[event.h],
|
||||
[ev],
|
||||
[event_base_new],
|
||||
[],
|
||||
[$pmix_libev_dir],
|
||||
[$pmix_libev_libdir],
|
||||
[pmix_libev_support=1],
|
||||
[pmix_libev_support=0])
|
||||
CPPFLAGS="$pmix_check_libev_save_CPPFLAGS"
|
||||
LDFLAGS="$pmix_check_libev_save_LDFLAGS"
|
||||
LIBS="$pmix_check_libev_save_LIBS"])
|
||||
|
||||
AS_IF([test $pmix_libev_support -eq 1],
|
||||
[LIBS="$LIBS $pmix_libev_LIBS"
|
||||
|
||||
AS_IF([test "$pmix_libev_standard_header_location" != "yes"],
|
||||
[CPPFLAGS="$CPPFLAGS $pmix_libev_CPPFLAGS"])
|
||||
AS_IF([test "$pmix_libev_standard_lib_location" != "yes"],
|
||||
[LDFLAGS="$LDFLAGS $pmix_libev_LDFLAGS"])])
|
||||
|
||||
AC_MSG_CHECKING([will libev support be built])
|
||||
if test $pmix_libev_support -eq 1; then
|
||||
AC_MSG_RESULT([yes])
|
||||
PMIX_EVENT_HEADER="<event.h>"
|
||||
AC_DEFINE_UNQUOTED([PMIX_EVENT_HEADER], [$PMIX_EVENT_HEADER],
|
||||
[Location of event.h])
|
||||
PMIX_SUMMARY_ADD([[External Packages]],[[libev]],[libev],[$pmix_libev_dir])
|
||||
else
|
||||
AC_MSG_RESULT([no])
|
||||
fi
|
||||
|
||||
AC_DEFINE_UNQUOTED([PMIX_HAVE_LIBEV], [$pmix_libev_support], [Whether we are building against libev])
|
||||
|
||||
PMIX_VAR_SCOPE_POP
|
||||
])dnl
|
@ -3,8 +3,8 @@
|
||||
# Copyright (c) 2009-2015 Cisco Systems, Inc. All rights reserved.
|
||||
# Copyright (c) 2013 Los Alamos National Security, LLC. All rights reserved.
|
||||
# Copyright (c) 2013-2019 Intel, Inc. All rights reserved.
|
||||
# Copyright (c) 2017 Research Organization for Information Science
|
||||
# and Technology (RIST). All rights reserved.
|
||||
# Copyright (c) 2017-2019 Research Organization for Information Science
|
||||
# and Technology (RIST). All rights reserved.
|
||||
# $COPYRIGHT$
|
||||
#
|
||||
# Additional copyrights may follow
|
||||
@ -19,20 +19,25 @@ AC_DEFUN([PMIX_LIBEVENT_CONFIG],[
|
||||
[AC_HELP_STRING([--with-libevent-header=HEADER],
|
||||
[The value that should be included in C files to include event.h])])
|
||||
|
||||
pmix_libevent_support=0
|
||||
|
||||
AS_IF([test "$pmix_mode" = "embedded"],
|
||||
[_PMIX_LIBEVENT_EMBEDDED_MODE],
|
||||
[_PMIX_LIBEVENT_EXTERNAL])
|
||||
[AS_IF([test $pmix_libev_support -eq 0],
|
||||
[_PMIX_LIBEVENT_EXTERNAL])])
|
||||
|
||||
AC_MSG_CHECKING([libevent header])
|
||||
AC_DEFINE_UNQUOTED([PMIX_EVENT_HEADER], [$PMIX_EVENT_HEADER],
|
||||
[Location of event.h])
|
||||
AC_MSG_RESULT([$PMIX_EVENT_HEADER])
|
||||
AC_MSG_CHECKING([libevent2/thread header])
|
||||
AC_DEFINE_UNQUOTED([PMIX_EVENT2_THREAD_HEADER], [$PMIX_EVENT2_THREAD_HEADER],
|
||||
[Location of event2/thread.h])
|
||||
AC_MSG_RESULT([$PMIX_EVENT2_THREAD_HEADER])
|
||||
if test $pmix_libevent_support -eq 1; then
|
||||
AC_MSG_CHECKING([libevent header])
|
||||
AC_DEFINE_UNQUOTED([PMIX_EVENT_HEADER], [$PMIX_EVENT_HEADER],
|
||||
[Location of event.h])
|
||||
AC_MSG_RESULT([$PMIX_EVENT_HEADER])
|
||||
AC_MSG_CHECKING([libevent2/thread header])
|
||||
AC_DEFINE_UNQUOTED([PMIX_EVENT2_THREAD_HEADER], [$PMIX_EVENT2_THREAD_HEADER],
|
||||
[Location of event2/thread.h])
|
||||
AC_MSG_RESULT([$PMIX_EVENT2_THREAD_HEADER])
|
||||
|
||||
PMIX_SUMMARY_ADD([[External Packages]],[[Libevent]], [pmix_libevent], [yes ($pmix_libevent_source)])
|
||||
PMIX_SUMMARY_ADD([[External Packages]],[[Libevent]], [pmix_libevent], [yes ($pmix_libevent_source)])
|
||||
fi
|
||||
])
|
||||
|
||||
AC_DEFUN([_PMIX_LIBEVENT_EMBEDDED_MODE],[
|
||||
@ -46,7 +51,8 @@ AC_DEFUN([_PMIX_LIBEVENT_EMBEDDED_MODE],[
|
||||
PMIX_EVENT2_THREAD_HEADER="$with_libevent_header"])
|
||||
|
||||
pmix_libevent_source=embedded
|
||||
])
|
||||
pmix_libevent_support=1
|
||||
])
|
||||
|
||||
AC_DEFUN([_PMIX_LIBEVENT_EXTERNAL],[
|
||||
PMIX_VAR_SCOPE_PUSH([pmix_event_dir pmix_event_libdir pmix_event_defaults])
|
||||
@ -55,88 +61,109 @@ AC_DEFUN([_PMIX_LIBEVENT_EXTERNAL],[
|
||||
[AC_HELP_STRING([--with-libevent=DIR],
|
||||
[Search for libevent headers and libraries in DIR ])])
|
||||
|
||||
# Bozo check
|
||||
AS_IF([test "$with_libevent" = "no"],
|
||||
[AC_MSG_WARN([It is not possible to configure PMIx --without-libevent])
|
||||
AC_MSG_ERROR([Cannot continue])])
|
||||
|
||||
AC_ARG_WITH([libevent-libdir],
|
||||
[AC_HELP_STRING([--with-libevent-libdir=DIR],
|
||||
[Search for libevent libraries in DIR ])])
|
||||
|
||||
pmix_check_libevent_save_CPPFLAGS="$CPPFLAGS"
|
||||
pmix_check_libevent_save_LDFLAGS="$LDFLAGS"
|
||||
pmix_check_libevent_save_LIBS="$LIBS"
|
||||
|
||||
# get rid of the trailing slash(es)
|
||||
libevent_prefix=$(echo $with_libevent | sed -e 'sX/*$XXg')
|
||||
libeventdir_prefix=$(echo $with_libevent_libdir | sed -e 'sX/*$XXg')
|
||||
|
||||
AC_MSG_CHECKING([for libevent in])
|
||||
if test ! -z "$libevent_prefix" && test "$libevent_prefix" != "yes"; then
|
||||
pmix_event_defaults=no
|
||||
pmix_event_dir=$libevent_prefix
|
||||
if test -d $libevent_prefix/lib; then
|
||||
pmix_event_libdir=$libevent_prefix/lib
|
||||
elif test -d $libevent_prefix/lib64; then
|
||||
pmix_event_libdir=$libevent_prefix/lib64
|
||||
elif test -d $libevent_prefix; then
|
||||
pmix_event_libdir=$libevent_prefix
|
||||
if test "$libevent_prefix" != "no"; then
|
||||
AC_MSG_CHECKING([for libevent in])
|
||||
if test ! -z "$libevent_prefix" && test "$libevent_prefix" != "yes"; then
|
||||
pmix_event_defaults=no
|
||||
pmix_event_dir=$libevent_prefix/include
|
||||
if test -d $libevent_prefix/lib; then
|
||||
pmix_event_libdir=$libevent_prefix/lib
|
||||
elif test -d $libevent_prefix/lib64; then
|
||||
pmix_event_libdir=$libevent_prefix/lib64
|
||||
elif test -d $libevent_prefix; then
|
||||
pmix_event_libdir=$libevent_prefix
|
||||
else
|
||||
AC_MSG_RESULT([Could not find $libevent_prefix/lib, $libevent_prefix/lib64, or $libevent_prefix])
|
||||
AC_MSG_ERROR([Can not continue])
|
||||
fi
|
||||
AC_MSG_RESULT([$pmix_event_dir and $pmix_event_libdir])
|
||||
else
|
||||
AC_MSG_RESULT([Could not find $libevent_prefix/lib, $libevent_prefix/lib64, or $libevent_prefix])
|
||||
AC_MSG_ERROR([Can not continue])
|
||||
pmix_event_defaults=yes
|
||||
pmix_event_dir=/usr/include
|
||||
if test -d /usr/lib; then
|
||||
pmix_event_libdir=/usr/lib
|
||||
AC_MSG_RESULT([(default search paths)])
|
||||
elif test -d /usr/lib64; then
|
||||
pmix_event_libdir=/usr/lib64
|
||||
AC_MSG_RESULT([(default search paths)])
|
||||
else
|
||||
AC_MSG_RESULT([default paths not found])
|
||||
pmix_libevent_support=0
|
||||
fi
|
||||
fi
|
||||
AC_MSG_RESULT([$pmix_event_dir and $pmix_event_libdir])
|
||||
else
|
||||
pmix_event_defaults=yes
|
||||
pmix_event_dir=/usr/include
|
||||
if test -d /usr/lib; then
|
||||
pmix_event_libdir=/usr/lib
|
||||
elif test -d /usr/lib64; then
|
||||
pmix_event_libdir=/usr/lib64
|
||||
else
|
||||
AC_MSG_RESULT([not found])
|
||||
AC_MSG_WARN([Could not find /usr/lib or /usr/lib64 - you may])
|
||||
AC_MSG_WARN([need to specify --with-libevent-libdir=<path>])
|
||||
AC_MSG_ERROR([Can not continue])
|
||||
AS_IF([test ! -z "$libeventdir_prefix" && "$libeventdir_prefix" != "yes"],
|
||||
[pmix_event_libdir="$libeventdir_prefix"])
|
||||
|
||||
PMIX_CHECK_PACKAGE([pmix_libevent],
|
||||
[event.h],
|
||||
[event],
|
||||
[event_config_new],
|
||||
[-levent -levent_pthreads],
|
||||
[$pmix_event_dir],
|
||||
[$pmix_event_libdir],
|
||||
[pmix_libevent_support=1],
|
||||
[pmix_libevent_support=0])
|
||||
|
||||
AS_IF([test "$pmix_event_defaults" = "no"],
|
||||
[PMIX_FLAGS_APPEND_UNIQ(CPPFLAGS, $pmix_libevent_CPPFLAGS)
|
||||
PMIX_FLAGS_APPEND_UNIQ(LDFLAGS, $pmix_libevent_LDFLAGS)])
|
||||
PMIX_FLAGS_APPEND_UNIQ(LIBS, $pmix_libevent_LIBS)
|
||||
|
||||
if test $pmix_libevent_support -eq 1; then
|
||||
# Ensure that this libevent has the symbol
|
||||
# "evthread_set_lock_callbacks", which will only exist if
|
||||
# libevent was configured with thread support.
|
||||
AC_CHECK_LIB([event], [evthread_set_lock_callbacks],
|
||||
[],
|
||||
[AC_MSG_WARN([External libevent does not have thread support])
|
||||
AC_MSG_WARN([PMIx requires libevent to be compiled with])
|
||||
AC_MSG_WARN([thread support enabled])
|
||||
pmix_libevent_support=0])
|
||||
fi
|
||||
if test $pmix_libevent_support -eq 1; then
|
||||
AC_CHECK_LIB([event_pthreads], [evthread_use_pthreads],
|
||||
[],
|
||||
[AC_MSG_WARN([External libevent does not have thread support])
|
||||
AC_MSG_WARN([PMIx requires libevent to be compiled with])
|
||||
AC_MSG_WARN([thread support enabled])
|
||||
pmix_libevent_support=0])
|
||||
fi
|
||||
AC_MSG_RESULT([(default search paths)])
|
||||
fi
|
||||
AS_IF([test ! -z "$libeventdir_prefix" && "$libeventdir_prefix" != "yes"],
|
||||
[pmix_event_libdir="$libeventdir_prefix"])
|
||||
|
||||
PMIX_CHECK_PACKAGE([pmix_libevent],
|
||||
[event.h],
|
||||
[event],
|
||||
[event_config_new],
|
||||
[-levent -levent_pthreads],
|
||||
[$pmix_event_dir],
|
||||
[$pmix_event_libdir],
|
||||
[],
|
||||
[AC_MSG_WARN([LIBEVENT SUPPORT NOT FOUND])
|
||||
AC_MSG_ERROR([CANNOT CONTINUE])])
|
||||
CPPFLAGS="$pmix_check_libevent_save_CPPFLAGS"
|
||||
LDFLAGS="$pmix_check_libevent_save_LDFLAGS"
|
||||
LIBS="$pmix_check_libevent_save_LIBS"
|
||||
|
||||
AS_IF([test "$pmix_event_defaults" = "no"],
|
||||
[PMIX_FLAGS_APPEND_UNIQ(CPPFLAGS, $pmix_libevent_CPPFLAGS)
|
||||
PMIX_FLAGS_APPEND_UNIQ(LDFLAGS, $pmix_libevent_LDFLAGS)])
|
||||
PMIX_FLAGS_APPEND_UNIQ(LIBS, $pmix_libevent_LIBS)
|
||||
AC_MSG_CHECKING([will libevent support be built])
|
||||
if test $pmix_libevent_support -eq 1; then
|
||||
AC_MSG_RESULT([yes])
|
||||
# Set output variables
|
||||
PMIX_EVENT_HEADER="<event.h>"
|
||||
PMIX_EVENT2_THREAD_HEADER="<event2/thread.h>"
|
||||
AC_DEFINE_UNQUOTED([PMIX_EVENT_HEADER], [$PMIX_EVENT_HEADER],
|
||||
[Location of event.h])
|
||||
pmix_libevent_source=$pmix_event_dir
|
||||
AS_IF([test "$pmix_event_defaults" = "no"],
|
||||
[PMIX_FLAGS_APPEND_UNIQ(CPPFLAGS, $pmix_libevent_CPPFLAGS)
|
||||
PMIX_FLAGS_APPEND_UNIQ(LDFLAGS, $pmix_libevent_LDFLAGS)])
|
||||
PMIX_FLAGS_APPEND_UNIQ(LIBS, $pmix_libevent_LIBS)
|
||||
else
|
||||
AC_MSG_RESULT([no])
|
||||
fi
|
||||
|
||||
# Ensure that this libevent has the symbol
|
||||
# "evthread_set_lock_callbacks", which will only exist if
|
||||
# libevent was configured with thread support.
|
||||
AC_CHECK_LIB([event], [evthread_set_lock_callbacks],
|
||||
[],
|
||||
[AC_MSG_WARN([External libevent does not have thread support])
|
||||
AC_MSG_WARN([PMIx requires libevent to be compiled with])
|
||||
AC_MSG_WARN([thread support enabled])
|
||||
AC_MSG_ERROR([Cannot continue])])
|
||||
AC_CHECK_LIB([event_pthreads], [evthread_use_pthreads],
|
||||
[],
|
||||
[AC_MSG_WARN([External libevent does not have thread support])
|
||||
AC_MSG_WARN([PMIx requires libevent to be compiled with])
|
||||
AC_MSG_WARN([thread support enabled])
|
||||
AC_MSG_ERROR([Cannot continue])])
|
||||
|
||||
# Set output variables
|
||||
PMIX_EVENT_HEADER="<event.h>"
|
||||
PMIX_EVENT2_THREAD_HEADER="<event2/thread.h>"
|
||||
pmix_libevent_source=$pmix_event_dir
|
||||
AC_DEFINE_UNQUOTED([PMIX_HAVE_LIBEVENT], [$pmix_libevent_support], [Whether we are building against libevent])
|
||||
|
||||
PMIX_VAR_SCOPE_POP
|
||||
])dnl
|
||||
|
@ -201,7 +201,6 @@ AS_IF([test "$pmix_debug" = "1"],
|
||||
|
||||
LT_INIT()
|
||||
LT_LANG([C])
|
||||
LT_LANG([C++])
|
||||
|
||||
############################################################################
|
||||
# Setup the core
|
||||
|
@ -192,7 +192,7 @@
|
||||
|
||||
Summary: An extended/exascale implementation of PMI
|
||||
Name: %{?_name:%{_name}}%{!?_name:pmix}
|
||||
Version: 3.1.3
|
||||
Version: 3.1.4
|
||||
Release: 1%{?dist}
|
||||
License: BSD
|
||||
Group: Development/Libraries
|
||||
|
@ -254,6 +254,9 @@ int main(int argc, char **argv)
|
||||
fprintf(stderr, "Client ns %s rank %d: PMIx_Commit failed: %d\n", myproc.nspace, myproc.rank, rc);
|
||||
goto done;
|
||||
}
|
||||
if (0 == myproc.rank) {
|
||||
sleep(2);
|
||||
}
|
||||
|
||||
/* call fence to synchronize with our peers - instruct
|
||||
* the fence operation to collect and return all "put"
|
||||
|
@ -49,9 +49,7 @@ int main(int argc, char **argv)
|
||||
char nsp2[PMIX_MAX_NSLEN+1];
|
||||
pmix_app_t *app;
|
||||
char hostname[1024], dir[1024];
|
||||
pmix_proc_t *peers;
|
||||
size_t npeers, ntmp=0;
|
||||
char *nodelist;
|
||||
size_t ntmp=0;
|
||||
|
||||
if (0 > gethostname(hostname, sizeof(hostname))) {
|
||||
exit(1);
|
||||
@ -71,14 +69,14 @@ int main(int argc, char **argv)
|
||||
(void)strncpy(proc.nspace, myproc.nspace, PMIX_MAX_NSLEN);
|
||||
proc.rank = PMIX_RANK_WILDCARD;
|
||||
|
||||
/* get our universe size */
|
||||
if (PMIX_SUCCESS != (rc = PMIx_Get(&proc, PMIX_UNIV_SIZE, NULL, 0, &val))) {
|
||||
fprintf(stderr, "Client ns %s rank %d: PMIx_Get universe size failed: %d\n", myproc.nspace, myproc.rank, rc);
|
||||
/* get our job size */
|
||||
if (PMIX_SUCCESS != (rc = PMIx_Get(&proc, PMIX_JOB_SIZE, NULL, 0, &val))) {
|
||||
fprintf(stderr, "Client ns %s rank %d: PMIx_Get job size failed: %d\n", myproc.nspace, myproc.rank, rc);
|
||||
goto done;
|
||||
}
|
||||
nprocs = val->data.uint32;
|
||||
PMIX_VALUE_RELEASE(val);
|
||||
fprintf(stderr, "Client %s:%d universe size %d\n", myproc.nspace, myproc.rank, nprocs);
|
||||
fprintf(stderr, "Client %s:%d job size %d\n", myproc.nspace, myproc.rank, nprocs);
|
||||
|
||||
/* call fence to sync */
|
||||
(void)strncpy(proc.nspace, myproc.nspace, PMIX_MAX_NSLEN);
|
||||
@ -103,13 +101,6 @@ int main(int argc, char **argv)
|
||||
app->env = (char**)malloc(2 * sizeof(char*));
|
||||
app->env[0] = strdup("PMIX_ENV_VALUE=3");
|
||||
app->env[1] = NULL;
|
||||
PMIX_INFO_CREATE(app->info, 2);
|
||||
(void)strncpy(app->info[0].key, "DARTH", PMIX_MAX_KEYLEN);
|
||||
app->info[0].value.type = PMIX_INT8;
|
||||
app->info[0].value.data.int8 = 12;
|
||||
(void)strncpy(app->info[1].key, "VADER", PMIX_MAX_KEYLEN);
|
||||
app->info[1].value.type = PMIX_DOUBLE;
|
||||
app->info[1].value.data.dval = 12.34;
|
||||
|
||||
fprintf(stderr, "Client ns %s rank %d: calling PMIx_Spawn\n", myproc.nspace, myproc.rank);
|
||||
if (PMIX_SUCCESS != (rc = PMIx_Spawn(NULL, 0, app, 1, nsp2))) {
|
||||
@ -122,65 +113,28 @@ int main(int argc, char **argv)
|
||||
val = NULL;
|
||||
(void)strncpy(proc.nspace, nsp2, PMIX_MAX_NSLEN);
|
||||
proc.rank = PMIX_RANK_WILDCARD;
|
||||
if (PMIX_SUCCESS != (rc = PMIx_Get(&proc, PMIX_UNIV_SIZE, NULL, 0, &val)) ||
|
||||
if (PMIX_SUCCESS != (rc = PMIx_Get(&proc, PMIX_JOB_SIZE, NULL, 0, &val)) ||
|
||||
NULL == val) {
|
||||
fprintf(stderr, "Client ns %s rank %d: PMIx_Get universe size failed: %d\n", myproc.nspace, myproc.rank, rc);
|
||||
fprintf(stderr, "Client ns %s rank %d: PMIx_Get job size failed: %d\n", myproc.nspace, myproc.rank, rc);
|
||||
goto done;
|
||||
}
|
||||
ntmp = val->data.uint32;
|
||||
PMIX_VALUE_RELEASE(val);
|
||||
fprintf(stderr, "Client %s:%d universe %s size %d\n", myproc.nspace, myproc.rank, nsp2, (int)ntmp);
|
||||
}
|
||||
fprintf(stderr, "Client %s:%d job %s size %d\n", myproc.nspace, myproc.rank, nsp2, (int)ntmp);
|
||||
|
||||
/* just cycle the connect/disconnect functions */
|
||||
(void)strncpy(proc.nspace, myproc.nspace, PMIX_MAX_NSLEN);
|
||||
proc.rank = PMIX_RANK_WILDCARD;
|
||||
if (PMIX_SUCCESS != (rc = PMIx_Connect(&proc, 1, NULL, 0))) {
|
||||
fprintf(stderr, "Client ns %s rank %d: PMIx_Connect failed: %d\n", myproc.nspace, myproc.rank, rc);
|
||||
goto done;
|
||||
/* get a proc-specific value */
|
||||
val = NULL;
|
||||
(void)strncpy(proc.nspace, nsp2, PMIX_MAX_NSLEN);
|
||||
proc.rank = 1;
|
||||
if (PMIX_SUCCESS != (rc = PMIx_Get(&proc, PMIX_LOCAL_RANK, NULL, 0, &val)) ||
|
||||
NULL == val) {
|
||||
fprintf(stderr, "Client ns %s rank %d: PMIx_Get local rank failed: %d\n", myproc.nspace, myproc.rank, rc);
|
||||
goto done;
|
||||
}
|
||||
ntmp = (int)val->data.uint16;
|
||||
PMIX_VALUE_RELEASE(val);
|
||||
fprintf(stderr, "Client %s:%d job %s local rank %d\n", myproc.nspace, myproc.rank, nsp2, (int)ntmp);
|
||||
}
|
||||
fprintf(stderr, "Client ns %s rank %d: PMIx_Connect succeeded\n",
|
||||
myproc.nspace, myproc.rank);
|
||||
if (PMIX_SUCCESS != (rc = PMIx_Disconnect(&proc, 1, NULL, 0))) {
|
||||
fprintf(stderr, "Client ns %s rank %d: PMIx_Disonnect failed: %d\n", myproc.nspace, myproc.rank, rc);
|
||||
goto done;
|
||||
}
|
||||
fprintf(stderr, "Client ns %s rank %d: PMIx_Disconnect succeeded\n", myproc.nspace, myproc.rank);
|
||||
|
||||
/* finally, test the resolve functions */
|
||||
if (0 == myproc.rank) {
|
||||
if (PMIX_SUCCESS != (rc = PMIx_Resolve_peers(hostname, NULL, &peers, &npeers))) {
|
||||
fprintf(stderr, "Client ns %s rank %d: PMIx_Resolve_peers failed for nspace %s: %d\n", myproc.nspace, myproc.rank, nsp2, rc);
|
||||
goto done;
|
||||
}
|
||||
if ((nprocs+ntmp) != npeers) {
|
||||
fprintf(stderr, "Client ns %s rank %d: PMIx_Resolve_peers returned incorrect npeers: %d vs %d\n", myproc.nspace, myproc.rank, (int)(nprocs+ntmp), (int)npeers);
|
||||
goto done;
|
||||
}
|
||||
fprintf(stderr, "Client ns %s rank %d: PMIx_Resolve_peers returned %d npeers\n", myproc.nspace, myproc.rank, (int)npeers);
|
||||
if (PMIX_SUCCESS != (rc = PMIx_Resolve_nodes(nsp2, &nodelist))) {
|
||||
fprintf(stderr, "Client ns %s rank %d: PMIx_Resolve_nodes failed for nspace %s: %d\n", myproc.nspace, myproc.rank, nsp2, rc);
|
||||
goto done;
|
||||
}
|
||||
fprintf(stderr, "Client ns %s rank %d: PMIx_Resolve_nodes %s", myproc.nspace, myproc.rank, nodelist);
|
||||
} else {
|
||||
if (PMIX_SUCCESS != (rc = PMIx_Resolve_peers(hostname, myproc.nspace, &peers, &npeers))) {
|
||||
fprintf(stderr, "Client ns %s rank %d: PMIx_Resolve_peers failed for nspace %s: %d\n", myproc.nspace, myproc.rank, myproc.nspace, rc);
|
||||
goto done;
|
||||
}
|
||||
if (nprocs != npeers) {
|
||||
fprintf(stderr, "Client ns %s rank %d: PMIx_Resolve_peers returned incorrect npeers: %d vs %d\n", myproc.nspace, myproc.rank, nprocs, (int)npeers);
|
||||
goto done;
|
||||
}
|
||||
fprintf(stderr, "Client ns %s rank %d: PMIx_Resolve_peers returned %d npeers\n", myproc.nspace, myproc.rank, (int)npeers);
|
||||
if (PMIX_SUCCESS != (rc = PMIx_Resolve_nodes(myproc.nspace, &nodelist))) {
|
||||
fprintf(stderr, "Client ns %s rank %d: PMIx_Resolve_nodes failed: %d\n", myproc.nspace, myproc.rank, rc);
|
||||
goto done;
|
||||
}
|
||||
fprintf(stderr, "Client ns %s rank %d: PMIx_Resolve_nodes %s\n", myproc.nspace, myproc.rank, nodelist);
|
||||
}
|
||||
PMIX_PROC_FREE(peers, npeers);
|
||||
free(nodelist);
|
||||
|
||||
done:
|
||||
/* call fence to sync */
|
||||
|
@ -1,8 +1,8 @@
|
||||
/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil -*- */
|
||||
/*
|
||||
* Copyright (c) 2014-2018 Intel, Inc. All rights reserved.
|
||||
* Copyright (c) 2014 Research Organization for Information Science
|
||||
* and Technology (RIST). All rights reserved.
|
||||
* Copyright (c) 2014-2019 Intel, Inc. All rights reserved.
|
||||
* Copyright (c) 2014-2019 Research Organization for Information Science
|
||||
* and Technology (RIST). All rights reserved.
|
||||
* Copyright (c) 2016 Mellanox Technologies, Inc.
|
||||
* All rights reserved.
|
||||
* $COPYRIGHT$
|
||||
@ -85,7 +85,7 @@ PMIX_EXPORT int PMI_Init(int *spawned)
|
||||
|
||||
/* getting internal key requires special rank value */
|
||||
memcpy(&proc, &myproc, sizeof(myproc));
|
||||
proc.rank = PMIX_RANK_UNDEF;
|
||||
proc.rank = PMIX_RANK_WILDCARD;
|
||||
|
||||
/* set controlling parameters
|
||||
* PMIX_OPTIONAL - expect that these keys should be available on startup
|
||||
@ -394,8 +394,6 @@ PMIX_EXPORT int PMI_Get_appnum(int *appnum)
|
||||
pmix_value_t *val;
|
||||
pmix_info_t info[1];
|
||||
bool val_optinal = 1;
|
||||
pmix_proc_t proc = myproc;
|
||||
proc.rank = PMIX_RANK_WILDCARD;
|
||||
|
||||
PMI_CHECK();
|
||||
|
||||
@ -414,11 +412,11 @@ PMIX_EXPORT int PMI_Get_appnum(int *appnum)
|
||||
PMIX_INFO_CONSTRUCT(&info[0]);
|
||||
PMIX_INFO_LOAD(&info[0], PMIX_OPTIONAL, &val_optinal, PMIX_BOOL);
|
||||
|
||||
rc = PMIx_Get(&proc, PMIX_APPNUM, info, 1, &val);
|
||||
rc = PMIx_Get(&myproc, PMIX_APPNUM, info, 1, &val);
|
||||
if (PMIX_SUCCESS == rc) {
|
||||
rc = convert_int(appnum, val);
|
||||
PMIX_VALUE_RELEASE(val);
|
||||
} else if( PMIX_ERR_NOT_FOUND == rc ){
|
||||
} else {
|
||||
/* this is optional value, set to 0 */
|
||||
*appnum = 0;
|
||||
rc = PMIX_SUCCESS;
|
||||
@ -445,7 +443,7 @@ PMIX_EXPORT int PMI_Publish_name(const char service_name[], const char port[])
|
||||
}
|
||||
|
||||
/* pass the service/port */
|
||||
pmix_strncpy(info.key, service_name, PMIX_MAX_KEYLEN);
|
||||
pmix_strncpy(info.key, service_name, PMIX_MAX_KEYLEN);
|
||||
info.value.type = PMIX_STRING;
|
||||
info.value.data.string = (char*) port;
|
||||
|
||||
@ -497,7 +495,7 @@ PMIX_EXPORT int PMI_Lookup_name(const char service_name[], char port[])
|
||||
PMIX_PDATA_CONSTRUCT(&pdata);
|
||||
|
||||
/* pass the service */
|
||||
pmix_strncpy(pdata.key, service_name, PMIX_MAX_KEYLEN);
|
||||
pmix_strncpy(pdata.key, service_name, PMIX_MAX_KEYLEN);
|
||||
|
||||
/* PMI-1 doesn't want the nspace back */
|
||||
if (PMIX_SUCCESS != (rc = PMIx_Lookup(&pdata, 1, NULL, 0))) {
|
||||
@ -514,7 +512,7 @@ PMIX_EXPORT int PMI_Lookup_name(const char service_name[], char port[])
|
||||
* potential we could overrun it. As this feature
|
||||
* isn't widely supported in PMI-1, try being
|
||||
* conservative */
|
||||
pmix_strncpy(port, pdata.value.data.string, PMIX_MAX_KEYLEN);
|
||||
pmix_strncpy(port, pdata.value.data.string, PMIX_MAX_KEYLEN);
|
||||
PMIX_PDATA_DESTRUCT(&pdata);
|
||||
|
||||
return PMIX_SUCCESS;
|
||||
|
@ -1,6 +1,6 @@
|
||||
/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil -*- */
|
||||
/*
|
||||
* Copyright (c) 2014-2018 Intel, Inc. All rights reserved.
|
||||
* Copyright (c) 2014-2019 Intel, Inc. All rights reserved.
|
||||
* Copyright (c) 2014-2018 Research Organization for Information Science
|
||||
* and Technology (RIST). All rights reserved.
|
||||
* Copyright (c) 2014 Artem Y. Polyakov <artpol84@gmail.com>.
|
||||
@ -50,7 +50,9 @@
|
||||
#include <zlib.h>
|
||||
#endif
|
||||
#include PMIX_EVENT_HEADER
|
||||
#if ! PMIX_HAVE_LIBEV
|
||||
#include PMIX_EVENT2_THREAD_HEADER
|
||||
#endif
|
||||
|
||||
static const char pmix_version_string[] = PMIX_VERSION;
|
||||
static pmix_status_t pmix_init_result = PMIX_ERR_INIT;
|
||||
|
@ -1,8 +1,8 @@
|
||||
/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil -*- */
|
||||
/*
|
||||
* Copyright (c) 2014-2018 Intel, Inc. All rights reserved.
|
||||
* Copyright (c) 2014-2015 Research Organization for Information Science
|
||||
* and Technology (RIST). All rights reserved.
|
||||
* Copyright (c) 2014-2019 Intel, Inc. All rights reserved.
|
||||
* Copyright (c) 2014-2019 Research Organization for Information Science
|
||||
* and Technology (RIST). All rights reserved.
|
||||
* Copyright (c) 2014 Artem Y. Polyakov <artpol84@gmail.com>.
|
||||
* All rights reserved.
|
||||
* Copyright (c) 2016 Mellanox Technologies, Inc.
|
||||
@ -73,7 +73,7 @@ PMIX_EXPORT pmix_status_t PMIx_Fence(const pmix_proc_t procs[], size_t nprocs,
|
||||
|
||||
PMIX_ACQUIRE_THREAD(&pmix_global_lock);
|
||||
|
||||
pmix_output_verbose(2, pmix_globals.debug_output,
|
||||
pmix_output_verbose(2, pmix_client_globals.fence_output,
|
||||
"pmix: executing fence");
|
||||
|
||||
if (pmix_globals.init_cntr <= 0) {
|
||||
@ -106,7 +106,7 @@ PMIX_EXPORT pmix_status_t PMIx_Fence(const pmix_proc_t procs[], size_t nprocs,
|
||||
rc = cb->status;
|
||||
PMIX_RELEASE(cb);
|
||||
|
||||
pmix_output_verbose(2, pmix_globals.debug_output,
|
||||
pmix_output_verbose(2, pmix_client_globals.fence_output,
|
||||
"pmix: fence released");
|
||||
|
||||
return rc;
|
||||
@ -125,7 +125,7 @@ PMIX_EXPORT pmix_status_t PMIx_Fence_nb(const pmix_proc_t procs[], size_t nprocs
|
||||
|
||||
PMIX_ACQUIRE_THREAD(&pmix_global_lock);
|
||||
|
||||
pmix_output_verbose(2, pmix_globals.debug_output,
|
||||
pmix_output_verbose(2, pmix_client_globals.fence_output,
|
||||
"pmix: fence_nb called");
|
||||
|
||||
if (pmix_globals.init_cntr <= 0) {
|
||||
@ -185,7 +185,7 @@ static pmix_status_t unpack_return(pmix_buffer_t *data)
|
||||
pmix_status_t ret;
|
||||
int32_t cnt;
|
||||
|
||||
pmix_output_verbose(2, pmix_globals.debug_output,
|
||||
pmix_output_verbose(2, pmix_client_globals.fence_output,
|
||||
"client:unpack fence called");
|
||||
|
||||
/* unpack the status code */
|
||||
@ -196,7 +196,7 @@ static pmix_status_t unpack_return(pmix_buffer_t *data)
|
||||
PMIX_ERROR_LOG(rc);
|
||||
return rc;
|
||||
}
|
||||
pmix_output_verbose(2, pmix_globals.debug_output,
|
||||
pmix_output_verbose(2, pmix_client_globals.fence_output,
|
||||
"client:unpack fence received status %d", ret);
|
||||
return ret;
|
||||
}
|
||||
@ -255,7 +255,7 @@ static void wait_cbfunc(struct pmix_peer_t *pr, pmix_ptl_hdr_t *hdr,
|
||||
pmix_cb_t *cb = (pmix_cb_t*)cbdata;
|
||||
pmix_status_t rc;
|
||||
|
||||
pmix_output_verbose(2, pmix_globals.debug_output,
|
||||
pmix_output_verbose(2, pmix_client_globals.fence_output,
|
||||
"pmix: fence_nb callback recvd");
|
||||
|
||||
if (NULL == cb) {
|
||||
|
@ -1,6 +1,6 @@
|
||||
/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil -*- */
|
||||
/*
|
||||
* Copyright (c) 2014-2018 Intel, Inc. All rights reserved.
|
||||
* Copyright (c) 2014-2019 Intel, Inc. All rights reserved.
|
||||
* Copyright (c) 2014-2016 Research Organization for Information Science
|
||||
* and Technology (RIST). All rights reserved.
|
||||
* Copyright (c) 2014 Artem Y. Polyakov <artpol84@gmail.com>.
|
||||
@ -57,6 +57,7 @@
|
||||
#include "src/util/compress.h"
|
||||
#include "src/util/error.h"
|
||||
#include "src/util/hash.h"
|
||||
#include "src/util/name_fns.h"
|
||||
#include "src/util/output.h"
|
||||
#include "src/mca/gds/gds.h"
|
||||
#include "src/mca/ptl/ptl.h"
|
||||
@ -99,14 +100,15 @@ PMIX_EXPORT pmix_status_t PMIx_Get(const pmix_proc_t *proc,
|
||||
PMIX_RELEASE_THREAD(&pmix_global_lock);
|
||||
|
||||
pmix_output_verbose(2, pmix_client_globals.get_output,
|
||||
"pmix:client get for %s:%d key %s",
|
||||
(NULL == proc) ? "NULL" : proc->nspace,
|
||||
(NULL == proc) ? PMIX_RANK_UNDEF : proc->rank,
|
||||
"pmix:client get for %s key %s",
|
||||
(NULL == proc) ? "NULL" : PMIX_NAME_PRINT(proc),
|
||||
(NULL == key) ? "NULL" : key);
|
||||
|
||||
/* try to get data directly, without threadshift */
|
||||
if (PMIX_SUCCESS == (rc = _getfn_fastpath(proc, key, info, ninfo, val))) {
|
||||
goto done;
|
||||
if (PMIX_RANK_UNDEF != proc->rank && NULL != key) {
|
||||
if (PMIX_SUCCESS == (rc = _getfn_fastpath(proc, key, info, ninfo, val))) {
|
||||
goto done;
|
||||
}
|
||||
}
|
||||
|
||||
/* create a callback object as we need to pass it to the
|
||||
@ -329,9 +331,14 @@ static void _getnb_cbfunc(struct pmix_peer_t *pr,
|
||||
}
|
||||
|
||||
if (PMIX_SUCCESS != ret) {
|
||||
PMIX_ERROR_LOG(ret);
|
||||
goto done;
|
||||
}
|
||||
PMIX_GDS_ACCEPT_KVS_RESP(rc, pmix_client_globals.myserver, buf);
|
||||
if (PMIX_RANK_UNDEF == proc.rank) {
|
||||
PMIX_GDS_ACCEPT_KVS_RESP(rc, pmix_globals.mypeer, buf);
|
||||
} else {
|
||||
PMIX_GDS_ACCEPT_KVS_RESP(rc, pmix_client_globals.myserver, buf);
|
||||
}
|
||||
if (PMIX_SUCCESS != rc) {
|
||||
goto done;
|
||||
}
|
||||
@ -350,7 +357,11 @@ static void _getnb_cbfunc(struct pmix_peer_t *pr,
|
||||
/* fetch the data from server peer module - since it is passing
|
||||
* it back to the user, we need a copy of it */
|
||||
cb->copy = true;
|
||||
PMIX_GDS_FETCH_KV(rc, pmix_client_globals.myserver, cb);
|
||||
if (PMIX_RANK_UNDEF == proc.rank) {
|
||||
PMIX_GDS_FETCH_KV(rc, pmix_globals.mypeer, cb);
|
||||
} else {
|
||||
PMIX_GDS_FETCH_KV(rc, pmix_client_globals.myserver, cb);
|
||||
}
|
||||
if (PMIX_SUCCESS == rc) {
|
||||
if (1 != pmix_list_get_size(&cb->kvs)) {
|
||||
rc = PMIX_ERR_INVALID_VAL;
|
||||
@ -496,9 +507,15 @@ static pmix_status_t _getfn_fastpath(const pmix_proc_t *proc, const pmix_key_t k
|
||||
/* scan the incoming directives */
|
||||
if (NULL != info) {
|
||||
for (n=0; n < ninfo; n++) {
|
||||
if (0 == strncmp(info[n].key, PMIX_DATA_SCOPE, PMIX_MAX_KEYLEN)) {
|
||||
if (PMIX_CHECK_KEY(&info[n], PMIX_DATA_SCOPE)) {
|
||||
cb->scope = info[n].value.data.scope;
|
||||
break;
|
||||
} else if (PMIX_CHECK_KEY(&info[n], PMIX_OPTIONAL) ||
|
||||
PMIX_CHECK_KEY(&info[n], PMIX_IMMEDIATE)) {
|
||||
continue;
|
||||
} else {
|
||||
/* we cannot handle any other directives via this path */
|
||||
PMIX_RELEASE(cb);
|
||||
return PMIX_ERR_NOT_SUPPORTED;
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -508,16 +525,16 @@ static pmix_status_t _getfn_fastpath(const pmix_proc_t *proc, const pmix_key_t k
|
||||
cb->info = (pmix_info_t*)info;
|
||||
cb->ninfo = ninfo;
|
||||
|
||||
PMIX_GDS_FETCH_IS_TSAFE(rc, pmix_globals.mypeer);
|
||||
PMIX_GDS_FETCH_IS_TSAFE(rc, pmix_client_globals.myserver);
|
||||
if (PMIX_SUCCESS == rc) {
|
||||
PMIX_GDS_FETCH_KV(rc, pmix_globals.mypeer, cb);
|
||||
PMIX_GDS_FETCH_KV(rc, pmix_client_globals.myserver, cb);
|
||||
if (PMIX_SUCCESS == rc) {
|
||||
goto done;
|
||||
}
|
||||
}
|
||||
PMIX_GDS_FETCH_IS_TSAFE(rc, pmix_client_globals.myserver);
|
||||
PMIX_GDS_FETCH_IS_TSAFE(rc, pmix_globals.mypeer);
|
||||
if (PMIX_SUCCESS == rc) {
|
||||
PMIX_GDS_FETCH_KV(rc, pmix_client_globals.myserver, cb);
|
||||
PMIX_GDS_FETCH_KV(rc, pmix_globals.mypeer, cb);
|
||||
if (PMIX_SUCCESS == rc) {
|
||||
goto done;
|
||||
}
|
||||
@ -551,23 +568,23 @@ static void _getnbfn(int fd, short flags, void *cbdata)
|
||||
/* cb was passed to us from another thread - acquire it */
|
||||
PMIX_ACQUIRE_OBJECT(cb);
|
||||
|
||||
pmix_output_verbose(2, pmix_client_globals.get_output,
|
||||
"pmix: getnbfn value for proc %s:%u key %s",
|
||||
cb->pname.nspace, cb->pname.rank,
|
||||
(NULL == cb->key) ? "NULL" : cb->key);
|
||||
|
||||
/* set the proc object identifier */
|
||||
pmix_strncpy(proc.nspace, cb->pname.nspace, PMIX_MAX_NSLEN);
|
||||
proc.rank = cb->pname.rank;
|
||||
|
||||
pmix_output_verbose(2, pmix_client_globals.get_output,
|
||||
"pmix: getnbfn value for proc %s key %s",
|
||||
PMIX_NAME_PRINT(&proc),
|
||||
(NULL == cb->key) ? "NULL" : cb->key);
|
||||
|
||||
/* scan the incoming directives */
|
||||
if (NULL != cb->info) {
|
||||
for (n=0; n < cb->ninfo; n++) {
|
||||
if (0 == strncmp(cb->info[n].key, PMIX_OPTIONAL, PMIX_MAX_KEYLEN)) {
|
||||
if (PMIX_CHECK_KEY(&cb->info[n], PMIX_OPTIONAL)) {
|
||||
optional = PMIX_INFO_TRUE(&cb->info[n]);
|
||||
} else if (0 == strncmp(cb->info[n].key, PMIX_IMMEDIATE, PMIX_MAX_KEYLEN)) {
|
||||
} else if (PMIX_CHECK_KEY(&cb->info[n], PMIX_IMMEDIATE)) {
|
||||
immediate = PMIX_INFO_TRUE(&cb->info[n]);
|
||||
} else if (0 == strncmp(cb->info[n].key, PMIX_TIMEOUT, PMIX_MAX_KEYLEN)) {
|
||||
} else if (PMIX_CHECK_KEY(&cb->info[n], PMIX_TIMEOUT)) {
|
||||
/* set a timer to kick us out if we don't
|
||||
* have an answer within their window */
|
||||
if (0 < cb->info[n].value.data.integer) {
|
||||
@ -578,8 +595,16 @@ static void _getnbfn(int fd, short flags, void *cbdata)
|
||||
pmix_event_evtimer_add(&cb->ev, &tv);
|
||||
cb->timer_running = true;
|
||||
}
|
||||
} else if (0 == strncmp(cb->info[n].key, PMIX_DATA_SCOPE, PMIX_MAX_KEYLEN)) {
|
||||
} else if (PMIX_CHECK_KEY(&cb->info[n], PMIX_DATA_SCOPE)) {
|
||||
cb->scope = cb->info[n].value.data.scope;
|
||||
} else if (PMIX_CHECK_KEY(&cb->info[n], PMIX_SESSION_INFO)) {
|
||||
cb->level = PMIX_LEVEL_SESSION;
|
||||
} else if (PMIX_CHECK_KEY(&cb->info[n], PMIX_JOB_INFO)) {
|
||||
cb->level = PMIX_LEVEL_JOB;
|
||||
} else if (PMIX_CHECK_KEY(&cb->info[n], PMIX_APP_INFO)) {
|
||||
cb->level = PMIX_LEVEL_APP;
|
||||
} else if (PMIX_CHECK_KEY(&cb->info[n], PMIX_NODE_INFO)) {
|
||||
cb->level = PMIX_LEVEL_NODE;
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -604,7 +629,13 @@ static void _getnbfn(int fd, short flags, void *cbdata)
|
||||
/* fetch the data from my server's module - since we are passing
|
||||
* it back to the user, we need a copy of it */
|
||||
cb->copy = true;
|
||||
PMIX_GDS_FETCH_KV(rc, pmix_client_globals.myserver, cb);
|
||||
/* if the peer and server GDS component are the same, then no
|
||||
* point in trying it again */
|
||||
if (0 != strcmp(pmix_globals.mypeer->nptr->compat.gds->name, pmix_client_globals.myserver->nptr->compat.gds->name)) {
|
||||
PMIX_GDS_FETCH_KV(rc, pmix_client_globals.myserver, cb);
|
||||
} else {
|
||||
rc = PMIX_ERR_TAKE_NEXT_OPTION;
|
||||
}
|
||||
if (PMIX_SUCCESS != rc) {
|
||||
pmix_output_verbose(5, pmix_client_globals.get_output,
|
||||
"pmix:client job-level data NOT found");
|
||||
@ -653,7 +684,17 @@ static void _getnbfn(int fd, short flags, void *cbdata)
|
||||
"pmix:client job-level data NOT found");
|
||||
rc = process_values(&val, cb);
|
||||
goto respond;
|
||||
} else if (PMIX_RANK_UNDEF == proc.rank) {
|
||||
/* the data would have to be stored on our own peer, so
|
||||
* we need to go request it */
|
||||
goto request;
|
||||
} else {
|
||||
/* if the peer and server GDS component are the same, then no
|
||||
* point in trying it again */
|
||||
if (0 == strcmp(pmix_globals.mypeer->nptr->compat.gds->name, pmix_client_globals.myserver->nptr->compat.gds->name)) {
|
||||
val = NULL;
|
||||
goto request;
|
||||
}
|
||||
cb->proc = &proc;
|
||||
cb->copy = true;
|
||||
PMIX_GDS_FETCH_KV(rc, pmix_client_globals.myserver, cb);
|
||||
@ -722,9 +763,9 @@ static void _getnbfn(int fd, short flags, void *cbdata)
|
||||
}
|
||||
|
||||
pmix_output_verbose(2, pmix_client_globals.get_output,
|
||||
"%s:%d REQUESTING DATA FROM SERVER FOR %s:%d KEY %s",
|
||||
pmix_globals.myid.nspace, pmix_globals.myid.rank,
|
||||
cb->pname.nspace, cb->pname.rank, cb->key);
|
||||
"%s REQUESTING DATA FROM SERVER FOR %s KEY %s",
|
||||
PMIX_NAME_PRINT(&pmix_globals.myid),
|
||||
PMIX_NAME_PRINT(cb->proc), cb->key);
|
||||
|
||||
/* track the callback object */
|
||||
pmix_list_append(&pmix_client_globals.pending_requests, &cb->super);
|
||||
|
@ -1,6 +1,6 @@
|
||||
/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil -*- */
|
||||
/*
|
||||
* Copyright (c) 2014-2018 Intel, Inc. All rights reserved.
|
||||
* Copyright (c) 2014-2019 Intel, Inc. All rights reserved.
|
||||
* Copyright (c) 2016 Mellanox Technologies, Inc.
|
||||
* All rights reserved.
|
||||
* Copyright (c) 2016 IBM Corporation. All rights reserved.
|
||||
@ -82,14 +82,18 @@ PMIX_EXPORT pmix_status_t PMIx_Log(const pmix_info_t data[], size_t ndata,
|
||||
* recv routine so we know which callback to use when
|
||||
* the return message is recvd */
|
||||
PMIX_CONSTRUCT(&cb, pmix_cb_t);
|
||||
if (PMIX_SUCCESS != (rc = PMIx_Log_nb(data, ndata, directives,
|
||||
ndirs, opcbfunc, &cb))) {
|
||||
rc = PMIx_Log_nb(data, ndata, directives, ndirs, opcbfunc, &cb);
|
||||
if (PMIX_SUCCESS == rc) {
|
||||
/* wait for the operation to complete */
|
||||
PMIX_WAIT_THREAD(&cb.lock);
|
||||
} else {
|
||||
PMIX_DESTRUCT(&cb);
|
||||
if (PMIX_OPERATION_SUCCEEDED == rc) {
|
||||
rc = PMIX_SUCCESS;
|
||||
}
|
||||
return rc;
|
||||
}
|
||||
|
||||
/* wait for the operation to complete */
|
||||
PMIX_WAIT_THREAD(&cb.lock);
|
||||
rc = cb.status;
|
||||
PMIX_DESTRUCT(&cb);
|
||||
|
||||
|
@ -144,6 +144,7 @@ PMIX_EXPORT pmix_status_t PMIx_Query_info_nb(pmix_query_t queries[], size_t nque
|
||||
pmix_list_t results;
|
||||
pmix_kval_t *kv, *kvnxt;
|
||||
pmix_proc_t proc;
|
||||
bool rank_given;
|
||||
|
||||
PMIX_ACQUIRE_THREAD(&pmix_global_lock);
|
||||
|
||||
@ -190,6 +191,7 @@ PMIX_EXPORT pmix_status_t PMIx_Query_info_nb(pmix_query_t queries[], size_t nque
|
||||
memset(proc.nspace, 0, PMIX_MAX_NSLEN+1);
|
||||
proc.rank = PMIX_RANK_INVALID;
|
||||
for (n=0; n < nqueries; n++) {
|
||||
rank_given = false;
|
||||
for (p=0; p < queries[n].nqual; p++) {
|
||||
if (PMIX_CHECK_KEY(&queries[n].qualifiers[p], PMIX_QUERY_REFRESH_CACHE)) {
|
||||
if (PMIX_INFO_TRUE(&queries[n].qualifiers[p])) {
|
||||
@ -199,37 +201,41 @@ PMIX_EXPORT pmix_status_t PMIx_Query_info_nb(pmix_query_t queries[], size_t nque
|
||||
} else if (PMIX_CHECK_KEY(&queries[n].qualifiers[p], PMIX_PROCID)) {
|
||||
PMIX_LOAD_NSPACE(proc.nspace, queries[n].qualifiers[p].value.data.proc->nspace);
|
||||
proc.rank = queries[n].qualifiers[p].value.data.proc->rank;
|
||||
rank_given = true;
|
||||
} else if (PMIX_CHECK_KEY(&queries[n].qualifiers[p], PMIX_NSPACE)) {
|
||||
PMIX_LOAD_NSPACE(proc.nspace, queries[n].qualifiers[p].value.data.string);
|
||||
} else if (PMIX_CHECK_KEY(&queries[n].qualifiers[p], PMIX_RANK)) {
|
||||
proc.rank = queries[n].qualifiers[p].value.data.rank;
|
||||
} else if (PMIX_CHECK_KEY(&queries[n].qualifiers[p], PMIX_HOSTNAME)) {
|
||||
if (0 != strcmp(queries[n].qualifiers[p].value.data.string, pmix_globals.hostname)) {
|
||||
/* asking about a different host, so ask for the info */
|
||||
PMIX_LIST_DESTRUCT(&results);
|
||||
goto query;
|
||||
}
|
||||
rank_given = true;
|
||||
}
|
||||
}
|
||||
/* we get here if a refresh isn't required - first try a local
|
||||
* "get" on the data to see if we already have it */
|
||||
PMIX_CONSTRUCT(&cb, pmix_cb_t);
|
||||
cb.copy = false;
|
||||
/* set the proc */
|
||||
if (PMIX_RANK_INVALID == proc.rank &&
|
||||
0 == strlen(proc.nspace)) {
|
||||
/* use our id */
|
||||
cb.proc = &pmix_globals.myid;
|
||||
} else {
|
||||
if (0 == strlen(proc.nspace)) {
|
||||
/* use our nspace */
|
||||
PMIX_LOAD_NSPACE(cb.proc->nspace, pmix_globals.myid.nspace);
|
||||
}
|
||||
if (PMIX_RANK_INVALID == proc.rank) {
|
||||
/* user the wildcard rank */
|
||||
proc.rank = PMIX_RANK_WILDCARD;
|
||||
}
|
||||
/* if they are querying about node or app values not directly
|
||||
* associated with a proc (i.e., they didn't specify the proc),
|
||||
* then we obtain those by leaving the proc info as undefined */
|
||||
if (!rank_given) {
|
||||
proc.rank = PMIX_RANK_UNDEF;
|
||||
cb.proc = &proc;
|
||||
} else {
|
||||
/* set the proc */
|
||||
if (PMIX_RANK_INVALID == proc.rank &&
|
||||
0 == strlen(proc.nspace)) {
|
||||
/* use our id */
|
||||
cb.proc = &pmix_globals.myid;
|
||||
} else {
|
||||
if (0 == strlen(proc.nspace)) {
|
||||
/* use our nspace */
|
||||
PMIX_LOAD_NSPACE(cb.proc->nspace, pmix_globals.myid.nspace);
|
||||
}
|
||||
if (PMIX_RANK_INVALID == proc.rank) {
|
||||
/* user the wildcard rank */
|
||||
proc.rank = PMIX_RANK_WILDCARD;
|
||||
}
|
||||
cb.proc = &proc;
|
||||
}
|
||||
}
|
||||
for (p=0; NULL != queries[n].keys[p]; p++) {
|
||||
cb.key = queries[n].keys[p];
|
||||
|
@ -883,7 +883,7 @@ static void _notify_client_event(int sd, short args, void *cbdata)
|
||||
} else {
|
||||
/* look up the nspace for this proc */
|
||||
nptr = NULL;
|
||||
PMIX_LIST_FOREACH(tmp, &pmix_server_globals.nspaces, pmix_namespace_t) {
|
||||
PMIX_LIST_FOREACH(tmp, &pmix_globals.nspaces, pmix_namespace_t) {
|
||||
if (PMIX_CHECK_NSPACE(tmp->nspace, cd->targets[n].nspace)) {
|
||||
nptr = tmp;
|
||||
break;
|
||||
|
@ -306,6 +306,7 @@ static void cbcon(pmix_cb_t *p)
|
||||
PMIX_CONSTRUCT(&p->kvs, pmix_list_t);
|
||||
p->copy = false;
|
||||
p->timer_running = false;
|
||||
p->level = PMIX_LEVEL_UNDEF;
|
||||
}
|
||||
static void cbdes(pmix_cb_t *p)
|
||||
{
|
||||
@ -342,6 +343,7 @@ static void qcon(pmix_query_caddy_t *p)
|
||||
p->relcbfunc = NULL;
|
||||
p->credcbfunc = NULL;
|
||||
p->validcbfunc = NULL;
|
||||
PMIX_CONSTRUCT(&p->results, pmix_list_t);
|
||||
}
|
||||
static void qdes(pmix_query_caddy_t *p)
|
||||
{
|
||||
@ -349,6 +351,8 @@ static void qdes(pmix_query_caddy_t *p)
|
||||
PMIX_BYTE_OBJECT_DESTRUCT(&p->bo);
|
||||
PMIX_PROC_FREE(p->targets, p->ntargets);
|
||||
PMIX_INFO_FREE(p->info, p->ninfo);
|
||||
PMIX_LIST_DESTRUCT(&p->results);
|
||||
PMIX_QUERY_FREE(p->queries, p->nqueries);
|
||||
}
|
||||
PMIX_EXPORT PMIX_CLASS_INSTANCE(pmix_query_caddy_t,
|
||||
pmix_object_t,
|
||||
@ -566,3 +570,30 @@ static bool dirpath_is_empty(const char *path )
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
int pmix_event_assign(struct event *ev, pmix_event_base_t *evbase,
|
||||
int fd, short arg, event_callback_fn cbfn, void *cbd)
|
||||
{
|
||||
#if PMIX_HAVE_LIBEV
|
||||
event_set(ev, fd, arg, cbfn, cbd);
|
||||
event_base_set(evbase, ev);
|
||||
#else
|
||||
event_assign(ev, evbase, fd, arg, cbfn, cbd);
|
||||
#endif
|
||||
return 0;
|
||||
}
|
||||
|
||||
pmix_event_t* pmix_event_new(pmix_event_base_t *b, int fd,
|
||||
short fg, event_callback_fn cbfn, void *cbd)
|
||||
{
|
||||
pmix_event_t *ev = NULL;
|
||||
|
||||
#if PMIX_HAVE_LIBEV
|
||||
ev = (pmix_event_t*)calloc(1, sizeof(pmix_event_t));
|
||||
ev->ev_base = b;
|
||||
#else
|
||||
ev = event_new(b, fd, fg, (event_callback_fn) cbfn, cbd);
|
||||
#endif
|
||||
|
||||
return ev;
|
||||
}
|
||||
|
@ -122,6 +122,16 @@ typedef enum {
|
||||
PMIX_COLLECT_MAX
|
||||
} pmix_collect_t;
|
||||
|
||||
/* define a set of flags indicating the level
|
||||
* of information being stored/requested */
|
||||
typedef enum {
|
||||
PMIX_LEVEL_UNDEF,
|
||||
PMIX_LEVEL_SESSION,
|
||||
PMIX_LEVEL_JOB,
|
||||
PMIX_LEVEL_APP,
|
||||
PMIX_LEVEL_NODE
|
||||
} pmix_level_t;
|
||||
|
||||
/**** PEER STRUCTURES ****/
|
||||
|
||||
/* clients can only talk to their server, and servers are
|
||||
@ -268,6 +278,7 @@ typedef struct {
|
||||
pmix_info_t *info;
|
||||
size_t ninfo;
|
||||
pmix_byte_object_t bo;
|
||||
pmix_list_t results;
|
||||
pmix_info_cbfunc_t cbfunc;
|
||||
pmix_value_cbfunc_t valcbfunc;
|
||||
pmix_release_cbfunc_t relcbfunc;
|
||||
@ -388,6 +399,7 @@ typedef struct {
|
||||
pmix_list_t kvs;
|
||||
bool copy;
|
||||
bool timer_running;
|
||||
pmix_level_t level;
|
||||
} pmix_cb_t;
|
||||
PMIX_CLASS_DECLARATION(pmix_cb_t);
|
||||
|
||||
@ -481,6 +493,7 @@ typedef struct {
|
||||
bool xml_output;
|
||||
bool timestamp_output;
|
||||
size_t output_limit;
|
||||
pmix_list_t nspaces;
|
||||
} pmix_globals_t;
|
||||
|
||||
/* provide access to a function to cleanup epilogs */
|
||||
|
@ -9,9 +9,11 @@
|
||||
* University of Stuttgart. All rights reserved.
|
||||
* Copyright (c) 2004-2005 The Regents of the University of California.
|
||||
* All rights reserved.
|
||||
* Copyright (c) 2014-2018 Intel, Inc. All rights reserved.
|
||||
* Copyright (c) 2014-2019 Intel, Inc. All rights reserved.
|
||||
* Copyright (c) 2015 Mellanox Technologies, Inc.
|
||||
* All rights reserved.
|
||||
* Copyright (c) 2019 Research Organization for Information Science
|
||||
* and Technology (RIST). All rights reserved.
|
||||
* $COPYRIGHT$
|
||||
*
|
||||
* Additional copyrights may follow
|
||||
@ -43,11 +45,17 @@
|
||||
#include <arpa/inet.h>
|
||||
#endif
|
||||
#include PMIX_EVENT_HEADER
|
||||
#if ! PMIX_HAVE_LIBEV
|
||||
#include PMIX_EVENT2_THREAD_HEADER
|
||||
#endif
|
||||
|
||||
#if PMIX_ENABLE_DEBUG
|
||||
#include "src/util/output.h"
|
||||
#endif
|
||||
|
||||
#include <pthread.h>
|
||||
#include <pmix_common.h>
|
||||
|
||||
|
||||
/*
|
||||
* portable assignment of pointer to int
|
||||
@ -137,6 +145,18 @@ static inline uint64_t pmix_ntoh64(uint64_t val)
|
||||
#endif
|
||||
}
|
||||
|
||||
/* Convert size_t value from host to network byte order and back */
|
||||
#if SIZEOF_SIZE_T == 4
|
||||
|
||||
#define pmix_htonsizet(x) htonl(x)
|
||||
#define pmix_ntohsizet(x) ntohl(x)
|
||||
|
||||
#elif SIZEOF_SIZE_T == 8
|
||||
|
||||
#define pmix_htonsizet(x) pmix_hton64(x)
|
||||
#define pmix_ntohsizet(x) pmix_ntoh64(x)
|
||||
|
||||
#endif
|
||||
|
||||
/**
|
||||
* Convert between a local representation of pointer and a 64 bits value.
|
||||
@ -225,6 +245,8 @@ static inline uint64_t pmix_swap_bytes8(uint64_t val)
|
||||
#define PMIX_EVLOOP_ONCE EVLOOP_ONCE /**< Block at most once. */
|
||||
#define PMIX_EVLOOP_NONBLOCK EVLOOP_NONBLOCK /**< Do not block. */
|
||||
|
||||
#define PMIX_EVENT_SIGNAL(ev) pmix_event_get_signal(ev)
|
||||
|
||||
typedef struct event_base pmix_event_base_t;
|
||||
typedef struct event pmix_event_t;
|
||||
|
||||
@ -232,42 +254,52 @@ typedef struct event pmix_event_t;
|
||||
|
||||
#define pmix_event_base_free(b) event_base_free(b)
|
||||
|
||||
#define pmix_event_free(x) event_free(x)
|
||||
|
||||
#define pmix_event_base_loopbreak(b) event_base_loopbreak(b)
|
||||
|
||||
#define pmix_event_base_loopexit(b) event_base_loopexit(b, NULL)
|
||||
#if PMIX_HAVE_LIBEV
|
||||
#define pmix_event_use_threads()
|
||||
#define pmix_event_free(b) free(b)
|
||||
#define pmix_event_get_signal(x) (x)->ev_fd
|
||||
#else
|
||||
|
||||
/* thread support APIs */
|
||||
#define pmix_event_use_threads() evthread_use_pthreads()
|
||||
#define pmix_event_free(x) event_free(x)
|
||||
#define pmix_event_get_signal(x) event_get_signal(x)
|
||||
#endif
|
||||
|
||||
/* Basic event APIs */
|
||||
#define pmix_event_enable_debug_mode() event_enable_debug_mode()
|
||||
|
||||
#define pmix_event_assign(x, b, fd, fg, cb, arg) event_assign((x), (b), (fd), (fg), (event_callback_fn) (cb), (arg))
|
||||
PMIX_EXPORT int pmix_event_assign(struct event *ev, pmix_event_base_t *evbase,
|
||||
int fd, short arg, event_callback_fn cbfn, void *cbd);
|
||||
|
||||
#define pmix_event_set(b, x, fd, fg, cb, arg) event_assign((x), (b), (fd), (fg), (event_callback_fn) (cb), (arg))
|
||||
#define pmix_event_set(b, x, fd, fg, cb, arg) pmix_event_assign((x), (b), (fd), (fg), (event_callback_fn) (cb), (arg))
|
||||
|
||||
#if PMIX_HAVE_LIBEV
|
||||
PMIX_EXPORT int pmix_event_add(struct event *ev, struct timeval *tv);
|
||||
PMIX_EXPORT int pmix_event_del(struct event *ev);
|
||||
PMIX_EXPORT void pmix_event_active (struct event *ev, int res, short ncalls);
|
||||
PMIX_EXPORT void pmix_event_base_loopexit (pmix_event_base_t *b);
|
||||
#else
|
||||
#define pmix_event_add(ev, tv) event_add((ev), (tv))
|
||||
|
||||
#define pmix_event_del(ev) event_del((ev))
|
||||
|
||||
#define pmix_event_active(x, y, z) event_active((x), (y), (z))
|
||||
#define pmix_event_base_loopexit(b) event_base_loopexit(b, NULL)
|
||||
#endif
|
||||
|
||||
#define pmix_event_new(b, fd, fg, cb, arg) event_new((b), (fd), (fg), (event_callback_fn) (cb), (arg))
|
||||
PMIX_EXPORT pmix_event_t* pmix_event_new(pmix_event_base_t *b, int fd,
|
||||
short fg, event_callback_fn cbfn, void *cbd);
|
||||
|
||||
#define pmix_event_loop(b, fg) event_base_loop((b), (fg))
|
||||
|
||||
#define pmix_event_active(x, y, z) event_active((x), (y), (z))
|
||||
|
||||
#define pmix_event_evtimer_new(b, cb, arg) pmix_event_new((b), -1, 0, (cb), (arg))
|
||||
|
||||
#define pmix_event_evtimer_add(x, tv) pmix_event_add((x), (tv))
|
||||
|
||||
#define pmix_event_evtimer_set(b, x, cb, arg) event_assign((x), (b), -1, 0, (event_callback_fn) (cb), (arg))
|
||||
#define pmix_event_evtimer_set(b, x, cb, arg) pmix_event_assign((x), (b), -1, 0, (event_callback_fn) (cb), (arg))
|
||||
|
||||
#define pmix_event_evtimer_del(x) pmix_event_del((x))
|
||||
|
||||
#define pmix_event_signal_set(b, x, fd, cb, arg) event_assign((x), (b), (fd), EV_SIGNAL|EV_PERSIST, (event_callback_fn) (cb), (arg))
|
||||
#define pmix_event_signal_set(b, x, fd, cb, arg) pmix_event_assign((x), (b), (fd), EV_SIGNAL|EV_PERSIST, (event_callback_fn) (cb), (arg))
|
||||
|
||||
#endif /* PMIX_TYPES_H */
|
||||
|
@ -16,7 +16,7 @@
|
||||
* and Technology (RIST). All rights reserved.
|
||||
* Copyright (c) 2014-2015 Los Alamos National Security, LLC. All rights
|
||||
* reserved.
|
||||
* Copyright (c) 2016-2018 Intel, Inc. All rights reserved.
|
||||
* Copyright (c) 2016-2019 Intel, Inc. All rights reserved.
|
||||
* $COPYRIGHT$
|
||||
*
|
||||
* Additional copyrights may follow
|
||||
@ -339,8 +339,8 @@ static int component_find_check (pmix_mca_base_framework_t *framework, char **re
|
||||
}
|
||||
|
||||
if (!found) {
|
||||
char h[MAXHOSTNAMELEN];
|
||||
gethostname(h, sizeof(h));
|
||||
char h[PMIX_MAXHOSTNAMELEN] = {0};
|
||||
gethostname(h, sizeof(h)-1);
|
||||
pmix_show_help("help-pmix-mca-base.txt",
|
||||
"find-available:not-valid", true,
|
||||
h, framework->framework_name, requested_component_names[i]);
|
||||
|
@ -13,7 +13,7 @@
|
||||
* Copyright (c) 2011 Cisco Systems, Inc. All rights reserved.
|
||||
* Copyright (c) 2015 Los Alamos National Security, LLC. All rights
|
||||
* reserved.
|
||||
* Copyright (c) 2016-2017 Intel, Inc. All rights reserved.
|
||||
* Copyright (c) 2016-2019 Intel, Inc. All rights reserved.
|
||||
* $COPYRIGHT$
|
||||
*
|
||||
* Additional copyrights may follow
|
||||
@ -68,7 +68,7 @@ int pmix_mca_base_open(void)
|
||||
{
|
||||
char *value;
|
||||
pmix_output_stream_t lds;
|
||||
char hostname[64];
|
||||
char hostname[PMIX_MAXHOSTNAMELEN] = {0};
|
||||
int var_id;
|
||||
int rc;
|
||||
|
||||
@ -155,7 +155,7 @@ int pmix_mca_base_open(void)
|
||||
} else {
|
||||
set_defaults(&lds);
|
||||
}
|
||||
gethostname(hostname, 64);
|
||||
gethostname(hostname, PMIX_MAXHOSTNAMELEN-1);
|
||||
rc = asprintf(&lds.lds_prefix, "[%s:%05d] ", hostname, getpid());
|
||||
if (0 > rc) {
|
||||
return PMIX_ERR_OUT_OF_RESOURCE;
|
||||
|
@ -9,7 +9,7 @@
|
||||
* University of Stuttgart. All rights reserved.
|
||||
* Copyright (c) 2004-2005 The Regents of the University of California.
|
||||
* All rights reserved.
|
||||
* Copyright (c) 2014-2018 Intel, Inc. All rights reserved.
|
||||
* Copyright (c) 2014-2019 Intel, Inc. All rights reserved.
|
||||
* Copyright (c) 2015 Research Organization for Information Science
|
||||
* and Technology (RIST). All rights reserved.
|
||||
* Copyright (c) 2016 IBM Corporation. All rights reserved.
|
||||
@ -431,10 +431,15 @@ pmix_status_t pmix20_bfrop_value_xfer(pmix_value_t *p, const pmix_value_t *src)
|
||||
memcpy(&p->data.status, &src->data.status, sizeof(pmix_status_t));
|
||||
break;
|
||||
case PMIX_PROC:
|
||||
memcpy(&p->data.proc, &src->data.proc, sizeof(pmix_proc_t));
|
||||
/* create the storage */
|
||||
p->data.proc = (pmix_proc_t*)malloc(sizeof(pmix_proc_t));
|
||||
if (NULL == p->data.proc) {
|
||||
return PMIX_ERR_NOMEM;
|
||||
}
|
||||
memcpy(p->data.proc, src->data.proc, sizeof(pmix_proc_t));
|
||||
break;
|
||||
case PMIX_PROC_RANK:
|
||||
memcpy(&p->data.proc, &src->data.rank, sizeof(pmix_rank_t));
|
||||
memcpy(&p->data.rank, &src->data.rank, sizeof(pmix_rank_t));
|
||||
break;
|
||||
case PMIX_BYTE_OBJECT:
|
||||
case PMIX_COMPRESSED_STRING:
|
||||
@ -653,7 +658,12 @@ pmix_status_t pmix20_bfrop_value_xfer(pmix_value_t *p, const pmix_value_t *src)
|
||||
p1 = (pmix_info_t*)p->data.darray->array;
|
||||
s1 = (pmix_info_t*)src->data.darray->array;
|
||||
for (n=0; n < src->data.darray->size; n++) {
|
||||
PMIX_INFO_LOAD(&p1[n], s1[n].key, &s1[n].value.data.flag, s1[n].value.type);
|
||||
PMIX_LOAD_KEY(p1[n].key, s1[n].key);
|
||||
rc = pmix_value_xfer(&p1[n].value, &s1[n].value);
|
||||
if (PMIX_SUCCESS != rc) {
|
||||
PMIX_INFO_FREE(p1, src->data.darray->size);
|
||||
return rc;
|
||||
}
|
||||
}
|
||||
break;
|
||||
case PMIX_PDATA:
|
||||
@ -664,7 +674,13 @@ pmix_status_t pmix20_bfrop_value_xfer(pmix_value_t *p, const pmix_value_t *src)
|
||||
pd = (pmix_pdata_t*)p->data.darray->array;
|
||||
sd = (pmix_pdata_t*)src->data.darray->array;
|
||||
for (n=0; n < src->data.darray->size; n++) {
|
||||
PMIX_PDATA_LOAD(&pd[n], &sd[n].proc, sd[n].key, &sd[n].value.data.flag, sd[n].value.type);
|
||||
memcpy(&pd[n].proc, &sd[n].proc, sizeof(pmix_proc_t));
|
||||
PMIX_LOAD_KEY(pd[n].key, sd[n].key);
|
||||
rc = pmix_value_xfer(&pd[n].value, &sd[n].value);
|
||||
if (PMIX_SUCCESS != rc) {
|
||||
PMIX_INFO_FREE(pd, src->data.darray->size);
|
||||
return rc;
|
||||
}
|
||||
}
|
||||
break;
|
||||
case PMIX_BUFFER:
|
||||
|
@ -1,9 +1,9 @@
|
||||
/*
|
||||
* Copyright (c) 2015-2018 Intel, Inc. All rights reserved.
|
||||
* Copyright (c) 2015-2019 Intel, Inc. All rights reserved.
|
||||
* Copyright (c) 2016 IBM Corporation. All rights reserved.
|
||||
* Copyright (c) 2016-2017 Mellanox Technologies, Inc.
|
||||
* All rights reserved.
|
||||
* Copyright (c) 2018 Research Organization for Information Science
|
||||
* Copyright (c) 2018-2019 Research Organization for Information Science
|
||||
* and Technology (RIST). All rights reserved.
|
||||
*
|
||||
* $COPYRIGHT$
|
||||
@ -30,6 +30,11 @@
|
||||
|
||||
#ifdef HAVE_SYS_AUXV_H
|
||||
#include <sys/auxv.h>
|
||||
#if PMIX_HAVE_LIBEV
|
||||
/* EV_NONE is macro-defined in <elf.h> that is included by <sys/auxv.h>
|
||||
* and used in an enum in <event.h> from libev, so #undef it to fix an issue*/
|
||||
#undef EV_NONE
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#include <pmix_common.h>
|
||||
|
Разница между файлами не показана из-за своего большого размера
Загрузить разницу
@ -1,7 +1,7 @@
|
||||
/*
|
||||
* Copyright (c) 2010 Cisco Systems, Inc. All rights reserved.
|
||||
* Copyright (c) 2010 Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2018 Intel, Inc. All rights reserved.
|
||||
* Copyright (c) 2018-2019 Intel, Inc. All rights reserved.
|
||||
* $COPYRIGHT$
|
||||
*
|
||||
* Additional copyrights may follow
|
||||
@ -158,7 +158,7 @@ static int if_bsdx_open(void)
|
||||
/* fill values into the pmix_pif_t */
|
||||
memcpy(&a4, &(sin_addr->sin_addr), sizeof(struct in_addr));
|
||||
|
||||
pmix_strncpy(intf->if_name, cur_ifaddrs->ifa_name, IF_NAMESIZE-1);
|
||||
pmix_strncpy(intf->if_name, cur_ifaddrs->ifa_name, PMIX_IF_NAMESIZE-1);
|
||||
intf->if_index = pmix_list_get_size(&pmix_if_list) + 1;
|
||||
((struct sockaddr_in*) &intf->if_addr)->sin_addr = a4;
|
||||
((struct sockaddr_in*) &intf->if_addr)->sin_family = AF_INET;
|
||||
|
@ -1,7 +1,7 @@
|
||||
/*
|
||||
* Copyright (c) 2010 Cisco Systems, Inc. All rights reserved.
|
||||
* Copyright (c) 2010 Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2018 Intel, Inc. All rights reserved.
|
||||
* Copyright (c) 2018-2019 Intel, Inc. All rights reserved.
|
||||
* $COPYRIGHT$
|
||||
*
|
||||
* Additional copyrights may follow
|
||||
@ -183,7 +183,7 @@ static int if_bsdx_ipv6_open(void)
|
||||
return PMIX_ERR_OUT_OF_RESOURCE;
|
||||
}
|
||||
intf->af_family = AF_INET6;
|
||||
pmix_strncpy(intf->if_name, cur_ifaddrs->ifa_name, IF_NAMESIZE-1);
|
||||
pmix_strncpy(intf->if_name, cur_ifaddrs->ifa_name, PMIX_IF_NAMESIZE-1);
|
||||
intf->if_index = pmix_list_get_size(&pmix_if_list) + 1;
|
||||
((struct sockaddr_in6*) &intf->if_addr)->sin6_addr = a6;
|
||||
((struct sockaddr_in6*) &intf->if_addr)->sin6_family = AF_INET6;
|
||||
|
@ -1,7 +1,7 @@
|
||||
/*
|
||||
* Copyright (c) 2010 Cisco Systems, Inc. All rights reserved.
|
||||
* Copyright (c) 2010 Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2018 Intel, Inc. All rights reserved.
|
||||
* Copyright (c) 2018-2019 Intel, Inc. All rights reserved.
|
||||
* $COPYRIGHT$
|
||||
*
|
||||
* Additional copyrights may follow
|
||||
@ -80,12 +80,17 @@ static int if_linux_ipv6_open(void)
|
||||
{
|
||||
FILE *f;
|
||||
if ((f = fopen("/proc/net/if_inet6", "r"))) {
|
||||
char ifname[IF_NAMESIZE];
|
||||
/* IF_NAMESIZE is normally 16 on Linux,
|
||||
but the next scanf allows up to 21 bytes */
|
||||
char ifname[PMIX_IF_NAMESIZE];
|
||||
unsigned int idx, pfxlen, scope, dadstat;
|
||||
struct in6_addr a6;
|
||||
int iter;
|
||||
uint32_t flag;
|
||||
unsigned int addrbyte[16];
|
||||
unsigned int addrbyte[PMIX_IF_NAMESIZE];
|
||||
|
||||
memset(addrbyte, 0, PMIX_IF_NAMESIZE*sizeof(unsigned int));
|
||||
memset(ifname, 0, PMIX_IF_NAMESIZE*sizeof(char));
|
||||
|
||||
while (fscanf(f, "%2x%2x%2x%2x%2x%2x%2x%2x%2x%2x%2x%2x%2x%2x%2x%2x %x %x %x %x %20s\n",
|
||||
&addrbyte[0], &addrbyte[1], &addrbyte[2], &addrbyte[3],
|
||||
@ -102,8 +107,8 @@ static int if_linux_ipv6_open(void)
|
||||
addrbyte[8], addrbyte[9], addrbyte[10], addrbyte[11],
|
||||
addrbyte[12], addrbyte[13], addrbyte[14], addrbyte[15], scope);
|
||||
|
||||
/* we don't want any other scope less than link-local */
|
||||
if (scope < 0x20) {
|
||||
/* Only interested in global (0x00) scope */
|
||||
if (scope != 0x00) {
|
||||
pmix_output_verbose(1, pmix_pif_base_framework.framework_output,
|
||||
"skipping interface %2x%2x:%2x%2x:%2x%2x:%2x%2x:%2x%2x:%2x%2x:%2x%2x:%2x%2x scope %x\n",
|
||||
addrbyte[0], addrbyte[1], addrbyte[2], addrbyte[3],
|
||||
@ -127,7 +132,7 @@ static int if_linux_ipv6_open(void)
|
||||
}
|
||||
|
||||
/* now construct the pmix_pif_t */
|
||||
pmix_strncpy(intf->if_name, ifname, IF_NAMESIZE-1);
|
||||
pmix_strncpy(intf->if_name, ifname, PMIX_IF_NAMESIZE-1);
|
||||
intf->if_index = pmix_list_get_size(&pmix_if_list)+1;
|
||||
intf->if_kernel_index = (uint16_t) idx;
|
||||
((struct sockaddr_in6*) &intf->if_addr)->sin6_addr = a6;
|
||||
|
@ -3,7 +3,7 @@
|
||||
* Copyright (c) 2010-2013 Cisco Systems, Inc. All rights reserved.
|
||||
* Copyright (c) 2015 Los Alamos National Security, LLC. All rights
|
||||
* reserved.
|
||||
* Copyright (c) 2016-2018 Intel, Inc. All rights reserved.
|
||||
* Copyright (c) 2016-2019 Intel, Inc. All rights reserved.
|
||||
* $COPYRIGHT$
|
||||
*
|
||||
* Additional copyrights may follow
|
||||
@ -73,7 +73,7 @@ BEGIN_C_DECLS
|
||||
|
||||
typedef struct pmix_pif_t {
|
||||
pmix_list_item_t super;
|
||||
char if_name[IF_NAMESIZE+1];
|
||||
char if_name[PMIX_IF_NAMESIZE+1];
|
||||
int if_index;
|
||||
uint16_t if_kernel_index;
|
||||
uint16_t af_family;
|
||||
|
@ -3,7 +3,7 @@
|
||||
* Copyright (c) 2010 Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2016 Research Organization for Information Science
|
||||
* and Technology (RIST). All rights reserved.
|
||||
* Copyright (c) 2016-2018 Intel, Inc. All rights reserved.
|
||||
* Copyright (c) 2016-2019 Intel, Inc. All rights reserved.
|
||||
* $COPYRIGHT$
|
||||
*
|
||||
* Additional copyrights may follow
|
||||
@ -190,7 +190,7 @@ static int if_solaris_ipv6_open(void)
|
||||
}
|
||||
intf->af_family = AF_INET6;
|
||||
|
||||
pmix_strncpy (intf->if_name, lifreq->lifr_name, IF_NAMESIZE-1);
|
||||
pmix_strncpy (intf->if_name, lifreq->lifr_name, PMIX_IF_NAMESIZE-1);
|
||||
intf->if_index = pmix_list_get_size(&pmix_if_list)+1;
|
||||
memcpy(&intf->if_addr, my_addr, sizeof (*my_addr));
|
||||
intf->if_mask = 64;
|
||||
|
@ -1,6 +1,6 @@
|
||||
/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil -*- */
|
||||
/*
|
||||
* Copyright (c) 2018 Intel, Inc. All rights reserved.
|
||||
* Copyright (c) 2018-2019 Intel, Inc. All rights reserved.
|
||||
*
|
||||
* $COPYRIGHT$
|
||||
*
|
||||
@ -109,8 +109,8 @@ pmix_status_t pmix_plog_base_log(const pmix_proc_t *source,
|
||||
* channel that can successfully handle this request,
|
||||
* and any channel directives */
|
||||
for (n=0; n < ndirs; n++) {
|
||||
if (0 == strncmp(directives[n].key, PMIX_LOG_ONCE, PMIX_MAX_KEYLEN)) {
|
||||
logonce = true;
|
||||
if (PMIX_CHECK_KEY(&directives[n], PMIX_LOG_ONCE)) {
|
||||
logonce = PMIX_INFO_TRUE(&directives[n]);
|
||||
break;
|
||||
}
|
||||
}
|
||||
@ -237,14 +237,10 @@ pmix_status_t pmix_plog_base_log(const pmix_proc_t *source,
|
||||
|
||||
rc = mycount->status; // save the status as it could change when the lock is released
|
||||
if (0 == mycount->nreqs) {
|
||||
/* execute their callback */
|
||||
if (NULL != mycount->cbfunc) {
|
||||
mycount->cbfunc(mycount->status, mycount->cbdata);
|
||||
}
|
||||
PMIX_RELEASE_THREAD(&mycount->lock);
|
||||
PMIX_RELEASE(mycount);
|
||||
PMIX_RELEASE_THREAD(&pmix_plog_globals.lock);
|
||||
return PMIX_SUCCESS;
|
||||
return PMIX_OPERATION_SUCCEEDED;
|
||||
}
|
||||
PMIX_RELEASE_THREAD(&mycount->lock);
|
||||
PMIX_RELEASE_THREAD(&pmix_plog_globals.lock);
|
||||
|
@ -10,7 +10,7 @@
|
||||
* Copyright (c) 2004-2005 The Regents of the University of California.
|
||||
* All rights reserved.
|
||||
* Copyright (c) 2007 Sun Microsystems, Inc. All rights reserved.
|
||||
* Copyright (c) 2014-2018 Intel, Inc. All rights reserved.
|
||||
* Copyright (c) 2014-2019 Intel, Inc. All rights reserved.
|
||||
* $COPYRIGHT$
|
||||
*
|
||||
* Additional copyrights may follow
|
||||
@ -101,6 +101,9 @@ static pmix_status_t mylog(const pmix_proc_t *source,
|
||||
/* check to see if there are any stdfd entries */
|
||||
rc = PMIX_ERR_TAKE_NEXT_OPTION;
|
||||
for (n=0; n < ndata; n++) {
|
||||
if (PMIX_INFO_OP_IS_COMPLETE(&data[n])) {
|
||||
continue;
|
||||
}
|
||||
if (0 == strncmp(data[n].key, PMIX_LOG_STDERR, PMIX_MAX_KEYLEN)) {
|
||||
bo.bytes = data[n].value.data.string;
|
||||
bo.size = strlen(bo.bytes);
|
||||
@ -117,6 +120,5 @@ static pmix_status_t mylog(const pmix_proc_t *source,
|
||||
rc = PMIX_SUCCESS;
|
||||
}
|
||||
}
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
@ -60,7 +60,7 @@ pmix_status_t pmix_pnet_base_allocate(char *nspace,
|
||||
nptr = NULL;
|
||||
/* find this nspace - note that it may not have
|
||||
* been registered yet */
|
||||
PMIX_LIST_FOREACH(ns, &pmix_server_globals.nspaces, pmix_namespace_t) {
|
||||
PMIX_LIST_FOREACH(ns, &pmix_globals.nspaces, pmix_namespace_t) {
|
||||
if (0 == strcmp(ns->nspace, nspace)) {
|
||||
nptr = ns;
|
||||
break;
|
||||
@ -73,7 +73,7 @@ pmix_status_t pmix_pnet_base_allocate(char *nspace,
|
||||
return PMIX_ERR_NOMEM;
|
||||
}
|
||||
nptr->nspace = strdup(nspace);
|
||||
pmix_list_append(&pmix_server_globals.nspaces, &nptr->super);
|
||||
pmix_list_append(&pmix_globals.nspaces, &nptr->super);
|
||||
}
|
||||
|
||||
if (NULL != info) {
|
||||
@ -146,7 +146,7 @@ pmix_status_t pmix_pnet_base_setup_local_network(char *nspace,
|
||||
|
||||
/* find this proc's nspace object */
|
||||
nptr = NULL;
|
||||
PMIX_LIST_FOREACH(ns, &pmix_server_globals.nspaces, pmix_namespace_t) {
|
||||
PMIX_LIST_FOREACH(ns, &pmix_globals.nspaces, pmix_namespace_t) {
|
||||
if (0 == strcmp(ns->nspace, nspace)) {
|
||||
nptr = ns;
|
||||
break;
|
||||
@ -159,7 +159,7 @@ pmix_status_t pmix_pnet_base_setup_local_network(char *nspace,
|
||||
return PMIX_ERR_NOMEM;
|
||||
}
|
||||
nptr->nspace = strdup(nspace);
|
||||
pmix_list_append(&pmix_server_globals.nspaces, &nptr->super);
|
||||
pmix_list_append(&pmix_globals.nspaces, &nptr->super);
|
||||
}
|
||||
|
||||
PMIX_LIST_FOREACH(active, &pmix_pnet_globals.actives, pmix_pnet_base_active_module_t) {
|
||||
@ -191,7 +191,7 @@ pmix_status_t pmix_pnet_base_setup_fork(const pmix_proc_t *proc, char ***env)
|
||||
|
||||
/* find this proc's nspace object */
|
||||
nptr = NULL;
|
||||
PMIX_LIST_FOREACH(ns, &pmix_server_globals.nspaces, pmix_namespace_t) {
|
||||
PMIX_LIST_FOREACH(ns, &pmix_globals.nspaces, pmix_namespace_t) {
|
||||
if (0 == strcmp(ns->nspace, proc->nspace)) {
|
||||
nptr = ns;
|
||||
break;
|
||||
@ -204,7 +204,7 @@ pmix_status_t pmix_pnet_base_setup_fork(const pmix_proc_t *proc, char ***env)
|
||||
return PMIX_ERR_NOMEM;
|
||||
}
|
||||
nptr->nspace = strdup(proc->nspace);
|
||||
pmix_list_append(&pmix_server_globals.nspaces, &nptr->super);
|
||||
pmix_list_append(&pmix_globals.nspaces, &nptr->super);
|
||||
}
|
||||
|
||||
PMIX_LIST_FOREACH(active, &pmix_pnet_globals.actives, pmix_pnet_base_active_module_t) {
|
||||
@ -282,7 +282,7 @@ void pmix_pnet_base_deregister_nspace(char *nspace)
|
||||
|
||||
/* find this nspace object */
|
||||
nptr = NULL;
|
||||
PMIX_LIST_FOREACH(ns, &pmix_server_globals.nspaces, pmix_namespace_t) {
|
||||
PMIX_LIST_FOREACH(ns, &pmix_globals.nspaces, pmix_namespace_t) {
|
||||
if (0 == strcmp(ns->nspace, nspace)) {
|
||||
nptr = ns;
|
||||
break;
|
||||
|
@ -435,7 +435,7 @@ static pmix_status_t collect_inventory(pmix_info_t directives[], size_t ndirs,
|
||||
pmix_buffer_t bucket, pbkt;
|
||||
bool found = false;
|
||||
pmix_byte_object_t pbo;
|
||||
char nodename[PMIX_MAXHOSTNAMELEN], *foo;
|
||||
char nodename[PMIX_MAXHOSTNAMELEN] = {0}, *foo;
|
||||
|
||||
pmix_output_verbose(2, pmix_pnet_base_framework.framework_output,
|
||||
"pnet:opa collect inventory");
|
||||
@ -443,7 +443,7 @@ static pmix_status_t collect_inventory(pmix_info_t directives[], size_t ndirs,
|
||||
/* setup the bucket - we will pass the results as a blob */
|
||||
PMIX_CONSTRUCT(&bucket, pmix_buffer_t);
|
||||
/* pack our node name */
|
||||
gethostname(nodename, sizeof(nodename));
|
||||
gethostname(nodename, sizeof(nodename)-1);
|
||||
foo = &nodename[0];
|
||||
PMIX_BFROPS_PACK(rc, pmix_globals.mypeer, &bucket, &foo, 1, PMIX_STRING);
|
||||
if (PMIX_SUCCESS != rc) {
|
||||
|
@ -737,6 +737,7 @@ static pmix_status_t setup_local_network(pmix_namespace_t *nptr,
|
||||
"pnet:tcp:setup_local_network");
|
||||
|
||||
if (NULL != info) {
|
||||
idkey = strdup("default");
|
||||
for (n=0; n < ninfo; n++) {
|
||||
/* look for my key */
|
||||
if (0 == strncmp(info[n].key, PMIX_TCP_SETUP_APP_KEY, PMIX_MAX_KEYLEN)) {
|
||||
@ -866,8 +867,8 @@ static pmix_status_t collect_inventory(pmix_info_t directives[], size_t ndirs,
|
||||
pmix_inventory_cbfunc_t cbfunc, void *cbdata)
|
||||
{
|
||||
pmix_inventory_rollup_t *cd = (pmix_inventory_rollup_t*)cbdata;
|
||||
char *prefix, myhost[PMIX_MAXHOSTNAMELEN];
|
||||
char myconnhost[PMIX_MAXHOSTNAMELEN];
|
||||
char *prefix, myhost[PMIX_MAXHOSTNAMELEN] = {0};
|
||||
char myconnhost[PMIX_MAXHOSTNAMELEN] = {0};
|
||||
char name[32], uri[2048];
|
||||
struct sockaddr_storage my_ss;
|
||||
char *foo;
|
||||
@ -884,7 +885,7 @@ static pmix_status_t collect_inventory(pmix_info_t directives[], size_t ndirs,
|
||||
/* setup the bucket - we will pass the results as a blob */
|
||||
PMIX_CONSTRUCT(&bucket, pmix_buffer_t);
|
||||
/* add our hostname */
|
||||
gethostname(myhost, sizeof(myhost));
|
||||
gethostname(myhost, sizeof(myhost)-1);
|
||||
foo = &myhost[0];
|
||||
PMIX_BFROPS_PACK(rc, pmix_globals.mypeer, &bucket, &foo, 1, PMIX_STRING);
|
||||
if (PMIX_SUCCESS != rc) {
|
||||
@ -919,11 +920,11 @@ static pmix_status_t collect_inventory(pmix_info_t directives[], size_t ndirs,
|
||||
if (AF_INET == my_ss.ss_family) {
|
||||
prefix = "tcp4://";
|
||||
inet_ntop(AF_INET, &((struct sockaddr_in*) &my_ss)->sin_addr,
|
||||
myconnhost, PMIX_MAXHOSTNAMELEN);
|
||||
myconnhost, PMIX_MAXHOSTNAMELEN-1);
|
||||
} else if (AF_INET6 == my_ss.ss_family) {
|
||||
prefix = "tcp6://";
|
||||
inet_ntop(AF_INET6, &((struct sockaddr_in6*) &my_ss)->sin6_addr,
|
||||
myconnhost, PMIX_MAXHOSTNAMELEN);
|
||||
myconnhost, PMIX_MAXHOSTNAMELEN-1);
|
||||
} else {
|
||||
continue;
|
||||
}
|
||||
|
@ -3,7 +3,7 @@
|
||||
* All rights reserved.
|
||||
* Copyright (c) 2017 Research Organization for Information Science
|
||||
* and Technology (RIST). All rights reserved.
|
||||
* Copyright (c) 2017-2018 Intel, Inc. All rights reserved.
|
||||
* Copyright (c) 2017-2019 Intel, Inc. All rights reserved.
|
||||
* $COPYRIGHT$
|
||||
*
|
||||
* Additional copyrights may follow
|
||||
@ -82,9 +82,9 @@ static int _mmap_segment_create(pmix_pshmem_seg_t *sm_seg, const char *file_name
|
||||
if (ENOSPC == rc) {
|
||||
rc = PMIX_ERR_OUT_OF_RESOURCE;
|
||||
goto out;
|
||||
} else if ((ENOTSUP != rc)
|
||||
} else if (EINVAL != rc && ENOTSUP != rc
|
||||
#ifdef EOPNOTSUPP
|
||||
&& (EOPNOTSUPP != rc)
|
||||
&& EOPNOTSUPP != rc
|
||||
#endif
|
||||
){
|
||||
rc = PMIX_ERROR;
|
||||
|
@ -24,6 +24,7 @@
|
||||
*/
|
||||
|
||||
#include <src/include/pmix_config.h>
|
||||
#include "src/include/pmix_globals.h"
|
||||
|
||||
#ifdef HAVE_FCNTL_H
|
||||
#include <fcntl.h>
|
||||
@ -50,7 +51,6 @@
|
||||
#include <sys/sysctl.h>
|
||||
#endif
|
||||
|
||||
#include "src/include/pmix_globals.h"
|
||||
#include "src/include/pmix_socket_errno.h"
|
||||
#include "src/client/pmix_client_ops.h"
|
||||
#include "src/server/pmix_server_ops.h"
|
||||
@ -131,7 +131,7 @@ static pmix_status_t connect_to_peer(struct pmix_peer_t *peer,
|
||||
char *p, *p2, *server_nspace = NULL, *rendfile = NULL;
|
||||
int sd, rc;
|
||||
size_t n;
|
||||
char myhost[PMIX_MAXHOSTNAMELEN];
|
||||
char myhost[PMIX_MAXHOSTNAMELEN] = {0};
|
||||
bool system_level = false;
|
||||
bool system_level_only = false;
|
||||
bool reconnect = false;
|
||||
@ -414,7 +414,7 @@ static pmix_status_t connect_to_peer(struct pmix_peer_t *peer,
|
||||
|
||||
/* mark that we are using the V2 protocol */
|
||||
pmix_globals.mypeer->protocol = PMIX_PROTOCOL_V2;
|
||||
gethostname(myhost, sizeof(myhost));
|
||||
gethostname(myhost, sizeof(myhost)-1);
|
||||
/* if we were given a URI via MCA param, then look no further */
|
||||
if (NULL != suri) {
|
||||
if (NULL != server_nspace) {
|
||||
|
@ -360,8 +360,8 @@ static pmix_status_t setup_listener(pmix_info_t info[], size_t ninfo,
|
||||
bool session_tool = false;
|
||||
bool system_tool = false;
|
||||
pmix_socklen_t addrlen;
|
||||
char *prefix, myhost[PMIX_MAXHOSTNAMELEN];
|
||||
char myconnhost[PMIX_MAXHOSTNAMELEN];
|
||||
char *prefix, myhost[PMIX_MAXHOSTNAMELEN] = {0};
|
||||
char myconnhost[PMIX_MAXHOSTNAMELEN] = {0};
|
||||
int myport;
|
||||
pmix_kval_t *urikv;
|
||||
|
||||
@ -624,17 +624,17 @@ static pmix_status_t setup_listener(pmix_info_t info[], size_t ninfo,
|
||||
goto sockerror;
|
||||
}
|
||||
|
||||
gethostname(myhost, sizeof(myhost));
|
||||
gethostname(myhost, sizeof(myhost)-1);
|
||||
if (AF_INET == mca_ptl_tcp_component.connection.ss_family) {
|
||||
prefix = "tcp4://";
|
||||
myport = ntohs(((struct sockaddr_in*) &mca_ptl_tcp_component.connection)->sin_port);
|
||||
inet_ntop(AF_INET, &((struct sockaddr_in*) &mca_ptl_tcp_component.connection)->sin_addr,
|
||||
myconnhost, PMIX_MAXHOSTNAMELEN);
|
||||
myconnhost, PMIX_MAXHOSTNAMELEN-1);
|
||||
} else if (AF_INET6 == mca_ptl_tcp_component.connection.ss_family) {
|
||||
prefix = "tcp6://";
|
||||
myport = ntohs(((struct sockaddr_in6*) &mca_ptl_tcp_component.connection)->sin6_port);
|
||||
inet_ntop(AF_INET6, &((struct sockaddr_in6*) &mca_ptl_tcp_component.connection)->sin6_addr,
|
||||
myconnhost, PMIX_MAXHOSTNAMELEN);
|
||||
myconnhost, PMIX_MAXHOSTNAMELEN-1);
|
||||
} else {
|
||||
goto sockerror;
|
||||
}
|
||||
@ -898,7 +898,7 @@ static char **split_and_resolve(char **orig_str, char *name)
|
||||
{
|
||||
int i, ret, save, if_index;
|
||||
char **argv, *str, *tmp;
|
||||
char if_name[IF_NAMESIZE];
|
||||
char if_name[PMIX_IF_NAMESIZE];
|
||||
struct sockaddr_storage argv_inaddr, if_inaddr;
|
||||
uint32_t argv_prefix;
|
||||
|
||||
@ -1384,7 +1384,7 @@ static void connection_handler(int sd, short args, void *cbdata)
|
||||
* of local clients. So let's start by searching for
|
||||
* the nspace object */
|
||||
nptr = NULL;
|
||||
PMIX_LIST_FOREACH(tmp, &pmix_server_globals.nspaces, pmix_namespace_t) {
|
||||
PMIX_LIST_FOREACH(tmp, &pmix_globals.nspaces, pmix_namespace_t) {
|
||||
if (0 == strcmp(tmp->nspace, nspace)) {
|
||||
nptr = tmp;
|
||||
break;
|
||||
@ -1534,7 +1534,7 @@ static void connection_handler(int sd, short args, void *cbdata)
|
||||
|
||||
/* see if we know this nspace */
|
||||
nptr = NULL;
|
||||
PMIX_LIST_FOREACH(tmp, &pmix_server_globals.nspaces, pmix_namespace_t) {
|
||||
PMIX_LIST_FOREACH(tmp, &pmix_globals.nspaces, pmix_namespace_t) {
|
||||
if (0 == strcmp(tmp->nspace, nspace)) {
|
||||
nptr = tmp;
|
||||
break;
|
||||
@ -1838,7 +1838,7 @@ static void process_cbfunc(int sd, short args, void *cbdata)
|
||||
if (5 != pnd->flag && 8 != pnd->flag) {
|
||||
PMIX_RETAIN(nptr);
|
||||
nptr->nspace = strdup(cd->proc.nspace);
|
||||
pmix_list_append(&pmix_server_globals.nspaces, &nptr->super);
|
||||
pmix_list_append(&pmix_globals.nspaces, &nptr->super);
|
||||
info = PMIX_NEW(pmix_rank_info_t);
|
||||
info->pname.nspace = strdup(nptr->nspace);
|
||||
info->pname.rank = cd->proc.rank;
|
||||
@ -1866,7 +1866,7 @@ static void process_cbfunc(int sd, short args, void *cbdata)
|
||||
peer->nptr->compat.psec = pmix_psec_base_assign_module(pnd->psec);
|
||||
if (NULL == peer->nptr->compat.psec) {
|
||||
PMIX_RELEASE(peer);
|
||||
pmix_list_remove_item(&pmix_server_globals.nspaces, &nptr->super);
|
||||
pmix_list_remove_item(&pmix_globals.nspaces, &nptr->super);
|
||||
PMIX_RELEASE(nptr); // will release the info object
|
||||
CLOSE_THE_SOCKET(pnd->sd);
|
||||
goto done;
|
||||
@ -1881,7 +1881,7 @@ static void process_cbfunc(int sd, short args, void *cbdata)
|
||||
PMIX_INFO_DESTRUCT(&ginfo);
|
||||
if (NULL == peer->nptr->compat.gds) {
|
||||
PMIX_RELEASE(peer);
|
||||
pmix_list_remove_item(&pmix_server_globals.nspaces, &nptr->super);
|
||||
pmix_list_remove_item(&pmix_globals.nspaces, &nptr->super);
|
||||
PMIX_RELEASE(nptr); // will release the info object
|
||||
CLOSE_THE_SOCKET(pnd->sd);
|
||||
goto done;
|
||||
@ -1900,7 +1900,7 @@ static void process_cbfunc(int sd, short args, void *cbdata)
|
||||
req = PMIX_NEW(pmix_iof_req_t);
|
||||
if (NULL == req) {
|
||||
PMIX_RELEASE(peer);
|
||||
pmix_list_remove_item(&pmix_server_globals.nspaces, &nptr->super);
|
||||
pmix_list_remove_item(&pmix_globals.nspaces, &nptr->super);
|
||||
PMIX_RELEASE(nptr); // will release the info object
|
||||
CLOSE_THE_SOCKET(pnd->sd);
|
||||
goto done;
|
||||
@ -1936,7 +1936,7 @@ static void process_cbfunc(int sd, short args, void *cbdata)
|
||||
"validation of tool credentials failed: %s",
|
||||
PMIx_Error_string(rc));
|
||||
PMIX_RELEASE(peer);
|
||||
pmix_list_remove_item(&pmix_server_globals.nspaces, &nptr->super);
|
||||
pmix_list_remove_item(&pmix_globals.nspaces, &nptr->super);
|
||||
PMIX_RELEASE(nptr); // will release the info object
|
||||
CLOSE_THE_SOCKET(pnd->sd);
|
||||
goto done;
|
||||
@ -1949,7 +1949,7 @@ static void process_cbfunc(int sd, short args, void *cbdata)
|
||||
PMIX_RELEASE(pnd);
|
||||
PMIX_RELEASE(cd);
|
||||
PMIX_RELEASE(peer);
|
||||
pmix_list_remove_item(&pmix_server_globals.nspaces, &nptr->super);
|
||||
pmix_list_remove_item(&pmix_globals.nspaces, &nptr->super);
|
||||
PMIX_RELEASE(nptr); // will release the info object
|
||||
/* probably cannot send an error reply if we are out of memory */
|
||||
return;
|
||||
|
@ -13,7 +13,7 @@
|
||||
* Copyright (c) 2011-2014 Cisco Systems, Inc. All rights reserved.
|
||||
* Copyright (c) 2011-2013 Los Alamos National Security, LLC. All rights
|
||||
* reserved.
|
||||
* Copyright (c) 2013-2018 Intel, Inc. All rights reserved.
|
||||
* Copyright (c) 2013-2019 Intel, Inc. All rights reserved.
|
||||
* $COPYRIGHT$
|
||||
*
|
||||
* Additional copyrights may follow
|
||||
@ -611,7 +611,7 @@ void pmix_usock_send_handler(int sd, short flags, void *cbdata)
|
||||
return;
|
||||
} else {
|
||||
// report the error
|
||||
event_del(&peer->send_event);
|
||||
pmix_event_del(&peer->send_event);
|
||||
peer->send_ev_active = false;
|
||||
PMIX_RELEASE(msg);
|
||||
peer->send_msg = NULL;
|
||||
|
@ -552,7 +552,7 @@ static void connection_handler(int sd, short args, void *cbdata)
|
||||
|
||||
/* see if we know this nspace */
|
||||
nptr = NULL;
|
||||
PMIX_LIST_FOREACH(tmp, &pmix_server_globals.nspaces, pmix_namespace_t) {
|
||||
PMIX_LIST_FOREACH(tmp, &pmix_globals.nspaces, pmix_namespace_t) {
|
||||
if (0 == strcmp(tmp->nspace, nspace)) {
|
||||
nptr = tmp;
|
||||
break;
|
||||
|
@ -12,9 +12,9 @@
|
||||
* Copyright (c) 2008-2015 Cisco Systems, Inc. All rights reserved.
|
||||
* Copyright (c) 2010-2015 Los Alamos National Security, LLC.
|
||||
* All rights reserved.
|
||||
* Copyright (c) 2013-2018 Intel, Inc. All rights reserved.
|
||||
* Copyright (c) 2016-2018 Research Organization for Information Science
|
||||
* and Technology (RIST). All rights reserved.
|
||||
* Copyright (c) 2013-2019 Intel, Inc. All rights reserved.
|
||||
* Copyright (c) 2016-2019 Research Organization for Information Science
|
||||
* and Technology (RIST). All rights reserved.
|
||||
* $COPYRIGHT$
|
||||
*
|
||||
* Additional copyrights may follow
|
||||
@ -116,6 +116,8 @@ void pmix_rte_finalize(void)
|
||||
}
|
||||
PMIX_DESTRUCT(&pmix_globals.notifications);
|
||||
PMIX_LIST_DESTRUCT(&pmix_globals.iof_requests);
|
||||
free(pmix_globals.hostname);
|
||||
PMIX_LIST_DESTRUCT(&pmix_globals.nspaces);
|
||||
|
||||
/* now safe to release the event base */
|
||||
if (!pmix_globals.external_evbase) {
|
||||
|
@ -33,7 +33,9 @@
|
||||
#include <unistd.h>
|
||||
#endif
|
||||
#include PMIX_EVENT_HEADER
|
||||
#include "event2/thread.h"
|
||||
#if ! PMIX_HAVE_LIBEV
|
||||
#include PMIX_EVENT2_THREAD_HEADER
|
||||
#endif
|
||||
|
||||
#include <pmix_rename.h>
|
||||
|
||||
@ -98,7 +100,7 @@ int pmix_rte_init(pmix_proc_type_t type,
|
||||
int ret, debug_level;
|
||||
char *error = NULL, *evar;
|
||||
size_t n;
|
||||
char hostname[PMIX_MAXHOSTNAMELEN];
|
||||
char hostname[PMIX_MAXHOSTNAMELEN] = {0};
|
||||
|
||||
if( ++pmix_initialized != 1 ) {
|
||||
if( pmix_initialized < 1 ) {
|
||||
@ -159,7 +161,7 @@ int pmix_rte_init(pmix_proc_type_t type,
|
||||
}
|
||||
|
||||
/* setup the globals structure */
|
||||
gethostname(hostname, PMIX_MAXHOSTNAMELEN);
|
||||
gethostname(hostname, PMIX_MAXHOSTNAMELEN-1);
|
||||
pmix_globals.hostname = strdup(hostname);
|
||||
memset(&pmix_globals.myid.nspace, 0, PMIX_MAX_NSLEN+1);
|
||||
pmix_globals.myid.rank = PMIX_RANK_INVALID;
|
||||
@ -172,6 +174,8 @@ int pmix_rte_init(pmix_proc_type_t type,
|
||||
ret = pmix_hotel_init(&pmix_globals.notifications, pmix_globals.max_events,
|
||||
pmix_globals.evbase, pmix_globals.event_eviction_time,
|
||||
_notification_eviction_cbfunc);
|
||||
PMIX_CONSTRUCT(&pmix_globals.nspaces, pmix_list_t);
|
||||
|
||||
if (PMIX_SUCCESS != ret) {
|
||||
error = "notification hotel init";
|
||||
goto return_error;
|
||||
|
@ -1,8 +1,8 @@
|
||||
/*
|
||||
* Copyright (c) 2014-2019 Intel, Inc. All rights reserved.
|
||||
* Copyright (c) 2015 Cisco Systems, Inc. All rights reserved.
|
||||
* Copyright (c) 2017 Research Organization for Information Science
|
||||
* and Technology (RIST). All rights reserved.
|
||||
* Copyright (c) 2017-2019 Research Organization for Information Science
|
||||
* and Technology (RIST). All rights reserved.
|
||||
* Copyright (c) 2019 Mellanox Technologies, Inc.
|
||||
* All rights reserved.
|
||||
* $COPYRIGHT$
|
||||
@ -13,7 +13,6 @@
|
||||
*/
|
||||
|
||||
#include <src/include/pmix_config.h>
|
||||
#include "src/include/types.h"
|
||||
|
||||
#ifdef HAVE_UNISTD_H
|
||||
#include <unistd.h>
|
||||
@ -49,6 +48,12 @@ typedef struct {
|
||||
|
||||
bool engine_constructed;
|
||||
pmix_thread_t engine;
|
||||
#if PMIX_HAVE_LIBEV
|
||||
ev_async async;
|
||||
pthread_mutex_t mutex;
|
||||
pthread_cond_t cond;
|
||||
pmix_list_t list;
|
||||
#endif
|
||||
} pmix_progress_tracker_t;
|
||||
|
||||
static void tracker_constructor(pmix_progress_tracker_t *p)
|
||||
@ -58,6 +63,10 @@ static void tracker_constructor(pmix_progress_tracker_t *p)
|
||||
p->ev_base = NULL;
|
||||
p->ev_active = false;
|
||||
p->engine_constructed = false;
|
||||
#if PMIX_HAVE_LIBEV
|
||||
pthread_mutex_init(&p->mutex, NULL);
|
||||
PMIX_CONSTRUCT(&p->list, pmix_list_t);
|
||||
#endif
|
||||
}
|
||||
|
||||
static void tracker_destructor(pmix_progress_tracker_t *p)
|
||||
@ -73,6 +82,10 @@ static void tracker_destructor(pmix_progress_tracker_t *p)
|
||||
if (p->engine_constructed) {
|
||||
PMIX_DESTRUCT(&p->engine);
|
||||
}
|
||||
#if PMIX_HAVE_LIBEV
|
||||
pthread_mutex_destroy(&p->mutex);
|
||||
PMIX_LIST_DESTRUCT(&p->list);
|
||||
#endif
|
||||
}
|
||||
|
||||
static PMIX_CLASS_INSTANCE(pmix_progress_tracker_t,
|
||||
@ -80,6 +93,114 @@ static PMIX_CLASS_INSTANCE(pmix_progress_tracker_t,
|
||||
tracker_constructor,
|
||||
tracker_destructor);
|
||||
|
||||
#if PMIX_HAVE_LIBEV
|
||||
|
||||
typedef enum {
|
||||
PMIX_EVENT_ACTIVE,
|
||||
PMIX_EVENT_ADD,
|
||||
PMIX_EVENT_DEL
|
||||
} pmix_event_type_t;
|
||||
|
||||
typedef struct {
|
||||
pmix_list_item_t super;
|
||||
struct event *ev;
|
||||
struct timeval *tv;
|
||||
int res;
|
||||
short ncalls;
|
||||
pmix_event_type_t type;
|
||||
} pmix_event_caddy_t;
|
||||
|
||||
static PMIX_CLASS_INSTANCE(pmix_event_caddy_t,
|
||||
pmix_list_item_t,
|
||||
NULL, NULL);
|
||||
|
||||
static pmix_progress_tracker_t* pmix_progress_tracker_get_by_base(struct event_base *);
|
||||
|
||||
static void pmix_libev_ev_async_cb (EV_P_ ev_async *w, int revents)
|
||||
{
|
||||
pmix_progress_tracker_t *trk = pmix_progress_tracker_get_by_base((struct event_base *)EV_A);
|
||||
assert(NULL != trk);
|
||||
pthread_mutex_lock (&trk->mutex);
|
||||
pmix_event_caddy_t *cd, *next;
|
||||
PMIX_LIST_FOREACH_SAFE(cd, next, &trk->list, pmix_event_caddy_t) {
|
||||
switch (cd->type) {
|
||||
case PMIX_EVENT_ADD:
|
||||
(void)event_add(cd->ev, cd->tv);
|
||||
break;
|
||||
case PMIX_EVENT_DEL:
|
||||
(void)event_del(cd->ev);
|
||||
break;
|
||||
case PMIX_EVENT_ACTIVE:
|
||||
(void)event_active(cd->ev, cd->res, cd->ncalls);
|
||||
break;
|
||||
}
|
||||
pmix_list_remove_item(&trk->list, &cd->super);
|
||||
PMIX_RELEASE(cd);
|
||||
}
|
||||
pthread_mutex_unlock (&trk->mutex);
|
||||
}
|
||||
|
||||
int pmix_event_add(struct event *ev, struct timeval *tv) {
|
||||
int res;
|
||||
pmix_progress_tracker_t *trk = pmix_progress_tracker_get_by_base(ev->ev_base);
|
||||
if ((NULL != trk) && !pthread_equal(pthread_self(), trk->engine.t_handle)) {
|
||||
pmix_event_caddy_t *cd = PMIX_NEW(pmix_event_caddy_t);
|
||||
cd->type = PMIX_EVENT_ADD;
|
||||
cd->ev = ev;
|
||||
cd->tv = tv;
|
||||
pthread_mutex_lock(&trk->mutex);
|
||||
pmix_list_append(&trk->list, &cd->super);
|
||||
ev_async_send ((struct ev_loop *)trk->ev_base, &trk->async);
|
||||
pthread_mutex_unlock(&trk->mutex);
|
||||
res = PMIX_SUCCESS;
|
||||
} else {
|
||||
res = event_add(ev, tv);
|
||||
}
|
||||
return res;
|
||||
}
|
||||
|
||||
int pmix_event_del(struct event *ev) {
|
||||
int res;
|
||||
pmix_progress_tracker_t *trk = pmix_progress_tracker_get_by_base(ev->ev_base);
|
||||
if ((NULL != trk) && !pthread_equal(pthread_self(), trk->engine.t_handle)) {
|
||||
pmix_event_caddy_t *cd = PMIX_NEW(pmix_event_caddy_t);
|
||||
cd->type = PMIX_EVENT_DEL;
|
||||
cd->ev = ev;
|
||||
pthread_mutex_lock(&trk->mutex);
|
||||
pmix_list_append(&trk->list, &cd->super);
|
||||
ev_async_send ((struct ev_loop *)trk->ev_base, &trk->async);
|
||||
pthread_mutex_unlock(&trk->mutex);
|
||||
res = PMIX_SUCCESS;
|
||||
} else {
|
||||
res = event_del(ev);
|
||||
}
|
||||
return res;
|
||||
}
|
||||
|
||||
void pmix_event_active (struct event *ev, int res, short ncalls) {
|
||||
pmix_progress_tracker_t *trk = pmix_progress_tracker_get_by_base(ev->ev_base);
|
||||
if ((NULL != trk) && !pthread_equal(pthread_self(), trk->engine.t_handle)) {
|
||||
pmix_event_caddy_t *cd = PMIX_NEW(pmix_event_caddy_t);
|
||||
cd->type = PMIX_EVENT_ACTIVE;
|
||||
cd->ev = ev;
|
||||
cd->res = res;
|
||||
cd->ncalls = ncalls;
|
||||
pthread_mutex_lock(&trk->mutex);
|
||||
pmix_list_append(&trk->list, &cd->super);
|
||||
ev_async_send ((struct ev_loop *)trk->ev_base, &trk->async);
|
||||
pthread_mutex_unlock(&trk->mutex);
|
||||
} else {
|
||||
event_active(ev, res, ncalls);
|
||||
}
|
||||
}
|
||||
|
||||
void pmix_event_base_loopexit (pmix_event_base_t *ev_base) {
|
||||
pmix_progress_tracker_t *trk = pmix_progress_tracker_get_by_base(ev_base);
|
||||
assert(NULL != trk);
|
||||
ev_async_send ((struct ev_loop *)trk->ev_base, &trk->async);
|
||||
}
|
||||
#endif
|
||||
|
||||
static bool inited = false;
|
||||
static pmix_list_t tracking;
|
||||
static struct timeval long_timeout = {
|
||||
@ -118,7 +239,6 @@ static void stop_progress_engine(pmix_progress_tracker_t *trk)
|
||||
{
|
||||
assert(trk->ev_active);
|
||||
trk->ev_active = false;
|
||||
|
||||
/* break the event loop - this will cause the loop to exit upon
|
||||
completion of any current event */
|
||||
pmix_event_base_loopexit(trk->ev_base);
|
||||
@ -192,6 +312,11 @@ pmix_event_base_t *pmix_progress_thread_init(const char *name)
|
||||
dummy_timeout_cb, trk);
|
||||
pmix_event_add(&trk->block, &long_timeout);
|
||||
|
||||
#if PMIX_HAVE_LIBEV
|
||||
ev_async_init (&trk->async, pmix_libev_ev_async_cb);
|
||||
ev_async_start((struct ev_loop *)trk->ev_base, &trk->async);
|
||||
#endif
|
||||
|
||||
/* construct the thread object */
|
||||
PMIX_CONSTRUCT(&trk->engine, pmix_thread_t);
|
||||
trk->engine_constructed = true;
|
||||
@ -302,6 +427,21 @@ int pmix_progress_thread_pause(const char *name)
|
||||
return PMIX_ERR_NOT_FOUND;
|
||||
}
|
||||
|
||||
#if PMIX_HAVE_LIBEV
|
||||
static pmix_progress_tracker_t* pmix_progress_tracker_get_by_base(pmix_event_base_t *base) {
|
||||
pmix_progress_tracker_t *trk;
|
||||
|
||||
if (inited) {
|
||||
PMIX_LIST_FOREACH(trk, &tracking, pmix_progress_tracker_t) {
|
||||
if(trk->ev_base == base) {
|
||||
return trk;
|
||||
}
|
||||
}
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
#endif
|
||||
|
||||
int pmix_progress_thread_resume(const char *name)
|
||||
{
|
||||
pmix_progress_tracker_t *trk;
|
||||
|
@ -50,7 +50,9 @@
|
||||
#include <ctype.h>
|
||||
#include <sys/stat.h>
|
||||
#include PMIX_EVENT_HEADER
|
||||
#if ! PMIX_HAVE_LIBEV
|
||||
#include PMIX_EVENT2_THREAD_HEADER
|
||||
#endif
|
||||
|
||||
#include "src/util/argv.h"
|
||||
#include "src/util/error.h"
|
||||
@ -97,7 +99,6 @@ pmix_status_t pmix_server_initialize(void)
|
||||
PMIX_CONSTRUCT(&pmix_server_globals.gdata, pmix_list_t);
|
||||
PMIX_CONSTRUCT(&pmix_server_globals.events, pmix_list_t);
|
||||
PMIX_CONSTRUCT(&pmix_server_globals.local_reqs, pmix_list_t);
|
||||
PMIX_CONSTRUCT(&pmix_server_globals.nspaces, pmix_list_t);
|
||||
PMIX_CONSTRUCT(&pmix_server_globals.iof, pmix_list_t);
|
||||
|
||||
pmix_output_verbose(2, pmix_server_globals.base_output,
|
||||
@ -361,7 +362,7 @@ PMIX_EXPORT pmix_status_t PMIx_server_init(pmix_server_module_t *module,
|
||||
pmix_globals.mypeer->nptr = PMIX_NEW(pmix_namespace_t);
|
||||
/* ensure our own nspace is first on the list */
|
||||
PMIX_RETAIN(pmix_globals.mypeer->nptr);
|
||||
pmix_list_prepend(&pmix_server_globals.nspaces, &pmix_globals.mypeer->nptr->super);
|
||||
pmix_list_prepend(&pmix_globals.nspaces, &pmix_globals.mypeer->nptr->super);
|
||||
}
|
||||
pmix_globals.mypeer->nptr->nspace = strdup(pmix_globals.myid.nspace);
|
||||
rinfo->pname.nspace = strdup(pmix_globals.mypeer->nptr->nspace);
|
||||
@ -474,13 +475,12 @@ PMIX_EXPORT pmix_status_t PMIx_server_finalize(void)
|
||||
PMIX_LIST_DESTRUCT(&pmix_server_globals.local_reqs);
|
||||
PMIX_LIST_DESTRUCT(&pmix_server_globals.gdata);
|
||||
PMIX_LIST_DESTRUCT(&pmix_server_globals.events);
|
||||
PMIX_LIST_FOREACH(ns, &pmix_server_globals.nspaces, pmix_namespace_t) {
|
||||
PMIX_LIST_FOREACH(ns, &pmix_globals.nspaces, pmix_namespace_t) {
|
||||
/* ensure that we do the specified cleanup - if this is an
|
||||
* abnormal termination, then the nspace object may not be
|
||||
* at zero refcount */
|
||||
pmix_execute_epilog(&ns->epilog);
|
||||
}
|
||||
PMIX_LIST_DESTRUCT(&pmix_server_globals.nspaces);
|
||||
PMIX_LIST_DESTRUCT(&pmix_server_globals.iof);
|
||||
|
||||
pmix_hwloc_cleanup();
|
||||
@ -547,7 +547,7 @@ static void _register_nspace(int sd, short args, void *cbdata)
|
||||
|
||||
/* see if we already have this nspace */
|
||||
nptr = NULL;
|
||||
PMIX_LIST_FOREACH(tmp, &pmix_server_globals.nspaces, pmix_namespace_t) {
|
||||
PMIX_LIST_FOREACH(tmp, &pmix_globals.nspaces, pmix_namespace_t) {
|
||||
if (0 == strcmp(tmp->nspace, cd->proc.nspace)) {
|
||||
nptr = tmp;
|
||||
break;
|
||||
@ -560,7 +560,7 @@ static void _register_nspace(int sd, short args, void *cbdata)
|
||||
goto release;
|
||||
}
|
||||
nptr->nspace = strdup(cd->proc.nspace);
|
||||
pmix_list_append(&pmix_server_globals.nspaces, &nptr->super);
|
||||
pmix_list_append(&pmix_globals.nspaces, &nptr->super);
|
||||
}
|
||||
nptr->nlocalprocs = cd->nlocalprocs;
|
||||
|
||||
@ -764,12 +764,12 @@ static void _deregister_nspace(int sd, short args, void *cbdata)
|
||||
pmix_server_purge_events(NULL, &cd->proc);
|
||||
|
||||
/* release this nspace */
|
||||
PMIX_LIST_FOREACH(tmp, &pmix_server_globals.nspaces, pmix_namespace_t) {
|
||||
PMIX_LIST_FOREACH(tmp, &pmix_globals.nspaces, pmix_namespace_t) {
|
||||
if (PMIX_CHECK_NSPACE(tmp->nspace, cd->proc.nspace)) {
|
||||
/* perform any nspace-level epilog */
|
||||
pmix_execute_epilog(&tmp->epilog);
|
||||
/* remove and release it */
|
||||
pmix_list_remove_item(&pmix_server_globals.nspaces, &tmp->super);
|
||||
pmix_list_remove_item(&pmix_globals.nspaces, &tmp->super);
|
||||
PMIX_RELEASE(tmp);
|
||||
break;
|
||||
}
|
||||
@ -997,7 +997,7 @@ static void _register_client(int sd, short args, void *cbdata)
|
||||
|
||||
/* see if we already have this nspace */
|
||||
nptr = NULL;
|
||||
PMIX_LIST_FOREACH(ns, &pmix_server_globals.nspaces, pmix_namespace_t) {
|
||||
PMIX_LIST_FOREACH(ns, &pmix_globals.nspaces, pmix_namespace_t) {
|
||||
if (0 == strcmp(ns->nspace, cd->proc.nspace)) {
|
||||
nptr = ns;
|
||||
break;
|
||||
@ -1010,7 +1010,7 @@ static void _register_client(int sd, short args, void *cbdata)
|
||||
goto cleanup;
|
||||
}
|
||||
nptr->nspace = strdup(cd->proc.nspace);
|
||||
pmix_list_append(&pmix_server_globals.nspaces, &nptr->super);
|
||||
pmix_list_append(&pmix_globals.nspaces, &nptr->super);
|
||||
}
|
||||
/* setup a peer object for this client - since the host server
|
||||
* only deals with the original processes and not any clones,
|
||||
@ -1051,7 +1051,7 @@ static void _register_client(int sd, short args, void *cbdata)
|
||||
* if the nspaces are all defined */
|
||||
if (all_def) {
|
||||
/* so far, they have all been defined - check this one */
|
||||
PMIX_LIST_FOREACH(ns, &pmix_server_globals.nspaces, pmix_namespace_t) {
|
||||
PMIX_LIST_FOREACH(ns, &pmix_globals.nspaces, pmix_namespace_t) {
|
||||
if (0 < ns->nlocalprocs &&
|
||||
0 == strcmp(trk->pcs[i].nspace, ns->nspace)) {
|
||||
all_def = ns->all_registered;
|
||||
@ -1166,7 +1166,7 @@ static void _deregister_client(int sd, short args, void *cbdata)
|
||||
|
||||
/* see if we already have this nspace */
|
||||
nptr = NULL;
|
||||
PMIX_LIST_FOREACH(tmp, &pmix_server_globals.nspaces, pmix_namespace_t) {
|
||||
PMIX_LIST_FOREACH(tmp, &pmix_globals.nspaces, pmix_namespace_t) {
|
||||
if (0 == strcmp(tmp->nspace, cd->proc.nspace)) {
|
||||
nptr = tmp;
|
||||
break;
|
||||
@ -1368,15 +1368,15 @@ static void _dmodex_req(int sd, short args, void *cbdata)
|
||||
PMIX_ACQUIRE_OBJECT(cd);
|
||||
|
||||
pmix_output_verbose(2, pmix_server_globals.base_output,
|
||||
"DMODX LOOKING FOR %s:%d",
|
||||
cd->proc.nspace, cd->proc.rank);
|
||||
"DMODX LOOKING FOR %s",
|
||||
PMIX_NAME_PRINT(&cd->proc));
|
||||
|
||||
/* this should be one of my clients, but a race condition
|
||||
* could cause this request to arrive prior to us having
|
||||
* been informed of it - so first check to see if we know
|
||||
* about this nspace yet */
|
||||
nptr = NULL;
|
||||
PMIX_LIST_FOREACH(ns, &pmix_server_globals.nspaces, pmix_namespace_t) {
|
||||
PMIX_LIST_FOREACH(ns, &pmix_globals.nspaces, pmix_namespace_t) {
|
||||
if (0 == strcmp(ns->nspace, cd->proc.nspace)) {
|
||||
nptr = ns;
|
||||
break;
|
||||
@ -1502,8 +1502,9 @@ PMIX_EXPORT pmix_status_t PMIx_server_dmodex_request(const pmix_proc_t *proc,
|
||||
}
|
||||
|
||||
pmix_output_verbose(2, pmix_server_globals.base_output,
|
||||
"pmix:server dmodex request%s:%d",
|
||||
proc->nspace, proc->rank);
|
||||
"%s pmix:server dmodex request for proc %s",
|
||||
PMIX_NAME_PRINT(&pmix_globals.myid),
|
||||
PMIX_NAME_PRINT(proc));
|
||||
|
||||
cd = PMIX_NEW(pmix_setup_caddy_t);
|
||||
pmix_strncpy(cd->proc.nspace, proc->nspace, PMIX_MAX_NSLEN);
|
||||
|
@ -1,8 +1,8 @@
|
||||
/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil -*- */
|
||||
/*
|
||||
* Copyright (c) 2014-2018 Intel, Inc. All rights reserved.
|
||||
* Copyright (c) 2014-2015 Research Organization for Information Science
|
||||
* and Technology (RIST). All rights reserved.
|
||||
* Copyright (c) 2014-2019 Intel, Inc. All rights reserved.
|
||||
* Copyright (c) 2014-2019 Research Organization for Information Science
|
||||
* and Technology (RIST). All rights reserved.
|
||||
* Copyright (c) 2014-2015 Artem Y. Polyakov <artpol84@gmail.com>.
|
||||
* All rights reserved.
|
||||
* Copyright (c) 2016 Mellanox Technologies, Inc.
|
||||
@ -51,6 +51,7 @@
|
||||
#include "src/mca/gds/gds.h"
|
||||
#include "src/util/argv.h"
|
||||
#include "src/util/error.h"
|
||||
#include "src/util/name_fns.h"
|
||||
#include "src/util/output.h"
|
||||
#include "src/util/pmix_environ.h"
|
||||
|
||||
@ -126,6 +127,7 @@ pmix_status_t pmix_server_get(pmix_buffer_t *buf,
|
||||
pmix_dmdx_request_t *req;
|
||||
bool local;
|
||||
bool localonly = false;
|
||||
bool diffnspace = false;
|
||||
struct timeval tv = {0, 0};
|
||||
pmix_buffer_t pbkt, pkt;
|
||||
pmix_byte_object_t bo;
|
||||
@ -133,10 +135,10 @@ pmix_status_t pmix_server_get(pmix_buffer_t *buf,
|
||||
pmix_proc_t proc;
|
||||
char *data;
|
||||
size_t sz, n;
|
||||
pmix_peer_t *peer;
|
||||
|
||||
pmix_output_verbose(2, pmix_server_globals.get_output,
|
||||
"recvd GET");
|
||||
"%s recvd GET",
|
||||
PMIX_NAME_PRINT(&pmix_globals.myid));
|
||||
|
||||
/* setup */
|
||||
memset(nspace, 0, sizeof(nspace));
|
||||
@ -191,13 +193,19 @@ pmix_status_t pmix_server_get(pmix_buffer_t *buf,
|
||||
|
||||
/* find the nspace object for this client */
|
||||
nptr = NULL;
|
||||
PMIX_LIST_FOREACH(ns, &pmix_server_globals.nspaces, pmix_namespace_t) {
|
||||
PMIX_LIST_FOREACH(ns, &pmix_globals.nspaces, pmix_namespace_t) {
|
||||
if (0 == strcmp(nspace, ns->nspace)) {
|
||||
nptr = ns;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/* check if the nspace of the requestor is different from
|
||||
* the nspace of the target process */
|
||||
if (!PMIX_CHECK_NSPACE(nspace, cd->peer->info->pname.nspace)) {
|
||||
diffnspace = true;
|
||||
}
|
||||
|
||||
pmix_output_verbose(2, pmix_server_globals.get_output,
|
||||
"%s:%d EXECUTE GET FOR %s:%d ON BEHALF OF %s:%d",
|
||||
pmix_globals.myid.nspace,
|
||||
@ -294,10 +302,10 @@ pmix_status_t pmix_server_get(pmix_buffer_t *buf,
|
||||
return PMIX_SUCCESS;
|
||||
}
|
||||
|
||||
/* this nspace is known, so we can process the request.
|
||||
* if the rank is wildcard, then they are asking for the
|
||||
* job-level info for this nspace - provide it */
|
||||
if (PMIX_RANK_WILDCARD == rank) {
|
||||
/* the target nspace is known, so we can process the request.
|
||||
* if the rank is wildcard, or the nspace is different, then
|
||||
* they are asking for the job-level info for this nspace - provide it */
|
||||
if (PMIX_RANK_WILDCARD == rank || diffnspace) {
|
||||
/* see if we have the job-level info - we won't have it
|
||||
* if we have no local procs and haven't already asked
|
||||
* for it, so there is no guarantee we have it */
|
||||
@ -309,21 +317,32 @@ pmix_status_t pmix_server_get(pmix_buffer_t *buf,
|
||||
* can retrieve the info from that GDS. Otherwise,
|
||||
* we need to retrieve it from our own */
|
||||
PMIX_CONSTRUCT(&cb, pmix_cb_t);
|
||||
peer = pmix_globals.mypeer;
|
||||
/* this data is for a local client, so give the gds the
|
||||
* option of returning a complete copy of the data,
|
||||
* or returning a pointer to local storage */
|
||||
cb.proc = &proc;
|
||||
cb.scope = PMIX_SCOPE_UNDEF;
|
||||
cb.copy = false;
|
||||
PMIX_GDS_FETCH_KV(rc, peer, &cb);
|
||||
PMIX_GDS_FETCH_KV(rc, pmix_globals.mypeer, &cb);
|
||||
if (PMIX_SUCCESS != rc) {
|
||||
PMIX_DESTRUCT(&cb);
|
||||
return rc;
|
||||
}
|
||||
/* if the requested rank is not WILDCARD, then retrieve the
|
||||
* job-specific data for that rank - a scope of UNDEF
|
||||
* will direct the GDS to provide it. Anything found will
|
||||
* simply be added to the cb.kvs list */
|
||||
if (PMIX_RANK_WILDCARD != rank) {
|
||||
proc.rank = rank;
|
||||
PMIX_GDS_FETCH_KV(rc, pmix_globals.mypeer, &cb);
|
||||
if (PMIX_SUCCESS != rc) {
|
||||
PMIX_DESTRUCT(&cb);
|
||||
return rc;
|
||||
}
|
||||
}
|
||||
PMIX_CONSTRUCT(&pkt, pmix_buffer_t);
|
||||
/* assemble the provided data into a byte object */
|
||||
PMIX_GDS_ASSEMB_KVS_REQ(rc, peer, &proc, &cb.kvs, &pkt, cd);
|
||||
PMIX_GDS_ASSEMB_KVS_REQ(rc, pmix_globals.mypeer, &proc, &cb.kvs, &pkt, cd);
|
||||
if (PMIX_SUCCESS != rc) {
|
||||
PMIX_ERROR_LOG(rc);
|
||||
PMIX_DESTRUCT(&cb);
|
||||
@ -333,7 +352,7 @@ pmix_status_t pmix_server_get(pmix_buffer_t *buf,
|
||||
PMIX_DESTRUCT(&pkt);
|
||||
/* pack it into the payload */
|
||||
PMIX_CONSTRUCT(&pbkt, pmix_buffer_t);
|
||||
PMIX_BFROPS_PACK(rc, cd->peer, &pbkt, &bo, 1, PMIX_BYTE_OBJECT);
|
||||
PMIX_BFROPS_PACK(rc, pmix_globals.mypeer, &pbkt, &bo, 1, PMIX_BYTE_OBJECT);
|
||||
free(bo.bytes);
|
||||
if (PMIX_SUCCESS != rc) {
|
||||
PMIX_ERROR_LOG(rc);
|
||||
@ -604,6 +623,7 @@ static pmix_status_t _satisfy_request(pmix_namespace_t *nptr, pmix_rank_t rank,
|
||||
char *data = NULL;
|
||||
size_t sz = 0;
|
||||
pmix_scope_t scope = PMIX_SCOPE_UNDEF;
|
||||
bool diffnspace = false;
|
||||
|
||||
pmix_output_verbose(2, pmix_server_globals.get_output,
|
||||
"%s:%d SATISFY REQUEST CALLED",
|
||||
@ -617,10 +637,18 @@ static pmix_status_t _satisfy_request(pmix_namespace_t *nptr, pmix_rank_t rank,
|
||||
PMIX_CONSTRUCT(&pbkt, pmix_buffer_t);
|
||||
pmix_strncpy(proc.nspace, nptr->nspace, PMIX_MAX_NSLEN);
|
||||
|
||||
/* if we have local clients of this nspace, then we use
|
||||
* the corresponding GDS to retrieve the data. Otherwise,
|
||||
* the data will have been stored under our GDS */
|
||||
if (0 < nptr->nlocalprocs) {
|
||||
if (!PMIX_CHECK_NSPACE(nptr->nspace, cd->peer->info->pname.nspace)) {
|
||||
diffnspace = true;
|
||||
}
|
||||
|
||||
/* if rank is PMIX_RANK_UNDEF, then it was stored in our GDS */
|
||||
if (PMIX_RANK_UNDEF == rank) {
|
||||
scope = PMIX_GLOBAL; // we have to search everywhere
|
||||
peer = pmix_globals.mypeer;
|
||||
} else if (0 < nptr->nlocalprocs) {
|
||||
/* if we have local clients of this nspace, then we use
|
||||
* the corresponding GDS to retrieve the data. Otherwise,
|
||||
* the data will have been stored under our GDS */
|
||||
if (local) {
|
||||
*local = true;
|
||||
}
|
||||
@ -660,8 +688,7 @@ static pmix_status_t _satisfy_request(pmix_namespace_t *nptr, pmix_rank_t rank,
|
||||
/* if they are asking about a rank from an nspace different
|
||||
* from their own, or they gave a rank of "wildcard", then
|
||||
* include a copy of the job-level info */
|
||||
if (PMIX_RANK_WILDCARD == rank ||
|
||||
0 != strncmp(nptr->nspace, cd->peer->info->pname.nspace, PMIX_MAX_NSLEN)) {
|
||||
if (PMIX_RANK_WILDCARD == rank || diffnspace) {
|
||||
proc.rank = PMIX_RANK_WILDCARD;
|
||||
PMIX_CONSTRUCT(&cb, pmix_cb_t);
|
||||
/* this data is requested by a local client, so give the gds the option
|
||||
@ -674,7 +701,7 @@ static pmix_status_t _satisfy_request(pmix_namespace_t *nptr, pmix_rank_t rank,
|
||||
if (PMIX_SUCCESS == rc) {
|
||||
PMIX_CONSTRUCT(&pkt, pmix_buffer_t);
|
||||
/* assemble the provided data into a byte object */
|
||||
PMIX_GDS_ASSEMB_KVS_REQ(rc, cd->peer, &proc, &cb.kvs, &pkt, cd);
|
||||
PMIX_GDS_ASSEMB_KVS_REQ(rc, pmix_globals.mypeer, &proc, &cb.kvs, &pkt, cd);
|
||||
if (rc != PMIX_SUCCESS) {
|
||||
PMIX_ERROR_LOG(rc);
|
||||
PMIX_DESTRUCT(&pkt);
|
||||
@ -720,7 +747,8 @@ static pmix_status_t _satisfy_request(pmix_namespace_t *nptr, pmix_rank_t rank,
|
||||
|
||||
/* retrieve the data for the specific rank they are asking about */
|
||||
if (PMIX_RANK_WILDCARD != rank) {
|
||||
if (!PMIX_PROC_IS_SERVER(peer) && !peer->commit_cnt) {
|
||||
if (!PMIX_PROC_IS_SERVER(peer) && 0 == peer->commit_cnt) {
|
||||
PMIX_ERROR_LOG(PMIX_ERR_NOT_FOUND);
|
||||
/* this condition works only for local requests, server does
|
||||
* count commits for local ranks, and check this count when
|
||||
* local request.
|
||||
@ -743,7 +771,11 @@ static pmix_status_t _satisfy_request(pmix_namespace_t *nptr, pmix_rank_t rank,
|
||||
found = true;
|
||||
PMIX_CONSTRUCT(&pkt, pmix_buffer_t);
|
||||
/* assemble the provided data into a byte object */
|
||||
PMIX_GDS_ASSEMB_KVS_REQ(rc, cd->peer, &proc, &cb.kvs, &pkt, cd);
|
||||
if (PMIX_RANK_UNDEF == rank || diffnspace) {
|
||||
PMIX_GDS_ASSEMB_KVS_REQ(rc, pmix_globals.mypeer, &proc, &cb.kvs, &pkt, cd);
|
||||
} else {
|
||||
PMIX_GDS_ASSEMB_KVS_REQ(rc, cd->peer, &proc, &cb.kvs, &pkt, cd);
|
||||
}
|
||||
if (rc != PMIX_SUCCESS) {
|
||||
PMIX_ERROR_LOG(rc);
|
||||
PMIX_DESTRUCT(&pkt);
|
||||
@ -789,6 +821,7 @@ static pmix_status_t _satisfy_request(pmix_namespace_t *nptr, pmix_rank_t rank,
|
||||
}
|
||||
PMIX_DESTRUCT(&cb);
|
||||
}
|
||||
|
||||
PMIX_UNLOAD_BUFFER(&pbkt, data, sz);
|
||||
PMIX_DESTRUCT(&pbkt);
|
||||
|
||||
@ -896,7 +929,7 @@ static void _process_dmdx_reply(int fd, short args, void *cbdata)
|
||||
|
||||
/* find the nspace object for the proc whose data is being received */
|
||||
nptr = NULL;
|
||||
PMIX_LIST_FOREACH(ns, &pmix_server_globals.nspaces, pmix_namespace_t) {
|
||||
PMIX_LIST_FOREACH(ns, &pmix_globals.nspaces, pmix_namespace_t) {
|
||||
if (0 == strcmp(caddy->lcd->proc.nspace, ns->nspace)) {
|
||||
nptr = ns;
|
||||
break;
|
||||
@ -910,7 +943,7 @@ static void _process_dmdx_reply(int fd, short args, void *cbdata)
|
||||
nptr = PMIX_NEW(pmix_namespace_t);
|
||||
nptr->nspace = strdup(caddy->lcd->proc.nspace);
|
||||
/* add to the list */
|
||||
pmix_list_append(&pmix_server_globals.nspaces, &nptr->super);
|
||||
pmix_list_append(&pmix_globals.nspaces, &nptr->super);
|
||||
}
|
||||
|
||||
/* if the request was successfully satisfied, then store the data.
|
||||
|
@ -425,7 +425,7 @@ static pmix_server_trkr_t* new_tracker(char *id, pmix_proc_t *procs,
|
||||
}
|
||||
/* is this nspace known to us? */
|
||||
nptr = NULL;
|
||||
PMIX_LIST_FOREACH(ns, &pmix_server_globals.nspaces, pmix_namespace_t) {
|
||||
PMIX_LIST_FOREACH(ns, &pmix_globals.nspaces, pmix_namespace_t) {
|
||||
if (0 == strcmp(procs[i].nspace, ns->nspace)) {
|
||||
nptr = ns;
|
||||
break;
|
||||
@ -583,10 +583,15 @@ pmix_status_t pmix_server_fence(pmix_server_caddy_t *cd,
|
||||
/* see if we are to collect data or enforce a timeout - we don't internally care
|
||||
* about any other directives */
|
||||
for (n=0; n < ninfo; n++) {
|
||||
if (0 == strcmp(info[n].key, PMIX_COLLECT_DATA)) {
|
||||
collect_data = true;
|
||||
} else if (0 == strncmp(info[n].key, PMIX_TIMEOUT, PMIX_MAX_KEYLEN)) {
|
||||
tv.tv_sec = info[n].value.data.uint32;
|
||||
if (PMIX_CHECK_KEY(&info[n], PMIX_COLLECT_DATA)) {
|
||||
collect_data = PMIX_INFO_TRUE(&info[n]);
|
||||
} else if (PMIX_CHECK_KEY(&info[n], PMIX_TIMEOUT)) {
|
||||
PMIX_VALUE_GET_NUMBER(rc, &info[n].value, tv.tv_sec, uint32_t);
|
||||
if (PMIX_SUCCESS != rc) {
|
||||
PMIX_PROC_FREE(procs, nprocs);
|
||||
PMIX_INFO_FREE(info, ninfo);
|
||||
return rc;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -2738,7 +2743,7 @@ pmix_status_t pmix_server_job_ctrl(pmix_peer_t *peer,
|
||||
for (n=0; n < cd->ntargets; n++) {
|
||||
/* find the nspace of this proc */
|
||||
nptr = NULL;
|
||||
PMIX_LIST_FOREACH(tmp, &pmix_server_globals.nspaces, pmix_namespace_t) {
|
||||
PMIX_LIST_FOREACH(tmp, &pmix_globals.nspaces, pmix_namespace_t) {
|
||||
if (0 == strcmp(tmp->nspace, cd->targets[n].nspace)) {
|
||||
nptr = tmp;
|
||||
break;
|
||||
@ -2751,7 +2756,7 @@ pmix_status_t pmix_server_job_ctrl(pmix_peer_t *peer,
|
||||
goto exit;
|
||||
}
|
||||
nptr->nspace = strdup(cd->targets[n].nspace);
|
||||
pmix_list_append(&pmix_server_globals.nspaces, &nptr->super);
|
||||
pmix_list_append(&pmix_globals.nspaces, &nptr->super);
|
||||
}
|
||||
/* if the rank is wildcard, then we use the epilog for the nspace */
|
||||
if (PMIX_RANK_WILDCARD == cd->targets[n].rank) {
|
||||
@ -2805,7 +2810,7 @@ pmix_status_t pmix_server_job_ctrl(pmix_peer_t *peer,
|
||||
|
||||
cnt = 0; // track how many infos are cleanup related
|
||||
for (n=0; n < cd->ninfo; n++) {
|
||||
if (0 == strncmp(cd->info[n].key, PMIX_REGISTER_CLEANUP, PMIX_MAX_KEYLEN)) {
|
||||
if (PMIX_CHECK_KEY(&cd->info[n], PMIX_REGISTER_CLEANUP)) {
|
||||
++cnt;
|
||||
if (PMIX_STRING != cd->info[n].value.type ||
|
||||
NULL == cd->info[n].value.data.string) {
|
||||
@ -2821,7 +2826,7 @@ pmix_status_t pmix_server_job_ctrl(pmix_peer_t *peer,
|
||||
}
|
||||
cf->path = strdup(cd->info[n].value.data.string);
|
||||
pmix_list_append(&cachefiles, &cf->super);
|
||||
} else if (0 == strncmp(cd->info[n].key, PMIX_REGISTER_CLEANUP_DIR, PMIX_MAX_KEYLEN)) {
|
||||
} else if (PMIX_CHECK_KEY(&cd->info[n], PMIX_REGISTER_CLEANUP_DIR)) {
|
||||
++cnt;
|
||||
if (PMIX_STRING != cd->info[n].value.type ||
|
||||
NULL == cd->info[n].value.data.string) {
|
||||
@ -2837,10 +2842,10 @@ pmix_status_t pmix_server_job_ctrl(pmix_peer_t *peer,
|
||||
}
|
||||
cdir->path = strdup(cd->info[n].value.data.string);
|
||||
pmix_list_append(&cachedirs, &cdir->super);
|
||||
} else if (0 == strncmp(cd->info[n].key, PMIX_CLEANUP_RECURSIVE, PMIX_MAX_KEYLEN)) {
|
||||
} else if (PMIX_CHECK_KEY(&cd->info[n], PMIX_CLEANUP_RECURSIVE)) {
|
||||
recurse = PMIX_INFO_TRUE(&cd->info[n]);
|
||||
++cnt;
|
||||
} else if (0 == strncmp(cd->info[n].key, PMIX_CLEANUP_IGNORE, PMIX_MAX_KEYLEN)) {
|
||||
} else if (PMIX_CHECK_KEY(&cd->info[n], PMIX_CLEANUP_IGNORE)) {
|
||||
if (PMIX_STRING != cd->info[n].value.type ||
|
||||
NULL == cd->info[n].value.data.string) {
|
||||
/* return an error */
|
||||
@ -2856,7 +2861,7 @@ pmix_status_t pmix_server_job_ctrl(pmix_peer_t *peer,
|
||||
cf->path = strdup(cd->info[n].value.data.string);
|
||||
pmix_list_append(&ignorefiles, &cf->super);
|
||||
++cnt;
|
||||
} else if (0 == strncmp(cd->info[n].key, PMIX_CLEANUP_LEAVE_TOPDIR, PMIX_MAX_KEYLEN)) {
|
||||
} else if (PMIX_CHECK_KEY(&cd->info[n], PMIX_CLEANUP_LEAVE_TOPDIR)) {
|
||||
leave_topdir = PMIX_INFO_TRUE(&cd->info[n]);
|
||||
++cnt;
|
||||
}
|
||||
@ -3274,8 +3279,7 @@ pmix_status_t pmix_server_iofreg(pmix_peer_t *peer,
|
||||
continue;
|
||||
}
|
||||
/* do we already have this source for this peer? */
|
||||
if (0 == strncmp(cd->procs[n].nspace, req->pname.nspace, PMIX_MAX_NSLEN) &&
|
||||
(PMIX_RANK_WILDCARD == req->pname.rank || cd->procs[n].rank == req->pname.rank)) {
|
||||
if (PMIX_CHECK_PROCID(&cd->procs[n], &req->pname)) {
|
||||
match = true;
|
||||
if ((req->channels & cd->channels) != cd->channels) {
|
||||
/* this is a channel update */
|
||||
|
@ -50,7 +50,9 @@
|
||||
#endif /* HAVE_DIRENT_H */
|
||||
|
||||
#include PMIX_EVENT_HEADER
|
||||
#if ! PMIX_HAVE_LIBEV
|
||||
#include PMIX_EVENT2_THREAD_HEADER
|
||||
#endif
|
||||
|
||||
#include "src/class/pmix_list.h"
|
||||
#include "src/util/argv.h"
|
||||
@ -789,7 +791,7 @@ pmix_status_t pmix_tool_init_info(void)
|
||||
pmix_kval_t *kptr;
|
||||
pmix_status_t rc;
|
||||
pmix_proc_t wildcard;
|
||||
char hostname[PMIX_MAX_NSLEN];
|
||||
char hostname[PMIX_MAXHOSTNAMELEN] = {0};
|
||||
|
||||
pmix_strncpy(wildcard.nspace, pmix_globals.myid.nspace, PMIX_MAX_NSLEN);
|
||||
wildcard.rank = pmix_globals.myid.rank;
|
||||
@ -1027,9 +1029,9 @@ pmix_status_t pmix_tool_init_info(void)
|
||||
|
||||
/* hostname */
|
||||
if (NULL != pmix_globals.hostname) {
|
||||
pmix_strncpy(hostname, pmix_globals.hostname, PMIX_MAX_NSLEN);
|
||||
pmix_strncpy(hostname, pmix_globals.hostname, PMIX_MAXHOSTNAMELEN);
|
||||
} else {
|
||||
gethostname(hostname, PMIX_MAX_NSLEN);
|
||||
gethostname(hostname, PMIX_MAXHOSTNAMELEN-1);
|
||||
}
|
||||
kptr = PMIX_NEW(pmix_kval_t);
|
||||
kptr->key = strdup(PMIX_HOSTNAME);
|
||||
@ -1227,7 +1229,6 @@ PMIX_EXPORT pmix_status_t PMIx_tool_finalize(void)
|
||||
PMIX_LIST_DESTRUCT(&pmix_server_globals.local_reqs);
|
||||
PMIX_LIST_DESTRUCT(&pmix_server_globals.gdata);
|
||||
PMIX_LIST_DESTRUCT(&pmix_server_globals.events);
|
||||
PMIX_LIST_DESTRUCT(&pmix_server_globals.nspaces);
|
||||
PMIX_LIST_DESTRUCT(&pmix_server_globals.iof);
|
||||
}
|
||||
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2016 Intel, Inc. All rights reserved.
|
||||
* Copyright (c) 2016-2019 Intel, Inc. All rights reserved.
|
||||
* Copyright (c) 2017 Cisco Systems, Inc. All rights reserved.
|
||||
* $COPYRIGHT$
|
||||
*
|
||||
@ -31,6 +31,7 @@ bool pmix_util_compress_string(char *instring,
|
||||
size_t len, outlen;
|
||||
uint8_t *tmp, *ptr;
|
||||
uint32_t inlen;
|
||||
int rc;
|
||||
|
||||
/* set default output */
|
||||
*outbytes = NULL;
|
||||
@ -43,7 +44,6 @@ bool pmix_util_compress_string(char *instring,
|
||||
/* get an upper bound on the required output storage */
|
||||
len = deflateBound(&strm, inlen);
|
||||
if (NULL == (tmp = (uint8_t*)malloc(len))) {
|
||||
*outbytes = NULL;
|
||||
return false;
|
||||
}
|
||||
strm.next_in = (uint8_t*)instring;
|
||||
@ -54,8 +54,12 @@ bool pmix_util_compress_string(char *instring,
|
||||
strm.avail_out = len;
|
||||
strm.next_out = tmp;
|
||||
|
||||
deflate (&strm, Z_FINISH);
|
||||
rc = deflate (&strm, Z_FINISH);
|
||||
deflateEnd (&strm);
|
||||
if (Z_OK != rc) {
|
||||
free(tmp);
|
||||
return false;
|
||||
}
|
||||
|
||||
/* allocate 4 bytes beyond the size reqd by zlib so we
|
||||
* can pass the size of the uncompressed string to the
|
||||
|
@ -12,7 +12,7 @@
|
||||
* Copyright (c) 2010 Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2014-2016 Research Organization for Information Science
|
||||
* and Technology (RIST). All rights reserved.
|
||||
* Copyright (c) 2016-2018 Intel, Inc. All rights reserved.
|
||||
* Copyright (c) 2016-2019 Intel, Inc. All rights reserved.
|
||||
* $COPYRIGHT$
|
||||
*
|
||||
* Additional copyrights may follow
|
||||
@ -98,6 +98,7 @@ char* pmix_util_print_name_args(const pmix_proc_t *name)
|
||||
{
|
||||
pmix_print_args_buffers_t *ptr;
|
||||
char *rank;
|
||||
int index;
|
||||
|
||||
/* get the next buffer */
|
||||
ptr = get_print_name_buffer();
|
||||
@ -105,29 +106,36 @@ char* pmix_util_print_name_args(const pmix_proc_t *name)
|
||||
PMIX_ERROR_LOG(PMIX_ERR_OUT_OF_RESOURCE);
|
||||
return pmix_print_args_null;
|
||||
}
|
||||
/* cycle around the ring */
|
||||
if (PMIX_PRINT_NAME_ARG_NUM_BUFS == ptr->cntr) {
|
||||
ptr->cntr = 0;
|
||||
}
|
||||
|
||||
/* protect against NULL names */
|
||||
if (NULL == name) {
|
||||
snprintf(ptr->buffers[ptr->cntr++], PMIX_PRINT_NAME_ARGS_MAX_SIZE, "[NO-NAME]");
|
||||
return ptr->buffers[ptr->cntr-1];
|
||||
index = ptr->cntr;
|
||||
snprintf(ptr->buffers[index], PMIX_PRINT_NAME_ARGS_MAX_SIZE, "[NO-NAME]");
|
||||
ptr->cntr++;
|
||||
if (PMIX_PRINT_NAME_ARG_NUM_BUFS == ptr->cntr) {
|
||||
ptr->cntr = 0;
|
||||
}
|
||||
return ptr->buffers[index];
|
||||
}
|
||||
|
||||
rank = pmix_util_print_rank(name->rank);
|
||||
|
||||
snprintf(ptr->buffers[ptr->cntr++],
|
||||
index = ptr->cntr;
|
||||
snprintf(ptr->buffers[index],
|
||||
PMIX_PRINT_NAME_ARGS_MAX_SIZE,
|
||||
"[%s,%s]", name->nspace, rank);
|
||||
"[%s:%s]", name->nspace, rank);
|
||||
ptr->cntr++;
|
||||
if (PMIX_PRINT_NAME_ARG_NUM_BUFS == ptr->cntr) {
|
||||
ptr->cntr = 0;
|
||||
}
|
||||
|
||||
return ptr->buffers[ptr->cntr-1];
|
||||
return ptr->buffers[index];
|
||||
}
|
||||
|
||||
char* pmix_util_print_rank(const pmix_rank_t vpid)
|
||||
{
|
||||
pmix_print_args_buffers_t *ptr;
|
||||
int index;
|
||||
|
||||
ptr = get_print_name_buffer();
|
||||
|
||||
@ -136,19 +144,19 @@ char* pmix_util_print_rank(const pmix_rank_t vpid)
|
||||
return pmix_print_args_null;
|
||||
}
|
||||
|
||||
/* cycle around the ring */
|
||||
if (PMIX_PRINT_NAME_ARG_NUM_BUFS == ptr->cntr) {
|
||||
ptr->cntr = 0;
|
||||
}
|
||||
|
||||
index = ptr->cntr;
|
||||
if (PMIX_RANK_UNDEF == vpid) {
|
||||
snprintf(ptr->buffers[ptr->cntr++], PMIX_PRINT_NAME_ARGS_MAX_SIZE, "UNDEF");
|
||||
snprintf(ptr->buffers[index], PMIX_PRINT_NAME_ARGS_MAX_SIZE, "UNDEF");
|
||||
} else if (PMIX_RANK_WILDCARD == vpid) {
|
||||
snprintf(ptr->buffers[ptr->cntr++], PMIX_PRINT_NAME_ARGS_MAX_SIZE, "WILDCARD");
|
||||
snprintf(ptr->buffers[index], PMIX_PRINT_NAME_ARGS_MAX_SIZE, "WILDCARD");
|
||||
} else {
|
||||
snprintf(ptr->buffers[ptr->cntr++],
|
||||
snprintf(ptr->buffers[index],
|
||||
PMIX_PRINT_NAME_ARGS_MAX_SIZE,
|
||||
"%ld", (long)vpid);
|
||||
}
|
||||
return ptr->buffers[ptr->cntr-1];
|
||||
ptr->cntr++;
|
||||
if (PMIX_PRINT_NAME_ARG_NUM_BUFS == ptr->cntr) {
|
||||
ptr->cntr = 0;
|
||||
}
|
||||
return ptr->buffers[index];
|
||||
}
|
||||
|
@ -125,7 +125,7 @@ PMIX_CLASS_INSTANCE(pmix_output_stream_t, pmix_object_t, construct, destruct);
|
||||
bool pmix_output_init(void)
|
||||
{
|
||||
int i;
|
||||
char hostname[PMIX_MAXHOSTNAMELEN];
|
||||
char hostname[PMIX_MAXHOSTNAMELEN] = {0};
|
||||
char *str;
|
||||
|
||||
if (initialized) {
|
||||
@ -176,7 +176,7 @@ bool pmix_output_init(void)
|
||||
} else {
|
||||
verbose.lds_want_stderr = true;
|
||||
}
|
||||
gethostname(hostname, sizeof(hostname));
|
||||
gethostname(hostname, sizeof(hostname)-1);
|
||||
hostname[sizeof(hostname)-1] = '\0';
|
||||
if (0 > asprintf(&verbose.lds_prefix, "[%s:%05d] ", hostname, getpid())) {
|
||||
return PMIX_ERR_NOMEM;
|
||||
@ -256,7 +256,7 @@ bool pmix_output_switch(int output_id, bool enable)
|
||||
void pmix_output_reopen_all(void)
|
||||
{
|
||||
char *str;
|
||||
char hostname[PMIX_MAXHOSTNAMELEN];
|
||||
char hostname[PMIX_MAXHOSTNAMELEN] = {0};
|
||||
|
||||
str = getenv("PMIX_OUTPUT_STDERR_FD");
|
||||
if (NULL != str) {
|
||||
|
@ -13,7 +13,7 @@
|
||||
* reserved.
|
||||
* Copyright (c) 2008 Sun Microsystems, Inc. All rights reserved.
|
||||
* Copyright (c) 2013 Cisco Systems, Inc. All rights reserved.
|
||||
* Copyright (c) 2016 Intel, Inc. All rights reserved.
|
||||
* Copyright (c) 2016-2019 Intel, Inc. All rights reserved.
|
||||
* $COPYRIGHT$
|
||||
*
|
||||
* Additional copyrights may follow
|
||||
@ -38,9 +38,7 @@
|
||||
#include <netinet/in.h>
|
||||
#endif
|
||||
|
||||
#ifndef IF_NAMESIZE
|
||||
#define IF_NAMESIZE 32
|
||||
#endif
|
||||
#define PMIX_IF_NAMESIZE 256
|
||||
|
||||
BEGIN_C_DECLS
|
||||
|
||||
|
@ -12,8 +12,10 @@
|
||||
* Copyright (c) 2006 Cisco Systems, Inc. All rights reserved.
|
||||
* Copyright (c) 2007-2013 Los Alamos National Security, LLC. All rights
|
||||
* reserved.
|
||||
* Copyright (c) 2014-2017 Intel, Inc. All rights reserved.
|
||||
* Copyright (c) 2014-2019 Intel, Inc. All rights reserved.
|
||||
* Copyright (c) 2016 IBM Corporation. All rights reserved.
|
||||
* Copyright (c) 2019 Research Organization for Information Science
|
||||
* and Technology (RIST). All rights reserved.
|
||||
* $COPYRIGHT$
|
||||
*
|
||||
* Additional copyrights may follow
|
||||
@ -30,10 +32,12 @@
|
||||
#include <string.h>
|
||||
|
||||
#include "src/util/printf.h"
|
||||
#include "src/util/error.h"
|
||||
#include "src/util/argv.h"
|
||||
#include "src/util/pmix_environ.h"
|
||||
|
||||
#define PMIX_DEFAULT_TMPDIR "/tmp"
|
||||
#define PMIX_MAX_ENVAR_LENGTH 100000
|
||||
|
||||
/*
|
||||
* Merge two environ-like char arrays, ensuring that there are no
|
||||
@ -74,7 +78,7 @@ char **pmix_environ_merge(char **minor, char **major)
|
||||
pmix_setenv(minor[i], NULL, false, &ret);
|
||||
} else {
|
||||
|
||||
/* strdup minor[i] in case it's a constat string */
|
||||
/* strdup minor[i] in case it's a constant string */
|
||||
|
||||
name = strdup(minor[i]);
|
||||
value = name + (value - minor[i]);
|
||||
@ -99,9 +103,60 @@ char **pmix_environ_merge(char **minor, char **major)
|
||||
int i;
|
||||
char *newvalue, *compare;
|
||||
size_t len;
|
||||
bool valid;
|
||||
|
||||
/* Check the bozo case */
|
||||
if( NULL == env ) {
|
||||
return PMIX_ERR_BAD_PARAM;
|
||||
}
|
||||
|
||||
if (NULL != value) {
|
||||
/* check the string for unacceptable length - i.e., ensure
|
||||
* it is NULL-terminated */
|
||||
valid = false;
|
||||
for (i=0; i < PMIX_MAX_ENVAR_LENGTH; i++) {
|
||||
if ('\0' == value[i]) {
|
||||
valid = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (!valid) {
|
||||
PMIX_ERROR_LOG(PMIX_ERR_BAD_PARAM);
|
||||
return PMIX_ERR_BAD_PARAM;
|
||||
}
|
||||
}
|
||||
|
||||
/* If this is the "environ" array, use putenv or setenv */
|
||||
if (*env == environ) {
|
||||
/* THIS IS POTENTIALLY A MEMORY LEAK! But I am doing it
|
||||
because so that we don't violate the law of least
|
||||
astonishmet for PMIX developers (i.e., those that don't
|
||||
check the return code of pmix_setenv() and notice that we
|
||||
returned an error if you passed in the real environ) */
|
||||
#if defined (HAVE_SETENV)
|
||||
if (NULL == value) {
|
||||
/* this is actually an unsetenv request */
|
||||
unsetenv(name);
|
||||
} else {
|
||||
setenv(name, value, overwrite);
|
||||
}
|
||||
#else
|
||||
/* Make the new value */
|
||||
if (NULL == value) {
|
||||
i = asprintf(&newvalue, "%s=", name);
|
||||
} else {
|
||||
i = asprintf(&newvalue, "%s=%s", name, value);
|
||||
}
|
||||
if (NULL == newvalue || 0 > i) {
|
||||
return PMIX_ERR_OUT_OF_RESOURCE;
|
||||
}
|
||||
putenv(newvalue);
|
||||
/* cannot free it as putenv doesn't copy the value */
|
||||
#endif
|
||||
return PMIX_SUCCESS;
|
||||
}
|
||||
|
||||
/* Make the new value */
|
||||
|
||||
if (NULL == value) {
|
||||
i = asprintf(&newvalue, "%s=", name);
|
||||
} else {
|
||||
@ -111,28 +166,13 @@ char **pmix_environ_merge(char **minor, char **major)
|
||||
return PMIX_ERR_OUT_OF_RESOURCE;
|
||||
}
|
||||
|
||||
/* Check the bozo case */
|
||||
|
||||
if( NULL == env ) {
|
||||
return PMIX_ERR_BAD_PARAM;
|
||||
} else if (NULL == *env) {
|
||||
if (NULL == *env) {
|
||||
i = 0;
|
||||
pmix_argv_append(&i, env, newvalue);
|
||||
free(newvalue);
|
||||
return PMIX_SUCCESS;
|
||||
}
|
||||
|
||||
/* If this is the "environ" array, use putenv */
|
||||
if( *env == environ ) {
|
||||
/* THIS IS POTENTIALLY A MEMORY LEAK! But I am doing it
|
||||
because so that we don't violate the law of least
|
||||
astonishmet for PMIX developers (i.e., those that don't
|
||||
check the return code of pmix_setenv() and notice that we
|
||||
returned an error if you passed in the real environ) */
|
||||
putenv(newvalue);
|
||||
return PMIX_SUCCESS;
|
||||
}
|
||||
|
||||
/* Make something easy to compare to */
|
||||
|
||||
i = asprintf(&compare, "%s=", name);
|
||||
|
@ -1,6 +1,6 @@
|
||||
/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil -*- */
|
||||
/*
|
||||
* Copyright (c) 2015-2018 Intel, Inc. All rights reserved.
|
||||
* Copyright (c) 2015-2019 Intel, Inc. All rights reserved.
|
||||
* Copyright (c) 2015 Research Organization for Information Science
|
||||
* and Technology (RIST). All rights reserved.
|
||||
* Copyright (c) 2015-2018 Mellanox Technologies, Inc.
|
||||
@ -58,7 +58,7 @@ void cli_init(int nprocs)
|
||||
}
|
||||
}
|
||||
|
||||
void cli_connect(cli_info_t *cli, int sd, struct event_base * ebase, event_callback_fn callback)
|
||||
void cli_connect(cli_info_t *cli, int sd, pmix_event_base_t * ebase, event_callback_fn callback)
|
||||
{
|
||||
if( CLI_CONNECTED != cli->next_state[cli->state] ){
|
||||
TEST_ERROR(("Rank %d has bad next state: expect %d have %d!",
|
||||
@ -68,9 +68,9 @@ void cli_connect(cli_info_t *cli, int sd, struct event_base * ebase, event_callb
|
||||
}
|
||||
|
||||
cli->sd = sd;
|
||||
cli->ev = event_new(ebase, sd,
|
||||
EV_READ|EV_PERSIST, callback, cli);
|
||||
event_add(cli->ev,NULL);
|
||||
cli->ev = pmix_event_new(ebase, sd,
|
||||
EV_READ|EV_PERSIST, callback, cli);
|
||||
pmix_event_add(cli->ev,NULL);
|
||||
pmix_ptl_base_set_nonblocking(sd);
|
||||
TEST_VERBOSE(("Connection accepted from rank %d", cli_rank(cli) ));
|
||||
cli->state = CLI_CONNECTED;
|
||||
@ -105,12 +105,12 @@ void cli_disconnect(cli_info_t *cli)
|
||||
}
|
||||
|
||||
if( NULL == cli->ev ){
|
||||
TEST_ERROR(("Bad ev = NULL of rank = %d ", cli->sd, cli_rank(cli)));
|
||||
TEST_ERROR(("Bad ev = NULL of rank = %d ", cli_rank(cli)));
|
||||
test_abort = true;
|
||||
} else {
|
||||
TEST_VERBOSE(("remove event of rank %d from event queue", cli_rank(cli)));
|
||||
event_del(cli->ev);
|
||||
event_free(cli->ev);
|
||||
pmix_event_del(cli->ev);
|
||||
pmix_event_free(cli->ev);
|
||||
cli->ev = NULL;
|
||||
}
|
||||
|
||||
|
@ -1,6 +1,6 @@
|
||||
/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil -*- */
|
||||
/*
|
||||
* Copyright (c) 2015-2018 Intel, Inc. All rights reserved.
|
||||
* Copyright (c) 2015-2019 Intel, Inc. All rights reserved.
|
||||
* Copyright (c) 2015 Research Organization for Information Science
|
||||
* and Technology (RIST). All rights reserved.
|
||||
* Copyright (c) 2015-2018 Mellanox Technologies, Inc.
|
||||
@ -56,7 +56,7 @@ extern bool test_abort;
|
||||
|
||||
int cli_rank(cli_info_t *cli);
|
||||
void cli_init(int nprocs);
|
||||
void cli_connect(cli_info_t *cli, int sd, struct event_base * ebase, event_callback_fn callback);
|
||||
void cli_connect(cli_info_t *cli, int sd, pmix_event_base_t * ebase, event_callback_fn callback);
|
||||
void cli_finalize(cli_info_t *cli);
|
||||
void cli_disconnect(cli_info_t *cli);
|
||||
void cli_terminate(cli_info_t *cli);
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2013-2017 Intel, Inc. All rights reserved.
|
||||
* Copyright (c) 2013-2019 Intel, Inc. All rights reserved.
|
||||
* Copyright (c) 2015 Mellanox Technologies, Inc.
|
||||
* All rights reserved.
|
||||
* $COPYRIGHT$
|
||||
@ -24,6 +24,9 @@ static int _legacy = 0;
|
||||
/* Verbose level 0-silent, 1-fatal, 2-error, 3+ debug*/
|
||||
static int _verbose = 1;
|
||||
|
||||
static int spawned, size, rank=-1, appnum;
|
||||
static char jobid[255];
|
||||
|
||||
static void log_fatal(const char *format, ...)
|
||||
{
|
||||
va_list arglist;
|
||||
@ -36,7 +39,7 @@ static void log_fatal(const char *format, ...)
|
||||
va_end(arglist);
|
||||
return;
|
||||
}
|
||||
fprintf(stderr, "FATAL: %s", output);
|
||||
fprintf(stderr, "%d:FATAL: %s", rank, output);
|
||||
free(output);
|
||||
}
|
||||
va_end(arglist);
|
||||
@ -54,7 +57,7 @@ static void log_error(const char *format, ...)
|
||||
va_end(arglist);
|
||||
return;
|
||||
}
|
||||
fprintf(stderr, "ERROR: %s", output);
|
||||
fprintf(stderr, "%d:ERROR: %s", rank, output);
|
||||
free(output);
|
||||
}
|
||||
va_end(arglist);
|
||||
@ -72,7 +75,7 @@ static void log_info(const char *format, ...)
|
||||
va_end(arglist);
|
||||
return;
|
||||
}
|
||||
fprintf(stderr, "INFO: %s", output);
|
||||
fprintf(stderr, "%d:INFO: %s", rank, output);
|
||||
free(output);
|
||||
}
|
||||
va_end(arglist);
|
||||
@ -81,7 +84,7 @@ static void log_info(const char *format, ...)
|
||||
#define log_assert(e, msg) \
|
||||
do { \
|
||||
if (!(e)) { \
|
||||
log_fatal("%s at %s:%d\n", msg, __func__, __LINE__); \
|
||||
log_fatal("%d:%s at %s:%d\n", rank, msg, __func__, __LINE__); \
|
||||
rc = -1; \
|
||||
} \
|
||||
} while (0)
|
||||
@ -99,10 +102,6 @@ static int test_item5(void);
|
||||
static int test_item6(void);
|
||||
static int test_item7(void);
|
||||
|
||||
static int spawned, size, rank, appnum;
|
||||
static char jobid[255];
|
||||
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
int ret = 0;
|
||||
@ -372,21 +371,24 @@ static int test_item6(void)
|
||||
{
|
||||
int rc = 0;
|
||||
char val[100];
|
||||
const char *tkey = __func__;
|
||||
char *tkey;
|
||||
const char *tval = __FILE__;
|
||||
|
||||
asprintf(&tkey, "%d:%s", rank, __func__);
|
||||
if (PMI_SUCCESS != (rc = PMI_KVS_Put(jobid, tkey, tval))) {
|
||||
log_fatal("PMI_KVS_Put %d\n", rc);
|
||||
free(tkey);
|
||||
return rc;
|
||||
}
|
||||
|
||||
if (PMI_SUCCESS != (rc = PMI_KVS_Get(jobid, tkey, val, sizeof(val)))) {
|
||||
log_fatal("PMI_KVS_Get %d\n", rc);
|
||||
free(tkey);
|
||||
return rc;
|
||||
}
|
||||
|
||||
log_info("tkey=%s tval=%s val=%s\n", tkey, tval, val);
|
||||
|
||||
free(tkey);
|
||||
log_assert(!strcmp(tval, val), "value does not meet expectation");
|
||||
|
||||
return rc;
|
||||
@ -398,16 +400,16 @@ static int test_item7(void)
|
||||
char tkey[100];
|
||||
char tval[100];
|
||||
char val[100];
|
||||
int i = 0;
|
||||
int i = 0, j;
|
||||
|
||||
log_info("TEST7\n");
|
||||
|
||||
for (i = 0; i < size; i++) {
|
||||
sprintf(tkey, "KEY-%d", i);
|
||||
sprintf(tkey, "%d:KEY-%d", rank, i);
|
||||
sprintf(tval, "VALUE-%d", i);
|
||||
if (i == rank) {
|
||||
if (PMI_SUCCESS != (rc = PMI_KVS_Put(jobid, tkey, tval))) {
|
||||
log_fatal("PMI_KVS_Put [%s=%s] %d\n", tkey, tval, rc);
|
||||
return rc;
|
||||
}
|
||||
if (PMI_SUCCESS != (rc = PMI_KVS_Put(jobid, tkey, tval))) {
|
||||
log_fatal("PMI_KVS_Put [%s=%s] %d\n", tkey, tval, rc);
|
||||
return rc;
|
||||
}
|
||||
}
|
||||
|
||||
@ -416,22 +418,27 @@ static int test_item7(void)
|
||||
return rc;
|
||||
}
|
||||
|
||||
|
||||
log_info("BARRIER\n");
|
||||
if (PMI_SUCCESS != (rc = PMI_Barrier())) {
|
||||
log_fatal("PMI_Barrier %d\n", rc);
|
||||
return rc;
|
||||
}
|
||||
|
||||
for (i = 0; i < size; i++) {
|
||||
sprintf(tkey, "KEY-%d", i);
|
||||
sprintf(tval, "VALUE-%d", i);
|
||||
if (PMI_SUCCESS != (rc = PMI_KVS_Get(jobid, tkey, val, sizeof(val)))) {
|
||||
log_fatal("PMI_KVS_Get [%s=?] %d\n", tkey, rc);
|
||||
return rc;
|
||||
for (j=0; j < size; j++) {
|
||||
sprintf(tkey, "%d:KEY-%d", i, j);
|
||||
sprintf(tval, "VALUE-%d", j);
|
||||
log_info("Get key %s\n", tkey);
|
||||
if (PMI_SUCCESS != (rc = PMI_KVS_Get(jobid, tkey, val, sizeof(val)))) {
|
||||
log_fatal("PMI_KVS_Get [%s=?] %d\n", tkey, rc);
|
||||
return rc;
|
||||
}
|
||||
|
||||
log_info("tkey=%s tval=%s val=%s\n", tkey, tval, val);
|
||||
|
||||
log_assert(!strcmp(tval, val), "value does not meet expectation");
|
||||
}
|
||||
|
||||
log_info("tkey=%s tval=%s val=%s\n", tkey, tval, val);
|
||||
|
||||
log_assert(!strcmp(tval, val), "value does not meet expectation");
|
||||
}
|
||||
|
||||
return rc;
|
||||
|
@ -11,7 +11,7 @@
|
||||
# All rights reserved.
|
||||
# Copyright (c) 2006-2010 Cisco Systems, Inc. All rights reserved.
|
||||
# Copyright (c) 2012-2013 Los Alamos National Security, Inc. All rights reserved.
|
||||
# Copyright (c) 2013-2018 Intel, Inc. All rights reserved.
|
||||
# Copyright (c) 2013-2019 Intel, Inc. All rights reserved.
|
||||
# $COPYRIGHT$
|
||||
#
|
||||
# Additional copyrights may follow
|
||||
@ -85,7 +85,7 @@ simplegacy_SOURCES = $(headers) \
|
||||
simplegacy.c
|
||||
simplegacy_LDFLAGS = $(PMIX_PKG_CONFIG_LDFLAGS)
|
||||
simplegacy_LDADD = \
|
||||
$(top_builddir)/src/libpmix.la
|
||||
$(top_builddir)/src/libpmi.la
|
||||
|
||||
simptimeout_SOURCES = $(headers) \
|
||||
simptimeout.c
|
||||
|
@ -13,7 +13,7 @@
|
||||
* All rights reserved.
|
||||
* Copyright (c) 2009-2012 Cisco Systems, Inc. All rights reserved.
|
||||
* Copyright (c) 2011 Oak Ridge National Labs. All rights reserved.
|
||||
* Copyright (c) 2013-2018 Intel, Inc. All rights reserved.
|
||||
* Copyright (c) 2013-2019 Intel, Inc. All rights reserved.
|
||||
* Copyright (c) 2015 Research Organization for Information Science
|
||||
* and Technology (RIST). All rights reserved.
|
||||
* Copyright (c) 2016 IBM Corporation. All rights reserved.
|
||||
@ -392,9 +392,9 @@ int main(int argc, char **argv)
|
||||
|
||||
/* setup to see sigchld on the forked tests */
|
||||
PMIX_CONSTRUCT(&children, pmix_list_t);
|
||||
event_assign(&handler, pmix_globals.evbase, SIGCHLD,
|
||||
EV_SIGNAL|EV_PERSIST,wait_signal_callback, &handler);
|
||||
event_add(&handler, NULL);
|
||||
pmix_event_assign(&handler, pmix_globals.evbase, SIGCHLD,
|
||||
EV_SIGNAL|EV_PERSIST,wait_signal_callback, &handler);
|
||||
pmix_event_add(&handler, NULL);
|
||||
|
||||
/* we have a single namespace for all clients */
|
||||
atmp = NULL;
|
||||
@ -1023,7 +1023,7 @@ static void wait_signal_callback(int fd, short event, void *arg)
|
||||
pid_t pid;
|
||||
wait_tracker_t *t2;
|
||||
|
||||
if (SIGCHLD != event_get_signal(sig)) {
|
||||
if (SIGCHLD != pmix_event_get_signal(sig)) {
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -13,7 +13,7 @@
|
||||
* All rights reserved.
|
||||
* Copyright (c) 2009-2012 Cisco Systems, Inc. All rights reserved.
|
||||
* Copyright (c) 2011 Oak Ridge National Labs. All rights reserved.
|
||||
* Copyright (c) 2013-2018 Intel, Inc. All rights reserved.
|
||||
* Copyright (c) 2013-2019 Intel, Inc. All rights reserved.
|
||||
* Copyright (c) 2015 Mellanox Technologies, Inc. All rights reserved.
|
||||
* $COPYRIGHT$
|
||||
*
|
||||
@ -103,12 +103,15 @@ int main(int argc, char **argv)
|
||||
pmix_value_t *val = &value;
|
||||
char *tmp;
|
||||
pmix_proc_t proc;
|
||||
uint32_t nprocs, n;
|
||||
uint32_t nprocs, n, k, nlocal;
|
||||
int cnt, j;
|
||||
volatile bool active;
|
||||
pmix_info_t *iptr;
|
||||
size_t ninfo;
|
||||
pmix_status_t code;
|
||||
char **peers;
|
||||
bool all_local, local;
|
||||
pmix_rank_t *locals = NULL;
|
||||
|
||||
/* init us and declare we are a test programming model */
|
||||
PMIX_INFO_CREATE(iptr, 2);
|
||||
@ -152,11 +155,11 @@ int main(int argc, char **argv)
|
||||
usleep(10);
|
||||
}
|
||||
|
||||
/* get our universe size */
|
||||
/* get our job size */
|
||||
(void)strncpy(proc.nspace, myproc.nspace, PMIX_MAX_NSLEN);
|
||||
proc.rank = PMIX_RANK_WILDCARD;
|
||||
if (PMIX_SUCCESS != (rc = PMIx_Get(&proc, PMIX_UNIV_SIZE, NULL, 0, &val))) {
|
||||
pmix_output(0, "Client ns %s rank %d: PMIx_Get universe size failed: %s",
|
||||
if (PMIX_SUCCESS != (rc = PMIx_Get(&proc, PMIX_JOB_SIZE, NULL, 0, &val))) {
|
||||
pmix_output(0, "Client ns %s rank %d: PMIx_Get job size failed: %s",
|
||||
myproc.nspace, myproc.rank, PMIx_Error_string(rc));
|
||||
goto done;
|
||||
}
|
||||
@ -173,6 +176,27 @@ int main(int argc, char **argv)
|
||||
goto done;
|
||||
}
|
||||
|
||||
/* get a list of our local peers */
|
||||
if (PMIX_SUCCESS != (rc = PMIx_Get(&proc, PMIX_LOCAL_PEERS, NULL, 0, &val))) {
|
||||
pmix_output(0, "Client ns %s rank %d: PMIx_Get local peers failed: %s",
|
||||
myproc.nspace, myproc.rank, PMIx_Error_string(rc));
|
||||
goto done;
|
||||
}
|
||||
/* split the returned string to get the rank of each local peer */
|
||||
peers = pmix_argv_split(val->data.string, ',');
|
||||
PMIX_VALUE_RELEASE(val);
|
||||
nlocal = pmix_argv_count(peers);
|
||||
if (nprocs == nlocal) {
|
||||
all_local = true;
|
||||
} else {
|
||||
all_local = false;
|
||||
locals = (pmix_rank_t*)malloc(pmix_argv_count(peers) * sizeof(pmix_rank_t));
|
||||
for (cnt=0; NULL != peers[cnt]; cnt++) {
|
||||
locals[cnt] = strtoul(peers[cnt], NULL, 10);
|
||||
}
|
||||
}
|
||||
pmix_argv_free(peers);
|
||||
|
||||
for (cnt=0; cnt < MAXCNT; cnt++) {
|
||||
(void)asprintf(&tmp, "%s-%d-local-%d", myproc.nspace, myproc.rank, cnt);
|
||||
value.type = PMIX_UINT64;
|
||||
@ -213,43 +237,68 @@ int main(int argc, char **argv)
|
||||
for (j=0; j <= cnt; j++) {
|
||||
for (n=0; n < nprocs; n++) {
|
||||
proc.rank = n;
|
||||
(void)asprintf(&tmp, "%s-%d-local-%d", myproc.nspace, n, j);
|
||||
if (PMIX_SUCCESS != (rc = PMIx_Get(&proc, tmp, NULL, 0, &val))) {
|
||||
pmix_output(0, "Client ns %s rank %d cnt %d: PMIx_Get %s failed: %s",
|
||||
myproc.nspace, myproc.rank, j, tmp, PMIx_Error_string(rc));
|
||||
continue;
|
||||
if (all_local) {
|
||||
local = true;
|
||||
} else {
|
||||
local = false;
|
||||
/* see if this proc is local to us */
|
||||
for (k=0; k < nlocal; k++) {
|
||||
if (proc.rank == locals[k]) {
|
||||
local = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (NULL == val) {
|
||||
pmix_output(0, "Client ns %s rank %d: NULL value returned",
|
||||
myproc.nspace, myproc.rank);
|
||||
break;
|
||||
}
|
||||
if (PMIX_UINT64 != val->type) {
|
||||
pmix_output(0, "Client ns %s rank %d cnt %d: PMIx_Get %s returned wrong type: %d", myproc.nspace, myproc.rank, j, tmp, val->type);
|
||||
PMIX_VALUE_RELEASE(val);
|
||||
free(tmp);
|
||||
continue;
|
||||
}
|
||||
if (1234 != val->data.uint64) {
|
||||
pmix_output(0, "Client ns %s rank %d cnt %d: PMIx_Get %s returned wrong value: %d", myproc.nspace, myproc.rank, j, tmp, (int)val->data.uint64);
|
||||
PMIX_VALUE_RELEASE(val);
|
||||
free(tmp);
|
||||
continue;
|
||||
}
|
||||
PMIX_VALUE_RELEASE(val);
|
||||
free(tmp);
|
||||
|
||||
if (n != myproc.rank) {
|
||||
(void)asprintf(&tmp, "%s-%d-remote-%d", proc.nspace, n, j);
|
||||
if (local) {
|
||||
(void)asprintf(&tmp, "%s-%d-local-%d", myproc.nspace, n, j);
|
||||
if (PMIX_SUCCESS != (rc = PMIx_Get(&proc, tmp, NULL, 0, &val))) {
|
||||
/* this data should _not_ be found as we are on the same node
|
||||
* and the data was "put" with a PMIX_REMOTE scope */
|
||||
pmix_output(0, "Client ns %s rank %d cnt %d: PMIx_Get %s failed: %s",
|
||||
myproc.nspace, myproc.rank, j, tmp, PMIx_Error_string(rc));
|
||||
continue;
|
||||
}
|
||||
if (NULL == val) {
|
||||
pmix_output(0, "Client ns %s rank %d: NULL value returned",
|
||||
myproc.nspace, myproc.rank);
|
||||
break;
|
||||
}
|
||||
if (PMIX_UINT64 != val->type) {
|
||||
pmix_output(0, "Client ns %s rank %d cnt %d: PMIx_Get %s returned wrong type: %d", myproc.nspace, myproc.rank, j, tmp, val->type);
|
||||
PMIX_VALUE_RELEASE(val);
|
||||
free(tmp);
|
||||
continue;
|
||||
}
|
||||
if (1234 != val->data.uint64) {
|
||||
pmix_output(0, "Client ns %s rank %d cnt %d: PMIx_Get %s returned wrong value: %d", myproc.nspace, myproc.rank, j, tmp, (int)val->data.uint64);
|
||||
PMIX_VALUE_RELEASE(val);
|
||||
free(tmp);
|
||||
continue;
|
||||
}
|
||||
pmix_output(0, "Client ns %s rank %d cnt %d: PMIx_Get %s returned remote data for a local proc",
|
||||
myproc.nspace, myproc.rank, j, tmp);
|
||||
PMIX_VALUE_RELEASE(val);
|
||||
free(tmp);
|
||||
|
||||
/* now check that we don't get data for a remote proc - note that we
|
||||
* always can get our own remote data as we published it */
|
||||
if (proc.rank != myproc.rank) {
|
||||
(void)asprintf(&tmp, "%s-%d-remote-%d", proc.nspace, n, j);
|
||||
if (PMIX_SUCCESS == (rc = PMIx_Get(&proc, tmp, NULL, 0, &val))) {
|
||||
/* this data should _not_ be found as we are on the same node
|
||||
* and the data was "put" with a PMIX_REMOTE scope */
|
||||
pmix_output(0, "ERROR: Client ns %s rank %d cnt %d: PMIx_Get %s returned remote data for a local proc",
|
||||
myproc.nspace, myproc.rank, j, tmp);
|
||||
}
|
||||
PMIX_VALUE_RELEASE(val);
|
||||
free(tmp);
|
||||
}
|
||||
} else {
|
||||
(void)asprintf(&tmp, "%s-%d-remote-%d", proc.nspace, n, j);
|
||||
if (PMIX_SUCCESS != (rc = PMIx_Get(&proc, tmp, NULL, 0, &val))) {
|
||||
pmix_output(0, "Client ns %s rank %d cnt %d: PMIx_Get %s failed for remote proc",
|
||||
myproc.nspace, myproc.rank, j, tmp);
|
||||
}
|
||||
if (NULL != val) {
|
||||
PMIX_VALUE_RELEASE(val);
|
||||
}
|
||||
free(tmp);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -13,7 +13,7 @@
|
||||
* All rights reserved.
|
||||
* Copyright (c) 2009-2012 Cisco Systems, Inc. All rights reserved.
|
||||
* Copyright (c) 2011 Oak Ridge National Labs. All rights reserved.
|
||||
* Copyright (c) 2013-2018 Intel, Inc. All rights reserved.
|
||||
* Copyright (c) 2013-2019 Intel, Inc. All rights reserved.
|
||||
* Copyright (c) 2015 Mellanox Technologies, Inc. All rights reserved.
|
||||
* $COPYRIGHT$
|
||||
*
|
||||
@ -127,13 +127,16 @@ int main(int argc, char **argv)
|
||||
pmix_value_t *val = &value;
|
||||
char *tmp;
|
||||
pmix_proc_t proc;
|
||||
uint32_t nprocs, n;
|
||||
uint32_t nprocs, n, k, nlocal;
|
||||
int cnt, j;
|
||||
bool doabort = false;
|
||||
volatile bool active;
|
||||
pmix_info_t info, *iptr;
|
||||
size_t ninfo;
|
||||
pmix_status_t code;
|
||||
char **peers;
|
||||
bool all_local, local;
|
||||
pmix_rank_t *locals = NULL;
|
||||
|
||||
if (1 < argc) {
|
||||
if (0 == strcmp("-abort", argv[1])) {
|
||||
@ -185,17 +188,17 @@ int main(int argc, char **argv)
|
||||
}
|
||||
|
||||
|
||||
/* get our universe size */
|
||||
/* get our job size */
|
||||
(void)strncpy(proc.nspace, myproc.nspace, PMIX_MAX_NSLEN);
|
||||
proc.rank = PMIX_RANK_WILDCARD;
|
||||
if (PMIX_SUCCESS != (rc = PMIx_Get(&proc, PMIX_UNIV_SIZE, NULL, 0, &val))) {
|
||||
pmix_output(0, "Client ns %s rank %d: PMIx_Get universe size failed: %s",
|
||||
if (PMIX_SUCCESS != (rc = PMIx_Get(&proc, PMIX_JOB_SIZE, NULL, 0, &val))) {
|
||||
pmix_output(0, "Client ns %s rank %d: PMIx_Get job size failed: %s",
|
||||
myproc.nspace, myproc.rank, PMIx_Error_string(rc));
|
||||
goto done;
|
||||
}
|
||||
nprocs = val->data.uint32;
|
||||
PMIX_VALUE_RELEASE(val);
|
||||
pmix_output(0, "Client %s:%d universe size %d", myproc.nspace, myproc.rank, nprocs);
|
||||
pmix_output(0, "Client %s:%d job size %d", myproc.nspace, myproc.rank, nprocs);
|
||||
|
||||
/* put a few values */
|
||||
(void)asprintf(&tmp, "%s-%d-internal", myproc.nspace, myproc.rank);
|
||||
@ -207,6 +210,27 @@ int main(int argc, char **argv)
|
||||
goto done;
|
||||
}
|
||||
|
||||
/* get a list of our local peers */
|
||||
if (PMIX_SUCCESS != (rc = PMIx_Get(&proc, PMIX_LOCAL_PEERS, NULL, 0, &val))) {
|
||||
pmix_output(0, "Client ns %s rank %d: PMIx_Get local peers failed: %s",
|
||||
myproc.nspace, myproc.rank, PMIx_Error_string(rc));
|
||||
goto done;
|
||||
}
|
||||
/* split the returned string to get the rank of each local peer */
|
||||
peers = pmix_argv_split(val->data.string, ',');
|
||||
PMIX_VALUE_RELEASE(val);
|
||||
nlocal = pmix_argv_count(peers);
|
||||
if (nprocs == nlocal) {
|
||||
all_local = true;
|
||||
} else {
|
||||
all_local = false;
|
||||
locals = (pmix_rank_t*)malloc(pmix_argv_count(peers) * sizeof(pmix_rank_t));
|
||||
for (cnt=0; NULL != peers[cnt]; cnt++) {
|
||||
locals[cnt] = strtoul(peers[cnt], NULL, 10);
|
||||
}
|
||||
}
|
||||
pmix_argv_free(peers);
|
||||
|
||||
for (cnt=0; cnt < MAXCNT; cnt++) {
|
||||
(void)asprintf(&tmp, "%s-%d-local-%d", myproc.nspace, myproc.rank, cnt);
|
||||
value.type = PMIX_UINT64;
|
||||
@ -247,43 +271,71 @@ int main(int argc, char **argv)
|
||||
for (j=0; j <= cnt; j++) {
|
||||
for (n=0; n < nprocs; n++) {
|
||||
proc.rank = n;
|
||||
(void)asprintf(&tmp, "%s-%d-local-%d", myproc.nspace, n, j);
|
||||
if (PMIX_SUCCESS != (rc = PMIx_Get(&proc, tmp, NULL, 0, &val))) {
|
||||
pmix_output(0, "Client ns %s rank %d cnt %d: PMIx_Get %s failed: %s",
|
||||
myproc.nspace, myproc.rank, j, tmp, PMIx_Error_string(rc));
|
||||
continue;
|
||||
if (all_local) {
|
||||
local = true;
|
||||
} else {
|
||||
local = false;
|
||||
/* see if this proc is local to us */
|
||||
for (k=0; k < nlocal; k++) {
|
||||
if (proc.rank == locals[k]) {
|
||||
local = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (NULL == val) {
|
||||
pmix_output(0, "Client ns %s rank %d: NULL value returned",
|
||||
myproc.nspace, myproc.rank);
|
||||
break;
|
||||
}
|
||||
if (PMIX_UINT64 != val->type) {
|
||||
pmix_output(0, "Client ns %s rank %d cnt %d: PMIx_Get %s returned wrong type: %d", myproc.nspace, myproc.rank, j, tmp, val->type);
|
||||
PMIX_VALUE_RELEASE(val);
|
||||
free(tmp);
|
||||
continue;
|
||||
}
|
||||
if (1234 != val->data.uint64) {
|
||||
pmix_output(0, "Client ns %s rank %d cnt %d: PMIx_Get %s returned wrong value: %d", myproc.nspace, myproc.rank, j, tmp, (int)val->data.uint64);
|
||||
PMIX_VALUE_RELEASE(val);
|
||||
free(tmp);
|
||||
continue;
|
||||
}
|
||||
pmix_output(0, "Client ns %s rank %d cnt %d: PMIx_Get %s returned correct", myproc.nspace, myproc.rank, j, tmp);
|
||||
PMIX_VALUE_RELEASE(val);
|
||||
free(tmp);
|
||||
|
||||
if (n != myproc.rank) {
|
||||
(void)asprintf(&tmp, "%s-%d-remote-%d", proc.nspace, n, j);
|
||||
if (local) {
|
||||
(void)asprintf(&tmp, "%s-%d-local-%d", myproc.nspace, n, j);
|
||||
if (PMIX_SUCCESS != (rc = PMIx_Get(&proc, tmp, NULL, 0, &val))) {
|
||||
/* this data should _not_ be found as we are on the same node
|
||||
* and the data was "put" with a PMIX_REMOTE scope */
|
||||
pmix_output(0, "Client ns %s rank %d cnt %d: PMIx_Get %s returned correct", myproc.nspace, myproc.rank, j, tmp);
|
||||
pmix_output(0, "Client ns %s rank %d cnt %d: PMIx_Get %s failed: %s",
|
||||
myproc.nspace, myproc.rank, j, tmp, PMIx_Error_string(rc));
|
||||
continue;
|
||||
}
|
||||
pmix_output(0, "Client ns %s rank %d cnt %d: PMIx_Get %s returned remote data for a local proc",
|
||||
myproc.nspace, myproc.rank, j, tmp);
|
||||
if (NULL == val) {
|
||||
pmix_output(0, "Client ns %s rank %d: NULL value returned",
|
||||
myproc.nspace, myproc.rank);
|
||||
break;
|
||||
}
|
||||
if (PMIX_UINT64 != val->type) {
|
||||
pmix_output(0, "Client ns %s rank %d cnt %d: PMIx_Get %s returned wrong type: %d", myproc.nspace, myproc.rank, j, tmp, val->type);
|
||||
PMIX_VALUE_RELEASE(val);
|
||||
free(tmp);
|
||||
continue;
|
||||
}
|
||||
if (1234 != val->data.uint64) {
|
||||
pmix_output(0, "Client ns %s rank %d cnt %d: PMIx_Get %s returned wrong value: %d", myproc.nspace, myproc.rank, j, tmp, (int)val->data.uint64);
|
||||
PMIX_VALUE_RELEASE(val);
|
||||
free(tmp);
|
||||
continue;
|
||||
}
|
||||
pmix_output(0, "Client ns %s rank %d cnt %d: PMIx_Get %s returned correct", myproc.nspace, myproc.rank, j, tmp);
|
||||
PMIX_VALUE_RELEASE(val);
|
||||
free(tmp);
|
||||
|
||||
/* now check that we don't get data for a remote proc - note that we
|
||||
* always can get our own remote data as we published it */
|
||||
if (proc.rank != myproc.rank) {
|
||||
(void)asprintf(&tmp, "%s-%d-remote-%d", proc.nspace, n, j);
|
||||
if (PMIX_SUCCESS != (rc = PMIx_Get(&proc, tmp, NULL, 0, &val))) {
|
||||
/* this data should _not_ be found as we are on the same node
|
||||
* and the data was "put" with a PMIX_REMOTE scope */
|
||||
pmix_output(0, "Client ns %s rank %d cnt %d: PMIx_Get %s returned correct", myproc.nspace, myproc.rank, j, tmp);
|
||||
} else {
|
||||
pmix_output(0, "ERROR: Client ns %s rank %d cnt %d: PMIx_Get %s returned remote data for a local proc",
|
||||
myproc.nspace, myproc.rank, j, tmp);
|
||||
}
|
||||
if (NULL != val) {
|
||||
PMIX_VALUE_RELEASE(val);
|
||||
}
|
||||
free(tmp);
|
||||
}
|
||||
} else {
|
||||
(void)asprintf(&tmp, "%s-%d-remote-%d", proc.nspace, n, j);
|
||||
if (PMIX_SUCCESS == (rc = PMIx_Get(&proc, tmp, NULL, 0, &val))) {
|
||||
pmix_output(0, "Client ns %s rank %d cnt %d: PMIx_Get %s returned correct", myproc.nspace, myproc.rank, j, tmp);
|
||||
} else {
|
||||
pmix_output(0, "Client ns %s rank %d cnt %d: PMIx_Get %s failed for remote proc",
|
||||
myproc.nspace, myproc.rank, j, tmp);
|
||||
}
|
||||
PMIX_VALUE_RELEASE(val);
|
||||
free(tmp);
|
||||
}
|
||||
@ -321,7 +373,7 @@ int main(int argc, char **argv)
|
||||
|
||||
/* log something */
|
||||
PMIX_INFO_CONSTRUCT(&info);
|
||||
PMIX_INFO_LOAD(&info, PMIX_LOG_STDERR, "test log msg", PMIX_STRING);
|
||||
PMIX_INFO_LOAD(&info, PMIX_LOG_STDERR, "test log msg\n", PMIX_STRING);
|
||||
active = true;
|
||||
rc = PMIx_Log_nb(&info, 1, NULL, 0, opcbfunc, (void*)&active);
|
||||
if (PMIX_SUCCESS != rc) {
|
||||
|
@ -13,7 +13,7 @@
|
||||
* All rights reserved.
|
||||
* Copyright (c) 2009-2012 Cisco Systems, Inc. All rights reserved.
|
||||
* Copyright (c) 2011 Oak Ridge National Labs. All rights reserved.
|
||||
* Copyright (c) 2013-2018 Intel, Inc. All rights reserved.
|
||||
* Copyright (c) 2013-2019 Intel, Inc. All rights reserved.
|
||||
* Copyright (c) 2015 Mellanox Technologies, Inc. All rights reserved.
|
||||
* $COPYRIGHT$
|
||||
*
|
||||
@ -97,16 +97,17 @@ int main(int argc, char **argv)
|
||||
}
|
||||
pmix_output(0, "Client ns %s rank %d: Running", myproc.nspace, myproc.rank);
|
||||
|
||||
/* get our universe size */
|
||||
/* get our job size */
|
||||
(void)strncpy(proc.nspace, myproc.nspace, PMIX_MAX_NSLEN);
|
||||
proc.rank = PMIX_RANK_WILDCARD;
|
||||
if (PMIX_SUCCESS != (rc = PMIx_Get(&proc, PMIX_UNIV_SIZE, NULL, 0, &val))) {
|
||||
pmix_output(0, "Client ns %s rank %d: PMIx_Get universe size failed: %d", myproc.nspace, myproc.rank, rc);
|
||||
if (PMIX_SUCCESS != (rc = PMIx_Get(&proc, PMIX_JOB_SIZE, NULL, 0, &val))) {
|
||||
pmix_output(0, "Client ns %s rank %d: PMIx_Get job size failed: %s",
|
||||
myproc.nspace, myproc.rank, PMIx_Error_string(rc));
|
||||
goto done;
|
||||
}
|
||||
nprocs = val->data.uint32;
|
||||
PMIX_VALUE_RELEASE(val);
|
||||
pmix_output(0, "Client %s:%d universe size %d", myproc.nspace, myproc.rank, nprocs);
|
||||
pmix_output(0, "Client %s:%d job size %d", myproc.nspace, myproc.rank, nprocs);
|
||||
completed = false;
|
||||
|
||||
/* register our errhandler */
|
||||
|
@ -13,7 +13,7 @@
|
||||
* All rights reserved.
|
||||
* Copyright (c) 2009-2012 Cisco Systems, Inc. All rights reserved.
|
||||
* Copyright (c) 2011 Oak Ridge National Labs. All rights reserved.
|
||||
* Copyright (c) 2013-2018 Intel, Inc. All rights reserved.
|
||||
* Copyright (c) 2013-2019 Intel, Inc. All rights reserved.
|
||||
* Copyright (c) 2015 Mellanox Technologies, Inc. All rights reserved.
|
||||
* $COPYRIGHT$
|
||||
*
|
||||
@ -98,9 +98,12 @@ int main(int argc, char **argv)
|
||||
pmix_value_t *val = &value;
|
||||
char *tmp;
|
||||
pmix_proc_t proc;
|
||||
uint32_t n, num_gets;
|
||||
uint32_t n, num_gets, k, nlocal;
|
||||
bool active;
|
||||
bool dofence = true;
|
||||
bool local, all_local;
|
||||
char **peers;
|
||||
pmix_rank_t *locals;
|
||||
|
||||
if (NULL != getenv("PMIX_SIMPDMODEX_ASYNC")) {
|
||||
dofence = false;
|
||||
@ -113,16 +116,17 @@ int main(int argc, char **argv)
|
||||
}
|
||||
pmix_output(0, "Client ns %s rank %d: Running", myproc.nspace, myproc.rank);
|
||||
|
||||
/* get our universe size */
|
||||
/* get our job size */
|
||||
(void)strncpy(proc.nspace, myproc.nspace, PMIX_MAX_NSLEN);
|
||||
proc.rank = PMIX_RANK_WILDCARD;
|
||||
if (PMIX_SUCCESS != (rc = PMIx_Get(&proc, PMIX_UNIV_SIZE, NULL, 0, &val))) {
|
||||
pmix_output(0, "Client ns %s rank %d: PMIx_Get universe size failed: %d", myproc.nspace, myproc.rank, rc);
|
||||
if (PMIX_SUCCESS != (rc = PMIx_Get(&proc, PMIX_JOB_SIZE, NULL, 0, &val))) {
|
||||
pmix_output(0, "Client ns %s rank %d: PMIx_Get job size failed: %s",
|
||||
myproc.nspace, myproc.rank, PMIx_Error_string(rc));
|
||||
goto done;
|
||||
}
|
||||
nprocs = val->data.uint32;
|
||||
PMIX_VALUE_RELEASE(val);
|
||||
pmix_output(0, "Client %s:%d universe size %d", myproc.nspace, myproc.rank, nprocs);
|
||||
pmix_output(0, "Client %s:%d job size %d", myproc.nspace, myproc.rank, nprocs);
|
||||
|
||||
/* put a few values */
|
||||
(void)asprintf(&tmp, "%s-%d-internal", myproc.nspace, myproc.rank);
|
||||
@ -174,24 +178,60 @@ int main(int argc, char **argv)
|
||||
}
|
||||
}
|
||||
|
||||
/* get a list of our local peers */
|
||||
if (PMIX_SUCCESS != (rc = PMIx_Get(&proc, PMIX_LOCAL_PEERS, NULL, 0, &val))) {
|
||||
pmix_output(0, "Client ns %s rank %d: PMIx_Get local peers failed: %s",
|
||||
myproc.nspace, myproc.rank, PMIx_Error_string(rc));
|
||||
goto done;
|
||||
}
|
||||
/* split the returned string to get the rank of each local peer */
|
||||
peers = pmix_argv_split(val->data.string, ',');
|
||||
PMIX_VALUE_RELEASE(val);
|
||||
nlocal = pmix_argv_count(peers);
|
||||
if (nprocs == nlocal) {
|
||||
all_local = true;
|
||||
} else {
|
||||
all_local = false;
|
||||
locals = (pmix_rank_t*)malloc(pmix_argv_count(peers) * sizeof(pmix_rank_t));
|
||||
for (n=0; NULL != peers[n]; n++) {
|
||||
locals[n] = strtoul(peers[n], NULL, 10);
|
||||
}
|
||||
}
|
||||
pmix_argv_free(peers);
|
||||
|
||||
/* get the committed data - ask for someone who doesn't exist as well */
|
||||
num_gets = 0;
|
||||
for (n=0; n < nprocs; n++) {
|
||||
(void)asprintf(&tmp, "%s-%d-local", myproc.nspace, n);
|
||||
proc.rank = n;
|
||||
if (PMIX_SUCCESS != (rc = PMIx_Get_nb(&proc, tmp,
|
||||
NULL, 0, valcbfunc, tmp))) {
|
||||
pmix_output(0, "Client ns %s rank %d: PMIx_Get %s failed: %d", myproc.nspace, n, tmp, rc);
|
||||
goto done;
|
||||
if (all_local) {
|
||||
local = true;
|
||||
} else {
|
||||
local = false;
|
||||
/* see if this proc is local to us */
|
||||
for (k=0; k < nlocal; k++) {
|
||||
if (proc.rank == locals[k]) {
|
||||
local = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
++num_gets;
|
||||
(void)asprintf(&tmp, "%s-%d-remote", myproc.nspace, n);
|
||||
if (PMIX_SUCCESS != (rc = PMIx_Get_nb(&proc, tmp,
|
||||
NULL, 0, valcbfunc, tmp))) {
|
||||
pmix_output(0, "Client ns %s rank %d: PMIx_Get %s failed: %d", myproc.nspace, n, tmp, rc);
|
||||
goto done;
|
||||
if (local) {
|
||||
(void)asprintf(&tmp, "%s-%d-local", myproc.nspace, n);
|
||||
proc.rank = n;
|
||||
if (PMIX_SUCCESS != (rc = PMIx_Get_nb(&proc, tmp,
|
||||
NULL, 0, valcbfunc, tmp))) {
|
||||
pmix_output(0, "Client ns %s rank %d: PMIx_Get %s failed: %d", myproc.nspace, n, tmp, rc);
|
||||
goto done;
|
||||
}
|
||||
++num_gets;
|
||||
} else {
|
||||
(void)asprintf(&tmp, "%s-%d-remote", myproc.nspace, n);
|
||||
if (PMIX_SUCCESS != (rc = PMIx_Get_nb(&proc, tmp,
|
||||
NULL, 0, valcbfunc, tmp))) {
|
||||
pmix_output(0, "Client ns %s rank %d: PMIx_Get %s failed: %d", myproc.nspace, n, tmp, rc);
|
||||
goto done;
|
||||
}
|
||||
++num_gets;
|
||||
}
|
||||
++num_gets;
|
||||
}
|
||||
|
||||
if (dofence) {
|
||||
|
@ -13,7 +13,7 @@
|
||||
* All rights reserved.
|
||||
* Copyright (c) 2009-2012 Cisco Systems, Inc. All rights reserved.
|
||||
* Copyright (c) 2011 Oak Ridge National Labs. All rights reserved.
|
||||
* Copyright (c) 2013-2018 Intel, Inc. All rights reserved.
|
||||
* Copyright (c) 2013-2019 Intel, Inc. All rights reserved.
|
||||
* Copyright (c) 2015 Mellanox Technologies, Inc. All rights reserved.
|
||||
* $COPYRIGHT$
|
||||
*
|
||||
@ -62,16 +62,17 @@ int main(int argc, char **argv)
|
||||
}
|
||||
pmix_output(0, "Client ns %s rank %d: Running", myproc.nspace, myproc.rank);
|
||||
|
||||
/* get our universe size */
|
||||
/* get our job size */
|
||||
(void)strncpy(proc.nspace, myproc.nspace, PMIX_MAX_NSLEN);
|
||||
proc.rank = PMIX_RANK_WILDCARD;
|
||||
if (PMIX_SUCCESS != (rc = PMIx_Get(&proc, PMIX_UNIV_SIZE, NULL, 0, &val))) {
|
||||
pmix_output(0, "Client ns %s rank %d: PMIx_Get universe size failed: %d", myproc.nspace, myproc.rank, rc);
|
||||
if (PMIX_SUCCESS != (rc = PMIx_Get(&proc, PMIX_JOB_SIZE, NULL, 0, &val))) {
|
||||
pmix_output(0, "Client ns %s rank %d: PMIx_Get job size failed: %s",
|
||||
myproc.nspace, myproc.rank, PMIx_Error_string(rc));
|
||||
goto done;
|
||||
}
|
||||
nprocs = val->data.uint32;
|
||||
PMIX_VALUE_RELEASE(val);
|
||||
pmix_output(0, "Client %s:%d universe size %d", myproc.nspace, myproc.rank, nprocs);
|
||||
pmix_output(0, "Client %s:%d job size %d", myproc.nspace, myproc.rank, nprocs);
|
||||
|
||||
/* call fence to sync */
|
||||
PMIX_PROC_CONSTRUCT(&proc);
|
||||
@ -85,19 +86,12 @@ int main(int argc, char **argv)
|
||||
/* rank=0 calls spawn */
|
||||
if (0 == myproc.rank) {
|
||||
PMIX_APP_CREATE(app, 1);
|
||||
app->cmd = strdup("gumby");
|
||||
app->cmd = strdup("./simpclient");
|
||||
app->maxprocs = 2;
|
||||
pmix_argv_append_nosize(&app->argv, "gumby");
|
||||
pmix_argv_append_nosize(&app->argv, "simpclient");
|
||||
pmix_argv_append_nosize(&app->argv, "-n");
|
||||
pmix_argv_append_nosize(&app->argv, "2");
|
||||
pmix_setenv("PMIX_ENV_VALUE", "3", true, &app->env);
|
||||
PMIX_INFO_CREATE(app->info, 2);
|
||||
(void)strncpy(app->info[0].key, "DARTH", PMIX_MAX_KEYLEN);
|
||||
app->info[0].value.type = PMIX_INT8;
|
||||
app->info[0].value.data.int8 = 12;
|
||||
(void)strncpy(app->info[1].key, "VADER", PMIX_MAX_KEYLEN);
|
||||
app->info[1].value.type = PMIX_DOUBLE;
|
||||
app->info[1].value.data.dval = 12.34;
|
||||
|
||||
pmix_output(0, "Client ns %s rank %d: calling PMIx_Spawn", myproc.nspace, myproc.rank);
|
||||
if (PMIX_SUCCESS != (rc = PMIx_Spawn(NULL, 0, app, 1, nsp2))) {
|
||||
@ -106,25 +100,18 @@ int main(int argc, char **argv)
|
||||
}
|
||||
PMIX_APP_FREE(app, 1);
|
||||
|
||||
/* check to see if we got the expected info back */
|
||||
if (0 != strncmp(nsp2, "DYNSPACE", PMIX_MAX_NSLEN)) {
|
||||
pmix_output(0, "Client ns %s rank %d: PMIx_Spawn returned incorrect nspace: %s", myproc.nspace, myproc.rank, nsp2);
|
||||
goto done;
|
||||
} else {
|
||||
pmix_output(0, "Client ns %s rank %d: PMIx_Spawn succeeded returning nspace: %s", myproc.nspace, myproc.rank, nsp2);
|
||||
}
|
||||
/* get their universe size */
|
||||
/* get their job size */
|
||||
(void)strncpy(proc.nspace, nsp2, PMIX_MAX_NSLEN);
|
||||
proc.rank = PMIX_RANK_WILDCARD;
|
||||
val = NULL;
|
||||
if (PMIX_SUCCESS != (rc = PMIx_Get(&proc, PMIX_UNIV_SIZE, NULL, 0, &val)) ||
|
||||
if (PMIX_SUCCESS != (rc = PMIx_Get(&proc, PMIX_JOB_SIZE, NULL, 0, &val)) ||
|
||||
NULL == val) {
|
||||
pmix_output(0, "Client ns %s rank %d: PMIx_Get universe size failed: %d", myproc.nspace, myproc.rank, rc);
|
||||
pmix_output(0, "Client ns %s rank %d: PMIx_Get job %s size failed: %d", myproc.nspace, myproc.rank, nsp2, rc);
|
||||
goto done;
|
||||
}
|
||||
ntmp = val->data.uint32;
|
||||
PMIX_VALUE_RELEASE(val);
|
||||
pmix_output(0, "Client %s:%d universe %s size %d", myproc.nspace, myproc.rank, nsp2, (int)ntmp);
|
||||
pmix_output(0, "Client %s:%d job %s size %d", myproc.nspace, myproc.rank, nsp2, (int)ntmp);
|
||||
}
|
||||
|
||||
/* just cycle the connect/disconnect functions */
|
||||
|
@ -13,7 +13,7 @@
|
||||
* All rights reserved.
|
||||
* Copyright (c) 2009-2012 Cisco Systems, Inc. All rights reserved.
|
||||
* Copyright (c) 2011 Oak Ridge National Labs. All rights reserved.
|
||||
* Copyright (c) 2013-2017 Intel, Inc. All rights reserved.
|
||||
* Copyright (c) 2013-2019 Intel, Inc. All rights reserved.
|
||||
* Copyright (c) 2015 Mellanox Technologies, Inc. All rights reserved.
|
||||
* $COPYRIGHT$
|
||||
*
|
||||
@ -83,16 +83,17 @@ int main(int argc, char **argv)
|
||||
}
|
||||
pmix_output(0, "Client ns %s rank %d: Running", myproc.nspace, myproc.rank);
|
||||
|
||||
/* get our universe size */
|
||||
/* get our job size */
|
||||
(void)strncpy(proc.nspace, myproc.nspace, PMIX_MAX_NSLEN);
|
||||
proc.rank = PMIX_RANK_WILDCARD;
|
||||
if (PMIX_SUCCESS != (rc = PMIx_Get(&proc, PMIX_UNIV_SIZE, NULL, 0, &val))) {
|
||||
pmix_output(0, "Client ns %s rank %d: PMIx_Get universe size failed: %d", myproc.nspace, myproc.rank, rc);
|
||||
if (PMIX_SUCCESS != (rc = PMIx_Get(&proc, PMIX_JOB_SIZE, NULL, 0, &val))) {
|
||||
pmix_output(0, "Client ns %s rank %d: PMIx_Get job size failed: %s",
|
||||
myproc.nspace, myproc.rank, PMIx_Error_string(rc));
|
||||
goto done;
|
||||
}
|
||||
nprocs = val->data.uint32;
|
||||
PMIX_VALUE_RELEASE(val);
|
||||
pmix_output(0, "Client %s:%d universe size %d", myproc.nspace, myproc.rank, nprocs);
|
||||
pmix_output(0, "Client %s:%d job size %d", myproc.nspace, myproc.rank, nprocs);
|
||||
completed = false;
|
||||
|
||||
/* register our errhandler */
|
||||
|
@ -13,7 +13,7 @@
|
||||
* All rights reserved.
|
||||
* Copyright (c) 2009-2012 Cisco Systems, Inc. All rights reserved.
|
||||
* Copyright (c) 2011 Oak Ridge National Labs. All rights reserved.
|
||||
* Copyright (c) 2013-2018 Intel, Inc. All rights reserved.
|
||||
* Copyright (c) 2013-2019 Intel, Inc. All rights reserved.
|
||||
* Copyright (c) 2015 Mellanox Technologies, Inc. All rights reserved.
|
||||
* $COPYRIGHT$
|
||||
*
|
||||
@ -133,14 +133,17 @@ int main(int argc, char **argv)
|
||||
(void)strncpy(proc.nspace, myproc.nspace, PMIX_MAX_NSLEN);
|
||||
proc.rank = PMIX_RANK_WILDCARD;
|
||||
|
||||
/* get our universe size */
|
||||
if (PMIX_SUCCESS != (rc = PMIx_Get(&proc, PMIX_UNIV_SIZE, NULL, 0, &val))) {
|
||||
fprintf(stderr, "Client ns %s rank %d: PMIx_Get universe size failed: %d\n", myproc.nspace, myproc.rank, rc);
|
||||
/* get our job size */
|
||||
(void)strncpy(proc.nspace, myproc.nspace, PMIX_MAX_NSLEN);
|
||||
proc.rank = PMIX_RANK_WILDCARD;
|
||||
if (PMIX_SUCCESS != (rc = PMIx_Get(&proc, PMIX_JOB_SIZE, NULL, 0, &val))) {
|
||||
fprintf(stderr, "Client ns %s rank %d: PMIx_Get job size failed: %s\n",
|
||||
myproc.nspace, myproc.rank, PMIx_Error_string(rc));
|
||||
goto done;
|
||||
}
|
||||
nprocs = val->data.uint32;
|
||||
PMIX_VALUE_RELEASE(val);
|
||||
fprintf(stderr, "Client %s:%d universe size %d\n", myproc.nspace, myproc.rank, nprocs);
|
||||
fprintf(stderr, "Client %s:%d job size %d\n", myproc.nspace, myproc.rank, nprocs);
|
||||
|
||||
/* inform the RM that we are preemptible, and that our checkpoint methods are
|
||||
* "signal" on SIGUSR2 and event on PMIX_JCTRL_CHECKPOINT */
|
||||
|
@ -13,7 +13,7 @@
|
||||
* All rights reserved.
|
||||
* Copyright (c) 2009-2012 Cisco Systems, Inc. All rights reserved.
|
||||
* Copyright (c) 2011 Oak Ridge National Labs. All rights reserved.
|
||||
* Copyright (c) 2013-2017 Intel, Inc. All rights reserved.
|
||||
* Copyright (c) 2013-2019 Intel, Inc. All rights reserved.
|
||||
* Copyright (c) 2015 Mellanox Technologies, Inc. All rights reserved.
|
||||
* $COPYRIGHT$
|
||||
*
|
||||
@ -24,230 +24,90 @@
|
||||
*/
|
||||
|
||||
#include <src/include/pmix_config.h>
|
||||
#include <pmix.h>
|
||||
#include <pmi.h>
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
#include <time.h>
|
||||
|
||||
#include "src/class/pmix_object.h"
|
||||
#include "src/util/output.h"
|
||||
#include "src/util/printf.h"
|
||||
|
||||
#define MAXCNT 3
|
||||
|
||||
static volatile bool completed = false;
|
||||
static pmix_proc_t myproc;
|
||||
|
||||
static void notification_fn(size_t evhdlr_registration_id,
|
||||
pmix_status_t status,
|
||||
const pmix_proc_t *source,
|
||||
pmix_info_t info[], size_t ninfo,
|
||||
pmix_info_t results[], size_t nresults,
|
||||
pmix_event_notification_cbfunc_fn_t cbfunc,
|
||||
void *cbdata)
|
||||
{
|
||||
pmix_output(0, "Client %s:%d NOTIFIED with status %s", myproc.nspace, myproc.rank, PMIx_Error_string(status));
|
||||
if (NULL != cbfunc) {
|
||||
cbfunc(PMIX_SUCCESS, NULL, 0, NULL, NULL, cbdata);
|
||||
}
|
||||
completed = true;
|
||||
}
|
||||
|
||||
static void errhandler_reg_callbk(pmix_status_t status,
|
||||
size_t errhandler_ref,
|
||||
void *cbdata)
|
||||
{
|
||||
volatile bool *active = (volatile bool*)cbdata;
|
||||
|
||||
pmix_output(0, "Client: ERRHANDLER REGISTRATION CALLBACK CALLED WITH STATUS %d, ref=%lu",
|
||||
status, (unsigned long)errhandler_ref);
|
||||
*active = false;
|
||||
}
|
||||
|
||||
/* this is an event notification function that we explicitly request
|
||||
* be called when the PMIX_MODEL_DECLARED notification is issued.
|
||||
* We could catch it in the general event notification function and test
|
||||
* the status to see if the status matched, but it often is simpler
|
||||
* to declare a use-specific notification callback point. In this case,
|
||||
* we are asking to know whenever a model is declared as a means
|
||||
* of testing server self-notification */
|
||||
static void model_callback(size_t evhdlr_registration_id,
|
||||
pmix_status_t status,
|
||||
const pmix_proc_t *source,
|
||||
pmix_info_t info[], size_t ninfo,
|
||||
pmix_info_t results[], size_t nresults,
|
||||
pmix_event_notification_cbfunc_fn_t cbfunc,
|
||||
void *cbdata)
|
||||
{
|
||||
size_t n;
|
||||
|
||||
/* just let us know it was received */
|
||||
fprintf(stderr, "%s:%d Model event handler called with status %d(%s)\n",
|
||||
myproc.nspace, myproc.rank, status, PMIx_Error_string(status));
|
||||
for (n=0; n < ninfo; n++) {
|
||||
if (PMIX_STRING == info[n].value.type) {
|
||||
fprintf(stderr, "%s:%d\t%s:\t%s\n",
|
||||
myproc.nspace, myproc.rank,
|
||||
info[n].key, info[n].value.data.string);
|
||||
}
|
||||
}
|
||||
|
||||
/* we must NOT tell the event handler state machine that we
|
||||
* are the last step as that will prevent it from notifying
|
||||
* anyone else that might be listening for declarations */
|
||||
if (NULL != cbfunc) {
|
||||
cbfunc(PMIX_SUCCESS, NULL, 0, NULL, NULL, cbdata);
|
||||
}
|
||||
}
|
||||
|
||||
/* event handler registration is done asynchronously */
|
||||
static void model_registration_callback(pmix_status_t status,
|
||||
size_t evhandler_ref,
|
||||
void *cbdata)
|
||||
{
|
||||
volatile int *active = (volatile int*)cbdata;
|
||||
|
||||
fprintf(stderr, "simpclient EVENT HANDLER REGISTRATION RETURN STATUS %d, ref=%lu\n",
|
||||
status, (unsigned long)evhandler_ref);
|
||||
*active = false;
|
||||
}
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
int rc;
|
||||
pmix_value_t value;
|
||||
pmix_value_t *val = &value;
|
||||
int rc, j, n;
|
||||
char *tmp;
|
||||
pmix_proc_t proc;
|
||||
uint32_t nprocs, n;
|
||||
int cnt, j;
|
||||
volatile bool active;
|
||||
pmix_info_t info, *iptr;
|
||||
size_t ninfo;
|
||||
pmix_status_t code;
|
||||
int spawned;
|
||||
int rank;
|
||||
int nprocs;
|
||||
char value[1024];
|
||||
|
||||
/* init us and declare we are a test programming model */
|
||||
PMIX_INFO_CREATE(iptr, 2);
|
||||
PMIX_INFO_LOAD(&iptr[0], PMIX_PROGRAMMING_MODEL, "TEST", PMIX_STRING);
|
||||
PMIX_INFO_LOAD(&iptr[1], PMIX_MODEL_LIBRARY_NAME, "PMIX", PMIX_STRING);
|
||||
if (PMIX_SUCCESS != (rc = PMIx_Init(&myproc, iptr, 2))) {
|
||||
pmix_output(0, "Client ns %s rank %d: PMIx_Init failed: %s",
|
||||
myproc.nspace, myproc.rank, PMIx_Error_string(rc));
|
||||
fprintf(stderr, "Client calling init\n");
|
||||
if (PMI_SUCCESS != (rc = PMI_Init(&spawned))) {
|
||||
fprintf(stderr, "Client PMI_Init failed: %d\n", rc);
|
||||
exit(rc);
|
||||
}
|
||||
PMIX_INFO_FREE(iptr, 2);
|
||||
pmix_output(0, "Client ns %s rank %d: Running", myproc.nspace, myproc.rank);
|
||||
fprintf(stderr, "Client Running\n");
|
||||
|
||||
/* test something */
|
||||
(void)strncpy(proc.nspace, myproc.nspace, PMIX_MAX_NSLEN);
|
||||
proc.rank = PMIX_RANK_WILDCARD;
|
||||
if (PMIX_SUCCESS != (rc = PMIx_Get(&proc, PMIX_JOB_SIZE, NULL, 0, &val))) {
|
||||
pmix_output(0, "Client ns %s rank %d: PMIx_Get failed: %s",
|
||||
myproc.nspace, myproc.rank, PMIx_Error_string(rc));
|
||||
if (PMI_SUCCESS != (rc = PMI_Get_rank(&rank))) {
|
||||
fprintf(stderr, "Client PMI_Get_rank failed: %d\n", rc);
|
||||
exit(rc);
|
||||
}
|
||||
nprocs = val->data .uint32;
|
||||
PMIX_VALUE_RELEASE(val);
|
||||
pmix_output(0, "Client %s:%d universe size %d", myproc.nspace, myproc.rank, nprocs);
|
||||
|
||||
/* register a handler specifically for when models declare */
|
||||
active = true;
|
||||
ninfo = 1;
|
||||
PMIX_INFO_CREATE(iptr, ninfo);
|
||||
PMIX_INFO_LOAD(&iptr[0], PMIX_EVENT_HDLR_NAME, "SIMPCLIENT-MODEL", PMIX_STRING);
|
||||
code = PMIX_MODEL_DECLARED;
|
||||
PMIx_Register_event_handler(&code, 1, iptr, ninfo,
|
||||
model_callback, model_registration_callback, (void*)&active);
|
||||
while (active) {
|
||||
usleep(10);
|
||||
if (PMI_SUCCESS != (rc = PMI_Get_universe_size(&nprocs))) {
|
||||
fprintf(stderr, "Client %d: PMI_Get_universe_size failed: %d\n", rank, rc);
|
||||
exit(rc);
|
||||
}
|
||||
PMIX_INFO_FREE(iptr, ninfo);
|
||||
fprintf(stderr, "Client %d job size %d\n", rank, nprocs);
|
||||
|
||||
/* register our errhandler */
|
||||
active = true;
|
||||
PMIx_Register_event_handler(NULL, 0, NULL, 0,
|
||||
notification_fn, errhandler_reg_callbk, (void*)&active);
|
||||
while (active) {
|
||||
usleep(10);
|
||||
for (j=0; j < 10; j++) {
|
||||
(void)asprintf(&tmp, "%d-gasnet-0-%d", rank, j);
|
||||
if (PMI_SUCCESS != (rc = PMI_KVS_Put("foobar", tmp, "myvalue"))) {
|
||||
fprintf(stderr, "Client %d: j %d PMI_KVS_Put failed: %d\n",
|
||||
rank, j, rc);
|
||||
goto done;
|
||||
}
|
||||
free(tmp);
|
||||
}
|
||||
|
||||
memset(&info, 0, sizeof(pmix_info_t));
|
||||
(void)strncpy(info.key, PMIX_COLLECT_DATA, PMIX_MAX_KEYLEN);
|
||||
info.value.type = PMIX_UNDEF;
|
||||
info.value.data.flag = 1;
|
||||
if (PMIX_SUCCESS != (rc = PMI_KVS_Commit("foobar"))) {
|
||||
fprintf(stderr, "Client %d: PMI_KVS_Commit failed: %d\n", rank, rc);
|
||||
goto done;
|
||||
}
|
||||
|
||||
for (cnt=0; cnt < MAXCNT; cnt++) {
|
||||
pmix_output(0, "EXECUTING LOOP %d", cnt);
|
||||
for (j=0; j < 10; j++) {
|
||||
(void)asprintf(&tmp, "%s-%d-gasnet-%d-%d", myproc.nspace, myproc.rank, cnt, j);
|
||||
value.type = PMIX_UINT64;
|
||||
value.data.uint64 = 1234;
|
||||
if (PMIX_SUCCESS != (rc = PMIx_Put(PMIX_GLOBAL, tmp, &value))) {
|
||||
pmix_output(0, "Client ns %s rank %d: PMIx_Put failed: %s",
|
||||
myproc.nspace, myproc.rank, PMIx_Error_string(rc));
|
||||
goto done;
|
||||
fprintf(stderr, "Client rank %d: CALLING PMI_Barrier\n", rank);
|
||||
|
||||
/* call fence to ensure the data is received */
|
||||
if (PMI_SUCCESS != (rc = PMI_Barrier())) {
|
||||
fprintf(stderr, "Client %d: PMI_Barrier failed: %d\n", rank, rc);
|
||||
goto done;
|
||||
}
|
||||
|
||||
/* check the returned data */
|
||||
for (j=0; j < 10; j++) {
|
||||
for (n=0; n < nprocs; n++) {
|
||||
(void)asprintf(&tmp, "%d-gasnet-0-%d", n, j);
|
||||
fprintf(stderr, "Client %d: Calling get\n", rank);
|
||||
if (PMI_SUCCESS != (rc = PMI_KVS_Get("foobar", tmp, value, 1024))) {
|
||||
fprintf(stderr, "Client %d: PMI_Get failed: %d\n", rank, rc);
|
||||
continue;
|
||||
}
|
||||
if (0 == strcmp(value, "myvalue")) {
|
||||
fprintf(stderr, "Client %d: PMI_Get returned correct value\n", rank);
|
||||
} else {
|
||||
fprintf(stderr, "Client %d: PMI_Get returned incorrect value\n", rank);
|
||||
}
|
||||
free(tmp);
|
||||
}
|
||||
|
||||
if (PMIX_SUCCESS != (rc = PMIx_Commit())) {
|
||||
pmix_output(0, "Client ns %s rank %d cnt %d: PMIx_Commit failed: %s",
|
||||
myproc.nspace, myproc.rank, cnt, PMIx_Error_string(rc));
|
||||
goto done;
|
||||
}
|
||||
|
||||
/* call fence to ensure the data is received */
|
||||
if (PMIX_SUCCESS != (rc = PMIx_Fence(NULL, 0, &info, 1))) {
|
||||
pmix_output(0, "Client ns %s rank %d cnt %d: PMIx_Fence failed: %s",
|
||||
myproc.nspace, myproc.rank, cnt, PMIx_Error_string(rc));
|
||||
goto done;
|
||||
}
|
||||
|
||||
/* check the returned data */
|
||||
(void)strncpy(proc.nspace, myproc.nspace, PMIX_MAX_NSLEN);
|
||||
proc.rank = PMIX_RANK_UNDEF;
|
||||
for (j=0; j < 10; j++) {
|
||||
for (n=0; n < nprocs; n++) {
|
||||
(void)asprintf(&tmp, "%s-%d-gasnet-%d-%d", myproc.nspace, n, cnt, j);
|
||||
if (PMIX_SUCCESS != (rc = PMIx_Get(&proc, tmp, NULL, 0, &val))) {
|
||||
pmix_output(0, "Client ns %s rank %d cnt %d: PMIx_Get %s failed: %s",
|
||||
myproc.nspace, myproc.rank, j, tmp, PMIx_Error_string(rc));
|
||||
continue;
|
||||
}
|
||||
if (NULL == val) {
|
||||
pmix_output(0, "Client ns %s rank %d: NULL value returned",
|
||||
myproc.nspace, myproc.rank);
|
||||
break;
|
||||
}
|
||||
if (PMIX_UINT64 != val->type) {
|
||||
pmix_output(0, "Client ns %s rank %d cnt %d: PMIx_Get %s returned wrong type: %d", myproc.nspace, myproc.rank, j, tmp, val->type);
|
||||
PMIX_VALUE_RELEASE(val);
|
||||
free(tmp);
|
||||
continue;
|
||||
}
|
||||
if (1234 != val->data.uint64) {
|
||||
pmix_output(0, "Client ns %s rank %d cnt %d: PMIx_Get %s returned wrong value: %d", myproc.nspace, myproc.rank, j, tmp, (int)val->data.uint64);
|
||||
PMIX_VALUE_RELEASE(val);
|
||||
free(tmp);
|
||||
continue;
|
||||
}
|
||||
pmix_output(0, "Client ns %s rank %d cnt %d: PMIx_Get %s returned correct", myproc.nspace, myproc.rank, j, tmp);
|
||||
PMIX_VALUE_RELEASE(val);
|
||||
free(tmp);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
done:
|
||||
/* finalize us */
|
||||
pmix_output(0, "Client ns %s rank %d: Finalizing", myproc.nspace, myproc.rank);
|
||||
if (PMIX_SUCCESS != (rc = PMIx_Finalize(NULL, 0))) {
|
||||
fprintf(stderr, "Client ns %s rank %d:PMIx_Finalize failed: %s\n",
|
||||
myproc.nspace, myproc.rank, PMIx_Error_string(rc));
|
||||
fprintf(stderr, "Client rank %d: Finalizing\n", rank);
|
||||
if (PMI_SUCCESS != (rc = PMI_Finalize())) {
|
||||
fprintf(stderr, "Client rank %d: finalize failed %d\n", rank, rc);
|
||||
} else {
|
||||
fprintf(stderr, "Client ns %s rank %d:PMIx_Finalize successfully completed\n", myproc.nspace, myproc.rank);
|
||||
fprintf(stderr, "Client %d:PMI_Finalize successfully completed\n", rank);
|
||||
}
|
||||
fflush(stderr);
|
||||
return(rc);
|
||||
|
@ -13,7 +13,7 @@
|
||||
* All rights reserved.
|
||||
* Copyright (c) 2009-2012 Cisco Systems, Inc. All rights reserved.
|
||||
* Copyright (c) 2011 Oak Ridge National Labs. All rights reserved.
|
||||
* Copyright (c) 2013-2017 Intel, Inc. All rights reserved.
|
||||
* Copyright (c) 2013-2019 Intel, Inc. All rights reserved.
|
||||
* Copyright (c) 2015 Mellanox Technologies, Inc. All rights reserved.
|
||||
* $COPYRIGHT$
|
||||
*
|
||||
@ -54,16 +54,17 @@ int main(int argc, char **argv)
|
||||
}
|
||||
pmix_output(0, "Client ns %s rank %d: Running", myproc.nspace, myproc.rank);
|
||||
|
||||
/* get our universe size */
|
||||
/* get our job size */
|
||||
(void)strncpy(proc.nspace, myproc.nspace, PMIX_MAX_NSLEN);
|
||||
proc.rank = PMIX_RANK_WILDCARD;
|
||||
if (PMIX_SUCCESS != (rc = PMIx_Get(&proc, PMIX_UNIV_SIZE, NULL, 0, &val))) {
|
||||
pmix_output(0, "Client ns %s rank %d: PMIx_Get universe size failed: %d", myproc.nspace, myproc.rank, rc);
|
||||
if (PMIX_SUCCESS != (rc = PMIx_Get(&proc, PMIX_JOB_SIZE, NULL, 0, &val))) {
|
||||
pmix_output(0, "Client ns %s rank %d: PMIx_Get job size failed: %s",
|
||||
myproc.nspace, myproc.rank, PMIx_Error_string(rc));
|
||||
goto done;
|
||||
}
|
||||
nprocs = val->data.uint32;
|
||||
PMIX_VALUE_RELEASE(val);
|
||||
pmix_output(0, "Client %s:%d universe size %d", myproc.nspace, myproc.rank, nprocs);
|
||||
pmix_output(0, "Client %s:%d job size %d", myproc.nspace, myproc.rank, nprocs);
|
||||
|
||||
/* call fence to ensure the data is received */
|
||||
PMIX_PROC_CONSTRUCT(&proc);
|
||||
|
@ -13,7 +13,7 @@
|
||||
* All rights reserved.
|
||||
* Copyright (c) 2009-2012 Cisco Systems, Inc. All rights reserved.
|
||||
* Copyright (c) 2011 Oak Ridge National Labs. All rights reserved.
|
||||
* Copyright (c) 2013-2018 Intel, Inc. All rights reserved.
|
||||
* Copyright (c) 2013-2019 Intel, Inc. All rights reserved.
|
||||
* Copyright (c) 2015-2019 Research Organization for Information Science
|
||||
* and Technology (RIST). All rights reserved.
|
||||
* Copyright (c) 2016 IBM Corporation. All rights reserved.
|
||||
@ -38,7 +38,6 @@
|
||||
#include <sys/wait.h>
|
||||
#include <errno.h>
|
||||
#include <signal.h>
|
||||
#include PMIX_EVENT_HEADER
|
||||
|
||||
#if PMIX_HAVE_HWLOC
|
||||
#include <src/hwloc/hwloc-internal.h>
|
||||
@ -230,8 +229,6 @@ static void dlcbfunc(int sd, short flags, void *cbdata)
|
||||
{
|
||||
myxfer_t *x = (myxfer_t*)cbdata;
|
||||
|
||||
pmix_output(0, "INVENTORY READY FOR DELIVERY");
|
||||
|
||||
PMIx_server_deliver_inventory(x->info, x->ninfo, NULL, 0, opcbfunc, (void*)x);
|
||||
}
|
||||
|
||||
@ -245,8 +242,6 @@ static void infocbfunc(pmix_status_t status,
|
||||
myxfer_t *x;
|
||||
size_t n;
|
||||
|
||||
pmix_output(0, "INVENTORY RECEIVED");
|
||||
|
||||
/* we don't have any place to send this, so for test
|
||||
* purposes only, let's push it back down for processing.
|
||||
* Note: it must be thread-shifted first as we are in
|
||||
@ -343,12 +338,14 @@ int main(int argc, char **argv)
|
||||
pmix_info_t *info;
|
||||
size_t ninfo;
|
||||
bool cross_version = false;
|
||||
bool usock = true;
|
||||
bool hwloc = false;
|
||||
#if PMIX_HAVE_HWLOC
|
||||
char *hwloc_file = NULL;
|
||||
#endif
|
||||
mylock_t mylock;
|
||||
pmix_status_t code;
|
||||
sigset_t unblock;
|
||||
|
||||
/* smoke test */
|
||||
if (PMIX_SUCCESS != 0) {
|
||||
@ -378,6 +375,25 @@ int main(int argc, char **argv)
|
||||
/* cross-version test - we will set one child to
|
||||
* run at a different version. Requires -n >= 2 */
|
||||
cross_version = true;
|
||||
usock = false;
|
||||
} else if (0 == strcmp("-u", argv[n])) {
|
||||
/* enable usock */
|
||||
usock = false;
|
||||
#if PMIX_HAVE_HWLOC
|
||||
} else if (0 == strcmp("-hwloc", argv[n]) ||
|
||||
0 == strcmp("--hwloc", argv[n])) {
|
||||
/* test hwloc support */
|
||||
hwloc = true;
|
||||
} else if (0 == strcmp("-hwloc-file", argv[n]) ||
|
||||
0 == strcmp("--hwloc-file", argv[n])) {
|
||||
if (NULL == argv[n+1]) {
|
||||
fprintf(stderr, "The --hwloc-file option requires an argument\n");
|
||||
exit(1);
|
||||
}
|
||||
hwloc_file = strdup(argv[n+1]);
|
||||
hwloc = true;
|
||||
++n;
|
||||
#endif
|
||||
} else if (0 == strcmp("-h", argv[n])) {
|
||||
/* print the options and exit */
|
||||
fprintf(stderr, "usage: simptest <options>\n");
|
||||
@ -393,6 +409,12 @@ int main(int argc, char **argv)
|
||||
if (NULL == executable) {
|
||||
executable = strdup("./simpclient");
|
||||
}
|
||||
/* check for executable existence and permissions */
|
||||
if (0 != access(executable, X_OK)) {
|
||||
fprintf(stderr, "Executable %s not found or missing executable permissions\n", executable);
|
||||
exit(1);
|
||||
}
|
||||
|
||||
if (cross_version && nprocs < 2) {
|
||||
fprintf(stderr, "Cross-version testing requires at least two clients\n");
|
||||
exit(1);
|
||||
@ -407,6 +429,21 @@ int main(int argc, char **argv)
|
||||
|
||||
fprintf(stderr, "Testing version %s\n", PMIx_Get_version());
|
||||
|
||||
/* ensure that SIGCHLD is unblocked as we need to capture it */
|
||||
if (0 != sigemptyset(&unblock)) {
|
||||
fprintf(stderr, "SIGEMPTYSET FAILED\n");
|
||||
exit(1);
|
||||
}
|
||||
if (0 != sigaddset(&unblock, SIGCHLD)) {
|
||||
fprintf(stderr, "SIGADDSET FAILED\n");
|
||||
exit(1);
|
||||
}
|
||||
if (0 != sigprocmask(SIG_UNBLOCK, &unblock, NULL)) {
|
||||
fprintf(stderr, "SIG_UNBLOCK FAILED\n");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
|
||||
/* setup the server library and tell it to support tool connections */
|
||||
#if PMIX_HAVE_HWLOC
|
||||
if (hwloc) {
|
||||
@ -477,9 +514,9 @@ int main(int argc, char **argv)
|
||||
|
||||
/* setup to see sigchld on the forked tests */
|
||||
PMIX_CONSTRUCT(&children, pmix_list_t);
|
||||
event_assign(&handler, pmix_globals.evbase, SIGCHLD,
|
||||
EV_SIGNAL|EV_PERSIST,wait_signal_callback, &handler);
|
||||
event_add(&handler, NULL);
|
||||
pmix_event_assign(&handler, pmix_globals.evbase, SIGCHLD,
|
||||
EV_SIGNAL|EV_PERSIST,wait_signal_callback, &handler);
|
||||
pmix_event_add(&handler, NULL);
|
||||
|
||||
/* we have a single namespace for all clients */
|
||||
atmp = NULL;
|
||||
@ -539,6 +576,9 @@ int main(int argc, char **argv)
|
||||
} else {
|
||||
pmix_setenv("PMIX_MCA_ptl", "usock", true, &client_env);
|
||||
}
|
||||
} else if (!usock) {
|
||||
/* don't disable usock => enable it on client */
|
||||
pmix_setenv("PMIX_MCA_ptl", "usock", true, &client_env);
|
||||
}
|
||||
x = PMIX_NEW(myxfer_t);
|
||||
if (PMIX_SUCCESS != (rc = PMIx_server_register_client(&proc, myuid, mygid,
|
||||
@ -616,6 +656,24 @@ int main(int argc, char **argv)
|
||||
DEBUG_DESTRUCT_LOCK(&globallock);
|
||||
PMIX_INFO_FREE(info, ninfo);
|
||||
|
||||
#if 0
|
||||
fprintf(stderr, "TEST NONDEFAULT NOTIFICATION\n");
|
||||
/* verify that notifications don't recirculate */
|
||||
ninfo = 1;
|
||||
PMIX_INFO_CREATE(info, ninfo);
|
||||
/* mark that it is not to go to any default handlers */
|
||||
PMIX_INFO_LOAD(&info[0], PMIX_EVENT_NON_DEFAULT, NULL, PMIX_BOOL);
|
||||
PMIx_Notify_event(PMIX_ERR_DEBUGGER_RELEASE,
|
||||
&pmix_globals.myid, PMIX_RANGE_LOCAL,
|
||||
info, ninfo, NULL, NULL);
|
||||
PMIX_INFO_FREE(info, ninfo);
|
||||
/* wait a little in case we get notified */
|
||||
for (ninfo=0; ninfo < 100000; ninfo++) {
|
||||
struct timespec t = {0, 100};
|
||||
nanosleep(&t, NULL);
|
||||
}
|
||||
#endif
|
||||
|
||||
done:
|
||||
/* deregister the event handlers */
|
||||
PMIx_Deregister_event_handler(0, NULL, NULL);
|
||||
@ -645,42 +703,132 @@ static void set_namespace(int nprocs, char *ranks, char *nspace,
|
||||
pmix_op_cbfunc_t cbfunc, myxfer_t *x)
|
||||
{
|
||||
char *regex, *ppn;
|
||||
char hostname[PMIX_MAXHOSTNAMELEN];
|
||||
int n, m, k;
|
||||
pmix_info_t *info;
|
||||
pmix_data_array_t *array;
|
||||
|
||||
gethostname(hostname, sizeof(hostname));
|
||||
x->ninfo = 7;
|
||||
x->ninfo = 16 + nprocs;
|
||||
|
||||
PMIX_INFO_CREATE(x->info, x->ninfo);
|
||||
(void)strncpy(x->info[0].key, PMIX_UNIV_SIZE, PMIX_MAX_KEYLEN);
|
||||
x->info[0].value.type = PMIX_UINT32;
|
||||
x->info[0].value.data.uint32 = nprocs;
|
||||
n = 0;
|
||||
|
||||
(void)strncpy(x->info[1].key, PMIX_SPAWNED, PMIX_MAX_KEYLEN);
|
||||
x->info[1].value.type = PMIX_UINT32;
|
||||
x->info[1].value.data.uint32 = 0;
|
||||
PMIx_generate_regex("test000,test001,test002", ®ex);
|
||||
PMIx_generate_ppn("0;1;2", &ppn);
|
||||
|
||||
(void)strncpy(x->info[2].key, PMIX_LOCAL_SIZE, PMIX_MAX_KEYLEN);
|
||||
x->info[2].value.type = PMIX_UINT32;
|
||||
x->info[2].value.data.uint32 = nprocs;
|
||||
(void)strncpy(x->info[n].key, PMIX_NODE_MAP, PMIX_MAX_KEYLEN);
|
||||
x->info[n].value.type = PMIX_STRING;
|
||||
x->info[n].value.data.string = regex;
|
||||
++n;
|
||||
|
||||
(void)strncpy(x->info[3].key, PMIX_LOCAL_PEERS, PMIX_MAX_KEYLEN);
|
||||
x->info[3].value.type = PMIX_STRING;
|
||||
x->info[3].value.data.string = strdup(ranks);
|
||||
/* if we have some empty nodes, then fill their spots */
|
||||
(void)strncpy(x->info[n].key, PMIX_PROC_MAP, PMIX_MAX_KEYLEN);
|
||||
x->info[n].value.type = PMIX_STRING;
|
||||
x->info[n].value.data.string = ppn;
|
||||
++n;
|
||||
|
||||
PMIx_generate_regex(hostname, ®ex);
|
||||
(void)strncpy(x->info[4].key, PMIX_NODE_MAP, PMIX_MAX_KEYLEN);
|
||||
x->info[4].value.type = PMIX_STRING;
|
||||
x->info[4].value.data.string = regex;
|
||||
(void)strncpy(x->info[n].key, PMIX_UNIV_SIZE, PMIX_MAX_KEYLEN);
|
||||
x->info[n].value.type = PMIX_UINT32;
|
||||
x->info[n].value.data.uint32 = nprocs;
|
||||
++n;
|
||||
|
||||
PMIx_generate_ppn(ranks, &ppn);
|
||||
(void)strncpy(x->info[5].key, PMIX_PROC_MAP, PMIX_MAX_KEYLEN);
|
||||
x->info[5].value.type = PMIX_STRING;
|
||||
x->info[5].value.data.string = ppn;
|
||||
(void)strncpy(x->info[n].key, PMIX_SPAWNED, PMIX_MAX_KEYLEN);
|
||||
x->info[n].value.type = PMIX_UINT32;
|
||||
x->info[n].value.data.uint32 = 0;
|
||||
++n;
|
||||
|
||||
(void)strncpy(x->info[6].key, PMIX_JOB_SIZE, PMIX_MAX_KEYLEN);
|
||||
x->info[6].value.type = PMIX_UINT32;
|
||||
x->info[6].value.data.uint32 = nprocs;
|
||||
(void)strncpy(x->info[n].key, PMIX_LOCAL_SIZE, PMIX_MAX_KEYLEN);
|
||||
x->info[n].value.type = PMIX_UINT32;
|
||||
x->info[n].value.data.uint32 = nprocs;
|
||||
++n;
|
||||
|
||||
(void)strncpy(x->info[n].key, PMIX_LOCAL_PEERS, PMIX_MAX_KEYLEN);
|
||||
x->info[n].value.type = PMIX_STRING;
|
||||
x->info[n].value.data.string = strdup(ranks);
|
||||
++n;
|
||||
|
||||
(void)strncpy(x->info[n].key, PMIX_JOB_SIZE, PMIX_MAX_KEYLEN);
|
||||
x->info[n].value.type = PMIX_UINT32;
|
||||
x->info[n].value.data.uint32 = nprocs;
|
||||
++n;
|
||||
|
||||
(void)strncpy(x->info[n].key, PMIX_JOBID, PMIX_MAX_KEYLEN);
|
||||
x->info[n].value.type = PMIX_STRING;
|
||||
x->info[n].value.data.string = strdup("1234");
|
||||
++n;
|
||||
|
||||
(void)strncpy(x->info[n].key, PMIX_NPROC_OFFSET, PMIX_MAX_KEYLEN);
|
||||
x->info[n].value.type = PMIX_UINT32;
|
||||
x->info[n].value.data.uint32 = 0;
|
||||
++n;
|
||||
|
||||
(void)strncpy(x->info[n].key, PMIX_NODEID, PMIX_MAX_KEYLEN);
|
||||
x->info[n].value.type = PMIX_UINT32;
|
||||
x->info[n].value.data.uint32 = 0;
|
||||
++n;
|
||||
|
||||
(void)strncpy(x->info[n].key, PMIX_NODE_SIZE, PMIX_MAX_KEYLEN);
|
||||
x->info[n].value.type = PMIX_UINT32;
|
||||
x->info[n].value.data.uint32 = nprocs;
|
||||
++n;
|
||||
|
||||
(void)strncpy(x->info[n].key, PMIX_NUM_NODES, PMIX_MAX_KEYLEN);
|
||||
x->info[n].value.type = PMIX_UINT32;
|
||||
x->info[n].value.data.uint32 = 1;
|
||||
++n;
|
||||
|
||||
(void)strncpy(x->info[n].key, PMIX_UNIV_SIZE, PMIX_MAX_KEYLEN);
|
||||
x->info[n].value.type = PMIX_UINT32;
|
||||
x->info[n].value.data.uint32 = nprocs;
|
||||
++n;
|
||||
|
||||
(void)strncpy(x->info[n].key, PMIX_MAX_PROCS, PMIX_MAX_KEYLEN);
|
||||
x->info[n].value.type = PMIX_UINT32;
|
||||
x->info[n].value.data.uint32 = nprocs;
|
||||
++n;
|
||||
|
||||
(void)strncpy(x->info[n].key, PMIX_JOB_NUM_APPS, PMIX_MAX_KEYLEN);
|
||||
x->info[n].value.type = PMIX_UINT32;
|
||||
x->info[n].value.data.uint32 = 1;
|
||||
++n;
|
||||
|
||||
(void)strncpy(x->info[n].key, PMIX_LOCALLDR, PMIX_MAX_KEYLEN);
|
||||
x->info[n].value.type = PMIX_PROC_RANK;
|
||||
x->info[n].value.data.uint32 = 0;
|
||||
++n;
|
||||
|
||||
/* add the proc-specific data */
|
||||
for (m=0; m < nprocs; m++) {
|
||||
(void)strncpy(x->info[n].key, PMIX_PROC_DATA, PMIX_MAX_KEYLEN);
|
||||
x->info[n].value.type = PMIX_DATA_ARRAY;
|
||||
PMIX_DATA_ARRAY_CREATE(array, 5, PMIX_INFO);
|
||||
x->info[n].value.data.darray = array;
|
||||
info = (pmix_info_t*)array->array;
|
||||
k = 0;
|
||||
(void)strncpy(info[k].key, PMIX_RANK, PMIX_MAX_KEYLEN);
|
||||
info[k].value.type = PMIX_PROC_RANK;
|
||||
info[k].value.data.rank = m;
|
||||
++k;
|
||||
(void)strncpy(info[k].key, PMIX_GLOBAL_RANK, PMIX_MAX_KEYLEN);
|
||||
info[k].value.type = PMIX_PROC_RANK;
|
||||
info[k].value.data.rank = m;
|
||||
++k;
|
||||
(void)strncpy(info[k].key, PMIX_LOCAL_RANK, PMIX_MAX_KEYLEN);
|
||||
info[k].value.type = PMIX_UINT16;
|
||||
info[k].value.data.uint16 = m;
|
||||
++k;
|
||||
|
||||
(void)strncpy(info[k].key, PMIX_NODE_RANK, PMIX_MAX_KEYLEN);
|
||||
info[k].value.type = PMIX_UINT16;
|
||||
info[k].value.data.uint16 = m;
|
||||
++k;
|
||||
|
||||
(void)strncpy(info[k].key, PMIX_NODEID, PMIX_MAX_KEYLEN);
|
||||
info[k].value.type = PMIX_UINT32;
|
||||
info[k].value.data.uint32 = 0;
|
||||
++k;
|
||||
/* move to next proc */
|
||||
++n;
|
||||
}
|
||||
PMIx_server_register_nspace(nspace, nprocs, x->info, x->ninfo,
|
||||
cbfunc, x);
|
||||
}
|
||||
@ -694,6 +842,12 @@ static void errhandler(size_t evhdlr_registration_id,
|
||||
void *cbdata)
|
||||
{
|
||||
pmix_output(0, "SERVER: ERRHANDLER CALLED WITH STATUS %d", status);
|
||||
/* we must NOT tell the event handler state machine that we
|
||||
* are the last step as that will prevent it from notifying
|
||||
* anyone else that might be listening for declarations */
|
||||
if (NULL != cbfunc) {
|
||||
cbfunc(PMIX_SUCCESS, NULL, 0, NULL, NULL, cbdata);
|
||||
}
|
||||
}
|
||||
|
||||
static void errhandler_reg_callbk (pmix_status_t status,
|
||||
@ -702,8 +856,6 @@ static void errhandler_reg_callbk (pmix_status_t status,
|
||||
{
|
||||
mylock_t *lock = (mylock_t*)cbdata;
|
||||
|
||||
pmix_output(0, "SERVER: ERRHANDLER REGISTRATION CALLBACK CALLED WITH STATUS %d, ref=%lu",
|
||||
status, (unsigned long)errhandler_ref);
|
||||
lock->status = status;
|
||||
DEBUG_WAKEUP_THREAD(lock);
|
||||
}
|
||||
@ -716,8 +868,6 @@ static pmix_status_t connected(const pmix_proc_t *proc, void *server_object,
|
||||
static pmix_status_t finalized(const pmix_proc_t *proc, void *server_object,
|
||||
pmix_op_cbfunc_t cbfunc, void *cbdata)
|
||||
{
|
||||
pmix_output(0, "SERVER: FINALIZED %s:%d WAKEUP %d",
|
||||
proc->nspace, proc->rank, wakeup);
|
||||
return PMIX_OPERATION_SUCCEEDED;
|
||||
}
|
||||
|
||||
@ -793,7 +943,6 @@ static pmix_status_t fencenb_fn(const pmix_proc_t procs[], size_t nprocs,
|
||||
{
|
||||
pmix_shift_caddy_t *scd;
|
||||
|
||||
pmix_output(0, "SERVER: FENCENB");
|
||||
scd = PMIX_NEW(pmix_shift_caddy_t);
|
||||
scd->status = PMIX_SUCCESS;
|
||||
scd->data = data;
|
||||
@ -811,8 +960,6 @@ static pmix_status_t dmodex_fn(const pmix_proc_t *proc,
|
||||
{
|
||||
pmix_shift_caddy_t *scd;
|
||||
|
||||
pmix_output(0, "SERVER: DMODEX");
|
||||
|
||||
/* if this is a timeout test, then do nothing */
|
||||
if (istimeouttest) {
|
||||
return PMIX_SUCCESS;
|
||||
@ -835,8 +982,6 @@ static pmix_status_t publish_fn(const pmix_proc_t *proc,
|
||||
pmix_locdat_t *p;
|
||||
size_t n;
|
||||
|
||||
pmix_output(0, "SERVER: PUBLISH");
|
||||
|
||||
for (n=0; n < ninfo; n++) {
|
||||
p = PMIX_NEW(pmix_locdat_t);
|
||||
(void)strncpy(p->pdata.proc.nspace, proc->nspace, PMIX_MAX_NSLEN);
|
||||
@ -877,8 +1022,6 @@ static pmix_status_t lookup_fn(const pmix_proc_t *proc, char **keys,
|
||||
pmix_status_t ret = PMIX_ERR_NOT_FOUND;
|
||||
lkobj_t *lk;
|
||||
|
||||
pmix_output(0, "SERVER: LOOKUP");
|
||||
|
||||
PMIX_CONSTRUCT(&results, pmix_list_t);
|
||||
|
||||
for (n=0; NULL != keys[n]; n++) {
|
||||
@ -928,8 +1071,6 @@ static pmix_status_t unpublish_fn(const pmix_proc_t *proc, char **keys,
|
||||
pmix_locdat_t *p, *p2;
|
||||
size_t n;
|
||||
|
||||
pmix_output(0, "SERVER: UNPUBLISH");
|
||||
|
||||
for (n=0; NULL != keys[n]; n++) {
|
||||
PMIX_LIST_FOREACH_SAFE(p, p2, &pubdata, pmix_locdat_t) {
|
||||
if (0 == strncmp(keys[n], p->pdata.key, PMIX_MAX_KEYLEN)) {
|
||||
@ -961,8 +1102,6 @@ static pmix_status_t spawn_fn(const pmix_proc_t *proc,
|
||||
pmix_proc_t *pptr;
|
||||
bool spawned;
|
||||
|
||||
pmix_output(0, "SERVER: SPAWN");
|
||||
|
||||
/* check the job info for parent and spawned keys */
|
||||
for (n=0; n < ninfo; n++) {
|
||||
if (0 == strncmp(job_info[n].key, PMIX_PARENT_ID, PMIX_MAX_KEYLEN)) {
|
||||
@ -996,8 +1135,6 @@ static pmix_status_t connect_fn(const pmix_proc_t procs[], size_t nprocs,
|
||||
const pmix_info_t info[], size_t ninfo,
|
||||
pmix_op_cbfunc_t cbfunc, void *cbdata)
|
||||
{
|
||||
pmix_output(0, "SERVER: CONNECT");
|
||||
|
||||
/* in practice, we would pass this request to the local
|
||||
* resource manager for handling */
|
||||
|
||||
@ -1011,8 +1148,6 @@ static pmix_status_t disconnect_fn(const pmix_proc_t procs[], size_t nprocs,
|
||||
const pmix_info_t info[], size_t ninfo,
|
||||
pmix_op_cbfunc_t cbfunc, void *cbdata)
|
||||
{
|
||||
pmix_output(0, "SERVER: DISCONNECT");
|
||||
|
||||
return PMIX_OPERATION_SUCCEEDED;
|
||||
}
|
||||
|
||||
@ -1035,7 +1170,6 @@ static pmix_status_t notify_event(pmix_status_t code,
|
||||
pmix_info_t info[], size_t ninfo,
|
||||
pmix_op_cbfunc_t cbfunc, void *cbdata)
|
||||
{
|
||||
pmix_output(0, "SERVER: NOTIFY EVENT");
|
||||
return PMIX_OPERATION_SUCCEEDED;
|
||||
}
|
||||
|
||||
@ -1064,8 +1198,6 @@ static pmix_status_t query_fn(pmix_proc_t *proct,
|
||||
pmix_info_t *info;
|
||||
query_data_t qd;
|
||||
|
||||
pmix_output(0, "SERVER: QUERY");
|
||||
|
||||
if (NULL == cbfunc) {
|
||||
return PMIX_ERROR;
|
||||
}
|
||||
@ -1093,8 +1225,6 @@ static void tool_connect_fn(pmix_info_t *info, size_t ninfo,
|
||||
{
|
||||
pmix_proc_t proc;
|
||||
|
||||
pmix_output(0, "SERVER: TOOL CONNECT");
|
||||
|
||||
/* just pass back an arbitrary nspace */
|
||||
(void)strncpy(proc.nspace, "TOOL", PMIX_MAX_NSLEN);
|
||||
proc.rank = 0;
|
||||
@ -1122,8 +1252,6 @@ static void log_fn(const pmix_proc_t *client,
|
||||
{
|
||||
mylog_t *lg = (mylog_t *)malloc(sizeof(mylog_t));
|
||||
|
||||
pmix_output(0, "SERVER: LOG");
|
||||
|
||||
lg->cbfunc = cbfunc;
|
||||
lg->cbdata = cbdata;
|
||||
PMIX_THREADSHIFT(lg, foobar);
|
||||
@ -1161,7 +1289,7 @@ static void wait_signal_callback(int fd, short event, void *arg)
|
||||
pid_t pid;
|
||||
wait_tracker_t *t2;
|
||||
|
||||
if (SIGCHLD != event_get_signal(sig)) {
|
||||
if (SIGCHLD != pmix_event_get_signal(sig)) {
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -13,7 +13,7 @@
|
||||
* All rights reserved.
|
||||
* Copyright (c) 2009-2012 Cisco Systems, Inc. All rights reserved.
|
||||
* Copyright (c) 2011 Oak Ridge National Labs. All rights reserved.
|
||||
* Copyright (c) 2013-2018 Intel, Inc. All rights reserved.
|
||||
* Copyright (c) 2013-2019 Intel, Inc. All rights reserved.
|
||||
* Copyright (c) 2015 Mellanox Technologies, Inc. All rights reserved.
|
||||
* $COPYRIGHT$
|
||||
*
|
||||
@ -103,17 +103,17 @@ int main(int argc, char **argv)
|
||||
usleep(10);
|
||||
}
|
||||
|
||||
/* get our universe size */
|
||||
/* get our job size */
|
||||
(void)strncpy(proc.nspace, myproc.nspace, PMIX_MAX_NSLEN);
|
||||
proc.rank = PMIX_RANK_WILDCARD;
|
||||
if (PMIX_SUCCESS != (rc = PMIx_Get(&proc, PMIX_UNIV_SIZE, NULL, 0, &val))) {
|
||||
pmix_output(0, "Client ns %s rank %d: PMIx_Get universe size failed: %s",
|
||||
if (PMIX_SUCCESS != (rc = PMIx_Get(&proc, PMIX_JOB_SIZE, NULL, 0, &val))) {
|
||||
pmix_output(0, "Client ns %s rank %d: PMIx_Get job size failed: %s",
|
||||
myproc.nspace, myproc.rank, PMIx_Error_string(rc));
|
||||
goto done;
|
||||
}
|
||||
nprocs = val->data.uint32;
|
||||
PMIX_VALUE_RELEASE(val);
|
||||
pmix_output(0, "Client %s:%d universe size %d", myproc.nspace, myproc.rank, nprocs);
|
||||
pmix_output(0, "Client %s:%d job size %d", myproc.nspace, myproc.rank, nprocs);
|
||||
|
||||
/* if we are rank=0, then do a fence with timeout */
|
||||
if (0 == myproc.rank) {
|
||||
|
@ -13,7 +13,7 @@
|
||||
* All rights reserved.
|
||||
* Copyright (c) 2009-2012 Cisco Systems, Inc. All rights reserved.
|
||||
* Copyright (c) 2011 Oak Ridge National Labs. All rights reserved.
|
||||
* Copyright (c) 2013-2018 Intel, Inc. All rights reserved.
|
||||
* Copyright (c) 2013-2019 Intel, Inc. All rights reserved.
|
||||
* Copyright (c) 2015-2018 Research Organization for Information Science
|
||||
* and Technology (RIST). All rights reserved.
|
||||
* Copyright (c) 2016 IBM Corporation. All rights reserved.
|
||||
@ -183,6 +183,8 @@ static pmix_list_t pubdata;
|
||||
static pmix_event_t handler;
|
||||
static pmix_list_t children;
|
||||
static bool istimeouttest = false;
|
||||
static bool nettest = false;
|
||||
static bool arrays = false;
|
||||
|
||||
static void set_namespace(int nprocs, char *ranks, char *nspace,
|
||||
pmix_op_cbfunc_t cbfunc, myxfer_t *x);
|
||||
@ -209,6 +211,32 @@ static void opcbfunc(pmix_status_t status, void *cbdata)
|
||||
DEBUG_WAKEUP_THREAD(&x->lock);
|
||||
}
|
||||
|
||||
static void setup_cbfunc(pmix_status_t status,
|
||||
pmix_info_t info[], size_t ninfo,
|
||||
void *provided_cbdata,
|
||||
pmix_op_cbfunc_t cbfunc, void *cbdata)
|
||||
{
|
||||
myxfer_t *x = (myxfer_t*)provided_cbdata;
|
||||
size_t n;
|
||||
|
||||
/* transfer it to the caddy for return to the main thread */
|
||||
if (0 < ninfo) {
|
||||
PMIX_INFO_CREATE(x->info, ninfo);
|
||||
x->ninfo = ninfo;
|
||||
for (n=0; n < ninfo; n++) {
|
||||
PMIX_INFO_XFER(&x->info[n], &info[n]);
|
||||
}
|
||||
}
|
||||
|
||||
/* let the library release the data and cleanup from
|
||||
* the operation */
|
||||
if (NULL != cbfunc) {
|
||||
cbfunc(PMIX_SUCCESS, cbdata);
|
||||
}
|
||||
|
||||
DEBUG_WAKEUP_THREAD(&x->lock);
|
||||
}
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
char **client_env=NULL;
|
||||
@ -225,6 +253,11 @@ int main(int argc, char **argv)
|
||||
size_t ninfo;
|
||||
mylock_t mylock;
|
||||
int ncycles=1, m, delay=0;
|
||||
bool hwloc = false;
|
||||
#if PMIX_HAVE_HWLOC
|
||||
char *hwloc_file = NULL;
|
||||
#endif
|
||||
sigset_t unblock;
|
||||
|
||||
/* smoke test */
|
||||
if (PMIX_SUCCESS != 0) {
|
||||
@ -260,30 +293,115 @@ int main(int argc, char **argv)
|
||||
0 == strcmp("--sleep", argv[n])) &&
|
||||
NULL != argv[n+1]) {
|
||||
delay = strtol(argv[n+1], NULL, 10);
|
||||
#if PMIX_HAVE_HWLOC
|
||||
} else if (0 == strcmp("-hwloc", argv[n]) ||
|
||||
0 == strcmp("--hwloc", argv[n])) {
|
||||
/* test hwloc support */
|
||||
hwloc = true;
|
||||
} else if (0 == strcmp("-hwloc-file", argv[n]) ||
|
||||
0 == strcmp("--hwloc-file", argv[n])) {
|
||||
if (NULL == argv[n+1]) {
|
||||
fprintf(stderr, "The --hwloc-file option requires an argument\n");
|
||||
exit(1);
|
||||
}
|
||||
hwloc_file = strdup(argv[n+1]);
|
||||
hwloc = true;
|
||||
++n;
|
||||
#endif
|
||||
} else if (0 == strcmp("-h", argv[n])) {
|
||||
/* print the options and exit */
|
||||
fprintf(stderr, "usage: simptest <options>\n");
|
||||
fprintf(stderr, " -n N Number of clients to run\n");
|
||||
fprintf(stderr, " -e foo Name of the client executable to run (default: simpclient\n");
|
||||
fprintf(stderr, " -reps N Cycle for N repetitions");
|
||||
fprintf(stderr, " -hwloc Test hwloc support\n");
|
||||
fprintf(stderr, " -hwloc-file FILE Use file to import topology\n");
|
||||
fprintf(stderr, " -net-test Test network endpt assignments\n");
|
||||
fprintf(stderr, " -arrays Use the job session array to pass registration info\n");
|
||||
exit(0);
|
||||
} else if (0 == strcmp("-net-test", argv[n]) ||
|
||||
0 == strcmp("--net-test", argv[n])) {
|
||||
/* test network support */
|
||||
nettest = true;
|
||||
} else if (0 == strcmp("-arrays", argv[n]) ||
|
||||
0 == strcmp("--arrays", argv[n])) {
|
||||
/* test network support */
|
||||
arrays = true;
|
||||
}
|
||||
}
|
||||
if (NULL == executable) {
|
||||
executable = strdup("./quietclient");
|
||||
if (nettest) {
|
||||
executable = strdup("./simpcoord");
|
||||
} else {
|
||||
executable = strdup("./quietclient");
|
||||
}
|
||||
}
|
||||
/* check for executable existence and permissions */
|
||||
if (0 != access(executable, X_OK)) {
|
||||
fprintf(stderr, "Executable %s not found or missing executable permissions\n", executable);
|
||||
exit(1);
|
||||
}
|
||||
|
||||
/* ensure that SIGCHLD is unblocked as we need to capture it */
|
||||
if (0 != sigemptyset(&unblock)) {
|
||||
fprintf(stderr, "SIGEMPTYSET FAILED\n");
|
||||
exit(1);
|
||||
}
|
||||
if (0 != sigaddset(&unblock, SIGCHLD)) {
|
||||
fprintf(stderr, "SIGADDSET FAILED\n");
|
||||
exit(1);
|
||||
}
|
||||
if (0 != sigprocmask(SIG_UNBLOCK, &unblock, NULL)) {
|
||||
fprintf(stderr, "SIG_UNBLOCK FAILED\n");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
/* setup the server library and tell it to support tool connections */
|
||||
#if PMIX_HAVE_HWLOC
|
||||
if (hwloc) {
|
||||
#if HWLOC_API_VERSION < 0x20000
|
||||
ninfo = 4;
|
||||
#else
|
||||
ninfo = 5;
|
||||
#endif
|
||||
} else {
|
||||
ninfo = 4;
|
||||
}
|
||||
#else
|
||||
ninfo = 3;
|
||||
#endif
|
||||
|
||||
PMIX_INFO_CREATE(info, ninfo);
|
||||
PMIX_INFO_LOAD(&info[0], PMIX_SERVER_TOOL_SUPPORT, NULL, PMIX_BOOL);
|
||||
PMIX_INFO_LOAD(&info[1], PMIX_USOCK_DISABLE, NULL, PMIX_BOOL);
|
||||
PMIX_INFO_LOAD(&info[2], PMIX_SERVER_GATEWAY, NULL, PMIX_BOOL);
|
||||
#if PMIX_HAVE_HWLOC
|
||||
if (hwloc) {
|
||||
if (NULL != hwloc_file) {
|
||||
PMIX_INFO_LOAD(&info[3], PMIX_TOPOLOGY_FILE, hwloc_file, PMIX_STRING);
|
||||
} else {
|
||||
PMIX_INFO_LOAD(&info[3], PMIX_TOPOLOGY, NULL, PMIX_STRING);
|
||||
}
|
||||
#if HWLOC_API_VERSION >= 0x20000
|
||||
PMIX_INFO_LOAD(&info[4], PMIX_HWLOC_SHARE_TOPO, NULL, PMIX_BOOL);
|
||||
#endif
|
||||
}
|
||||
#endif
|
||||
if (nettest) {
|
||||
/* set a known network configuration for the pnet/test component */
|
||||
putenv("PMIX_MCA_pnet_test_nverts=nodes:5;plane:d:3;plane:s:2;plane:d:5");
|
||||
putenv("PMIX_MCA_pnet=test");
|
||||
}
|
||||
|
||||
if (PMIX_SUCCESS != (rc = PMIx_server_init(&mymodule, info, ninfo))) {
|
||||
fprintf(stderr, "Init failed with error %d\n", rc);
|
||||
return rc;
|
||||
}
|
||||
PMIX_INFO_FREE(info, ninfo);
|
||||
if (nettest) {
|
||||
unsetenv("PMIX_MCA_pnet");
|
||||
unsetenv("PMIX_MCA_pnet_test_nverts");
|
||||
}
|
||||
|
||||
/* register the default errhandler */
|
||||
DEBUG_CONSTRUCT_LOCK(&mylock);
|
||||
@ -304,9 +422,9 @@ int main(int argc, char **argv)
|
||||
|
||||
/* setup to see sigchld on the forked tests */
|
||||
PMIX_CONSTRUCT(&children, pmix_list_t);
|
||||
event_assign(&handler, pmix_globals.evbase, SIGCHLD,
|
||||
EV_SIGNAL|EV_PERSIST,wait_signal_callback, &handler);
|
||||
event_add(&handler, NULL);
|
||||
pmix_event_assign(&handler, pmix_globals.evbase, SIGCHLD,
|
||||
EV_SIGNAL|EV_PERSIST,wait_signal_callback, &handler);
|
||||
pmix_event_add(&handler, NULL);
|
||||
|
||||
for (m=0; m < ncycles; m++) {
|
||||
fprintf(stderr, "Running cycle %d\n", m);
|
||||
@ -445,43 +563,186 @@ int main(int argc, char **argv)
|
||||
static void set_namespace(int nprocs, char *ranks, char *nspace,
|
||||
pmix_op_cbfunc_t cbfunc, myxfer_t *x)
|
||||
{
|
||||
char *regex, *ppn;
|
||||
char hostname[PMIX_MAXHOSTNAMELEN];
|
||||
char *regex, *ppn, *rks;
|
||||
int n, m, k;
|
||||
pmix_data_array_t *array;
|
||||
pmix_info_t *info, *iptr, *ip;
|
||||
myxfer_t cd, lock;
|
||||
pmix_status_t rc;
|
||||
|
||||
gethostname(hostname, sizeof(hostname));
|
||||
x->ninfo = 7;
|
||||
if (arrays) {
|
||||
x->ninfo = 15 + nprocs;
|
||||
} else {
|
||||
x->ninfo = 16 + nprocs;
|
||||
}
|
||||
|
||||
PMIX_INFO_CREATE(x->info, x->ninfo);
|
||||
(void)strncpy(x->info[0].key, PMIX_UNIV_SIZE, PMIX_MAX_KEYLEN);
|
||||
x->info[0].value.type = PMIX_UINT32;
|
||||
x->info[0].value.data.uint32 = nprocs;
|
||||
n = 0;
|
||||
|
||||
(void)strncpy(x->info[1].key, PMIX_SPAWNED, PMIX_MAX_KEYLEN);
|
||||
x->info[1].value.type = PMIX_UINT32;
|
||||
x->info[1].value.data.uint32 = 0;
|
||||
PMIx_generate_regex("test000,test001,test002", ®ex);
|
||||
PMIx_generate_ppn("0;1;2", &ppn);
|
||||
|
||||
(void)strncpy(x->info[2].key, PMIX_LOCAL_SIZE, PMIX_MAX_KEYLEN);
|
||||
x->info[2].value.type = PMIX_UINT32;
|
||||
x->info[2].value.data.uint32 = nprocs;
|
||||
if (arrays) {
|
||||
(void)strncpy(x->info[n].key, PMIX_JOB_INFO_ARRAY, PMIX_MAX_KEYLEN);
|
||||
x->info[n].value.type = PMIX_DATA_ARRAY;
|
||||
PMIX_DATA_ARRAY_CREATE(x->info[n].value.data.darray, 2, PMIX_INFO);
|
||||
iptr = (pmix_info_t*)x->info[n].value.data.darray->array;
|
||||
(void)strncpy(iptr[0].key, PMIX_NODE_MAP, PMIX_MAX_KEYLEN);
|
||||
iptr[0].value.type = PMIX_STRING;
|
||||
iptr[0].value.data.string = regex;
|
||||
(void)strncpy(iptr[1].key, PMIX_PROC_MAP, PMIX_MAX_KEYLEN);
|
||||
iptr[1].value.type = PMIX_STRING;
|
||||
iptr[1].value.data.string = ppn;
|
||||
++n;
|
||||
} else {
|
||||
(void)strncpy(x->info[n].key, PMIX_NODE_MAP, PMIX_MAX_KEYLEN);
|
||||
x->info[n].value.type = PMIX_STRING;
|
||||
x->info[n].value.data.string = regex;
|
||||
++n;
|
||||
|
||||
(void)strncpy(x->info[3].key, PMIX_LOCAL_PEERS, PMIX_MAX_KEYLEN);
|
||||
x->info[3].value.type = PMIX_STRING;
|
||||
x->info[3].value.data.string = strdup(ranks);
|
||||
/* if we have some empty nodes, then fill their spots */
|
||||
(void)strncpy(x->info[n].key, PMIX_PROC_MAP, PMIX_MAX_KEYLEN);
|
||||
x->info[n].value.type = PMIX_STRING;
|
||||
x->info[n].value.data.string = ppn;
|
||||
++n;
|
||||
}
|
||||
|
||||
PMIx_generate_regex(hostname, ®ex);
|
||||
(void)strncpy(x->info[4].key, PMIX_NODE_MAP, PMIX_MAX_KEYLEN);
|
||||
x->info[4].value.type = PMIX_STRING;
|
||||
x->info[4].value.data.string = regex;
|
||||
/* we have the required info to run setup_app, so do that now */
|
||||
PMIX_INFO_CREATE(iptr, 4);
|
||||
PMIX_INFO_XFER(&iptr[0], &x->info[0]);
|
||||
PMIX_INFO_XFER(&iptr[1], &x->info[1]);
|
||||
PMIX_INFO_LOAD(&iptr[2], PMIX_SETUP_APP_ENVARS, NULL, PMIX_BOOL);
|
||||
PMIX_LOAD_KEY(iptr[3].key, PMIX_ALLOC_NETWORK);
|
||||
iptr[3].value.type = PMIX_DATA_ARRAY;
|
||||
PMIX_DATA_ARRAY_CREATE(iptr[3].value.data.darray, 2, PMIX_INFO);
|
||||
ip = (pmix_info_t*)iptr[3].value.data.darray->array;
|
||||
asprintf(&rks, "%s.net", nspace);
|
||||
PMIX_INFO_LOAD(&ip[0], PMIX_ALLOC_NETWORK_ID, rks, PMIX_STRING);
|
||||
free(rks);
|
||||
PMIX_INFO_LOAD(&ip[1], PMIX_ALLOC_NETWORK_SEC_KEY, NULL, PMIX_BOOL);
|
||||
PMIX_CONSTRUCT(&cd, myxfer_t);
|
||||
if (PMIX_SUCCESS != (rc = PMIx_server_setup_application(nspace, iptr, 4,
|
||||
setup_cbfunc, &cd))) {
|
||||
pmix_output(0, "[%s:%d] PMIx_server_setup_application failed: %s", __FILE__, __LINE__, PMIx_Error_string(rc));
|
||||
DEBUG_DESTRUCT_LOCK(&cd.lock);
|
||||
} else {
|
||||
DEBUG_WAIT_THREAD(&cd.lock);
|
||||
}
|
||||
|
||||
PMIx_generate_ppn(ranks, &ppn);
|
||||
(void)strncpy(x->info[5].key, PMIX_PROC_MAP, PMIX_MAX_KEYLEN);
|
||||
x->info[5].value.type = PMIX_STRING;
|
||||
x->info[5].value.data.string = ppn;
|
||||
/* use the results to setup the local subsystems */
|
||||
PMIX_CONSTRUCT(&lock, myxfer_t);
|
||||
if (PMIX_SUCCESS != (rc = PMIx_server_setup_local_support(nspace, cd.info, cd.ninfo,
|
||||
opcbfunc, &lock))) {
|
||||
pmix_output(0, "[%s:%d] PMIx_server_setup_local_support failed: %s", __FILE__, __LINE__, PMIx_Error_string(rc));
|
||||
} else {
|
||||
DEBUG_WAIT_THREAD(&lock.lock);
|
||||
}
|
||||
PMIX_DESTRUCT(&lock);
|
||||
PMIX_DESTRUCT(&cd);
|
||||
|
||||
(void)strncpy(x->info[6].key, PMIX_JOB_SIZE, PMIX_MAX_KEYLEN);
|
||||
x->info[6].value.type = PMIX_UINT32;
|
||||
x->info[6].value.data.uint32 = nprocs;
|
||||
(void)strncpy(x->info[n].key, PMIX_UNIV_SIZE, PMIX_MAX_KEYLEN);
|
||||
x->info[n].value.type = PMIX_UINT32;
|
||||
x->info[n].value.data.uint32 = nprocs;
|
||||
++n;
|
||||
|
||||
(void)strncpy(x->info[n].key, PMIX_SPAWNED, PMIX_MAX_KEYLEN);
|
||||
x->info[n].value.type = PMIX_UINT32;
|
||||
x->info[n].value.data.uint32 = 0;
|
||||
++n;
|
||||
|
||||
(void)strncpy(x->info[n].key, PMIX_LOCAL_SIZE, PMIX_MAX_KEYLEN);
|
||||
x->info[n].value.type = PMIX_UINT32;
|
||||
x->info[n].value.data.uint32 = nprocs;
|
||||
++n;
|
||||
|
||||
(void)strncpy(x->info[n].key, PMIX_LOCAL_PEERS, PMIX_MAX_KEYLEN);
|
||||
x->info[n].value.type = PMIX_STRING;
|
||||
x->info[n].value.data.string = strdup(ranks);
|
||||
++n;
|
||||
|
||||
(void)strncpy(x->info[n].key, PMIX_JOB_SIZE, PMIX_MAX_KEYLEN);
|
||||
x->info[n].value.type = PMIX_UINT32;
|
||||
x->info[n].value.data.uint32 = nprocs;
|
||||
++n;
|
||||
|
||||
(void)strncpy(x->info[n].key, PMIX_JOBID, PMIX_MAX_KEYLEN);
|
||||
x->info[n].value.type = PMIX_STRING;
|
||||
x->info[n].value.data.string = strdup("1234");
|
||||
++n;
|
||||
|
||||
(void)strncpy(x->info[n].key, PMIX_NPROC_OFFSET, PMIX_MAX_KEYLEN);
|
||||
x->info[n].value.type = PMIX_UINT32;
|
||||
x->info[n].value.data.uint32 = 0;
|
||||
++n;
|
||||
|
||||
(void)strncpy(x->info[n].key, PMIX_NODEID, PMIX_MAX_KEYLEN);
|
||||
x->info[n].value.type = PMIX_UINT32;
|
||||
x->info[n].value.data.uint32 = 0;
|
||||
++n;
|
||||
|
||||
(void)strncpy(x->info[n].key, PMIX_NODE_SIZE, PMIX_MAX_KEYLEN);
|
||||
x->info[n].value.type = PMIX_UINT32;
|
||||
x->info[n].value.data.uint32 = nprocs;
|
||||
++n;
|
||||
|
||||
(void)strncpy(x->info[n].key, PMIX_NUM_NODES, PMIX_MAX_KEYLEN);
|
||||
x->info[n].value.type = PMIX_UINT32;
|
||||
x->info[n].value.data.uint32 = 1;
|
||||
++n;
|
||||
|
||||
(void)strncpy(x->info[n].key, PMIX_UNIV_SIZE, PMIX_MAX_KEYLEN);
|
||||
x->info[n].value.type = PMIX_UINT32;
|
||||
x->info[n].value.data.uint32 = nprocs;
|
||||
++n;
|
||||
|
||||
(void)strncpy(x->info[n].key, PMIX_MAX_PROCS, PMIX_MAX_KEYLEN);
|
||||
x->info[n].value.type = PMIX_UINT32;
|
||||
x->info[n].value.data.uint32 = nprocs;
|
||||
++n;
|
||||
|
||||
(void)strncpy(x->info[n].key, PMIX_JOB_NUM_APPS, PMIX_MAX_KEYLEN);
|
||||
x->info[n].value.type = PMIX_UINT32;
|
||||
x->info[n].value.data.uint32 = 1;
|
||||
++n;
|
||||
|
||||
(void)strncpy(x->info[n].key, PMIX_LOCALLDR, PMIX_MAX_KEYLEN);
|
||||
x->info[n].value.type = PMIX_PROC_RANK;
|
||||
x->info[n].value.data.uint32 = 0;
|
||||
++n;
|
||||
|
||||
/* add the proc-specific data */
|
||||
for (m=0; m < nprocs; m++) {
|
||||
(void)strncpy(x->info[n].key, PMIX_PROC_DATA, PMIX_MAX_KEYLEN);
|
||||
x->info[n].value.type = PMIX_DATA_ARRAY;
|
||||
PMIX_DATA_ARRAY_CREATE(array, 5, PMIX_INFO);
|
||||
x->info[n].value.data.darray = array;
|
||||
info = (pmix_info_t*)array->array;
|
||||
k = 0;
|
||||
(void)strncpy(info[k].key, PMIX_RANK, PMIX_MAX_KEYLEN);
|
||||
info[k].value.type = PMIX_PROC_RANK;
|
||||
info[k].value.data.rank = m;
|
||||
++k;
|
||||
(void)strncpy(info[k].key, PMIX_GLOBAL_RANK, PMIX_MAX_KEYLEN);
|
||||
info[k].value.type = PMIX_PROC_RANK;
|
||||
info[k].value.data.rank = m;
|
||||
++k;
|
||||
(void)strncpy(info[k].key, PMIX_LOCAL_RANK, PMIX_MAX_KEYLEN);
|
||||
info[k].value.type = PMIX_UINT16;
|
||||
info[k].value.data.uint16 = m;
|
||||
++k;
|
||||
|
||||
(void)strncpy(info[k].key, PMIX_NODE_RANK, PMIX_MAX_KEYLEN);
|
||||
info[k].value.type = PMIX_UINT16;
|
||||
info[k].value.data.uint16 = m;
|
||||
++k;
|
||||
|
||||
(void)strncpy(info[k].key, PMIX_NODEID, PMIX_MAX_KEYLEN);
|
||||
info[k].value.type = PMIX_UINT32;
|
||||
info[k].value.data.uint32 = 0;
|
||||
++k;
|
||||
/* move to next proc */
|
||||
++n;
|
||||
}
|
||||
PMIx_server_register_nspace(nspace, nprocs, x->info, x->ninfo,
|
||||
cbfunc, x);
|
||||
}
|
||||
@ -852,7 +1113,7 @@ static void wait_signal_callback(int fd, short event, void *arg)
|
||||
pid_t pid;
|
||||
wait_tracker_t *t2;
|
||||
|
||||
if (SIGCHLD != event_get_signal(sig)) {
|
||||
if (SIGCHLD != pmix_event_get_signal(sig)) {
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -289,9 +289,9 @@ typedef struct {
|
||||
} \
|
||||
if (PMIX_SUCCESS == rc) { \
|
||||
if( PMIX_SUCCESS != cbdata.status ){ \
|
||||
if( !( (cbdata.status == PMIX_ERR_NOT_FOUND || cbdata.status == PMIX_ERR_PROC_ENTRY_NOT_FOUND) && ok_notfnd ) ){ \
|
||||
TEST_ERROR(("%s:%d: PMIx_Get_nb failed: %d from %s:%d, key=%s", \
|
||||
my_nspace, my_rank, rc, my_nspace, r)); \
|
||||
if( !( (cbdata.status == PMIX_ERR_NOT_FOUND || cbdata.status == PMIX_ERR_PROC_ENTRY_NOT_FOUND) && ok_notfnd ) ){ \
|
||||
TEST_ERROR(("%s:%d: PMIx_Get_nb failed: %d from %s:%d, key=%s", \
|
||||
my_nspace, my_rank, rc, my_nspace, r, key)); \
|
||||
} \
|
||||
rc = PMIX_ERROR; \
|
||||
} else if (NULL == val) { \
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2015-2016 Intel, Inc. All rights reserved.
|
||||
* Copyright (c) 2015-2019 Intel, Inc. All rights reserved.
|
||||
* $COPYRIGHT$
|
||||
*
|
||||
* Additional copyrights may follow
|
||||
@ -38,7 +38,7 @@ static void timeout_errhandler(size_t evhdlr_registration_id,
|
||||
void *cbdata)
|
||||
{
|
||||
TEST_ERROR(("timeout errhandler called for error status = %d ninfo = %d",
|
||||
status, ninfo));
|
||||
status, (int)ninfo));
|
||||
if (NULL != cbfunc) {
|
||||
cbfunc(PMIX_SUCCESS, NULL, 0, NULL, NULL, cbdata);
|
||||
}
|
||||
@ -58,7 +58,7 @@ static void errhandler_reg_callbk1 (pmix_status_t status,
|
||||
size_t *ref = (size_t*) cbdata;
|
||||
*ref = errhandler_ref;
|
||||
TEST_VERBOSE(("PMIX client ERRHANDLER REGISTRATION CALLED WITH STATUS %d, ref=%lu",
|
||||
status, *ref, (unsigned long)errhandler_ref));
|
||||
status, (unsigned long)errhandler_ref));
|
||||
|
||||
}
|
||||
|
||||
|
@ -77,7 +77,7 @@ PMIX_CLASS_INSTANCE(server_nspace_t,
|
||||
nscon, nsdes);
|
||||
|
||||
static int server_send_procs(void);
|
||||
static void server_read_cb(evutil_socket_t fd, short event, void *arg);
|
||||
static void server_read_cb(int fd, short event, void *arg);
|
||||
static int srv_wait_all(double timeout);
|
||||
static int server_fwd_msg(msg_hdr_t *msg_hdr, char *buf, size_t size);
|
||||
static int server_send_msg(msg_hdr_t *msg_hdr, char *data, size_t size);
|
||||
@ -187,7 +187,7 @@ static void server_unpack_procs(char *buf, size_t size)
|
||||
char *nspace;
|
||||
|
||||
while ((size_t)(ptr - buf) < size) {
|
||||
ns_count = (size_t)*ptr;
|
||||
ns_count = *(size_t *)ptr;
|
||||
ptr += sizeof(size_t);
|
||||
|
||||
for (i = 0; i < ns_count; i++) {
|
||||
@ -195,16 +195,16 @@ static void server_unpack_procs(char *buf, size_t size)
|
||||
size_t ltasks, ntasks;
|
||||
int server_id;
|
||||
|
||||
server_id = *ptr;
|
||||
server_id = *(int *)ptr;
|
||||
ptr += sizeof(int);
|
||||
|
||||
nspace = ptr;
|
||||
ptr += PMIX_MAX_NSLEN+1;
|
||||
|
||||
ntasks = (size_t)*ptr;
|
||||
ntasks = *(size_t *)ptr;
|
||||
ptr += sizeof(size_t);
|
||||
|
||||
ltasks = (size_t)*ptr;
|
||||
ltasks = *(size_t *)ptr;
|
||||
ptr += sizeof(size_t);
|
||||
|
||||
PMIX_LIST_FOREACH(tmp, server_nspace, server_nspace_t) {
|
||||
@ -226,7 +226,7 @@ static void server_unpack_procs(char *buf, size_t size)
|
||||
}
|
||||
size_t i;
|
||||
for (i = 0; i < ltasks; i++) {
|
||||
int rank = (int)*ptr;
|
||||
int rank = *(int *)ptr;
|
||||
ptr += sizeof(int);
|
||||
if (ns_item->task_map[rank] >= 0) {
|
||||
continue;
|
||||
@ -473,7 +473,7 @@ static void _libpmix_cb(void *cbdata)
|
||||
}
|
||||
}
|
||||
|
||||
static void server_read_cb(evutil_socket_t fd, short event, void *arg)
|
||||
static void server_read_cb(int fd, short event, void *arg)
|
||||
{
|
||||
server_info_t *server = (server_info_t*)arg;
|
||||
msg_hdr_t msg_hdr;
|
||||
@ -505,8 +505,8 @@ static void server_read_cb(evutil_socket_t fd, short event, void *arg)
|
||||
switch(msg_hdr.cmd) {
|
||||
case CMD_BARRIER_REQUEST:
|
||||
barrier_cnt++;
|
||||
TEST_VERBOSE(("CMD_BARRIER_REQ req from %d cnt %d", msg_hdr.src_id,
|
||||
barrier_cnt));
|
||||
TEST_VERBOSE(("CMD_BARRIER_REQ req from %d cnt %lu", msg_hdr.src_id,
|
||||
(unsigned long)barrier_cnt));
|
||||
if (pmix_list_get_size(server_list) == barrier_cnt) {
|
||||
barrier_cnt = 0; /* reset barrier counter */
|
||||
server_info_t *tmp_server;
|
||||
@ -535,8 +535,8 @@ static void server_read_cb(evutil_socket_t fd, short event, void *arg)
|
||||
msg_buf = NULL;
|
||||
}
|
||||
|
||||
TEST_VERBOSE(("CMD_FENCE_CONTRIB req from %d cnt %d size %d",
|
||||
msg_hdr.src_id, contrib_cnt, msg_hdr.size));
|
||||
TEST_VERBOSE(("CMD_FENCE_CONTRIB req from %d cnt %lu size %d",
|
||||
msg_hdr.src_id, (unsigned long)contrib_cnt, msg_hdr.size));
|
||||
if (pmix_list_get_size(server_list) == contrib_cnt) {
|
||||
server_info_t *tmp_server;
|
||||
PMIX_LIST_FOREACH(tmp_server, server_list, server_info_t) {
|
||||
@ -547,8 +547,8 @@ static void server_read_cb(evutil_socket_t fd, short event, void *arg)
|
||||
resp_hdr.size = fence_buf_offset;
|
||||
server_send_msg(&resp_hdr, fence_buf, fence_buf_offset);
|
||||
}
|
||||
TEST_VERBOSE(("CMD_FENCE_CONTRIB complete, size %d",
|
||||
fence_buf_offset));
|
||||
TEST_VERBOSE(("CMD_FENCE_CONTRIB complete, size %lu",
|
||||
(unsigned long)fence_buf_offset));
|
||||
if (fence_buf) {
|
||||
free(fence_buf);
|
||||
fence_buf = NULL;
|
||||
@ -651,13 +651,13 @@ static void server_unpack_dmdx(char *buf, int *sender, pmix_proc_t *proc)
|
||||
{
|
||||
char *ptr = buf;
|
||||
|
||||
*sender = (int)*ptr;
|
||||
*sender = *(int *)ptr;
|
||||
ptr += sizeof(int);
|
||||
|
||||
memcpy(proc->nspace, ptr, PMIX_MAX_NSLEN +1);
|
||||
ptr += PMIX_MAX_NSLEN +1;
|
||||
|
||||
proc->rank = (int)*ptr;
|
||||
proc->rank = *(int *)ptr;
|
||||
ptr += sizeof(int);
|
||||
}
|
||||
|
||||
@ -671,6 +671,8 @@ static void _dmdx_cb(int status, char *data, size_t sz, void *cbdata)
|
||||
msg_hdr.src_id = my_server_id;
|
||||
msg_hdr.size = sz;
|
||||
msg_hdr.dst_id = *sender_id;
|
||||
TEST_VERBOSE(("srv #%d: DMDX RESPONSE: receiver=%d, size=%lu,",
|
||||
my_server_id, *sender_id, (unsigned long)sz));
|
||||
free(sender_id);
|
||||
|
||||
server_send_msg(&msg_hdr, data, sz);
|
||||
@ -804,9 +806,9 @@ int server_init(test_params *params)
|
||||
if (params->nservers && pmix_list_get_size(server_list)) {
|
||||
server_info_t *server;
|
||||
PMIX_LIST_FOREACH(server, server_list, server_info_t) {
|
||||
server->evread = event_new(pmix_globals.evbase, server->rd_fd,
|
||||
server->evread = pmix_event_new(pmix_globals.evbase, server->rd_fd,
|
||||
EV_READ|EV_PERSIST, server_read_cb, server);
|
||||
event_add(server->evread, NULL);
|
||||
pmix_event_add(server->evread, NULL);
|
||||
}
|
||||
}
|
||||
|
||||
|
Загрузка…
x
Ссылка в новой задаче
Block a user