1
1

Merge pull request #1212 from rhc54/pmix112

Update the PMIx native component to release v1.1.2
Этот коммит содержится в:
rhc54 2015-12-12 21:43:32 -08:00
родитель de7b93d3fc 03eb1a80bf
Коммит 6b23c917e5
192 изменённых файлов: 1673 добавлений и 1406 удалений

7
.gitignore поставляемый
Просмотреть файл

@ -300,9 +300,9 @@ opal/mca/hwloc/hwloc*/hwloc/include/private/autogen/config.h
opal/mca/installdirs/config/install_dirs.h
opal/mca/pmix/pmix1xx/pmix/include/pmix/autogen/config.h
opal/mca/pmix/pmix1xx/pmix/include/private/autogen/config.h
opal/mca/pmix/pmix1xx/pmix/include/private/autogen/config.h.in
opal/mca/pmix/pmix112/pmix/include/pmix/autogen/config.h
opal/mca/pmix/pmix112/pmix/include/private/autogen/config.h
opal/mca/pmix/pmix112/pmix/include/private/autogen/config.h.in
opal/tools/opal-checkpoint/opal-checkpoint
opal/tools/opal-checkpoint/opal-checkpoint.1
@ -363,6 +363,7 @@ orte/test/mpi/parallel_w64
orte/test/mpi/pubsub
orte/test/mpi/read_write
orte/test/mpi/reduce-hang
orte/test/mpi/ring
orte/test/mpi/segv
orte/test/mpi/simple_spawn
orte/test/mpi/slave

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

@ -10,8 +10,8 @@ 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) 2015 Cisco Systems, Inc. All rights reserved.
dnl Copyright (c) 2014-2015 Intel, Inc. All rights reserved.
dnl Copyright (c) 2015 Cisco Systems, Inc. All rights reserved.
dnl $COPYRIGHT$
dnl
dnl Additional copyrights may follow
@ -30,7 +30,9 @@ OPAL_VAR_SCOPE_PUSH([subdirs_str subdirs_skip subdirs_args subdirs_arg])
#
# Make a list of command line args --eliminate the --srcdir and
# --cache-file args, because we need to replace them with our own
# values when invoking the sub-configure script.
# values when invoking the sub-configure script. Also eliminate
# the --with-platform as this will confuse any subdir with
# similar options
#
subdirs_args=
@ -56,6 +58,8 @@ do
;;
-srcdir=* | --srcdir=*)
;;
-with-platform=* | --with-platform=*)
;;
*)
case $subdir_arg in
*\'*) subdir_arg=`echo "$subdir_arg" | sed "s/'/'\\\\\\\\''/g"` ;;

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

@ -26,26 +26,26 @@ sources = \
# mca_<type>_<name>.la (for DSO builds) or libmca_<type>_<name>.la
# (for static builds).
if MCA_BUILD_opal_pmix_pmix1xx_DSO
if MCA_BUILD_opal_pmix_pmix112_DSO
component_noinst =
component_install = mca_pmix_pmix1xx.la
component_install = mca_pmix_pmix112.la
else
component_noinst = libmca_pmix_pmix1xx.la
component_noinst = libmca_pmix_pmix112.la
component_install =
endif
mcacomponentdir = $(opallibdir)
mcacomponent_LTLIBRARIES = $(component_install)
mca_pmix_pmix1xx_la_SOURCES = $(sources)
mca_pmix_pmix1xx_la_CFLAGS = $(opal_pmix_pmix1xx_CFLAGS)
mca_pmix_pmix1xx_la_CPPFLAGS = \
-I$(srcdir)/pmix/include $(opal_pmix_pmix1xx_CPPFLAGS)
mca_pmix_pmix1xx_la_LDFLAGS = -module -avoid-version $(opal_pmix_pmix1xx_LDFLAGS)
mca_pmix_pmix1xx_la_LIBADD = $(opal_pmix_pmix1xx_LIBS)
mca_pmix_pmix112_la_SOURCES = $(sources)
mca_pmix_pmix112_la_CFLAGS = $(opal_pmix_pmix112_CFLAGS)
mca_pmix_pmix112_la_CPPFLAGS = \
-I$(srcdir)/pmix/include $(opal_pmix_pmix112_CPPFLAGS)
mca_pmix_pmix112_la_LDFLAGS = -module -avoid-version $(opal_pmix_pmix112_LDFLAGS)
mca_pmix_pmix112_la_LIBADD = $(opal_pmix_pmix112_LIBS)
noinst_LTLIBRARIES = $(component_noinst)
libmca_pmix_pmix1xx_la_SOURCES =$(sources)
libmca_pmix_pmix1xx_la_CFLAGS = $(opal_pmix_pmix1xx_CFLAGS)
libmca_pmix_pmix1xx_la_CPPFLAGS = -I$(srcdir)/pmix/include $(opal_pmix_pmix1xx_CPPFLAGS)
libmca_pmix_pmix1xx_la_LDFLAGS = -module -avoid-version $(opal_pmix_pmix1xx_LDFLAGS)
libmca_pmix_pmix1xx_la_LIBADD = $(opal_pmix_pmix1xx_LIBS)
libmca_pmix_pmix112_la_SOURCES =$(sources)
libmca_pmix_pmix112_la_CFLAGS = $(opal_pmix_pmix112_CFLAGS)
libmca_pmix_pmix112_la_CPPFLAGS = -I$(srcdir)/pmix/include $(opal_pmix_pmix112_CPPFLAGS)
libmca_pmix_pmix112_la_LDFLAGS = -module -avoid-version $(opal_pmix_pmix112_LDFLAGS)
libmca_pmix_pmix112_la_LIBADD = $(opal_pmix_pmix112_LIBS)

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

@ -23,42 +23,42 @@
# $HEADER$
#
# MCA_pmix_pmix1xx_CONFIG([action-if-found], [action-if-not-found])
# MCA_pmix_pmix112_CONFIG([action-if-found], [action-if-not-found])
# -----------------------------------------------------------
AC_DEFUN([MCA_opal_pmix_pmix1xx_CONFIG],[
AC_CONFIG_FILES([opal/mca/pmix/pmix1xx/Makefile])
AC_DEFUN([MCA_opal_pmix_pmix112_CONFIG],[
AC_CONFIG_FILES([opal/mca/pmix/pmix112/Makefile])
OPAL_VAR_SCOPE_PUSH([PMIX_VERSION opal_pmix_pmix1xx_save_CPPFLAGS opal_pmix_pmix1xx_save_LDFLAGS opal_pmix_pmix1xx_save_LIBS opal_pmix_pmix1xx_basedir opal_pmix_pmix1xx_save_cflags])
OPAL_VAR_SCOPE_PUSH([PMIX_VERSION opal_pmix_pmix112_save_CPPFLAGS opal_pmix_pmix112_save_LDFLAGS opal_pmix_pmix112_save_LIBS opal_pmix_pmix112_basedir opal_pmix_pmix112_save_cflags])
PMIX_VERSION=
opal_pmix_pmix1xx_basedir=opal/mca/pmix/pmix1xx
opal_pmix_pmix112_basedir=opal/mca/pmix/pmix112
opal_pmix_pmix1xx_save_CFLAGS=$CFLAGS
opal_pmix_pmix1xx_save_CPPFLAGS=$CPPFLAGS
opal_pmix_pmix1xx_save_LDFLAGS=$LDFLAGS
opal_pmix_pmix1xx_save_LIBS=$LIBS
opal_pmix_pmix112_save_CFLAGS=$CFLAGS
opal_pmix_pmix112_save_CPPFLAGS=$CPPFLAGS
opal_pmix_pmix112_save_LDFLAGS=$LDFLAGS
opal_pmix_pmix112_save_LIBS=$LIBS
opal_pmix_pmix1xx_args="--enable-embedded-mode --with-pmix-symbol-prefix=opal_pmix_pmix1xx_ --with-libevent-header=\\\"opal/mca/event/$opal_event_base_include\\\" --with-hwloc-header=\\\"$opal_hwloc_base_include\\\""
opal_pmix_pmix112_args="--enable-embedded-mode --with-pmix-symbol-prefix=opal_pmix_pmix112_ --with-libevent-header=\\\"opal/mca/event/$opal_event_base_include\\\" --with-hwloc-header=\\\"$opal_hwloc_base_include\\\""
if test "$enable_debug" = "yes"; then
opal_pmix_pmix1xx_args="--enable-debug $opal_pmix_pmix1xx_args"
opal_pmix_pmix112_args="--enable-debug $opal_pmix_pmix112_args"
CFLAGS="$OPAL_CFLAGS_BEFORE_PICKY $OPAL_VISIBILITY_CFLAGS -g"
else
opal_pmix_pmix111_args="--disable-debug $opal_pmix_pmix111_args"
opal_pmix_pmix112_args="--disable-debug $opal_pmix_pmix112_args"
CFLAGS="$OPAL_CFLAGS_BEFORE_PICKY $OPAL_VISIBILITY_CFLAGS"
fi
CPPFLAGS="-I$OPAL_TOP_SRCDIR -I$OPAL_TOP_BUILDDIR -I$OPAL_TOP_SRCDIR/opal/include -I$OPAL_TOP_BUILDDIR/opal/include $CPPFLAGS"
OPAL_CONFIG_SUBDIR([$opal_pmix_pmix1xx_basedir/pmix],
[$opal_pmix_pmix1xx_args $opal_subdir_args 'CFLAGS=$CFLAGS' 'CPPFLAGS=$CPPFLAGS'],
[opal_pmix_pmix1xx_happy=1], [opal_pmix_pmix1xx_happy=0])
OPAL_CONFIG_SUBDIR([$opal_pmix_pmix112_basedir/pmix],
[$opal_pmix_pmix112_args $opal_subdir_args 'CFLAGS=$CFLAGS' 'CPPFLAGS=$CPPFLAGS'],
[opal_pmix_pmix112_happy=1], [opal_pmix_pmix112_happy=0])
if test $opal_pmix_pmix1xx_happy -eq 1; then
PMIX_VERSION="internal v`$srcdir/$opal_pmix_pmix1xx_basedir/pmix/config/pmix_get_version.sh $srcdir/$opal_pmix_pmix1xx_basedir/pmix/VERSION`"
if test $opal_pmix_pmix112_happy -eq 1; then
PMIX_VERSION="internal v`$srcdir/$opal_pmix_pmix112_basedir/pmix/config/pmix_get_version.sh $srcdir/$opal_pmix_pmix112_basedir/pmix/VERSION`"
# Build flags for our Makefile.am
opal_pmix_pmix1xx_LIBS='$(OPAL_TOP_BUILDDIR)/'"$opal_pmix_pmix1xx_basedir"'/pmix/libpmix.la'
opal_pmix_pmix1xx_CPPFLAGS='-I$(OPAL_TOP_BUILDDIR)/opal/mca/pmix/pmix1xx/pmix/include/pmix -I$(OPAL_TOP_BUILDDIR)/opal/mca/pmix/pmix1xx/pmix/include -I$(OPAL_TOP_BUILDDIR)/opal/mca/pmix/pmix1xx/pmix -I$(OPAL_TOP_SRCDIR)/opal/mca/pmix/pmix1xx/pmix'
AC_SUBST([opal_pmix_pmix1xx_LIBS])
AC_SUBST([opal_pmix_pmix1xx_CPPFLAGS])
opal_pmix_pmix112_LIBS='$(OPAL_TOP_BUILDDIR)/'"$opal_pmix_pmix112_basedir"'/pmix/libpmix.la'
opal_pmix_pmix112_CPPFLAGS='-I$(OPAL_TOP_BUILDDIR)/opal/mca/pmix/pmix112/pmix/include/pmix -I$(OPAL_TOP_BUILDDIR)/opal/mca/pmix/pmix112/pmix/include -I$(OPAL_TOP_BUILDDIR)/opal/mca/pmix/pmix112/pmix -I$(OPAL_TOP_SRCDIR)/opal/mca/pmix/pmix112/pmix'
AC_SUBST([opal_pmix_pmix112_LIBS])
AC_SUBST([opal_pmix_pmix112_CPPFLAGS])
fi
AC_DEFINE_UNQUOTED([PMIX_PMIX1XX_PMIX_VERSION],
@ -66,14 +66,14 @@ AC_DEFUN([MCA_opal_pmix_pmix1xx_CONFIG],[
[Version of PMIx])
# Finally, add a flag to support static builds
pmix_pmix1xx_WRAPPER_EXTRA_LIBS=-lpmix
pmix_pmix112_WRAPPER_EXTRA_LIBS=-lpmix
CFLAGS=$opal_pmix_pmix1xx_save_CFLAGS
CPPFLAGS=$opal_pmix_pmix1xx_save_CPPFLAGS
LDFLAGS=$opal_pmix_pmix1xx_save_LDFLAGS
LIBS=$opal_pmix_pmix1xx_save_LIBS
CFLAGS=$opal_pmix_pmix112_save_CFLAGS
CPPFLAGS=$opal_pmix_pmix112_save_CPPFLAGS
LDFLAGS=$opal_pmix_pmix112_save_LDFLAGS
LIBS=$opal_pmix_pmix112_save_LIBS
AS_IF([test $opal_pmix_pmix1xx_happy -eq 1],
AS_IF([test $opal_pmix_pmix112_happy -eq 1],
[$1],
[$2])

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

@ -4,12 +4,12 @@ Copyright (c) 2004-2005 The Trustees of Indiana University and Indiana
Copyright (c) 2004-2005 The University of Tennessee and The University
of Tennessee Research Foundation. All rights
reserved.
Copyright (c) 2004-2005 High Performance Computing Center Stuttgart,
Copyright (c) 2004-2005 High Performance Computing Center Stuttgart,
University of Stuttgart. All rights reserved.
Copyright (c) 2004-2005 The Regents of the University of California.
All rights reserved.
Copyright (c) 2008-2015 Cisco Systems, Inc. All rights reserved.
Copyright (c) 2013 Intel, Inc. All rights reserved.
Copyright (c) 2013-2015 Intel, Inc. All rights reserved.
$COPYRIGHT$
Additional copyrights may follow
@ -24,7 +24,7 @@ This file is a *very* short overview of building and installing
the PMIx library. Much more information is available on the
PMIx web site (e.g., see the FAQ section):
http://www.open-mpi.org/projects/pmix
http://pmix.github.io/pmix/master
Developer Builds
@ -34,10 +34,10 @@ If you have checked out a DEVELOPER'S COPY of PMIx (i.e., you checked
out from Git), you should read the HACKING file before attempting to
build PMIx. You must then run:
shell$ ./autogen.pl
shell$ ./autogen.sh
You will need very recent versions of GNU Autoconf, Automake, and
Libtool. If autogen.pl fails, read the HACKING file. If anything
Libtool. If autogen.sh fails, read the HACKING file. If anything
else fails, read the HACKING file. Finally, we suggest reading the
HACKING file.
@ -61,8 +61,8 @@ all" as a user with write permissions in the build tree, and a
separate "make install" as a user with write permissions to the
install tree.
Compiling support for various networks or other specific hardware may
require additional command ling flags when running configure. See the
Compiling support for specific compilers and environments may
require additional command line flags when running configure. See the
README file for more details. Note that VPATH builds are fully
supported. For example:

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

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

@ -63,7 +63,7 @@ libpmix_la_SOURCES = $(headers) $(sources)
libpmix_la_LDFLAGS = -version-info $(libpmix_so_version)
if ! PMIX_EMBEDDED_MODE
SUBDIRS = . test examples
SUBDIRS = . test
pmixdir = $(pmixincludedir)/$(subdir)
nobase_pmix_HEADERS = $(headers)
endif
@ -76,10 +76,13 @@ nroff:
EXTRA_DIST += README INSTALL VERSION LICENSE autogen.sh \
config/pmix_get_version.sh $(man_MANS) \
contrib/platform/optimized \
test/test_common.h test/cli_stages.h \
test/server_callbacks.h test/test_fence.h \
test/test_publish.h test/test_resolve_peers.h \
test/test_spawn.h test/utils.h test/test_cd.h
test/test_spawn.h test/utils.h test/test_cd.h \
examples/client.c examples/dmodex.c examples/dynamic.c \
examples/fault.c examples/pub.c
dist-hook:

61
opal/mca/pmix/pmix112/pmix/NEWS Обычный файл
Просмотреть файл

@ -0,0 +1,61 @@
Copyright (c) 2015 Intel, Inc. All rights reserved.
$COPYRIGHT$
Additional copyrights may follow
$HEADER$
===========================================================================
This file contains the main features as well as overviews of specific
bug fixes (and other actions) for each version of PMIx since
version 1.0.
As more fully described in the "Software Version Number" section in
the README file, PMIx typically maintains two separate version
series simultaneously - the current release and one that is locked
to only bug fixes. Since these series are semi-independent of each
other, a single NEWS-worthy item might apply to different series. For
example, a bug might be fixed in the master, and then moved to the
current release as well as the "stable" bug fix release branch.
Master (not on release branches yet)
------------------------------------
1.1.2
-----
- Provide a check for hwloc support - if not found, then
don't pass any topology info down to the client as it
won't know how to unpack it anyway.
- Fix a few places where thread safety wasn't provided
- Fix several issues identified by Paul Hargrove:
* PMIx_Init(NULL) is supported
* Incomplete PMIx_constants man page had some lingering cruft
* Missing prototype for pmix_value_load
- Fix race condition in PMIx_Get/PMIx_Get_nb
- Fix double-free error in pmix_server_commit.
- Fix PMIX_LOAD_BUFFER to be safe.
1.1.1
-----
- Fix an issue where the example and test programs
were incorrectly being installed. Thanks to Orion
Poplawski for reporting it
1.1.0
-----
- major update of APIs to reflect comments received from 1.0.0
non-production release
- fixed thread-safety issues
- fixed a range of pack/unpack issues
- added unit tests for all APIs
1.0.0
------
Initial public release of draft APIs for comment - not production
intended

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

@ -15,7 +15,7 @@ Copyright (c) 2007 Myricom, Inc. All rights reserved.
Copyright (c) 2008 IBM Corporation. All rights reserved.
Copyright (c) 2010 Oak Ridge National Labs. All rights reserved.
Copyright (c) 2011 University of Houston. All rights reserved.
Copyright (c) 2013 Intel, Inc. All rights reserved
Copyright (c) 2013-2015 Intel, Inc. All rights reserved
$COPYRIGHT$
Additional copyrights may follow
@ -28,64 +28,51 @@ When submitting questions and problems, be sure to include as much
extra information as possible. This web page details all the
information that we request in order to provide assistance:
http://www.open-mpi.org/community/help/
http://pmix.github.io/master/community/help/
The best way to report bugs, send comments, or ask questions is to
sign up on the user's and/or developer's mailing list (for user-level
and developer-level questions; when in doubt, send to the user's
list):
sign up on the PMIx mailing list, which is hosted by GoogleGroups:
pmix-users@open-mpi.org
pmix-devel@open-mpi.org
pmix@googlegroups.com
Because of spam, only subscribers are allowed to post to these lists
Because of spam, only subscribers are allowed to post to this list
(ensure that you subscribe with and post from exactly the same e-mail
address -- joe@example.com is considered different than
joe@mycomputer.example.com!). Visit these pages to subscribe to the
lists:
joe@mycomputer.example.com!). You can subscribe to the list here:
http://www.open-mpi.org/mailman/listinfo.cgi/pmix-users
http://www.open-mpi.org/mailman/listinfo.cgi/pmix-devel
https://groups.google.com/d/forum/pmix
Thanks for your time.
===========================================================================
Much, much more information is also available in the PMIx FAQ:
More information is available in the PMIx FAQ:
http://www.open-mpi.org/faq/
http://pmix.github.io/master/faq/
We are in early days, so please be patient - info will grow as questions
are addressed.
===========================================================================
The following abbreviated list of release notes applies to this code
base as of this writing (11 November 2013):
base as of this writing (12 November 2015):
General notes
-------------
- The majority of PMIx's documentation is here in this file, the
included man pages, and on the web site FAQ
(http://www.open-mpi.org/projects/pmix). This will eventually be supplemented
with cohesive installation and user documentation files.
- Note that PMIx documentation uses the word "component"
frequently; the word "plugin" is probably more familiar to most
users. As such, end users can probably completely substitute the
word "plugin" wherever you see "component" in our documentation.
For what it's worth, we use the word "component" for historical
reasons, mainly because it is part of our acronyms and internal API
functionc calls.
(http://pmix.github.io/master/faq). This will eventually be
supplemented with cohesive installation and user documentation files.
- Systems that have been tested are:
- Linux (various flavors/distros), 32 bit, with gcc
- Linux (various flavors/distros), 64 bit (x86), with gcc, Absoft,
Intel, and Portland (*)
- OS X (10.5, 10.6, 10.7), 32 and 64 bit (x86_64), with gcc and
Absoft compilers (*)
- Linux (various flavors/distros), 64 bit (x86), with gcc, Intel,
and Portland (*)
- OS X (10.7 and above), 32 and 64 bit (x86_64), with gcc (*)
(*) Be sure to read the Compiler Notes, below.
Compiler Notes
(*) Compiler Notes
--------------
- The Portland Group compilers prior to version 7.0 require the
@ -130,79 +117,32 @@ INSTALLATION OPTIONS
files in <directory>/include, its libraries in <directory>/lib, etc.
--disable-shared
By default, libmpi is built as a shared library, and all components
are built as dynamic shared objects (DSOs). This switch disables
By default, libpmix is built as a shared library. This switch disables
this default; it is really only useful when used with
--enable-static. Specifically, this option does *not* imply
--enable-static; enabling static libraries and disabling shared
libraries are two independent options.
--enable-static
Build libmpi as a static library, and statically link in all
components. Note that this option does *not* imply
Build libpmix as a static library. Note that this option does *not* imply
--disable-shared; enabling static libraries and disabling shared
libraries are two independent options.
--enable-dlopen
Build all of PMIx's components as standalone Dynamic Shared
Objects (DSO's) that are loaded at run-time. The opposite of this
option, --disable-dlopen, causes two things:
1. All of PMIx's components will be built as part of PMIx's
normal libraries (e.g., libmpi).
2. PMIx will not attempt to open any DSO's at run-time.
Note that this option does *not* imply that PMIx's libraries will be
built as static objects (e.g., libmpi.a). It only specifies the
location of PMIx's components: standalone DSOs or folded into the
PMIx libraries. You can control whether PMIx's libraries
are build as static or dynamic via --enable|disable-static and
--enable|disable-shared.
--with-platform=FILE
Load configure options for the build from FILE. Options on the
command line that are not in FILE are also used. Options on the
command line and in FILE are replaced by what is in FILE.
MISCELLANEOUS SUPPORT LIBRARIES
--with-libltdl[=VALUE]
This option specifies where to find the GNU Libtool libltdl support
library. The following VALUEs are permitted:
internal: Use PMIx's internal copy of libltdl.
external: Use an external libltdl installation (rely on default
compiler and linker paths to find it)
<no value>: Same as "internal".
<directory>: Specify the location of a specific libltdl
installation to use
By default (or if --with-libltdl is specified with no VALUE), PMIx
will build and use the copy of libltdl that it has in its source
tree. However, if the VALUE is "external", PMIx will look for
the relevant libltdl header file and library in default compiler /
linker locations. Or, VALUE can be a directory tree where the
libltdl header file and library can be found. This option allows
operating systems to include PMIx and use their default libltdl
installation instead of PMIx's bundled libltdl.
Note that this option is ignored if --disable-dlopen is specified.
--with-threads=value
Since thread support is only partially tested, it is disabled by
default. To enable threading, use "--with-threads=posix". This is
most useful when combined with --enable-mpi-thread-multiple.
Once PMIx has been built and installed, it is safe to run "make
clean" and/or remove the entire build tree.
VPATH and parallel builds are fully supported.
Generally speaking, the only thing that users need to do to use Open
MPI <prefix>/lib is in their LD_LIBRARY_PATH. Users may need to ensure to set
LD_LIBRARY_PATH in their shell setup files (e.g., .bashrc, .cshrc)
so that non-interactive rsh/ssh-based logins will be able to find the
PMIx library.
Generally speaking, the only thing that users need to do to use PMIx
is ensure that <prefix>/lib is in their LD_LIBRARY_PATH. Users may
need to ensure to set LD_LIBRARY_PATH in their shell setup files (e.g.,
.bashrc, .cshrc) so that non-interactive rsh/ssh-based logins will
be able to find the PMIx library.
===========================================================================
@ -236,22 +176,10 @@ major, minor, release, and an optional quantifier.
functionality. The minor number is always included in the version
number:
o Even minor release numbers are part of "super-stable"
release series (e.g., v1.4.0). Releases in super stable series
are well-tested, time-tested, and mature. Such releases are
recommended for production sites. Changes between subsequent
releases in super stable series are expected to be fairly small.
o Odd minor release numbers are part of "feature" release
series (e.g., 1.3.7). Releases in feature releases are
well-tested, but they are not necessarily time-tested or as
mature as super stable releases. Changes between subsequent
releases in feature series may be large.
* Release: The release number is the third integer in the version
string (e.g., v1.2.3). Changes in the release number typically
indicate a bug fix in the code base and/or end-user
functionality. If the release number is 0, it is omitted from the
version number (e.g., v1.2 has a release number of 0).
functionality.
* Quantifier: PMIx version numbers sometimes have an arbitrary
string affixed to the end of the version number. Common strings
@ -267,7 +195,7 @@ major, minor, release, and an optional quantifier.
indicating the number of the release candidate (e.g., v1.2.3rc4
indicates the 4th release candidate of version 1.2.3).
Althought the major, minor, and release values (and optional
Although the major, minor, and release values (and optional
quantifiers) are reported in PMIx nightly snapshot tarballs, the
filenames of these snapshot tarballs follow a slightly different
convention.
@ -339,14 +267,14 @@ Application Binary Interface (ABI) Compatibility
PMIx provides forward ABI compatibility in all versions of a given
feature release series and its corresponding
super stable series. For example, on a single platform, an MPI
super stable series. For example, on a single platform, an pmix
application linked against PMIx v1.3.2 shared libraries can be
updated to point to the shared libraries in any successive v1.3.x or
v1.4 release and still work properly (e.g., via the LD_LIBRARY_PATH
environment variable or other operating system mechanism).
PMIx reserves the right to break ABI compatibility at new feature
release series. For example, the same MPI application from above
release series. For example, the same pmix application from above
(linked against PMIx v1.3.2 shared libraries) will *not* work with
PMIx v1.5 shared libraries.
@ -358,7 +286,7 @@ Common Questions
Many common questions about building and using PMIx are answered
on the FAQ:
http://www.open-mpi.org/faq/
http://pmix.github.io/master/faq/
===========================================================================
@ -372,24 +300,16 @@ When submitting questions and problems, be sure to include as much
extra information as possible. This web page details all the
information that we request in order to provide assistance:
http://www.open-mpi.org/community/help/
http://pmix.github.io/master/community/help/
User-level questions and comments should generally be sent to the
user's mailing list (users@open-mpi.org). Because of spam, only
Questions and comments should generally be sent to the PMIx mailing
list (pmix@googlegroups.com). Because of spam, only
subscribers are allowed to post to this list (ensure that you
subscribe with and post from *exactly* the same e-mail address --
joe@example.com is considered different than
joe@mycomputer.example.com!). Visit this page to subscribe to the
user's list:
http://www.open-mpi.org/mailman/listinfo.cgi/pmix-users
Developer-level bug reports, questions, and comments should generally
be sent to the developer's mailing list (devel@open-mpi.org). Please
do not post the same question to both lists. As with the user's list,
only subscribers are allowed to post to the developer's list. Visit
the following web page to subscribe:
http://www.open-mpi.org/mailman/listinfo.cgi/pmix-devel
https://groups.google.com/d/forum/pmix
Make today an PMIx day!

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

@ -15,7 +15,7 @@
major=1
minor=1
release=0
release=2
# 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
@ -23,14 +23,14 @@ release=0
# The only requirement is that it must be entirely printable ASCII
# characters and have no white space.
greek=a1
greek=
# If repo_rev is empty, then the repository version number will be
# obtained during "make dist" via the "git describe --tags --always"
# command, or with the date (if "git describe" fails) in the form of
# "date<date>".
repo_rev=gita4d7e07
repo_rev=git17ae5a4
# 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,11 +44,24 @@ tarball_version=
# The date when this release was created
date="Nov 06, 2015"
date="Dec 12, 2015"
# The shared library version of each of PMIx's public libraries.
# These versions are maintained in accordance with the "Library
# Interface Versions" chapter from the GNU Libtool documentation.
# Interface Versions" chapter from the GNU Libtool documentation:
#
# - If the library source code has changed at all since the last
# update, then increment revision (`c:r:a' becomes `c:r+1:a').
#
# - If any interfaces have been added, removed, or changed since
# the last update, increment current, and set revision to 0.
#
# - If any interfaces have been added since the last public release,
# then increment age.
#
# - If any interfaces have been removed since the last public release,
# then set age to 0.
#
# All changes in these version numbers are dictated by the PMIx
# release managers (not individual developers). Notes:
@ -62,4 +75,4 @@ date="Nov 06, 2015"
# Version numbers are described in the Libtool current:revision:age
# format.
libpmix_so_version=0:0:0
libpmix_so_version=2:1:0

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

@ -0,0 +1,81 @@
dnl -*- shell-script -*-
dnl
dnl Copyright (c) 2004-2005 The Trustees of Indiana University and Indiana
dnl University Research and Technology
dnl Corporation. All rights reserved.
dnl Copyright (c) 2004-2005 The University of Tennessee and The University
dnl of Tennessee Research Foundation. All rights
dnl reserved.
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-2015 Intel, Inc. All rights reserved.
dnl Copyright (c) 2015 Research Organization for Information Science
dnl and Technology (RIST). All rights reserved.
dnl $COPYRIGHT$
dnl
dnl Additional copyrights may follow
dnl
dnl $HEADER$
dnl
# PMIX_LOAD_PLATFORM()
# --------------------
AC_DEFUN([PMIX_LOAD_PLATFORM], [
AC_ARG_WITH([platform],
[AC_HELP_STRING([--with-platform=FILE],
[Load options for build from FILE. Options on the
command line not in FILE are used. Options on the
command line and in FILE are replaced by what is
in FILE.])])
if test "$with_platform" = "yes" ; then
AC_MSG_ERROR([--with-platform argument must include FILE option])
elif test "$with_platform" = "no" ; then
AC_MSG_ERROR([--without-platform is not a valid argument])
elif test "$with_platform" != "" ; then
# if not an absolute path, check in contrib/platform
if test ! "`echo $with_platform | cut -c1`" = "/" && test ! "`echo $with_platform | cut -c2`" = ".." ; then
if test -r "${srcdir}/contrib/platform/$with_platform" ; then
with_platform="${srcdir}/contrib/platform/$with_platform"
fi
fi
# make sure file exists
if test ! -r "$with_platform" ; then
AC_MSG_ERROR([platform file $with_platform not found])
fi
# eval into environment
PMIX_LOG_MSG([Loading environment file $with_platform, with contents below])
PMIX_LOG_FILE([$with_platform])
# setup by getting full pathname for the platform directories
platform_base="`dirname $with_platform`"
platform_file="`basename $with_platform`"
# get full pathname of where we are so we can return
platform_savedir="`pwd`"
# go to where the platform file is located
cd "$platform_base"
# get the full path to this location
platform_file_dir=`pwd`
. ./"$platform_file"
# see if they left us a name
if test "$PMIX_PLATFORM_LOADED" != "" ; then
platform_loaded="$PMIX_PLATFORM_LOADED"
else
platform_loaded="$with_platform"
fi
echo "Loaded platform arguments for $platform_loaded"
PMIX_LOG_MSG([Loaded platform arguments for $platform_loaded])
# look for default mca param file
# return to where we started
cd "$platform_savedir"
fi
])

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

@ -41,6 +41,10 @@ AC_CONFIG_AUX_DIR(./config)
# -I in ACLOCAL_AMFLAGS in the top-level Makefile.am.
AC_CONFIG_MACRO_DIR(./config)
# Get our platform support file. This has to be done very, very early
# because it twiddles random bits of autoconf
PMIX_LOAD_PLATFORM
# setup configure options (e.g., show_title and friends)
PMIX_CONFIGURE_SETUP
pmix_show_title "Configuring PMIx"
@ -203,8 +207,7 @@ AC_SUBST([CONFIGURE_DEPENDENCIES], ['$(top_srcdir)/VERSION'])
AC_SUBST([libpmix_so_version])
AC_CONFIG_FILES(pmix_config_prefix[test/Makefile]
pmix_config_prefix[test/simple/Makefile]
pmix_config_prefix[examples/Makefile])
pmix_config_prefix[test/simple/Makefile])
pmix_show_title "Configuration complete"

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

@ -0,0 +1,3 @@
enable_mem_debug=no
enable_mem_profile=no
enable_debug=no

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

@ -23,8 +23,6 @@
*
*/
#include <pmix/autogen/config.h>
#define _GNU_SOURCE
#include <stdbool.h>
#include <stdio.h>

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

@ -23,7 +23,6 @@
*
*/
#include <pmix/autogen/config.h>
#include <stdbool.h>
#define _GNU_SOURCE

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

@ -23,7 +23,6 @@
*
*/
#include <pmix/autogen/config.h>
#include <stdbool.h>
#define _GNU_SOURCE

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

@ -23,7 +23,6 @@
*
*/
#include <pmix/autogen/config.h>
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>

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

@ -23,7 +23,6 @@
*
*/
#include <pmix/autogen/config.h>
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>

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

@ -437,6 +437,16 @@ typedef struct {
} \
} while(0);
/* expose a function that is resolved in the
* PMIx library, but part of a header that
* includes internal functions - so we don't
* want to expose the entire header here
*/
extern void pmix_value_load(pmix_value_t *v, void *data,
pmix_data_type_t type);
/**** PMIX INFO STRUCT ****/
typedef struct {

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

@ -0,0 +1,636 @@
/* include/private/autogen/config.h.in. Generated from configure.ac by autoheader. */
/* -*- c -*-
*
* Copyright (c) 2004-2005 The Trustees of Indiana University.
* All rights reserved.
* Copyright (c) 2004-2005 The Trustees of the University of Tennessee.
* All rights reserved.
* Copyright (c) 2004-2005 High Performance Computing Center Stuttgart,
* University of Stuttgart. All rights reserved.
* Copyright (c) 2004-2005 The Regents of the University of California.
* All rights reserved.
* Copyright (c) 2013-2015 Intel, Inc. All rights reserved
* $COPYRIGHT$
*
* Additional copyrights may follow
*
* $HEADER$
*
* This file is automatically generated by configure. Edits will be lost
* the next time you run configure!
*/
#ifndef PMIX_CONFIG_H
#define PMIX_CONFIG_H
#include <pmix/autogen/pmix_config_top.h>
/* Define if building universal (internal helper macro) */
#undef AC_APPLE_UNIVERSAL_BUILD
/* Define to 1 if you have the <arpa/inet.h> header file. */
#undef HAVE_ARPA_INET_H
/* Define to 1 if you have the `asprintf' function. */
#undef HAVE_ASPRINTF
/* Define to 1 if you have the <crt_externs.h> header file. */
#undef HAVE_CRT_EXTERNS_H
/* Define to 1 if you have the declaration of `AF_INET6', and to 0 if you
don't. */
#undef HAVE_DECL_AF_INET6
/* Define to 1 if you have the declaration of `AF_UNSPEC', and to 0 if you
don't. */
#undef HAVE_DECL_AF_UNSPEC
/* Define to 1 if you have the declaration of `PF_INET6', and to 0 if you
don't. */
#undef HAVE_DECL_PF_INET6
/* Define to 1 if you have the declaration of `PF_UNSPEC', and to 0 if you
don't. */
#undef HAVE_DECL_PF_UNSPEC
/* Define to 1 if you have the declaration of `__func__', and to 0 if you
don't. */
#undef HAVE_DECL___FUNC__
/* Define to 1 if you have the <dlfcn.h> header file. */
#undef HAVE_DLFCN_H
/* Define to 1 if you have the <event.h> header file. */
#undef HAVE_EVENT_H
/* Define to 1 if you have the <fcntl.h> header file. */
#undef HAVE_FCNTL_H
/* Define to 1 if you have the <hostLib.h> header file. */
#undef HAVE_HOSTLIB_H
/* Define to 1 if you have the <hwloc.h> header file. */
#undef HAVE_HWLOC_H
/* Define to 1 if the system has the type `int16_t'. */
#undef HAVE_INT16_T
/* Define to 1 if the system has the type `int32_t'. */
#undef HAVE_INT32_T
/* Define to 1 if the system has the type `int64_t'. */
#undef HAVE_INT64_T
/* Define to 1 if the system has the type `int8_t'. */
#undef HAVE_INT8_T
/* Define to 1 if the system has the type `intptr_t'. */
#undef HAVE_INTPTR_T
/* Define to 1 if you have the <inttypes.h> header file. */
#undef HAVE_INTTYPES_H
/* Define to 1 if you have the <ioLib.h> header file. */
#undef HAVE_IOLIB_H
/* Define to 1 if you have the `event' library (-levent). */
#undef HAVE_LIBEVENT
/* Define to 1 if you have the `libevent_global_shutdown' function. */
#undef HAVE_LIBEVENT_GLOBAL_SHUTDOWN
/* Define to 1 if you have the `event_pthreads' library (-levent_pthreads). */
#undef HAVE_LIBEVENT_PTHREADS
/* Define to 1 if you have the <libgen.h> header file. */
#undef HAVE_LIBGEN_H
/* Define to 1 if you have the <limits.h> header file. */
#undef HAVE_LIMITS_H
/* Define to 1 if the system has the type `long long'. */
#undef HAVE_LONG_LONG
/* Define to 1 if you have the <memory.h> header file. */
#undef HAVE_MEMORY_H
/* Define to 1 if you have the <munge.h> header file. */
#undef HAVE_MUNGE_H
/* Define to 1 if you have the <netinet/in.h> header file. */
#undef HAVE_NETINET_IN_H
/* Define to 1 if you have the <net/uio.h> header file. */
#undef HAVE_NET_UIO_H
/* Define to 1 if the system has the type `ptrdiff_t'. */
#undef HAVE_PTRDIFF_T
/* Define to 1 if you have the <sasl/sasl.h> header file. */
#undef HAVE_SASL_SASL_H
/* Define to 1 if `si_band' is a member of `siginfo_t'. */
#undef HAVE_SIGINFO_T_SI_BAND
/* Define to 1 if `si_fd' is a member of `siginfo_t'. */
#undef HAVE_SIGINFO_T_SI_FD
/* Define to 1 if you have the <signal.h> header file. */
#undef HAVE_SIGNAL_H
/* Define to 1 if you have the `snprintf' function. */
#undef HAVE_SNPRINTF
/* Define to 1 if you have the `socketpair' function. */
#undef HAVE_SOCKETPAIR
/* Define to 1 if the system has the type `socklen_t'. */
#undef HAVE_SOCKLEN_T
/* Define to 1 if you have the <sockLib.h> header file. */
#undef HAVE_SOCKLIB_H
/* Define to 1 if you have the <stdarg.h> header file. */
#undef HAVE_STDARG_H
/* Define to 1 if you have the <stdbool.h> header file. */
#undef HAVE_STDBOOL_H
/* Define to 1 if you have the <stddef.h> header file. */
#undef HAVE_STDDEF_H
/* Define to 1 if you have the <stdint.h> header file. */
#undef HAVE_STDINT_H
/* Define to 1 if you have the <stdlib.h> header file. */
#undef HAVE_STDLIB_H
/* Define to 1 if you have the <strings.h> header file. */
#undef HAVE_STRINGS_H
/* Define to 1 if you have the <string.h> header file. */
#undef HAVE_STRING_H
/* Define to 1 if you have the `strncpy_s' function. */
#undef HAVE_STRNCPY_S
/* Define to 1 if you have the `strsignal' function. */
#undef HAVE_STRSIGNAL
/* Define to 1 if `d_type' is a member of `struct dirent'. */
#undef HAVE_STRUCT_DIRENT_D_TYPE
/* Define to 1 if the system has the type `struct sockaddr_in'. */
#undef HAVE_STRUCT_SOCKADDR_IN
/* Define to 1 if the system has the type `struct sockaddr_in6'. */
#undef HAVE_STRUCT_SOCKADDR_IN6
/* Define to 1 if `sa_len' is a member of `struct sockaddr'. */
#undef HAVE_STRUCT_SOCKADDR_SA_LEN
/* Define to 1 if the system has the type `struct sockaddr_storage'. */
#undef HAVE_STRUCT_SOCKADDR_STORAGE
/* Define to 1 if the system has the type `struct sockaddr_un'. */
#undef HAVE_STRUCT_SOCKADDR_UN
/* Define to 1 if `f_fstypename' is a member of `struct statfs'. */
#undef HAVE_STRUCT_STATFS_F_FSTYPENAME
/* Define to 1 if `f_type' is a member of `struct statfs'. */
#undef HAVE_STRUCT_STATFS_F_TYPE
/* Define to 1 if `f_basetype' is a member of `struct statvfs'. */
#undef HAVE_STRUCT_STATVFS_F_BASETYPE
/* Define to 1 if `f_fstypename' is a member of `struct statvfs'. */
#undef HAVE_STRUCT_STATVFS_F_FSTYPENAME
/* Define to 1 if you have the <syslog.h> header file. */
#undef HAVE_SYSLOG_H
/* Define to 1 if you have the <sys/param.h> header file. */
#undef HAVE_SYS_PARAM_H
/* Define to 1 if you have the <sys/select.h> header file. */
#undef HAVE_SYS_SELECT_H
/* Define to 1 if you have the <sys/socket.h> header file. */
#undef HAVE_SYS_SOCKET_H
/* Define to 1 if you have the <sys/stat.h> header file. */
#undef HAVE_SYS_STAT_H
/* Define to 1 if you have the <sys/time.h> header file. */
#undef HAVE_SYS_TIME_H
/* Define to 1 if you have the <sys/types.h> header file. */
#undef HAVE_SYS_TYPES_H
/* Define to 1 if you have the <sys/uio.h> header file. */
#undef HAVE_SYS_UIO_H
/* Define to 1 if you have the <sys/un.h> header file. */
#undef HAVE_SYS_UN_H
/* Define to 1 if you have the <sys/wait.h> header file. */
#undef HAVE_SYS_WAIT_H
/* Define to 1 if you have the <time.h> header file. */
#undef HAVE_TIME_H
/* Define to 1 if the system has the type `uint16_t'. */
#undef HAVE_UINT16_T
/* Define to 1 if the system has the type `uint32_t'. */
#undef HAVE_UINT32_T
/* Define to 1 if the system has the type `uint64_t'. */
#undef HAVE_UINT64_T
/* Define to 1 if the system has the type `uint8_t'. */
#undef HAVE_UINT8_T
/* Define to 1 if the system has the type `uintptr_t'. */
#undef HAVE_UINTPTR_T
/* Define to 1 if you have the <unistd.h> header file. */
#undef HAVE_UNISTD_H
/* whether unix byteswap routines -- htonl, htons, nothl, ntohs -- are
available */
#undef HAVE_UNIX_BYTESWAP
/* Define to 1 if you have the `usleep' function. */
#undef HAVE_USLEEP
/* Define to 1 if you have the `vasprintf' function. */
#undef HAVE_VASPRINTF
/* Define to 1 if you have the `vsnprintf' function. */
#undef HAVE_VSNPRINTF
/* Define to the sub-directory where libtool stores uninstalled libraries. */
#undef LT_OBJDIR
/* Define to the address where bug reports for this package should be sent. */
#undef PACKAGE_BUGREPORT
/* Define to the full name of this package. */
#undef PACKAGE_NAME
/* Define to the full name and version of this package. */
#undef PACKAGE_STRING
/* Define to the one symbol short name of this package. */
#undef PACKAGE_TARNAME
/* Define to the home page for this package. */
#undef PACKAGE_URL
/* Define to the version of this package. */
#undef PACKAGE_VERSION
/* Alignment of type bool */
#undef PMIX_ALIGNMENT_BOOL
/* Alignment of type char */
#undef PMIX_ALIGNMENT_CHAR
/* Alignment of type double */
#undef PMIX_ALIGNMENT_DOUBLE
/* Alignment of type float */
#undef PMIX_ALIGNMENT_FLOAT
/* Alignment of type int */
#undef PMIX_ALIGNMENT_INT
/* Alignment of type int16_t */
#undef PMIX_ALIGNMENT_INT16
/* Alignment of type int32_t */
#undef PMIX_ALIGNMENT_INT32
/* Alignment of type int64_t */
#undef PMIX_ALIGNMENT_INT64
/* Alignment of type int8_t */
#undef PMIX_ALIGNMENT_INT8
/* Alignment of type long */
#undef PMIX_ALIGNMENT_LONG
/* Alignment of type long double */
#undef PMIX_ALIGNMENT_LONG_DOUBLE
/* Alignment of type long long */
#undef PMIX_ALIGNMENT_LONG_LONG
/* Alignment of type short */
#undef PMIX_ALIGNMENT_SHORT
/* Alignment of type size_t */
#undef PMIX_ALIGNMENT_SIZE_T
/* Alignment of type void * */
#undef PMIX_ALIGNMENT_VOID_P
/* Alignment of type wchar_t */
#undef PMIX_ALIGNMENT_WCHAR
/* The compiler $lower which PMIx was built with */
#undef PMIX_BUILD_PLATFORM_COMPILER_FAMILYID
/* The compiler $lower which PMIX was built with */
#undef PMIX_BUILD_PLATFORM_COMPILER_FAMILYNAME
/* The compiler $lower which PMIx was built with */
#undef PMIX_BUILD_PLATFORM_COMPILER_VERSION
/* The compiler $lower which PMIX was built with */
#undef PMIX_BUILD_PLATFORM_COMPILER_VERSION_STR
/* PMIx underlying C compiler */
#undef PMIX_CC
/* Use static const char[] strings for C files */
#undef PMIX_CC_USE_CONST_CHAR_IDENT
/* Use #ident strings for C files */
#undef PMIX_CC_USE_IDENT
/* Use #pragma comment for C files */
#undef PMIX_CC_USE_PRAGMA_COMMENT
/* Use #pragma ident strings for C files */
#undef PMIX_CC_USE_PRAGMA_IDENT
/* Whether C compiler supports __builtin_clz */
#undef PMIX_C_HAVE_BUILTIN_CLZ
/* Whether C compiler supports __builtin_expect */
#undef PMIX_C_HAVE_BUILTIN_EXPECT
/* Whether C compiler supports __builtin_prefetch */
#undef PMIX_C_HAVE_BUILTIN_PREFETCH
/* Whether C compiler supports symbol visibility or not */
#undef PMIX_C_HAVE_VISIBILITY
/* Whether we are in debugging mode or not */
#undef PMIX_ENABLE_DEBUG
/* Whether we want developer-level timing support or not */
#undef PMIX_ENABLE_TIMING
/* Location of event2/thread.h */
#undef PMIX_EVENT2_THREAD_HEADER
/* Location of event.h */
#undef PMIX_EVENT_HEADER
/* Whether your compiler has __attribute__ or not */
#undef PMIX_HAVE_ATTRIBUTE
/* Whether your compiler has __attribute__ aligned or not */
#undef PMIX_HAVE_ATTRIBUTE_ALIGNED
/* Whether your compiler has __attribute__ always_inline or not */
#undef PMIX_HAVE_ATTRIBUTE_ALWAYS_INLINE
/* Whether your compiler has __attribute__ cold or not */
#undef PMIX_HAVE_ATTRIBUTE_COLD
/* Whether your compiler has __attribute__ const or not */
#undef PMIX_HAVE_ATTRIBUTE_CONST
/* Whether your compiler has __attribute__ deprecated or not */
#undef PMIX_HAVE_ATTRIBUTE_DEPRECATED
/* Whether your compiler has __attribute__ deprecated with optional argument
*/
#undef PMIX_HAVE_ATTRIBUTE_DEPRECATED_ARGUMENT
/* Whether your compiler has __attribute__ destructor or not */
#undef PMIX_HAVE_ATTRIBUTE_DESTRUCTOR
/* Whether your compiler has __attribute__ format or not */
#undef PMIX_HAVE_ATTRIBUTE_FORMAT
/* Whether your compiler has __attribute__ format and it works on function
pointers */
#undef PMIX_HAVE_ATTRIBUTE_FORMAT_FUNCPTR
/* Whether your compiler has __attribute__ hot or not */
#undef PMIX_HAVE_ATTRIBUTE_HOT
/* Whether your compiler has __attribute__ malloc or not */
#undef PMIX_HAVE_ATTRIBUTE_MALLOC
/* Whether your compiler has __attribute__ may_alias or not */
#undef PMIX_HAVE_ATTRIBUTE_MAY_ALIAS
/* Whether your compiler has __attribute__ nonnull or not */
#undef PMIX_HAVE_ATTRIBUTE_NONNULL
/* Whether your compiler has __attribute__ noreturn or not */
#undef PMIX_HAVE_ATTRIBUTE_NORETURN
/* Whether your compiler has __attribute__ noreturn and it works on function
pointers */
#undef PMIX_HAVE_ATTRIBUTE_NORETURN_FUNCPTR
/* Whether your compiler has __attribute__ no_instrument_function or not */
#undef PMIX_HAVE_ATTRIBUTE_NO_INSTRUMENT_FUNCTION
/* Whether your compiler has __attribute__ packed or not */
#undef PMIX_HAVE_ATTRIBUTE_PACKED
/* Whether your compiler has __attribute__ pure or not */
#undef PMIX_HAVE_ATTRIBUTE_PURE
/* Whether your compiler has __attribute__ sentinel or not */
#undef PMIX_HAVE_ATTRIBUTE_SENTINEL
/* Whether your compiler has __attribute__ unused or not */
#undef PMIX_HAVE_ATTRIBUTE_UNUSED
/* Whether your compiler has __attribute__ visibility or not */
#undef PMIX_HAVE_ATTRIBUTE_VISIBILITY
/* Whether your compiler has __attribute__ warn unused result or not */
#undef PMIX_HAVE_ATTRIBUTE_WARN_UNUSED_RESULT
/* Whether your compiler has __attribute__ weak alias or not */
#undef PMIX_HAVE_ATTRIBUTE_WEAK_ALIAS
/* whether qsort is broken or not */
#undef PMIX_HAVE_BROKEN_QSORT
/* whether ceil is found and available */
#undef PMIX_HAVE_CEIL
/* whether dirname is found and available */
#undef PMIX_HAVE_DIRNAME
/* Whether we have hwloc support or not */
#undef PMIX_HAVE_HWLOC
/* Whether we have munge support or not */
#undef PMIX_HAVE_MUNGE
/* Whether we have sasl support or not */
#undef PMIX_HAVE_SASL
/* Whether we have SA_RESTART in <signal.h> or not */
#undef PMIX_HAVE_SA_RESTART
/* whether socket is found and available */
#undef PMIX_HAVE_SOCKET
/* Whether we have __va_copy or not */
#undef PMIX_HAVE_UNDERSCORE_VA_COPY
/* Whether we have va_copy or not */
#undef PMIX_HAVE_VA_COPY
/* Location of hwloc.h */
#undef PMIX_HWLOC_HEADER
/* ident string for PMIX */
#undef PMIX_IDENT_STRING
/* Whether the C compiler supports "bool" without any other help (such as
<stdbool.h>) */
#undef PMIX_NEED_C_BOOL
/* type to use for ptrdiff_t */
#undef PMIX_PTRDIFF_TYPE
/* The pmix symbol prefix */
#undef PMIX_SYM_PREFIX
/* The pmix symbol prefix in all caps */
#undef PMIX_SYM_PREFIX_CAPS
/* Whether we need to re-define all the pmix public symbols or not */
#undef PMIX_SYM_TRANSFORM
/* Whether to use <stdbool.h> or not */
#undef PMIX_USE_STDBOOL_H
/* The library version is always available, contrary to VERSION */
#undef PMIX_VERSION
/* if want pretty-print stack trace feature */
#undef PMIX_WANT_PRETTY_PRINT_STACKTRACE
/* The size of `char', as computed by sizeof. */
#undef SIZEOF_CHAR
/* The size of `double', as computed by sizeof. */
#undef SIZEOF_DOUBLE
/* The size of `float', as computed by sizeof. */
#undef SIZEOF_FLOAT
/* The size of `int', as computed by sizeof. */
#undef SIZEOF_INT
/* The size of `long', as computed by sizeof. */
#undef SIZEOF_LONG
/* The size of `long long', as computed by sizeof. */
#undef SIZEOF_LONG_LONG
/* The size of `pid_t', as computed by sizeof. */
#undef SIZEOF_PID_T
/* The size of `ptrdiff_t', as computed by sizeof. */
#undef SIZEOF_PTRDIFF_T
/* The size of `short', as computed by sizeof. */
#undef SIZEOF_SHORT
/* The size of `size_t', as computed by sizeof. */
#undef SIZEOF_SIZE_T
/* The size of `ssize_t', as computed by sizeof. */
#undef SIZEOF_SSIZE_T
/* The size of `void *', as computed by sizeof. */
#undef SIZEOF_VOID_P
/* The size of `wchar_t', as computed by sizeof. */
#undef SIZEOF_WCHAR_T
/* The size of `_Bool', as computed by sizeof. */
#undef SIZEOF__BOOL
/* Define to 1 if you have the ANSI C header files. */
#undef STDC_HEADERS
/* Enable extensions on AIX 3, Interix. */
#ifndef _ALL_SOURCE
# undef _ALL_SOURCE
#endif
/* Enable GNU extensions on systems that have them. */
#ifndef _GNU_SOURCE
# undef _GNU_SOURCE
#endif
/* Enable threading extensions on Solaris. */
#ifndef _POSIX_PTHREAD_SEMANTICS
# undef _POSIX_PTHREAD_SEMANTICS
#endif
/* Enable extensions on HP NonStop. */
#ifndef _TANDEM_SOURCE
# undef _TANDEM_SOURCE
#endif
/* Enable general extensions on Solaris. */
#ifndef __EXTENSIONS__
# undef __EXTENSIONS__
#endif
/* Define WORDS_BIGENDIAN to 1 if your processor stores words with the most
significant byte first (like Motorola and SPARC, unlike Intel). */
#if defined AC_APPLE_UNIVERSAL_BUILD
# if defined __BIG_ENDIAN__
# define WORDS_BIGENDIAN 1
# endif
#else
# ifndef WORDS_BIGENDIAN
# undef WORDS_BIGENDIAN
# endif
#endif
/* Enable GNU extensions on systems that have them. */
#ifndef _GNU_SOURCE
# undef _GNU_SOURCE
#endif
/* Define to 1 if on MINIX. */
#undef _MINIX
/* Define to 2 if the system does not provide POSIX.1 features except with
this defined. */
#undef _POSIX_1_SOURCE
/* Define to 1 if you need to in order for `stat' and other things to work. */
#undef _POSIX_SOURCE
/* Define to `__inline__' or `__inline' if that's what the C compiler
calls it, or to nothing if 'inline' is not supported under any name. */
#ifndef __cplusplus
#undef inline
#endif
#include <pmix/autogen/pmix_config_bottom.h>
#endif /* PMIX_CONFIG_H */

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

@ -68,6 +68,8 @@ PMIX_DECLSPEC pmix_status_t pmix_value_unload(pmix_value_t *kv, void **data,
(b)->bytes_allocated = (s); \
(b)->pack_ptr = ((char*)(b)->base_ptr) + (s); \
(b)->unpack_ptr = (b)->base_ptr; \
(d) = NULL; \
(s) = 0; \
} while(0);
#define PMIX_UNLOAD_BUFFER(b, d, s) \

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

@ -663,7 +663,7 @@ int pmix_bfrop_print_pdata(char **output, char *prefix,
pmix_bfrop_print_proc(&tmp1, NULL, &src->proc, PMIX_PROC);
pmix_bfrop_print_value(&tmp2, NULL, &src->value, PMIX_VALUE);
asprintf(output, "%sPROC: %s KEY: %s %s", prefix, tmp1, src->key,
asprintf(output, "%s %s KEY: %s %s", prefix, tmp1, src->key,
(NULL == tmp2) ? "NULL" : tmp2);
if (NULL != tmp1) {
free(tmp1);
@ -689,6 +689,13 @@ int pmix_bfrop_print_app(char **output, char *prefix,
int pmix_bfrop_print_proc(char **output, char *prefix,
pmix_proc_t *src, pmix_data_type_t type)
{
char *prefx;
/* deal with NULL prefix */
if (NULL == prefix) asprintf(&prefx, " ");
else prefx = prefix;
asprintf(output, "%sPROC: %s:%d", prefx, src->nspace, src->rank);
return PMIX_SUCCESS;
}

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

@ -228,16 +228,14 @@ int PMIx_Init(pmix_proc_t *proc)
pmix_nspace_t *nsptr;
pmix_cb_t cb;
if (NULL == proc) {
return PMIX_ERR_BAD_PARAM;
}
if (0 < pmix_globals.init_cntr) {
/* since we have been called before, the nspace and
* rank should be known. So return them here if
* requested */
(void)strncpy(proc->nspace, pmix_globals.myid.nspace, PMIX_MAX_NSLEN);
proc->rank = pmix_globals.myid.rank;
if (NULL != proc) {
(void)strncpy(proc->nspace, pmix_globals.myid.nspace, PMIX_MAX_NSLEN);
proc->rank = pmix_globals.myid.rank;
}
return PMIX_SUCCESS;
}
@ -281,7 +279,9 @@ int PMIx_Init(pmix_proc_t *proc)
pmix_class_finalize();
return PMIX_ERR_INVALID_NAMESPACE;
}
(void)strncpy(proc->nspace, evar, PMIX_MAX_NSLEN);
if (NULL != proc) {
(void)strncpy(proc->nspace, evar, PMIX_MAX_NSLEN);
}
(void)strncpy(pmix_globals.myid.nspace, evar, PMIX_MAX_NSLEN);
nsptr = PMIX_NEW(pmix_nspace_t);
(void)strncpy(nsptr->nspace, evar, PMIX_MAX_NSLEN);
@ -336,7 +336,9 @@ int PMIx_Init(pmix_proc_t *proc)
return PMIX_ERR_DATA_VALUE_NOT_FOUND;
}
pmix_globals.myid.rank = strtol(evar, NULL, 10);
proc->rank = pmix_globals.myid.rank;
if (NULL != proc) {
proc->rank = pmix_globals.myid.rank;
}
pmix_globals.pindex = -1;
/* setup the support */
@ -530,12 +532,70 @@ int PMIx_Abort(int flag, const char msg[],
return PMIX_SUCCESS;
}
pmix_status_t PMIx_Put(pmix_scope_t scope, const char key[], pmix_value_t *val)
static void _putfn(int sd, short args, void *cbdata)
{
pmix_cb_t *cb = (pmix_cb_t*)cbdata;
pmix_status_t rc;
pmix_kval_t *kv;
pmix_nspace_t *ns;
/* setup to xfer the data */
kv = PMIX_NEW(pmix_kval_t);
kv->key = strdup(cb->key); // need to copy as the input belongs to the user
kv->value = (pmix_value_t*)malloc(sizeof(pmix_value_t));
rc = pmix_value_xfer(kv->value, cb->value);
if (PMIX_SUCCESS != rc) {
PMIX_ERROR_LOG(rc);
goto done;
}
/* put it in our own modex hash table in case something
* internal to us wants it - our nsrecord is always
* first on the list */
if (NULL == (ns = (pmix_nspace_t*)pmix_list_get_first(&pmix_globals.nspaces))) {
/* shouldn't be possible */
goto done;
}
if (PMIX_SUCCESS != (rc = pmix_hash_store(&ns->modex, pmix_globals.myid.rank, kv))) {
PMIX_ERROR_LOG(rc);
}
/* pack the cache that matches the scope - global scope needs
* to go into both local and remote caches */
if (PMIX_LOCAL == cb->scope || PMIX_GLOBAL == cb->scope) {
if (NULL == pmix_globals.cache_local) {
pmix_globals.cache_local = PMIX_NEW(pmix_buffer_t);
}
pmix_output_verbose(2, pmix_globals.debug_output,
"pmix: put %s data for key %s in local cache",
cb->key, (PMIX_GLOBAL == cb->scope) ? "global" : "local");
if (PMIX_SUCCESS != (rc = pmix_bfrop.pack(pmix_globals.cache_local, kv, 1, PMIX_KVAL))) {
PMIX_ERROR_LOG(rc);
}
}
if (PMIX_REMOTE == cb->scope || PMIX_GLOBAL == cb->scope) {
if (NULL == pmix_globals.cache_remote) {
pmix_globals.cache_remote = PMIX_NEW(pmix_buffer_t);
}
pmix_output_verbose(2, pmix_globals.debug_output,
"pmix: put %s data for key %s in remote cache",
cb->key, (PMIX_GLOBAL == cb->scope) ? "global" : "remote");
if (PMIX_SUCCESS != (rc = pmix_bfrop.pack(pmix_globals.cache_remote, kv, 1, PMIX_KVAL))) {
PMIX_ERROR_LOG(rc);
}
}
done:
PMIX_RELEASE(kv); // maintain accounting
cb->pstatus = rc;
cb->active = false;
}
pmix_status_t PMIx_Put(pmix_scope_t scope, const char key[], pmix_value_t *val)
{
pmix_cb_t *cb;
pmix_status_t rc;
pmix_output_verbose(2, pmix_globals.debug_output,
"pmix: executing put for key %s type %d",
key, val->type);
@ -544,66 +604,85 @@ pmix_status_t PMIx_Put(pmix_scope_t scope, const char key[], pmix_value_t *val)
return PMIX_ERR_INIT;
}
/* setup to xfer the data */
kv = PMIX_NEW(pmix_kval_t);
kv->key = strdup((char*)key);
kv->value = (pmix_value_t*)malloc(sizeof(pmix_value_t));
rc = pmix_value_xfer(kv->value, val);
if (PMIX_SUCCESS != rc) {
PMIX_ERROR_LOG(rc);
PMIX_RELEASE(kv);
return rc;
}
/* put it in our own modex hash table in case something
* internal to us wants it - our nsrecord is always
* first on the list */
if (NULL == (ns = (pmix_nspace_t*)pmix_list_get_first(&pmix_globals.nspaces))) {
/* shouldn't be possible */
PMIX_RELEASE(kv);
return PMIX_ERR_INIT;
}
if (PMIX_SUCCESS != (rc = pmix_hash_store(&ns->modex, pmix_globals.myid.rank, kv))) {
PMIX_ERROR_LOG(rc);
}
/* create a callback object */
cb = PMIX_NEW(pmix_cb_t);
cb->active = true;
cb->scope = scope;
cb->key = (char*)key;
cb->value = val;
/* pack the cache that matches the scope - global scope needs
* to go into both local and remote caches */
if (PMIX_LOCAL == scope || PMIX_GLOBAL == scope) {
if (NULL == pmix_globals.cache_local) {
pmix_globals.cache_local = PMIX_NEW(pmix_buffer_t);
}
pmix_output_verbose(2, pmix_globals.debug_output,
"pmix: put %s data for key %s in local cache",
key, (PMIX_GLOBAL == scope) ? "global" : "local");
if (PMIX_SUCCESS != (rc = pmix_bfrop.pack(pmix_globals.cache_local, kv, 1, PMIX_KVAL))) {
PMIX_ERROR_LOG(rc);
}
}
/* pass this into the event library for thread protection */
PMIX_THREAD_SHIFT(cb, _putfn);
if (PMIX_REMOTE == scope || PMIX_GLOBAL == scope) {
if (NULL == pmix_globals.cache_remote) {
pmix_globals.cache_remote = PMIX_NEW(pmix_buffer_t);
}
pmix_output_verbose(2, pmix_globals.debug_output,
"pmix: put %s data for key %s in remote cache",
key, (PMIX_GLOBAL == scope) ? "global" : "remote");
if (PMIX_SUCCESS != (rc = pmix_bfrop.pack(pmix_globals.cache_remote, kv, 1, PMIX_KVAL))) {
PMIX_ERROR_LOG(rc);
}
}
PMIX_RELEASE(kv); // maintain accounting
/* wait for the result */
PMIX_WAIT_FOR_COMPLETION(cb->active);
rc = cb->pstatus;
PMIX_RELEASE(cb);
return rc;
}
pmix_status_t PMIx_Commit(void)
static void _commitfn(int sd, short args, void *cbdata)
{
pmix_cb_t *cb = (pmix_cb_t*)cbdata;
pmix_status_t rc;
pmix_scope_t scope;
pmix_buffer_t *msgout;
pmix_cmd_t cmd=PMIX_COMMIT_CMD;
msgout = PMIX_NEW(pmix_buffer_t);
/* pack the cmd */
if (PMIX_SUCCESS != (rc = pmix_bfrop.pack(msgout, &cmd, 1, PMIX_CMD))) {
PMIX_ERROR_LOG(rc);
PMIX_RELEASE(msgout);
goto done;
}
/* if we haven't already done it, ensure we have committed our values */
if (NULL != pmix_globals.cache_local) {
scope = PMIX_LOCAL;
if (PMIX_SUCCESS != (rc = pmix_bfrop.pack(msgout, &scope, 1, PMIX_SCOPE))) {
PMIX_ERROR_LOG(rc);
PMIX_RELEASE(msgout);
goto done;
}
if (PMIX_SUCCESS != (rc = pmix_bfrop.pack(msgout, &pmix_globals.cache_local, 1, PMIX_BUFFER))) {
PMIX_ERROR_LOG(rc);
PMIX_RELEASE(msgout);
goto done;
}
PMIX_RELEASE(pmix_globals.cache_local);
}
if (NULL != pmix_globals.cache_remote) {
scope = PMIX_REMOTE;
if (PMIX_SUCCESS != (rc = pmix_bfrop.pack(msgout, &scope, 1, PMIX_SCOPE))) {
PMIX_ERROR_LOG(rc);
PMIX_RELEASE(msgout);
goto done;
}
if (PMIX_SUCCESS != (rc = pmix_bfrop.pack(msgout, &pmix_globals.cache_remote, 1, PMIX_BUFFER))) {
PMIX_ERROR_LOG(rc);
PMIX_RELEASE(msgout);
goto done;
}
PMIX_RELEASE(pmix_globals.cache_remote);
}
/* push the message into our event base to send to the server - always
* send, even if we have nothing to contribute, so the server knows
* that we contributed whatever we had */
PMIX_ACTIVATE_SEND_RECV(&pmix_client_globals.myserver, msgout, NULL, NULL);
done:
cb->pstatus = rc;
cb->active = false;
}
pmix_status_t PMIx_Commit(void)
{
pmix_cb_t *cb;
pmix_status_t rc;
/* if we are a server, or we aren't connected, don't attempt to send */
if (pmix_globals.server) {
return PMIX_SUCCESS; // not an error
@ -612,70 +691,37 @@ pmix_status_t PMIx_Commit(void)
return PMIX_ERR_UNREACH;
}
msgout = PMIX_NEW(pmix_buffer_t);
/* pack the cmd */
if (PMIX_SUCCESS != (rc = pmix_bfrop.pack(msgout, &cmd, 1, PMIX_CMD))) {
PMIX_ERROR_LOG(rc);
PMIX_RELEASE(msgout);
return rc;
}
/* create a callback object */
cb = PMIX_NEW(pmix_cb_t);
cb->active = true;
/* if we haven't already done it, ensure we have committed our values */
if (NULL != pmix_globals.cache_local) {
scope = PMIX_LOCAL;
if (PMIX_SUCCESS != (rc = pmix_bfrop.pack(msgout, &scope, 1, PMIX_SCOPE))) {
PMIX_ERROR_LOG(rc);
PMIX_RELEASE(msgout);
return rc;
}
if (PMIX_SUCCESS != (rc = pmix_bfrop.pack(msgout, &pmix_globals.cache_local, 1, PMIX_BUFFER))) {
PMIX_ERROR_LOG(rc);
PMIX_RELEASE(msgout);
return rc;
}
PMIX_RELEASE(pmix_globals.cache_local);
}
if (NULL != pmix_globals.cache_remote) {
scope = PMIX_REMOTE;
if (PMIX_SUCCESS != (rc = pmix_bfrop.pack(msgout, &scope, 1, PMIX_SCOPE))) {
PMIX_ERROR_LOG(rc);
PMIX_RELEASE(msgout);
return rc;
}
if (PMIX_SUCCESS != (rc = pmix_bfrop.pack(msgout, &pmix_globals.cache_remote, 1, PMIX_BUFFER))) {
PMIX_ERROR_LOG(rc);
PMIX_RELEASE(msgout);
return rc;
}
PMIX_RELEASE(pmix_globals.cache_remote);
}
/* pass this into the event library for thread protection */
PMIX_THREAD_SHIFT(cb, _commitfn);
/* push the message into our event base to send to the server - always
* send, even if we have nothing to contribute, so the server knows
* that we contributed whatever we had */
PMIX_ACTIVATE_SEND_RECV(&pmix_client_globals.myserver, msgout, NULL, NULL);
return PMIX_SUCCESS;
/* wait for the result */
PMIX_WAIT_FOR_COMPLETION(cb->active);
rc = cb->pstatus;
PMIX_RELEASE(cb);
return rc;
}
pmix_status_t PMIx_Resolve_peers(const char *nodename, const char *nspace,
pmix_proc_t **procs, size_t *nprocs)
static void _peersfn(int sd, short args, void *cbdata)
{
pmix_cb_t *cb = (pmix_cb_t*)cbdata;
pmix_status_t rc;
char **nsprocs=NULL, **nsps=NULL, **tmp;
pmix_nspace_t *nsptr;
pmix_nrec_t *nptr;
size_t i;
/* set the default */
*procs = NULL;
*nprocs = 0;
/* cycle across our known nspaces */
tmp = NULL;
PMIX_LIST_FOREACH(nsptr, &pmix_globals.nspaces, pmix_nspace_t) {
if (NULL == nspace || 0 == strcmp(nsptr->nspace, nspace)) {
if (0 == strncmp(nsptr->nspace, cb->nspace, PMIX_MAX_NSLEN)) {
/* cycle across the nodes in this nspace */
PMIX_LIST_FOREACH(nptr, &nsptr->nodes, pmix_nrec_t) {
if (0 == strcmp(nodename, nptr->name)) {
if (0 == strcmp(cb->key, nptr->name)) {
/* add the contribution from this node */
tmp = pmix_argv_split(nptr->procs, ',');
for (i=0; NULL != tmp[i]; i++) {
@ -689,41 +735,71 @@ pmix_status_t PMIx_Resolve_peers(const char *nodename, const char *nspace,
}
}
if (0 == (i = pmix_argv_count(nsps))) {
/* if we don't already have a record for this nspace,
* see if we have the data in our local cache */
return PMIX_ERR_NOT_FOUND;
/* we don't know this nspace */
rc = PMIX_ERR_NOT_FOUND;
goto done;
}
/* create the required storage */
i = pmix_argv_count(nsps);
PMIX_PROC_CREATE(*procs, i);
*nprocs = pmix_argv_count(nsps);
PMIX_PROC_CREATE(cb->procs, i);
cb->nvals = pmix_argv_count(nsps);
/* transfer the data */
for (i=0; NULL != nsps[i]; i++) {
(void)strncpy((*procs)[i].nspace, nsps[i], PMIX_MAX_NSLEN);
(*procs)[i].rank = strtol(nsprocs[i], NULL, 10);
(void)strncpy(cb->procs[i].nspace, nsps[i], PMIX_MAX_NSLEN);
cb->procs[i].rank = strtol(nsprocs[i], NULL, 10);
}
pmix_argv_free(nsps);
pmix_argv_free(nsprocs);
rc = PMIX_SUCCESS;
return PMIX_SUCCESS;
done:
cb->pstatus = rc;
cb->active = false;
}
pmix_status_t PMIx_Resolve_nodes(const char *nspace, char **nodelist)
pmix_status_t PMIx_Resolve_peers(const char *nodename, const char *nspace,
pmix_proc_t **procs, size_t *nprocs)
{
pmix_cb_t *cb;
pmix_status_t rc;
/* create a callback object */
cb = PMIX_NEW(pmix_cb_t);
cb->active = true;
cb->key = (char*)nodename;
if (NULL != nspace) {
(void)strncpy(cb->nspace, nspace, PMIX_MAX_NSLEN);
}
/* pass this into the event library for thread protection */
PMIX_THREAD_SHIFT(cb, _peersfn);
/* wait for the result */
PMIX_WAIT_FOR_COMPLETION(cb->active);
rc = cb->pstatus;
/* transfer the result */
*procs = cb->procs;
*nprocs = cb->nvals;
/* cleanup */
PMIX_RELEASE(cb);
return rc;
}
static void _nodesfn(int sd, short args, void *cbdata)
{
pmix_cb_t *cb = (pmix_cb_t*)cbdata;
pmix_status_t rc;
char **tmp;
pmix_nspace_t *nsptr;
pmix_nrec_t *nptr;
/* set the default */
*nodelist = NULL;
/* cycle across our known nspaces */
tmp = NULL;
PMIX_LIST_FOREACH(nsptr, &pmix_globals.nspaces, pmix_nspace_t) {
if (NULL == nspace || 0 == strcmp(nsptr->nspace, nspace)) {
if (0 == strncmp(nsptr->nspace, cb->nspace, PMIX_MAX_NSLEN)) {
/* cycle across the nodes in this nspace */
PMIX_LIST_FOREACH(nptr, &nsptr->nodes, pmix_nrec_t) {
pmix_argv_append_unique_nosize(&tmp, nptr->name, false);
@ -731,11 +807,39 @@ pmix_status_t PMIx_Resolve_nodes(const char *nspace, char **nodelist)
}
}
if (NULL == tmp) {
return PMIX_ERR_NOT_FOUND;
rc = PMIX_ERR_NOT_FOUND;
} else {
cb->key = pmix_argv_join(tmp, ',');
pmix_argv_free(tmp);
rc = PMIX_SUCCESS;
}
*nodelist = pmix_argv_join(tmp, ',');
pmix_argv_free(tmp);
return PMIX_SUCCESS;
cb->pstatus = rc;
cb->active = false;
}
pmix_status_t PMIx_Resolve_nodes(const char *nspace, char **nodelist)
{
pmix_cb_t *cb;
pmix_status_t rc;
/* create a callback object */
cb = PMIX_NEW(pmix_cb_t);
cb->active = true;
if (NULL != nspace) {
(void)strncpy(cb->nspace, nspace, PMIX_MAX_NSLEN);
}
/* pass this into the event library for thread protection */
PMIX_THREAD_SHIFT(cb, _nodesfn);
/* wait for the result */
PMIX_WAIT_FOR_COMPLETION(cb->active);
rc = cb->pstatus;
*nodelist = cb->key;
PMIX_RELEASE(cb);
return rc;
}
@ -919,9 +1023,6 @@ void pmix_client_process_nspace_blob(const char *nspace, pmix_buffer_t *bptr)
bo = &(kptr->value->data.bo);
PMIX_CONSTRUCT(&buf2, pmix_buffer_t);
PMIX_LOAD_BUFFER(&buf2, bo->bytes, bo->size);
/* protect the data */
kptr->value->data.bo.bytes = NULL;
kptr->value->data.bo.size = 0;
PMIX_RELEASE(kptr);
/* start by unpacking the rank */
cnt = 1;
@ -958,9 +1059,6 @@ void pmix_client_process_nspace_blob(const char *nspace, pmix_buffer_t *bptr)
bo = &(kptr->value->data.bo);
PMIX_CONSTRUCT(&buf2, pmix_buffer_t);
PMIX_LOAD_BUFFER(&buf2, bo->bytes, bo->size);
/* protect the data */
kptr->value->data.bo.bytes = NULL;
kptr->value->data.bo.size = 0;
PMIX_RELEASE(kptr);
/* start by unpacking the number of nodes */
cnt = 1;

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

@ -59,9 +59,12 @@
static pmix_buffer_t* pack_get(char *nspace, int rank,
const pmix_info_t info[], size_t ninfo,
pmix_cmd_t cmd);
static void _getnbfn(int sd, short args, void *cbdata);
static void getnb_cbfunc(struct pmix_peer_t *pr, pmix_usock_hdr_t *hdr,
pmix_buffer_t *buf, void *cbdata);
static void getnb_shortcut(int fd, short flags, void *cbdata);
static void value_cbfunc(int status, pmix_value_t *kv, void *cbdata);
int PMIx_Get(const pmix_proc_t *proc, const char key[],
@ -90,10 +93,8 @@ int PMIx_Get(const pmix_proc_t *proc, const char key[],
* the return message is recvd */
cb = PMIX_NEW(pmix_cb_t);
cb->active = true;
if (PMIX_SUCCESS != (rc = PMIx_Get_nb(proc, key, info, ninfo, value_cbfunc, cb))) {
PMIX_RELEASE(cb);
*val = NULL;
return rc;
}
@ -113,13 +114,7 @@ pmix_status_t PMIx_Get_nb(const pmix_proc_t *proc, const char *key,
const pmix_info_t info[], size_t ninfo,
pmix_value_cbfunc_t cbfunc, void *cbdata)
{
pmix_value_t *val;
pmix_buffer_t *msg;
pmix_cb_t *cb;
pmix_status_t rc;
char *nm;
pmix_nspace_t *ns, *nptr;
size_t n;
if (NULL == proc) {
return PMIX_ERR_BAD_PARAM;
@ -139,184 +134,18 @@ pmix_status_t PMIx_Get_nb(const pmix_proc_t *proc, const char *key,
return PMIX_ERR_BAD_PARAM;
}
/* if the nspace is empty, then the caller is referencing
* our own nspace */
if (0 == strlen(proc->nspace)) {
nm = pmix_globals.myid.nspace;
} else {
nm = (char*)proc->nspace;
}
/* find the nspace object */
nptr = NULL;
PMIX_LIST_FOREACH(ns, &pmix_globals.nspaces, pmix_nspace_t) {
if (0 == strcmp(nm, ns->nspace)) {
nptr = ns;
break;
}
}
if (NULL == nptr) {
/* we are asking for info about a new nspace - give us
* a chance to learn about it from the server. If the
* server has never heard of it, the server will return
* an error */
nptr = PMIX_NEW(pmix_nspace_t);
(void)strncpy(nptr->nspace, nm, PMIX_MAX_NSLEN);
pmix_list_append(&pmix_globals.nspaces, &nptr->super);
/* there is no point in looking for data in this nspace
* object, so let's just go generate the request */
goto request;
}
/* the requested data could be in the job-data table, so let's
* just check there first. */
if (PMIX_SUCCESS == (rc = pmix_hash_fetch(&nptr->internal, PMIX_RANK_WILDCARD, key, &val))) {
/* found it - return it via appropriate channel */
cb = PMIX_NEW(pmix_cb_t);
(void)strncpy(cb->nspace, nm, PMIX_MAX_NSLEN);
cb->rank = proc->rank;
cb->key = strdup(key);
cb->value_cbfunc = cbfunc;
cb->cbdata = cbdata;
/* pack the return data so the unpack routine can get it */
if (PMIX_SUCCESS != (rc = pmix_bfrop.pack(&cb->data, val, 1, PMIX_VALUE))) {
PMIX_ERROR_LOG(rc);
}
/* cleanup */
if (NULL != val) {
PMIX_VALUE_RELEASE(val);
}
/* activate the event */
event_assign(&(cb->ev), pmix_globals.evbase, -1,
EV_WRITE, getnb_shortcut, cb);
event_active(&(cb->ev), EV_WRITE, 1);
return PMIX_SUCCESS;
}
if (PMIX_RANK_WILDCARD == proc->rank) {
/* can't be anywhere else */
return PMIX_ERR_NOT_FOUND;
}
/* it could still be in the job-data table, only stored under its own
* rank and not WILDCARD - e.g., this is true of data returned about
* ourselves during startup */
if (PMIX_SUCCESS == (rc = pmix_hash_fetch(&nptr->internal, proc->rank, key, &val))) {
/* found it - return it via appropriate channel */
cb = PMIX_NEW(pmix_cb_t);
(void)strncpy(cb->nspace, nm, PMIX_MAX_NSLEN);
cb->rank = proc->rank;
cb->key = strdup(key);
cb->value_cbfunc = cbfunc;
cb->cbdata = cbdata;
/* pack the return data so the unpack routine can get it */
if (PMIX_SUCCESS != (rc = pmix_bfrop.pack(&cb->data, val, 1, PMIX_VALUE))) {
PMIX_ERROR_LOG(rc);
}
/* cleanup */
if (NULL != val) {
PMIX_VALUE_RELEASE(val);
}
/* activate the event */
event_assign(&(cb->ev), pmix_globals.evbase, -1,
EV_WRITE, getnb_shortcut, cb);
event_active(&(cb->ev), EV_WRITE, 1);
return PMIX_SUCCESS;
}
/* not finding it is not an error - it could be in the
* modex hash table, so check it */
if (PMIX_SUCCESS == (rc = pmix_hash_fetch(&nptr->modex, proc->rank, key, &val))) {
pmix_output_verbose(2, pmix_globals.debug_output,
"pmix: value retrieved from dstore");
/* need to push this into the event library to ensure
* the callback occurs within an event */
cb = PMIX_NEW(pmix_cb_t);
(void)strncpy(cb->nspace, nm, PMIX_MAX_NSLEN);
cb->rank = proc->rank;
cb->key = strdup(key);
cb->value_cbfunc = cbfunc;
cb->cbdata = cbdata;
/* pack the return data so the unpack routine can get it */
if (PMIX_SUCCESS != (rc = pmix_bfrop.pack(&cb->data, val, 1, PMIX_VALUE))) {
PMIX_ERROR_LOG(rc);
}
/* cleanup */
if (NULL != val) {
PMIX_VALUE_RELEASE(val);
}
/* activate the event */
event_assign(&(cb->ev), pmix_globals.evbase, -1,
EV_WRITE, getnb_shortcut, cb);
event_active(&(cb->ev), EV_WRITE, 1);
return PMIX_SUCCESS;
} else if (PMIX_ERR_NOT_FOUND == rc) {
/* we have the modex data from this proc, but didn't find the key
* the user requested. At this time, there is no way for the
* key to eventually be found, so all we can do is return
* the error */
pmix_output_verbose(2, pmix_globals.debug_output,
"Error requesting key=%s for rank = %d, namespace = %s",
key, proc->rank, nm);
return rc;
}
request:
/* if we got here, then we don't have the data for this proc. If we
* are a server, or we are a client and not connected, then there is
* nothing more we can do */
if (pmix_globals.server || (!pmix_globals.server && !pmix_globals.connected)) {
return PMIX_ERR_NOT_FOUND;
}
/* we also have to check the user's directives to see if they do not want
* us to attempt to retrieve it from the server */
for (n=0; n < ninfo; n++) {
if (0 == strcmp(info[n].key, PMIX_OPTIONAL) &&
info[n].value.data.flag) {
/* they don't want us to try and retrieve it */
pmix_output_verbose(2, pmix_globals.debug_output,
"PMIx_Get key=%s for rank = %d, namespace = %s was not found - request was optional",
key, proc->rank, nm);
return PMIX_ERR_NOT_FOUND;
}
}
/* see if we already have a request in place with the server for data from
* this nspace:rank. If we do, then no need to ask again as the
* request will return _all_ data from that proc */
PMIX_LIST_FOREACH(cb, &pmix_client_globals.pending_requests, pmix_cb_t) {
if (0 == strncmp(nm, cb->nspace, PMIX_MAX_NSLEN) && cb->rank == proc->rank) {
/* we do have a pending request, but we still need to track this
* outstanding request so we can satisfy it once the data is returned */
cb = PMIX_NEW(pmix_cb_t);
(void)strncpy(cb->nspace, nm, PMIX_MAX_NSLEN);
cb->rank = proc->rank;
cb->key = strdup(key);
cb->value_cbfunc = cbfunc;
cb->cbdata = cbdata;
pmix_list_append(&pmix_client_globals.pending_requests, &cb->super);
return PMIX_SUCCESS;
}
}
/* we don't have a pending request, so let's create one - don't worry
* about packing the key as we return everything from that proc */
if (NULL == (msg = pack_get(nm, proc->rank, info, ninfo, PMIX_GETNB_CMD))) {
return PMIX_ERROR;
}
/* create a callback object as we need to pass it to the
* recv routine so we know which callback to use when
* the return message is recvd */
/* thread-shift so we can check global objects */
cb = PMIX_NEW(pmix_cb_t);
(void)strncpy(cb->nspace, nm, PMIX_MAX_NSLEN);
cb->active = true;
(void)strncpy(cb->nspace, proc->nspace, PMIX_MAX_NSLEN);
cb->rank = proc->rank;
cb->key = strdup(key);
cb->key = (char*)key;
cb->info = (pmix_info_t*)info;
cb->ninfo = ninfo;
cb->value_cbfunc = cbfunc;
cb->cbdata = cbdata;
pmix_list_append(&pmix_client_globals.pending_requests, &cb->super);
PMIX_THREAD_SHIFT(cb, _getnbfn);
/* push the message into our event base to send to the server */
PMIX_ACTIVATE_SEND_RECV(&pmix_client_globals.myserver, msg, getnb_cbfunc, cb);
return PMIX_SUCCESS;
}
@ -377,6 +206,9 @@ static pmix_buffer_t* pack_get(char *nspace, int rank,
return msg;
}
/* this callback is coming from the usock recv, and thus
* is occurring inside of our progress thread - hence, no
* need to thread shift */
static void getnb_cbfunc(struct pmix_peer_t *pr, pmix_usock_hdr_t *hdr,
pmix_buffer_t *buf, void *cbdata)
{
@ -410,7 +242,7 @@ static void getnb_cbfunc(struct pmix_peer_t *pr, pmix_usock_hdr_t *hdr,
/* look up the nspace object for this proc */
nptr = NULL;
PMIX_LIST_FOREACH(ns, &pmix_globals.nspaces, pmix_nspace_t) {
if (0 == strcmp(cb->nspace, ns->nspace)) {
if (0 == strncmp(cb->nspace, ns->nspace, PMIX_MAX_NSLEN)) {
nptr = ns;
break;
}
@ -500,23 +332,169 @@ static void getnb_cbfunc(struct pmix_peer_t *pr, pmix_usock_hdr_t *hdr,
}
}
static void getnb_shortcut(int fd, short flags, void *cbdata)
static void _getnbfn(int fd, short flags, void *cbdata)
{
pmix_cb_t *cb = (pmix_cb_t*)cbdata;
pmix_value_t val;
pmix_cb_t *cbret;
pmix_buffer_t *msg;
pmix_value_t *val;
pmix_status_t rc;
int32_t m;
char *nm;
pmix_nspace_t *ns, *nptr;
size_t n;
pmix_output_verbose(2, pmix_globals.debug_output,
"getnb_shortcut called with %s cbfunc",
(NULL == cb->value_cbfunc) ? "NULL" : "NON-NULL");
"pmix: getnbfn value for proc %s:%d key %s",
cb->nspace, cb->rank,
(NULL == cb->key) ? "NULL" : cb->key);
PMIX_VALUE_CONSTRUCT(&val);
if (NULL != cb->value_cbfunc) {
m=1;
rc = pmix_bfrop.unpack(&cb->data, &val, &m, PMIX_VALUE);
cb->value_cbfunc(rc, &val, cb->cbdata);
/* if the nspace is empty, then the caller is referencing
* our own nspace */
if (0 == strlen(cb->nspace)) {
nm = pmix_globals.myid.nspace;
} else {
nm = (char*)cb->nspace;
}
PMIX_VALUE_DESTRUCT(&val);
PMIX_RELEASE(cb);
/* find the nspace object */
nptr = NULL;
PMIX_LIST_FOREACH(ns, &pmix_globals.nspaces, pmix_nspace_t) {
if (0 == strcmp(nm, ns->nspace)) {
nptr = ns;
break;
}
}
if (NULL == nptr) {
/* we are asking for info about a new nspace - give us
* a chance to learn about it from the server. If the
* server has never heard of it, the server will return
* an error */
nptr = PMIX_NEW(pmix_nspace_t);
(void)strncpy(nptr->nspace, nm, PMIX_MAX_NSLEN);
pmix_list_append(&pmix_globals.nspaces, &nptr->super);
/* there is no point in looking for data in this nspace
* object, so let's just go generate the request */
goto request;
}
/* the requested data could be in the job-data table, so let's
* just check there first. */
if (PMIX_SUCCESS == (rc = pmix_hash_fetch(&nptr->internal, PMIX_RANK_WILDCARD, cb->key, &val))) {
/* found it - we are in an event, so we can
* just execute the callback */
cb->value_cbfunc(rc, val, cb->cbdata);
/* cleanup */
if (NULL != val) {
PMIX_VALUE_RELEASE(val);
}
PMIX_RELEASE(cb);
return;
}
if (PMIX_RANK_WILDCARD == cb->rank) {
/* can't be anywhere else */
cb->value_cbfunc(PMIX_ERR_NOT_FOUND, NULL, cb->cbdata);
PMIX_RELEASE(cb);
return;
}
/* it could still be in the job-data table, only stored under its own
* rank and not WILDCARD - e.g., this is true of data returned about
* ourselves during startup */
if (PMIX_SUCCESS == (rc = pmix_hash_fetch(&nptr->internal, cb->rank, cb->key, &val))) {
/* found it - we are in an event, so we can
* just execute the callback */
cb->value_cbfunc(rc, val, cb->cbdata);
/* cleanup */
if (NULL != val) {
PMIX_VALUE_RELEASE(val);
}
PMIX_RELEASE(cb);
return;
}
/* not finding it is not an error - it could be in the
* modex hash table, so check it */
if (PMIX_SUCCESS == (rc = pmix_hash_fetch(&nptr->modex, cb->rank, cb->key, &val))) {
pmix_output_verbose(2, pmix_globals.debug_output,
"pmix: value retrieved from dstore");
/* found it - we are in an event, so we can
* just execute the callback */
cb->value_cbfunc(rc, val, cb->cbdata);
/* cleanup */
if (NULL != val) {
PMIX_VALUE_RELEASE(val);
}
PMIX_RELEASE(cb);
return;
} else if (PMIX_ERR_NOT_FOUND == rc) {
/* we have the modex data from this proc, but didn't find the key
* the user requested. At this time, there is no way for the
* key to eventually be found, so all we can do is return
* the error */
pmix_output_verbose(2, pmix_globals.debug_output,
"Error requesting key=%s for rank = %d, namespace = %s",
cb->key, cb->rank, nm);
cb->value_cbfunc(rc, NULL, cb->cbdata);
/* protect the data */
cb->procs = NULL;
cb->key = NULL;
cb->info = NULL;
PMIX_RELEASE(cb);
return;
}
request:
/* if we got here, then we don't have the data for this proc. If we
* are a server, or we are a client and not connected, then there is
* nothing more we can do */
if (pmix_globals.server || (!pmix_globals.server && !pmix_globals.connected)) {
cb->value_cbfunc(PMIX_ERR_NOT_FOUND, NULL, cb->cbdata);
PMIX_RELEASE(cb);
return;
}
/* we also have to check the user's directives to see if they do not want
* us to attempt to retrieve it from the server */
for (n=0; n < cb->ninfo; n++) {
if (0 == strcmp(cb->info[n].key, PMIX_OPTIONAL) &&
cb->info[n].value.data.flag) {
/* they don't want us to try and retrieve it */
pmix_output_verbose(2, pmix_globals.debug_output,
"PMIx_Get key=%s for rank = %d, namespace = %s was not found - request was optional",
cb->key, cb->rank, nm);
cb->value_cbfunc(PMIX_ERR_NOT_FOUND, NULL, cb->cbdata);
PMIX_RELEASE(cb);
return;
}
}
/* see if we already have a request in place with the server for data from
* this nspace:rank. If we do, then no need to ask again as the
* request will return _all_ data from that proc */
PMIX_LIST_FOREACH(cbret, &pmix_client_globals.pending_requests, pmix_cb_t) {
if (0 == strncmp(cbret->nspace, nm, PMIX_MAX_NSLEN) &&
cbret->rank == cb->rank) {
/* we do have a pending request, but we still need to track this
* outstanding request so we can satisfy it once the data is returned */
pmix_list_append(&pmix_client_globals.pending_requests, &cb->super);
return;
}
}
/* we don't have a pending request, so let's create one - don't worry
* about packing the key as we return everything from that proc */
msg = pack_get(nm, cb->rank, cb->info, cb->ninfo, PMIX_GETNB_CMD);
if (NULL == msg) {
cb->value_cbfunc(PMIX_ERROR, NULL, cb->cbdata);
PMIX_RELEASE(cb);
return;
}
/* create a callback object as we need to pass it to the
* recv routine so we know which callback to use when
* the return message is recvd */
pmix_list_append(&pmix_client_globals.pending_requests, &cb->super);
/* push the message into our event base to send to the server */
PMIX_ACTIVATE_SEND_RECV(&pmix_client_globals.myserver, msg, getnb_cbfunc, cb);
}

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

@ -1,44 +1,44 @@
/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil -*- */
/*
* Copyright (c) 2014-2015 Intel, Inc. All rights reserved.
* $COPYRIGHT$
*
* Additional copyrights may follow
*
* $HEADER$
*/
#include <private/autogen/config.h>
#include <pmix/rename.h>
#include <private/types.h>
#include <private/pmix_stdint.h>
#include <private/pmix_socket_errno.h>
#include <pmix.h>
#include <pmix/pmix_common.h>
#include <pmix_server.h>
#include "src/include/pmix_globals.h"
void PMIx_Register_errhandler(pmix_info_t info[], size_t ninfo,
pmix_notification_fn_t errhandler,
pmix_errhandler_reg_cbfunc_t cbfunc,
void *cbdata)
{
/* common err handler registration to be added */
}
void PMIx_Deregister_errhandler(int errhandler_ref,
pmix_op_cbfunc_t cbfunc,
void *cbdata)
{
/* common err handler deregistration goes here */
}
pmix_status_t PMIx_Notify_error(pmix_status_t status,
pmix_proc_t procs[], size_t nprocs,
pmix_proc_t error_procs[], size_t error_nprocs,
pmix_info_t info[], size_t ninfo,
pmix_op_cbfunc_t cbfunc, void *cbdata)
{
/* common err notify goes here */
return PMIX_SUCCESS;
}
/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil -*- */
/*
* Copyright (c) 2014-2015 Intel, Inc. All rights reserved.
* $COPYRIGHT$
*
* Additional copyrights may follow
*
* $HEADER$
*/
#include <private/autogen/config.h>
#include <pmix/rename.h>
#include <private/types.h>
#include <private/pmix_stdint.h>
#include <private/pmix_socket_errno.h>
#include <pmix.h>
#include <pmix/pmix_common.h>
#include <pmix_server.h>
#include "src/include/pmix_globals.h"
void PMIx_Register_errhandler(pmix_info_t info[], size_t ninfo,
pmix_notification_fn_t errhandler,
pmix_errhandler_reg_cbfunc_t cbfunc,
void *cbdata)
{
/* common err handler registration to be added */
}
void PMIx_Deregister_errhandler(int errhandler_ref,
pmix_op_cbfunc_t cbfunc,
void *cbdata)
{
/* common err handler deregistration goes here */
}
pmix_status_t PMIx_Notify_error(pmix_status_t status,
pmix_proc_t procs[], size_t nprocs,
pmix_proc_t error_procs[], size_t error_nprocs,
pmix_info_t info[], size_t ninfo,
pmix_op_cbfunc_t cbfunc, void *cbdata)
{
/* common err notify goes here */
return PMIX_SUCCESS;
}

Некоторые файлы не были показаны из-за слишком большого количества измененных файлов Показать больше