1
1

Merge pull request #8123 from jjhursey/v4.1-pmix-v3.2

v4.1.x: Update Internal PMIx to OpenPMIx v3.2.1rc1
Этот коммит содержится в:
Jeff Squyres 2020-11-02 15:29:17 -05:00 коммит произвёл GitHub
родитель 8c1d8305b4 60ee133255
Коммит 40e104d087
Не найден ключ, соответствующий данной подписи
Идентификатор ключа GPG: 4AEE18F83AFDEB23
454 изменённых файлов: 13654 добавлений и 11470 удалений

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

@ -16,6 +16,7 @@
# Copyright (c) 2013-2019 Intel, Inc. All rights reserved.
# Copyright (c) 2015-2016 Research Organization for Information Science
# and Technology (RIST). All rights reserved.
# Copyright (c) 2020 IBM Corporation. All rights reserved.
# $COPYRIGHT$
#
# Additional copyrights may follow
@ -60,6 +61,9 @@ AC_DEFUN([MCA_opal_pmix_pmix3x_CONFIG],[
[opal_pmix_pmix3x_args="--with-devel-headers $opal_pmix_pmix3x_args"])
CPPFLAGS="-I$OPAL_TOP_SRCDIR -I$OPAL_TOP_BUILDDIR -I$OPAL_TOP_SRCDIR/opal/include -I$OPAL_TOP_BUILDDIR/opal/include $CPPFLAGS"
# OpenPMIx Man pages are not needed when embedded. Avoids pandoc check
opal_pmix_pmix3x_args="--disable-man-pages $opal_pmix_pmix3x_args"
OPAL_CONFIG_SUBDIR([$opal_pmix_pmix3x_basedir/pmix],
[$opal_pmix_pmix3x_args $opal_subdir_args 'CFLAGS=$CFLAGS' 'CPPFLAGS=$CPPFLAGS'],
[opal_pmix_pmix3x_happy=1], [opal_pmix_pmix3x_happy=0])

274
opal/mca/pmix/pmix3x/pmix/HACKING Обычный файл
Просмотреть файл

@ -0,0 +1,274 @@
Copyright (c) 2004-2005 The Trustees of Indiana University and Indiana
University Research and Technology
Corporation. All rights reserved.
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,
University of Stuttgart. All rights reserved.
Copyright (c) 2004-2005 The Regents of the University of California.
All rights reserved.
Copyright (c) 2008-2020 Cisco Systems, Inc. All rights reserved
Copyright (c) 2013-2020 Intel, Inc. All rights reserved.
$COPYRIGHT$
Additional copyrights may follow
$HEADER$
Overview
========
This file is here for those who are building/exploring PMIx in its
source code form, most likely through a developer's tree (i.e., a Git
checkout).
Debugging vs. Optimized Builds
==============================
**If you are building PMIx from a Git checkout**, the default build
includes a lot of debugging features. This happens automatically when
when configure detects the hidden ".git" Git meta directory (that is
present in all Git checkouts) in your source tree, and therefore
activates a number of developer-only debugging features in the PMIx
code base.
By definition, debugging builds will perform [much] slower than
optimized builds of PMIx. You should *NOT* conduct timing tests
or try to run production performance numbers with debugging builds.
**REMEMBER** that you need to add appropriate -O directives
to your CFLAGS so your compiler will optimize the code! Otherwise,
while we will have disabled various debug code paths, the resulting
binary will not have been optimized.
NOTE: this version of PMIx requires the Libevent package to build
and operate. Any version of Libevent greater than or equal to
2.0.21 is acceptable. It optionally supports the HWLOC package
for providing topology information to both the host environment
(by collecting local inventory for rollup) and local client
processes. Any version of HWLOC greater than 1.10 is supported,
although versions in the 2.x series are recommended.
If you wish to build an optimized version of PMIx from a
developer's checkout, you have a couple of options:
1. Manually specify configure options to disable the debugging
option. You'll need to carefully examine the output of
"./configure --help" to see which options to disable.
They are all listed, but some are less obvious than others (they
are not listed here because it is a changing set of flags; by
Murphy's Law, listing them here will pretty much guarantee that
this file will get out of date):
shell$ ./autogen.pl
shell$ ./configure --disable-debug ...
[...lots of output...]
shell$ make all install
2. Use a VPATH build. Simply build PMIx from a different
directory than the source tree -- one where the .git subdirectory
is not present. For example:
shell$ git clone https://github.com/openpmix/openpmix.git pmix
shell$ cd pmix
shell$ ./autogen.pl
shell$ mkdir build
shell$ cd build
shell$ ../configure ...
[...lots of output...]
shell$ make all install
Note that in both cases you must point configure at the libevent
installation using the --with-libevent=<dir> option if it is in
a non-standard location. Similarly, non-standard locations for
the HWLOC package must be specified using the --with-hwloc=<dir>
option. In both cases, PMIx will automatically detect these
packages in standard locations and build-in support for them
unless otherwise specified using the respective configure option.
Use of GNU Autoconf, Automake, and Libtool (and m4)
===================================================
This procedure is *ONLY* necessary if you are building from a
developer's tree. If you have a PMIx distribution tarball, this
procedure is unnecessary -- you can (and should) skip reading this
section.
If you are building PMIx from a developer's tree, you must first
install fairly recent versions of the GNU tools Autoconf, Automake,
and Libtool (and possibly GNU m4, because recent versions of Autoconf
have specific GNU m4 version requirements). The specific versions
required depend on if you are using the master or a release branch (and
which release branch you are using). The specific versions can be
found at:
https://pmix.org/code/getting-the-reference-implementation/
You can check what versions of the autotools you have installed with
the following:
shell$ m4 --version
shell$ autoconf --version
shell$ automake --version
shell$ libtoolize --version
To strengthen the above point: the core PMIx developers typically
use very, very recent versions of the GNU tools. There are known bugs
in older versions of the GNU tools that PMIx no longer compensates
for (it seemed senseless to indefinitely support patches for ancient
versions of Autoconf, for example). You *WILL* have problems if you
do not use recent versions of the GNU tools.
If you need newer versions, you are *strongly* encouraged to heed the
following advice:
NOTE: On MacOS/X, the default "libtool" program is different than the
GNU libtool. You must download and install the GNU version
(e.g., via MacPorts, Homebrew, or some other mechanism).
1. Unless your OS distribution has easy-to-use binary installations,
the sources can be can be downloaded from:
ftp://ftp.gnu.org/gnu/autoconf/
ftp://ftp.gnu.org/gnu/automake/
ftp://ftp.gnu.org/gnu/libtool/
and if you need it:
ftp://ftp.gnu.org/gnu/m4/
NOTE: It is certainly easiest to download/build/install all four of
these tools together. But note that PMIx has no specific m4
requirements; it is only listed here because Autoconf requires
minimum versions of GNU m4. Hence, you may or may not *need* to
actually install a new version of GNU m4. That being said, if you
are confused or don't know, just install the latest GNU m4 with the
rest of the GNU Autotools and everything will work out fine.
2. Build and install the tools in the following order:
2a. m4
2b. Autoconf
2c. Automake
2d. Libtool
3. You MUST install the last three tools (Autoconf, Automake, Libtool)
into the same prefix directory. These three tools are somewhat
inter-related, and if they're going to be used together, they MUST
share a common installation prefix.
You can install m4 anywhere as long as it can be found in the path;
it may be convenient to install it in the same prefix as the other
three. Or you can use any recent-enough m4 that is in your path.
3a. It is *strongly* encouraged that you do not install your new
versions over the OS-installed versions. This could cause
other things on your system to break. Instead, install into
$HOME/local, or /usr/local, or wherever else you tend to
install "local" kinds of software.
3b. In doing so, be sure to prefix your $path with the directory
where they are installed. For example, if you install into
$HOME/local, you may want to edit your shell startup file
(.bashrc, .cshrc, .tcshrc, etc.) to have something like:
# For bash/sh:
export PATH=$HOME/local/bin:$PATH
# For csh/tcsh:
set path = ($HOME/local/bin $path)
3c. Ensure to set your $path *BEFORE* you configure/build/install
the four packages.
4. All four packages require two simple commands to build and
install (where PREFIX is the prefix discussed in 3, above).
shell$ cd m4-1.4.13
shell$ ./configure --prefix=PREFIX
shell$ make; make install
--> If you are using the csh or tcsh shells, be sure to run the
"rehash" command after you install each package.
shell$ cd ../autoconf-2.68
shell$ ./configure --prefix=PREFIX
shell$ make; make install
--> If you are using the csh or tcsh shells, be sure to run the
"rehash" command after you install each package.
shell$ cd ../automake-1.11.1
shell$ ./configure --prefix=PREFIX
shell$ make; make install
--> If you are using the csh or tcsh shells, be sure to run the
"rehash" command after you install each package.
shell$ cd ../libtool-2.2.8
shell$ ./configure --prefix=PREFIX
shell$ make; make install
--> If you are using the csh or tcsh shells, be sure to run the
"rehash" command after you install each package.
m4, Autoconf and Automake build and install very quickly; Libtool will
take a minute or two.
5. You can now run PMIxs top-level "autogen.pl" script. This script
will invoke the GNU Autoconf, Automake, and Libtool commands in the
proper order and setup to run PMIx's top-level "configure" script.
5a. You generally need to run autogen.pl only when the top-level
file "configure.ac" changes, or any files in the config/ or
<project>/config/ directories change (these directories are
where a lot of "include" files for PMIxs configure script
live).
5b. You do *NOT* need to re-run autogen.pl if you modify a
Makefile.am.
Use of Flex
===========
Flex may be used during the compilation of a developer's checkout (it is
not used to build official distribution tarballs). Other flavors of
lex are *not* supported: given the choice of making parsing code
portable between all flavors of lex and doing more interesting work on
PMIx, we greatly prefer the latter.
Note that no testing has been performed to see what the minimum
version of Flex is required by PMIx. We suggest that you use
v2.5.35 at the earliest.
Note that the flex-generated code generates some compiler warnings on
some platforms, but the warnings do not seem to be consistent or
uniform on all platforms, compilers, and flex versions. As such, we
have done little to try to remove those warnings.
If you do not have Flex installed, it can be downloaded from the
following URL:
https://github.com/westes/flex
Use of Pandoc
=============
Similar to prior sections, you need to read/care about this section
*ONLY* if you are building from a developer's tree (i.e., a Git clone
of the Open MPI source tree). If you have an Open MPI distribution
tarball, the contents of this section are optional -- you can (and
probably should) skip reading this section.
The Pandoc tool is used to generate Open MPI's man pages.
Specifically: Open MPI's man pages are written in Markdown; Pandoc is
the tool that converts that Markdown to nroff (i.e., the format of man
pages).
You must have Pandoc >=v1.12 when building Open MPI from a developer's
tree. If configure cannot find Pandoc >=v1.12, it will abort.
If you need to install Pandoc, check your operating system-provided
packages (to include MacOS Homebrew and MacPorts). The Pandoc project
itself also offers binaries for their releases:
https://pandoc.org/

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

@ -11,7 +11,7 @@
# All rights reserved.
# Copyright (c) 2006-2016 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 (c) 2019 Amazon.com, Inc. or its affiliates. All Rights
# reserved.
# $COPYRIGHT$
@ -32,7 +32,7 @@ AM_DISTCHECK_CONFIGURE_FLAGS = --disable-dlopen
headers =
sources =
nodist_headers =
EXTRA_DIST = AUTHORS README INSTALL VERSION LICENSE autogen.pl
EXTRA_DIST = AUTHORS README HACKING INSTALL VERSION LICENSE autogen.pl Makefile.pmix-rules
# Only install the valgrind suppressions file and man pages
# if we're building in standalone mode
@ -60,3 +60,6 @@ nroff:
dist-hook:
env LS_COLORS= sh "$(top_srcdir)/config/distscript.sh" "$(top_srcdir)" "$(distdir)" "$(PMIX_VERSION)" "$(PMIX_REPO_REV)"
pkgconfigdir = $(libdir)/pkgconfig
pkgconfig_DATA = maint/pmix.pc

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

@ -0,0 +1,42 @@
# -*- makefile -*-
# Copyright (c) 2008-2020 Cisco Systems, Inc. All rights reserved.
# Copyright (c) 2008 Sun Microsystems, Inc. All rights reserved.
# Copyright (c) 2019 Intel, Inc. All rights reserved.
# $COPYRIGHT$
#
# Additional copyrights may follow
#
# $HEADER$
#
MD2NROFF = $(PMIX_TOP_SRCDIR)/config/md2nroff.pl
%.1: %.1.md
$(PMIX_V_GEN) $(MD2NROFF) --source=$< --dest=$@ --pandoc=$(PANDOC)
# It is an error to "configure --disable-man-pages" and then try to
# "make dist".
if !PMIX_ENABLE_MAN_PAGES
dist-hook:
@echo "************************************************************************************"
@echo "ERROR: 'make dist' inoperable when Open PMIx is configured with --disable-man-pages"
@echo "************************************************************************************"
@/bin/false
endif
# A little verbosity magic; "make" will show the terse output. "make
# V=1" will show the actual commands used (just like the other
# Automake-generated compilation/linker rules).
V=0
PMIX_V_LN_S = $(pmix__v_LN_S_$V)
pmix__v_LN_S_ = $(pmix__v_LN_S_$AM_DEFAULT_VERBOSITY)
pmix__v_LN_S_0 = @echo " LN_S " `basename $@`;
PMIX_V_MKDIR = $(pmix__v_MKDIR_$V)
pmix__v_MKDIR_ = $(pmix__v_MKDIR_$AM_DEFAULT_VERBOSITY)
pmix__v_MKDIR_0 = @echo " MKDIR " $@;
PMIX_V_GEN = $(pmix__v_GEN_$V)
pmix__v_GEN_ = $(pmix__v_GEN_$AM_DEFAULT_VERBOSITY)
pmix__v_GEN_0 = @echo " GENERATE" $@;

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

@ -20,11 +20,55 @@ 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
multiple release branches.
Master (not on release branches yet)
------------------------------------
3.1.6 -- TBD
3.2.2 -- TBD
----------------------
3.2.1 -- 5 Nov 2020
----------------------
- PR #1890:
- Fix Issue #1889: Fix symlinks in unit tests to include new timeout
- Fix Issue #1891: Remove pnet/opa component that should not be in v3.2
- PR #1904: Add more metadata to string generated from preg/compress
3.2.0 -- 22 Oct 2020
----------------------
- PR #1402/#1403/#1421/#1423: Modex size reductions
- PR #1752: Convert man pages to Markdown (pandoc)
- PR #1766: Move from -levent to -levent_core for linking Libevent
- PR #1832: Sync 3.2 branch with master
- New attributes:
- PMIX_HOSTNAME_ALIASES
- PMIX_HOSTNAME_KEEP_FQDN
- PMIX_GET_REFRESH_CACHE
- PMIX_REQUIRED_KEY
- Removed PMIX_VALUE_COMPRESSED_STRING_UNPACK macro from pmix_common.h
- New frameworks
- PR #1139: pcompress - Compression methods
- PR #1423: psquash - Flexible integer packing
- New components
- PR #1139: preg/compress - regular expression methods
- PR #1422 Modified string representations produced by PMIx_generate_regex
and PMIx_generate_ppn.
- Issue #1586: Fixed dmodex support and PMIx_Get behavior
- PR #1748: Removed --with-pmix-symbol-rename configure option
- PR #1848: Expose PMIX_REGEX constant per v3.2 standard
- PR #1885: Fix immediate flag behavior at the server
3.1.6 -- 20 Aug 2020
----------------------
- PR #1669: Silence unnecessary error log message
- PR #1776: Fixed crash of dstore locks destructor
- PR #1825: Add option to bypass local-only fence optimization
- PR #1830: Increase timeout in test case
3.1.5 -- 14 Feb 2020
----------------------
NOTE: The signature of the PMIx_Allocation_request has changed
@ -33,7 +77,7 @@ in accordance with an Errata update of the PMIx v3 Standard
- PR #1433: Return the correct status from PMIx_Publish
- PR #1445: Sync. with master to fix 'get' of data for unknown namespace
Includes the following PRs from master
- PR #1382: dstore: fixed truncate key-names while restoring
- PR #1382: dstore: fixed truncate key-names while restoring
- PR #1405: Fix xnspace dmodex and add verbose debug
- PR #1406: Resolve request for job-level data
- PR #1407/#1409/#1411: Fix dmodex across nspaces
@ -58,11 +102,6 @@ in accordance with an Errata update of the PMIx v3 Standard
- PR #1613: dstore: Fix cache size calculation
- PR #1622: Fix multiple occurrences of unaligned access in pmix tests
- PR #1620: Re-address the collective tracker problem
- PR #1625: Fix library triplet
- PR #1630: Fix support for PGI compiler pgcc18
- PR #1637: Realign behavior of PMIx_Get and PMIx_Get_nb
- PR #1640: Properly handle forwarded output when no handler registered
3.1.4 -- 9 Aug 2019
@ -293,6 +332,68 @@ in accordance with an Errata update of the PMIx v3 Standard
- Fix several memory and file descriptor leaks
2.2.4 -- 07 Jun 2020
----------------------
- PR #1466: Silence spurious error log
- PR #1489: Allow specification of hostname to use by client
- PR #1499/#1512/#1518/#1525/#1528/#1533/#1553: Fix internal tests
- PR #1678: Update "check_vendor" for PGI problem
- PR #1734: Fix resource leaks in ptl/usock component
- PR #1777: Fix crash of dstor locks destructor in ds12
- PR #1788: Remove unnecessary error logs
2.2.3 -- 15 Aug 2019
----------------------
- PR #1162: Fix race condition when clients fail while in a PMIx
collective operation
- PR #1163: Fix a compiler warning in atomics on POWER arch
- PR #1165: Add BuildRequires: libevent-devel to spec file
- PR #1180: Remove dependency on C++ compiler for thread detection
- PR #1180: Add detection for Flex when building in non-tarball situations
- PR #1182: configury: use PMIX_ENABLE_DLOPEN_SUPPORT instead of enable_dlopen
- PR #1188: Link libpmix.so to MCA component libraries
- PR #1190: Ensure any cached notifications arrive after reg completes
- PR #1194: Ensure any cached notifications arrive after registration completes
- PR #1209: Update configure logic for clock_gettime
- PR #1213/#1217/#1221: Add configure option "--enable-nonglobal-dlopen"
If the MCA component libraries should link back to libpmix.so
- PR #1231: SPEC: Allow splitting PMIx in pmix and pmix-libpmi packages
- PR #1253: Preserve user-provided CFLAGS to protect autotools
- PR #1267: Correct dmodex example
- PR #1275: IPv6 IF Read: Buffer Overflow
- PR #1295: Fix comment: IPv6 IF_NAMESIZE
- PR #1296: Allow setup_fork to proceed even if gdds and pnet don't contribute
- PR #1296: Allow servers to pass NULL module
- PR #1297: Provide internal blocking ability to the register/deregister fns
- PR #1298: Add dummy handshake component to psec framework for testing
- PR #1303: Allow jobs to not specify proc-level info
- PR #1304: Provide proc data in cases where host does not
- PR #1305: Add some more values that can be computed
- PR #1308: Add missing tool rendezvous file
- PR #1309: Fix potential integer overflow in regex
- PR #1311: Work around memory bug in older gcc compilers
- PR #1329: Add -fPIC to static builds
- PR #1334: Cache only -W CFLAG entries to fix 32-bit builds
- PR #1341: Do not use '==' in m4 test statements
- 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 #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 #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
2.2.2 -- 24 Jan 2019
----------------------
- Fix a bug in macro identifying system events

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

@ -8,14 +8,14 @@ Copyright (c) 2004-2008 High Performance Computing Center Stuttgart,
University of Stuttgart. All rights reserved.
Copyright (c) 2004-2007 The Regents of the University of California.
All rights reserved.
Copyright (c) 2006-2015 Cisco Systems, Inc. All rights reserved.
Copyright (c) 2006-2020 Cisco Systems, Inc. All rights reserved.
Copyright (c) 2006-2011 Mellanox Technologies. All rights reserved.
Copyright (c) 2006-2012 Oracle and/or its affiliates. All rights reserved.
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-2018 Intel, Inc. All rights reserved.
Copyright (c) 2013-2017 Intel, Inc. All rights reserved.
$COPYRIGHT$
Additional copyrights may follow
@ -25,16 +25,20 @@ $HEADER$
===========================================================================
When submitting questions and problems, be sure to include as much
extra information as possible. The issues template on the
GitHub repo provides directions:
extra information as possible. This web page details all the
information that we request in order to provide assistance:
http://github.com/pmix/pmix/issues
https://pmix.org/support/
The best way to report bugs, send comments, or ask questions is to
open an issue on the repo. Alternatively, you are welcome to sign
up for the developer/user mailing list:
post them on the OpenPMIx GitHub issue tracker:
pmix@googlegroups.com
https://github.com/openpmix/openpmix/issues
Alternatively, you can sign up on the PMIx mailing list, which is
hosted by Google Groups:
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
@ -43,18 +47,13 @@ joe@mycomputer.example.com!). You can subscribe to the list here:
https://groups.google.com/d/forum/pmix
Finally, just to round out all the possible ways to communicate with the
PMIx community, you are invited to join the community's Slack channel:
pmix-workspace.slack.com
Thanks for your time.
===========================================================================
More information is available in the PMIx FAQ:
https://pmix.org/support
https://pmix.org/support/faq/
We are in early days, so please be patient - info will grow as questions
are addressed.
@ -69,7 +68,7 @@ General notes
- The majority of PMIx's documentation is here in this file, the
included man pages, and on the web site FAQ
(https://pmix.org/support). This will eventually be
(https://pmix.org/support/faq/). This will eventually be
supplemented with cohesive installation and user documentation files.
- Systems that have been tested are:
@ -197,22 +196,21 @@ PMIx's version numbers are the union of several different values:
major, minor, release, and an optional quantifier.
* Major: The major number is the first integer in the version string
(e.g., v1.2.3) and indicates the corresponding version of the PMIx
Standard. In other words, a PMIx library release starting with "v2"
indicates that the implementation conforms to version 2 of the PMIx
Standard.
(e.g., v1.2.3). Changes in the major number typically indicate a
significant change in the code base and/or end-user
functionality. The major number is always included in the version
number.
* Minor: The minor number is the second integer in the version
string (e.g., v1.2.3). Changes in the minor number typically
indicate a incremental change in the code base and/or end-user
functionality, but not the supported version of the Standard.
The minor number is always included in the version number.
functionality. The minor number is always included in the version
number:
* 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. The release number is always included in the
version number.
functionality.
* Quantifier: PMIx version numbers sometimes have an arbitrary
string affixed to the end of the version number. Common strings
@ -299,15 +297,16 @@ Application Binary Interface (ABI) Compatibility
------------------------------------------------
PMIx provides forward ABI compatibility in all versions of a given
feature release series. For example, on a single platform, an pmix
feature release series and its corresponding
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 major
PMIx reserves the right to break ABI compatibility at new feature
release series. For example, the same pmix application from above
(linked against PMIx v1.3.2 shared libraries) may *not* work with
(linked against PMIx v1.3.2 shared libraries) will *not* work with
PMIx v1.5 shared libraries.
===========================================================================
@ -318,7 +317,7 @@ Common Questions
Many common questions about building and using PMIx are answered
on the FAQ:
https://pmix.org/support
https://pmix.org/support/faq/
===========================================================================
@ -329,19 +328,23 @@ Found a bug? Got a question? Want to make a suggestion? Want to
contribute to PMIx? Please let us know!
When submitting questions and problems, be sure to include as much
extra information as possible. Again, the issues template is your
friend in this regard!
extra information as possible. This web page details all the
information that we request in order to provide assistance:
https://github.com/pmix/pmix/issues
https://pmix.org/support/
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:
Questions and comments should generally be posted to the OpenPMIx
GitHub issue tracker:
https://github.com/openpmix/openpmix/issues
Alternatively, question can also 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:
https://groups.google.com/d/forum/pmix
Make today a PMIx day!
Make today an PMIx day!

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

@ -6,7 +6,6 @@
# Copyright (c) 2014-2016 Intel, Inc. All rights reserved.
# Copyright (c) 2020 IBM Corporation. All rights reserved.
# This is the VERSION file for PMIx, describing the precise
# version of PMIx in this distribution. The various components of
# the version number below are combined to form a single version
@ -16,8 +15,8 @@
# <major>.<minor>.<release>.
major=3
minor=1
release=5
minor=2
release=1
# 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
@ -25,14 +24,14 @@ release=5
# The only requirement is that it must be entirely printable ASCII
# characters and have no white space.
greek=
greek=rc1
# 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=gitedebb24
repo_rev=git1063ca6
# If tarball_version is not empty, it is used as the version string in
# the tarball filename, regardless of all other versions listed in
@ -46,7 +45,7 @@ tarball_version=
# The date when this release was created
date="Feb 19, 2020"
date="Oct 30, 2020"
# The shared library version of each of PMIx's public libraries.
# These versions are maintained in accordance with the "Library
@ -77,13 +76,13 @@ date="Feb 19, 2020"
# Version numbers are described in the Libtool current:revision:age
# format.
libpmix_so_version=4:25:2
libpmix_so_version=4:31:2
libpmi_so_version=1:1:0
libpmi2_so_version=1:0:0
# "Common" components install standalone libraries that are run-time
# linked by one or more components. So they need to be versioned as
# well. Yuck; this somewhat breaks the
# components-don't-affect-the-build-system abstraction.
# # linked by one or more components. So they need to be versioned as
# # well. Yuck; this somewhat breaks the
# # components-don't-affect-the-build-system abstraction.
#
libmca_common_dstore_so_version=1:2:0

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

@ -4,7 +4,7 @@
# Copyright (c) 2010 Oracle and/or its affiliates. All rights reserved.
# Copyright (c) 2013 Mellanox Technologies, Inc.
# All rights reserved.
# Copyright (c) 2013-2019 Intel, Inc. All rights reserved.
# Copyright (c) 2013-2020 Intel, Inc. All rights reserved.
# Copyright (c) 2015 Research Organization for Information Science
# and Technology (RIST). All rights reserved.
# Copyright (c) 2015 IBM Corporation. All rights reserved.
@ -275,7 +275,7 @@ sub mca_generate_framework_header(\$\@) {
#ifndef $ifdef_string
#define $ifdef_string
#include <src/mca/base/pmix_mca_base_framework.h>
#include \"src/mca/base/pmix_mca_base_framework.h\"
$framework_decl_output
static pmix_mca_base_framework_t *pmix_frameworks[] = {

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

@ -1,7 +1,7 @@
# Copyright (c) 2013-2016 Intel, Inc. All rights reserved
# Copyright (c) 2013-2019 Intel, Inc. All rights reserved.
# Copyright (c) 2016 Research Organization for Information Science
# and Technology (RIST). All rights reserved.
# Copyright (c) 2006-2016 Cisco Systems, Inc. All rights reserved.
# Copyright (c) 2006-2020 Cisco Systems, Inc. All rights reserved
# Copyright (c) 2004-2006 The Trustees of Indiana University and Indiana
# University Research and Technology
# Corporation. All rights reserved.
@ -27,6 +27,7 @@ EXTRA_DIST = \
c_get_alignment.m4 \
pmix_get_version.sh \
distscript.sh \
md2nroff.pl \
pmix_check_attributes.m4 \
pmix_check_broken_qsort.m4 \
pmix_check_compiler_version.m4 \
@ -42,7 +43,6 @@ EXTRA_DIST = \
pmix.m4 \
pmix_search_libs.m4 \
pmix_setup_cc.m4 \
pmix_setup_zlib.m4 \
pmix_setup_libevent.m4 \
pmix_mca_priority_sort.pl \
mca_library_paths.txt

136
opal/mca/pmix/pmix3x/pmix/config/md2nroff.pl Исполняемый файл
Просмотреть файл

@ -0,0 +1,136 @@
#!/usr/bin/env perl
#
# Copyright (c) 2020 Cisco Systems, Inc. All rights reserved.
# $COPYRIGHT$
#
# Additional copyrights may follow
#
# $HEADER$
#
# This script is friendly to both Python 2 and Python 3.
use strict;
use IPC::Open3;
use File::Basename;
use Getopt::Long;
#--------------------------------------------------------------------------
my $source_arg;
my $dest_arg;
my $pandoc_arg = "pandoc";
my $help_arg;
my $verbose_arg;
my $ok = Getopt::Long::GetOptions("source=s" => \$source_arg,
"dest=s" => \$dest_arg,
"pandoc=s" => \$pandoc_arg,
"help" => \$help_arg,
"verbose" => \$verbose_arg);
if (!$source_arg || !$dest_arg) {
print("Must specify --source and --dest\n");
$ok = 0;
}
if (!$ok || $help_arg) {
print "Invalid command line argument.\n\n"
if (!$ok);
print "Options:
--source FILE Source Markdown filename
--dest FILE Destination nroff file
--pandoc FILE Location of pandoc executable
--help This help list
--verbose Be verbose when running\n";
exit($ok ? 0 : 1);
}
#--------------------------------------------------------------------------
# If the destination exists, read it in
my $dest_content;
if (-f $dest_arg) {
open(FILE, $dest_arg) ||
die "Can't open $dest_arg";
$dest_content .= $_
while(<FILE>);
close(FILE);
}
#--------------------------------------------------------------------------
# Read in the source
die "Error: $source_arg does not exist"
if (! -f $source_arg);
my $source_content;
open(FILE, $source_arg) ||
die "Can't open $source_arg";
$source_content .= $_
while(<FILE>);
close(FILE);
#--------------------------------------------------------------------------
# Figure out the section of man page
die "Cannot figure out man page section from source filename"
if (!($source_arg =~ m/(\d+).md$/));
my $man_section = $1;
my $shortfile = basename($source_arg);
$shortfile =~ s/\.$man_section\.md$//;
#--------------------------------------------------------------------------
my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime();
my $today = sprintf("%04d-%02d-%02d", ($year+1900), $mon, $mday);
# Run opal_get_version.sh to get the OMPI version.
my $config_dir = dirname($0);
my $get_version = "$config_dir/opal_get_version.sh";
my $VERSION_file = "$config_dir/../VERSION";
my $out = `$get_version $VERSION_file --full`;
chomp($out);
# Pandoc does not handle markdown links in output nroff properly, so
# just remove all links. Specifically: some versions of Pandoc ignore
# the links, but others handle it badly.
$source_content =~ s/\[(.+)\]\((.+)\)/\1/g;
# Add the pandoc header
$source_content = "---
section: $man_section
title: $shortfile
header: Open PMIx
footer: $today
---
$source_content";
#--------------------------------------------------------------------------
print("*** Processing: $source_arg --> $dest_arg\n")
if ($verbose_arg);
# Run Pandoc
my $pid = open3(my $child_stdin, my $child_stdout, my $child_stderr,
"$pandoc_arg -s --from=markdown --to=man");
print $child_stdin $source_content;
close($child_stdin);
my $pandoc_rendered;
$pandoc_rendered .= $_
while(<$child_stdout>);
close($child_stdout);
close($child_stderr)
if ($child_stderr);
waitpid($pid, 0);
# Write the output to the target file
open(FILE, ">$dest_arg") ||
die "Can't open $dest_arg for writing";
print FILE $pandoc_rendered;
close(FILE);
exit(0);

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

@ -43,6 +43,11 @@ AC_DEFUN([PMIX_SETUP_CORE],[
AC_REQUIRE([AM_PROG_CC_C_O])
# initialize
PMIX_EMBEDDED_LDFLAGS=
PMIX_EMBEDDED_LIBS=
PMIX_EMBEDDED_CPPFLAGS=
# If no prefix was defined, set a good value
m4_ifval([$1],
[m4_define([pmix_config_prefix],[$1/])],
@ -168,22 +173,6 @@ AC_DEFUN([PMIX_SETUP_CORE],[
# replaced, not the entire file.
AC_CONFIG_HEADERS(pmix_config_prefix[src/include/pmix_config.h])
# Rename symbols?
AC_ARG_WITH([pmix-symbol-rename],
AC_HELP_STRING([--with-pmix-symbol-rename=PREFIX],
[Provide a prefix to rename PMIx symbols]))
AC_MSG_CHECKING([for symbol rename])
AS_IF([test ! -z "$with_pmix_symbol_rename" && test "$with_pmix_symbol_rename" != "yes"],
[AC_MSG_RESULT([$with_pmix_symbol_rename])
pmix_symbol_rename="$with_pmix_symbol_rename"
PMIX_RENAME=$with_pmix_symbol_rename],
[AC_MSG_RESULT([no])
pmix_symbol_rename=""
PMIX_RENAME=])
AC_DEFINE_UNQUOTED(PMIX_SYMBOL_RENAME, [$pmix_symbol_rename],
[The pmix symbol rename include directive])
AC_SUBST(PMIX_RENAME)
AC_CONFIG_FILES(pmix_config_prefix[include/pmix_rename.h])
# Add any extra lib?
AC_ARG_WITH([pmix-extra-lib],
@ -416,9 +405,11 @@ AC_DEFUN([PMIX_SETUP_CORE],[
time.h unistd.h dirent.h \
crt_externs.h signal.h \
ioLib.h sockLib.h hostLib.h limits.h \
sys/statfs.h sys/statvfs.h \
sys/fcntl.h sys/statfs.h sys/statvfs.h \
netdb.h ucred.h zlib.h sys/auxv.h \
sys/sysctl.h])
sys/sysctl.h termio.h termios.h pty.h \
libutil.h util.h grp.h sys/cdefs.h utmp.h stropts.h \
sys/utsname.h])
AC_CHECK_HEADERS([sys/mount.h], [], [],
[AC_INCLUDES_DEFAULT
@ -663,7 +654,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 setpgid ptsname openpty setenv])
AC_CHECK_FUNCS([asprintf snprintf vasprintf vsnprintf strsignal socketpair strncpy_s usleep statfs statvfs getpeereid getpeerucred strnlen posix_fallocate tcgetpgrp setpgid ptsname openpty setenv fork execve waitpid])
# 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
@ -752,7 +743,7 @@ AC_DEFUN([PMIX_SETUP_CORE],[
##################################
# Libevent
##################################
pmix_show_title "Libevent"
pmix_show_title "Event libraries"
PMIX_LIBEV_CONFIG
PMIX_LIBEVENT_CONFIG
@ -779,12 +770,13 @@ AC_DEFUN([PMIX_SETUP_CORE],[
##################################
# ZLIB COMPRESSION
# ZLIB
##################################
pmix_show_title "ZLIB"
PMIX_ZLIB_CONFIG
##################################
# Dstore Locking
##################################
@ -813,15 +805,19 @@ AC_DEFUN([PMIX_SETUP_CORE],[
MCA-variable-setting mechansism). This MCA variable
controls whether warnings are displayed when an MCA
component fails to load at run time due to an error.
(default: enabled, meaning that
(default: enabled in --enable-debug builds, meaning that
mca_base_component_show_load_errors is enabled
by default])])
by default when configured with --enable-debug])])
if test "$enable_show_load_errors_by_default" = "no" ; then
PMIX_SHOW_LOAD_ERRORS_DEFAULT=0
AC_MSG_RESULT([disabled by default])
else
PMIX_SHOW_LOAD_ERRORS_DEFAULT=1
AC_MSG_RESULT([enabled by default])
PMIX_SHOW_LOAD_ERRORS_DEFAULT=$WANT_DEBUG
if test "$WANT_DEBUG" = "1"; then
AC_MSG_RESULT([enabled by default])
else
AC_MSG_RESULT([disabled by default])
fi
fi
AC_DEFINE_UNQUOTED(PMIX_SHOW_LOAD_ERRORS_DEFAULT, $PMIX_SHOW_LOAD_ERRORS_DEFAULT,
[Default value for mca_base_component_show_load_errors MCA variable])
@ -854,11 +850,16 @@ AC_DEFUN([PMIX_SETUP_CORE],[
# rather than have successive assignments to these shell
# variables, lest the $(foo) names try to get evaluated here.
# Yuck!
CPPFLAGS="-I$PMIX_top_builddir -I$PMIX_top_srcdir -I$PMIX_top_srcdir/src -I$PMIX_top_builddir/include -I$PMIX_top_srcdir/include $CPPFLAGS"
cpp_includes="$PMIX_top_builddir $PMIX_top_srcdir $PMIX_top_srcdir/src $PMIX_top_builddir/include"
else
CPPFLAGS="-I$PMIX_top_srcdir -I$PMIX_top_srcdir/src -I$PMIX_top_srcdir/include $CPPFLAGS"
cpp_includes="$PMIX_top_srcdir $PMIX_top_srcdir/src"
fi
CPP_INCLUDES="$(echo $cpp_includes | $SED 's/[[^ \]]* */'"$pmix_cc_iquote"'&/g')"
CPPFLAGS="$CPP_INCLUDES -I$PMIX_top_srcdir/include $CPPFLAGS $PMIX_FINAL_CPPFLAGS"
LDFLAGS="$LDFLAGS $PMIX_FINAL_LDFLAGS"
LIBS="$LIBS $PMIX_FINAL_LIBS"
############################################################################
# pmixdatadir, pmixlibdir, and pmixinclude are essentially the same as
# pkg*dir, but will always be */pmix.
pmixdatadir='${datadir}/pmix'
@ -891,8 +892,15 @@ AC_DEFUN([PMIX_SETUP_CORE],[
AC_CONFIG_FILES(pmix_config_prefix[test/run_tests11.pl], [chmod +x test/run_tests11.pl])
AC_CONFIG_FILES(pmix_config_prefix[test/run_tests12.pl], [chmod +x test/run_tests12.pl])
AC_CONFIG_FILES(pmix_config_prefix[test/run_tests13.pl], [chmod +x test/run_tests13.pl])
AC_CONFIG_FILES(pmix_config_prefix[test/run_tests14.pl], [chmod +x test/run_tests14.pl])
AC_CONFIG_FILES(pmix_config_prefix[test/run_tests15.pl], [chmod +x test/run_tests15.pl])
# AC_CONFIG_FILES(pmix_config_prefix[test/run_tests14.pl], [chmod +x test/run_tests14.pl])
# AC_CONFIG_FILES(pmix_config_prefix[test/run_tests15.pl], [chmod +x test/run_tests15.pl])
############################################################################
# Check for building man pages
############################################################################
pmix_show_subtitle "Man page setup"
PMIX_SETUP_MAN_PAGES
############################################################################
# final output
@ -1194,7 +1202,6 @@ fi
AM_CONDITIONAL([PMIX_INSTALL_BINARIES], [test $WANT_PMIX_BINARIES -eq 1])
# see if they want to disable non-RTLD_GLOBAL dlopen
AC_MSG_CHECKING([if want to support dlopen of non-global namespaces])
AC_ARG_ENABLE([nonglobal-dlopen],
@ -1213,6 +1220,24 @@ fi
AS_IF([test -z "$enable_nonglobal_dlopen" && test "x$pmix_mode" = "xembedded" && test $WANT_INSTALL_HEADERS -eq 0 && test $pmix_need_libpmix -eq 1],
[pmix_need_libpmix=0])
#
# Do we want PTY support?
#
AC_MSG_CHECKING([if want pty support])
AC_ARG_ENABLE(pty-support,
AC_HELP_STRING([--enable-pty-support],
[Enable/disable PTY support for STDIO forwarding. (default: enabled)]))
if test "$enable_pty_support" = "no" ; then
AC_MSG_RESULT([no])
PMIX_ENABLE_PTY_SUPPORT=0
else
AC_MSG_RESULT([yes])
PMIX_ENABLE_PTY_SUPPORT=1
fi
AC_DEFINE_UNQUOTED([PMIX_ENABLE_PTY_SUPPORT], [$PMIX_ENABLE_PTY_SUPPORT],
[Whether user wants PTY support or not])
#
# psec/dummy_handshake
#

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

@ -1,89 +0,0 @@
# -*- shell-script -*-
#
# Copyright (c) 2004-2005 The Trustees of Indiana University and Indiana
# University Research and Technology
# Corporation. All rights reserved.
# 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,
# University of Stuttgart. All rights reserved.
# Copyright (c) 2004-2006 The Regents of the University of California.
# All rights reserved.
# Copyright (c) 2006 QLogic Corp. All rights reserved.
# Copyright (c) 2009-2016 Cisco Systems, Inc. All rights reserved.
# Copyright (c) 2016-2017 Intel, Inc. All rights reserved.
# Copyright (c) 2015 Research Organization for Information Science
# and Technology (RIST). All rights reserved.
# Copyright (c) 2016 Los Alamos National Security, LLC. All rights
# reserved.
# $COPYRIGHT$
#
# Additional copyrights may follow
#
# $HEADER$
#
# PMIX_CHECK_PSM2(prefix, [action-if-found], [action-if-not-found])
# --------------------------------------------------------
# check if PSM2 support can be found. sets prefix_{CPPFLAGS,
# LDFLAGS, LIBS} as needed and runs action-if-found if there is
# support, otherwise executes action-if-not-found
AC_DEFUN([PMIX_CHECK_PSM2],[
if test -z "$pmix_check_psm2_happy" ; then
AC_ARG_WITH([psm2],
[AC_HELP_STRING([--with-psm2(=DIR)],
[Build PSM2 (Intel PSM2) support, optionally adding DIR/include, DIR/lib, and DIR/lib64 to the search path for headers and libraries])])
PMIX_CHECK_WITHDIR([psm2], [$with_psm2], [include/psm2.h])
AC_ARG_WITH([psm2-libdir],
[AC_HELP_STRING([--with-psm2-libdir=DIR],
[Search for PSM (Intel PSM2) libraries in DIR])])
PMIX_CHECK_WITHDIR([psm2-libdir], [$with_psm2_libdir], [libpsm2.*])
pmix_check_psm2_$1_save_CPPFLAGS="$CPPFLAGS"
pmix_check_psm2_$1_save_LDFLAGS="$LDFLAGS"
pmix_check_psm2_$1_save_LIBS="$LIBS"
AS_IF([test "$with_psm2" != "no"],
[AS_IF([test ! -z "$with_psm2" && test "$with_psm2" != "yes"],
[pmix_check_psm2_dir="$with_psm2"])
AS_IF([test ! -z "$with_psm2_libdir" && test "$with_psm2_libdir" != "yes"],
[pmix_check_psm2_libdir="$with_psm2_libdir"])
PMIX_CHECK_PACKAGE([pmix_check_psm2],
[psm2.h],
[psm2],
[psm2_mq_irecv2],
[],
[$pmix_check_psm2_dir],
[$pmix_check_psm2_libdir],
[pmix_check_psm2_happy="yes"],
[pmix_check_psm2_happy="no"])],
[pmix_check_psm2_happy="no"])
CPPFLAGS="$pmix_check_psm2_$1_save_CPPFLAGS"
LDFLAGS="$pmix_check_psm2_$1_save_LDFLAGS"
LIBS="$pmix_check_psm2_$1_save_LIBS"
AS_IF([test "$pmix_check_psm2_happy" = "yes" && test "$enable_progress_threads" = "yes"],
[AC_MSG_WARN([PSM2 driver does not currently support progress threads. Disabling MTL.])
pmix_check_psm2_happy="no"])
AS_IF([test "$pmix_check_psm2_happy" = "yes"],
[AC_CHECK_HEADERS(
glob.h,
[],
[AC_MSG_WARN([glob.h not found. Can not build component.])
pmix_check_psm2_happy="no"])])
fi
AS_IF([test "$pmix_check_psm2_happy" = "yes"],
[$1_LDFLAGS="[$]$1_LDFLAGS $pmix_check_psm2_LDFLAGS"
$1_CPPFLAGS="[$]$1_CPPFLAGS $pmix_check_psm2_CPPFLAGS"
$1_LIBS="[$]$1_LIBS $pmix_check_psm2_LIBS"
$2],
[AS_IF([test ! -z "$with_psm2" && test "$with_psm2" != "no"],
[AC_MSG_ERROR([PSM2 support requested but not found. Aborting])])
$3])
])

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

@ -11,13 +11,14 @@ dnl Copyright (c) 2004-2005 The Regents of the University of California.
dnl All rights reserved.
dnl Copyright (c) 2008-2018 Cisco Systems, Inc. All rights reserved.
dnl Copyright (c) 2010 Oracle and/or its affiliates. All rights reserved.
dnl Copyright (c) 2015-2017 Research Organization for Information Science
dnl and Technology (RIST). All rights reserved.
dnl Copyright (c) 2015-2018 Research Organization for Information Science
dnl and Technology (RIST). All rights reserved.
dnl Copyright (c) 2014-2018 Los Alamos National Security, LLC. All rights
dnl reserved.
dnl Copyright (c) 2017 Amazon.com, Inc. or its affiliates. All Rights
dnl reserved.
dnl Copyright (c) 2018-2019 Intel, Inc. All rights reserved.
dnl Copyright (c) 2020 Google, LLC. All rights reserved.
dnl Copyright (c) 2020 Intel, Inc. All rights reserved.
dnl $COPYRIGHT$
dnl
dnl Additional copyrights may follow
@ -32,12 +33,10 @@ AC_DEFUN([PMIX_ATOMIC_COMPARE_EXCHANGE_N_TEST_SOURCE],[[
#include <stdint.h>
#include <stdbool.h>
#include <stdlib.h>
typedef union {
uint64_t fake@<:@2@:>@;
__int128 real;
} pmix128;
static void test1(void)
{
// As of Aug 2018, we could not figure out a way to assign 128-bit
@ -53,7 +52,6 @@ static void test1(void)
exit(1);
}
}
static void test2(void)
{
pmix128 ptr = { .fake = { 0xFFEEDDCCBBAA0099, 0x8877665544332211 }};
@ -66,7 +64,6 @@ static void test2(void)
exit(2);
}
}
int main(int argc, char** argv)
{
test1();
@ -84,12 +81,10 @@ AC_DEFUN([PMIX_SYNC_BOOL_COMPARE_AND_SWAP_TEST_SOURCE],[[
#include <stdint.h>
#include <stdbool.h>
#include <stdlib.h>
typedef union {
uint64_t fake@<:@2@:>@;
__int128 real;
} pmix128;
static void test1(void)
{
// As of Aug 2018, we could not figure out a way to assign 128-bit
@ -103,7 +98,6 @@ static void test1(void)
exit(1);
}
}
static void test2(void)
{
pmix128 ptr = { .fake = { 0xFFEEDDCCBBAA0099, 0x8877665544332211 }};
@ -114,7 +108,6 @@ static void test2(void)
exit(2);
}
}
int main(int argc, char** argv)
{
test1();
@ -131,12 +124,11 @@ AC_DEFUN([PMIX_ATOMIC_COMPARE_EXCHANGE_STRONG_TEST_SOURCE],[[
#include <stdbool.h>
#include <stdlib.h>
#include <stdatomic.h>
typedef union {
uint64_t fake@<:@2@:>@;
_Atomic __int128 real;
__int128 real2;
} pmix128;
static void test1(void)
{
// As of Aug 2018, we could not figure out a way to assign 128-bit
@ -145,27 +137,23 @@ static void test1(void)
pmix128 ptr = { .fake = { 0xFFEEDDCCBBAA0099, 0x8877665544332211 }};
pmix128 expected = { .fake = { 0x11EEDDCCBBAA0099, 0x88776655443322FF }};
pmix128 desired = { .fake = { 0x1122DDCCBBAA0099, 0x887766554433EEFF }};
bool r = atomic_compare_exchange_strong (&ptr.real, &expected.real,
desired.real, true,
atomic_relaxed, atomic_relaxed);
bool r = atomic_compare_exchange_strong (&ptr.real, &expected.real2,
desired.real);
if ( !(r == false && ptr.real == expected.real)) {
exit(1);
}
}
static void test2(void)
{
pmix128 ptr = { .fake = { 0xFFEEDDCCBBAA0099, 0x8877665544332211 }};
pmix128 expected = ptr;
pmix128 desired = { .fake = { 0x1122DDCCBBAA0099, 0x887766554433EEFF }};
bool r = atomic_compare_exchange_strong (&ptr.real, &expected.real,
desired.real, true,
atomic_relaxed, atomic_relaxed);
bool r = atomic_compare_exchange_strong (&ptr.real, &expected.real2,
desired.real);
if (!(r == true && ptr.real == desired.real)) {
exit(2);
}
}
int main(int argc, char** argv)
{
test1();
@ -206,10 +194,8 @@ dnl #4: action if all of 1, 2, and 3 fail
dnl
AC_DEFUN([PMIX_ASM_CHECK_ATOMIC_FUNC],[
PMIX_VAR_SCOPE_PUSH([pmix_asm_check_func_happy pmix_asm_check_func_CFLAGS_save pmix_asm_check_func_LIBS_save])
pmix_asm_check_func_CFLAGS_save=$CFLAGS
pmix_asm_check_func_LIBS_save=$LIBS
dnl Check with no compiler/linker flags
AC_MSG_CHECKING([for $1])
AC_LINK_IFELSE([$2],
@ -217,7 +203,6 @@ AC_DEFUN([PMIX_ASM_CHECK_ATOMIC_FUNC],[
AC_MSG_RESULT([yes])],
[pmix_asm_check_func_happy=0
AC_MSG_RESULT([no])])
dnl If that didn't work, try again with CFLAGS+=mcx16
AS_IF([test $pmix_asm_check_func_happy -eq 0],
[AC_MSG_CHECKING([for $1 with -mcx16])
@ -229,7 +214,6 @@ AC_DEFUN([PMIX_ASM_CHECK_ATOMIC_FUNC],[
CFLAGS=$pmix_asm_check_func_CFLAGS_save
AC_MSG_RESULT([no])])
])
dnl If that didn't work, try again with LIBS+=-latomic
AS_IF([test $pmix_asm_check_func_happy -eq 0],
[AC_MSG_CHECKING([for $1 with -latomic])
@ -241,7 +225,6 @@ AC_DEFUN([PMIX_ASM_CHECK_ATOMIC_FUNC],[
LIBS=$pmix_asm_check_func_LIBS_save
AC_MSG_RESULT([no])])
])
dnl If we have it, try it and make sure it gives a correct result.
dnl As of Aug 2018, we know that it links but does *not* work on clang
dnl 6 on ARM64.
@ -253,15 +236,12 @@ AC_DEFUN([PMIX_ASM_CHECK_ATOMIC_FUNC],[
AC_MSG_RESULT([no])],
[AC_MSG_RESULT([cannot test -- assume yes (cross compiling)])])
])
dnl If we were unsuccessful, restore CFLAGS/LIBS
AS_IF([test $pmix_asm_check_func_happy -eq 0],
[CFLAGS=$pmix_asm_check_func_CFLAGS_save
LIBS=$pmix_asm_check_func_LIBS_save])
dnl Run the user actions
AS_IF([test $pmix_asm_check_func_happy -eq 1], [$3], [$4])
PMIX_VAR_SCOPE_POP
])
@ -269,7 +249,6 @@ dnl ------------------------------------------------------------------
AC_DEFUN([PMIX_CHECK_SYNC_BUILTIN_CSWAP_INT128], [
PMIX_VAR_SCOPE_PUSH([sync_bool_compare_and_swap_128_result])
# Do we have __sync_bool_compare_and_swap?
# Use a special macro because we need to check with a few different
# CFLAGS/LIBS.
@ -277,51 +256,16 @@ AC_DEFUN([PMIX_CHECK_SYNC_BUILTIN_CSWAP_INT128], [
[AC_LANG_SOURCE(PMIX_SYNC_BOOL_COMPARE_AND_SWAP_TEST_SOURCE)],
[sync_bool_compare_and_swap_128_result=1],
[sync_bool_compare_and_swap_128_result=0])
AC_DEFINE_UNQUOTED([PMIX_HAVE_SYNC_BUILTIN_CSWAP_INT128],
[$sync_bool_compare_and_swap_128_result],
[Whether the __sync builtin atomic compare and swap supports 128-bit values])
PMIX_VAR_SCOPE_POP
])
AC_DEFUN([PMIX_CHECK_SYNC_BUILTINS], [
AC_MSG_CHECKING([for __sync builtin atomics])
AC_TRY_LINK([long tmp;], [__sync_synchronize();
__sync_bool_compare_and_swap(&tmp, 0, 1);
__sync_add_and_fetch(&tmp, 1);],
[AC_MSG_RESULT([yes])
$1],
[AC_MSG_RESULT([no])
$2])
AC_MSG_CHECKING([for 64-bit __sync builtin atomics])
AC_TRY_LINK([
#include <stdint.h>
uint64_t tmp;], [
__sync_bool_compare_and_swap(&tmp, 0, 1);
__sync_add_and_fetch(&tmp, 1);],
[AC_MSG_RESULT([yes])
pmix_asm_sync_have_64bit=1],
[AC_MSG_RESULT([no])
pmix_asm_sync_have_64bit=0])
AC_DEFINE_UNQUOTED([PMIX_ASM_SYNC_HAVE_64BIT],[$pmix_asm_sync_have_64bit],
[Whether 64-bit is supported by the __sync builtin atomics])
# Check for 128-bit support
PMIX_CHECK_SYNC_BUILTIN_CSWAP_INT128
])
AC_DEFUN([PMIX_CHECK_GCC_BUILTIN_CSWAP_INT128], [
PMIX_VAR_SCOPE_PUSH([atomic_compare_exchange_n_128_result atomic_compare_exchange_n_128_CFLAGS_save atomic_compare_exchange_n_128_LIBS_save])
atomic_compare_exchange_n_128_CFLAGS_save=$CFLAGS
atomic_compare_exchange_n_128_LIBS_save=$LIBS
# Do we have __sync_bool_compare_and_swap?
# Use a special macro because we need to check with a few different
# CFLAGS/LIBS.
@ -329,7 +273,6 @@ AC_DEFUN([PMIX_CHECK_GCC_BUILTIN_CSWAP_INT128], [
[AC_LANG_SOURCE(PMIX_ATOMIC_COMPARE_EXCHANGE_N_TEST_SOURCE)],
[atomic_compare_exchange_n_128_result=1],
[atomic_compare_exchange_n_128_result=0])
# If we have it and it works, check to make sure it is always lock
# free.
AS_IF([test $atomic_compare_exchange_n_128_result -eq 1],
@ -347,23 +290,20 @@ AC_DEFUN([PMIX_CHECK_GCC_BUILTIN_CSWAP_INT128], [
AC_MSG_RESULT([no])],
[AC_MSG_RESULT([cannot test -- assume yes (cross compiling)])])
])
AC_DEFINE_UNQUOTED([PMIX_HAVE_GCC_BUILTIN_CSWAP_INT128],
[$atomic_compare_exchange_n_128_result],
[Whether the __atomic builtin atomic compare swap is both supported and lock-free on 128-bit values])
dnl If we could not find decent support for 128-bits __atomic let's
dnl try the GCC _sync
AS_IF([test $atomic_compare_exchange_n_128_result -eq 0],
[PMIX_CHECK_SYNC_BUILTIN_CSWAP_INT128])
PMIX_VAR_SCOPE_POP
])
AC_DEFUN([PMIX_CHECK_GCC_ATOMIC_BUILTINS], [
AC_MSG_CHECKING([for __atomic builtin atomics])
AC_TRY_LINK([
if test -z "$pmix_cv_have___atomic" ; then
AC_MSG_CHECKING([for 32-bit GCC built-in atomics])
AC_TRY_LINK([
#include <stdint.h>
uint32_t tmp, old = 0;
uint64_t tmp64, old64 = 0;], [
@ -372,21 +312,39 @@ __atomic_compare_exchange_n(&tmp, &old, 1, 0, __ATOMIC_RELAXED, __ATOMIC_RELAXED
__atomic_add_fetch(&tmp, 1, __ATOMIC_RELAXED);
__atomic_compare_exchange_n(&tmp64, &old64, 1, 0, __ATOMIC_RELAXED, __ATOMIC_RELAXED);
__atomic_add_fetch(&tmp64, 1, __ATOMIC_RELAXED);],
[AC_MSG_RESULT([yes])
$1],
[AC_MSG_RESULT([no])
$2])
# Check for 128-bit support
PMIX_CHECK_GCC_BUILTIN_CSWAP_INT128
[pmix_cv_have___atomic=yes],
[pmix_cv_have___atomic=no])
AC_MSG_RESULT([$pmix_cv_have___atomic])
if test $pmix_cv_have___atomic = "yes" ; then
AC_MSG_CHECKING([for 64-bit GCC built-in atomics])
AC_TRY_LINK([
#include <stdint.h>
uint64_t tmp64, old64 = 0;], [
__atomic_compare_exchange_n(&tmp64, &old64, 1, 0, __ATOMIC_RELAXED, __ATOMIC_RELAXED);
__atomic_add_fetch(&tmp64, 1, __ATOMIC_RELAXED);],
[pmix_cv_have___atomic_64=yes],
[pmix_cv_have___atomic_64=no])
AC_MSG_RESULT([$pmix_cv_have___atomic_64])
if test $pmix_cv_have___atomic_64 = "yes" ; then
AC_MSG_CHECKING([if 64-bit GCC built-in atomics are lock-free])
AC_RUN_IFELSE([AC_LANG_PROGRAM([], [if (!__atomic_is_lock_free (8, 0)) { return 1; }])],
[AC_MSG_RESULT([yes])],
[AC_MSG_RESULT([no])
pmix_cv_have___atomic_64=no],
[AC_MSG_RESULT([cannot test -- assume yes (cross compiling)])])
fi
else
pmix_cv_have___atomic_64=no
fi
# Check for 128-bit support
PMIX_CHECK_GCC_BUILTIN_CSWAP_INT128
fi
])
AC_DEFUN([PMIX_CHECK_C11_CSWAP_INT128], [
PMIX_VAR_SCOPE_PUSH([atomic_compare_exchange_result atomic_compare_exchange_CFLAGS_save atomic_compare_exchange_LIBS_save])
atomic_compare_exchange_CFLAGS_save=$CFLAGS
atomic_compare_exchange_LIBS_save=$LIBS
# Do we have C11 atomics on 128-bit integers?
# Use a special macro because we need to check with a few different
# CFLAGS/LIBS.
@ -394,7 +352,6 @@ AC_DEFUN([PMIX_CHECK_C11_CSWAP_INT128], [
[AC_LANG_SOURCE(PMIX_ATOMIC_COMPARE_EXCHANGE_STRONG_TEST_SOURCE)],
[atomic_compare_exchange_result=1],
[atomic_compare_exchange_result=0])
# If we have it and it works, check to make sure it is always lock
# free.
AS_IF([test $atomic_compare_exchange_result -eq 1],
@ -412,41 +369,16 @@ AC_DEFUN([PMIX_CHECK_C11_CSWAP_INT128], [
AC_MSG_RESULT([no])],
[AC_MSG_RESULT([cannot test -- assume yes (cross compiling)])])
])
AC_DEFINE_UNQUOTED([PMIX_HAVE_C11_CSWAP_INT128],
[$atomic_compare_exchange_result],
[Whether C11 atomic compare swap is both supported and lock-free on 128-bit values])
dnl If we could not find decent support for 128-bits atomic let's
dnl try the GCC _sync
AS_IF([test $atomic_compare_exchange_result -eq 0],
[PMIX_CHECK_SYNC_BUILTIN_CSWAP_INT128])
PMIX_VAR_SCOPE_POP
])
AC_DEFUN([PMIX_CHECK_GCC_ATOMIC_BUILTINS], [
AC_MSG_CHECKING([for __atomic builtin atomics])
AC_TRY_LINK([
#include <stdint.h>
uint32_t tmp, old = 0;
uint64_t tmp64, old64 = 0;], [
__atomic_thread_fence(__ATOMIC_SEQ_CST);
__atomic_compare_exchange_n(&tmp, &old, 1, 0, __ATOMIC_RELAXED, __ATOMIC_RELAXED);
__atomic_add_fetch(&tmp, 1, __ATOMIC_RELAXED);
__atomic_compare_exchange_n(&tmp64, &old64, 1, 0, __ATOMIC_RELAXED, __ATOMIC_RELAXED);
__atomic_add_fetch(&tmp64, 1, __ATOMIC_RELAXED);],
[AC_MSG_RESULT([yes])
$1],
[AC_MSG_RESULT([no])
$2])
# Check for 128-bit support
PMIX_CHECK_GCC_BUILTIN_CSWAP_INT128
])
dnl #################################################################
dnl
dnl PMIX_CHECK_ASM_TEXT
@ -526,9 +458,7 @@ dnl #################################################################
# ---------------------------------------
AC_DEFUN([_PMIX_CHECK_ASM_LSYM],[
AC_REQUIRE([AC_PROG_GREP])
$1="L"
for sym in L .L $ L$ ; do
asm_result=0
echo "configure: trying $sym" >&AC_FD_CC
@ -565,7 +495,6 @@ ${sym}mytestlabel$pmix_cv_asm_label_suffix],
# ---------------------
AC_DEFUN([PMIX_CHECK_ASM_LSYM],[
AC_REQUIRE([AC_PROG_NM])
AC_CACHE_CHECK([prefix for lsym labels],
[pmix_cv_asm_lsym],
[_PMIX_CHECK_ASM_LSYM([pmix_cv_asm_lsym])])
@ -593,7 +522,6 @@ mysym:
.endp mysym],
[pmix_cv_asm_need_proc="yes"])
rm -f conftest.out])
if test "$pmix_cv_asm_need_proc" = "yes" ; then
pmix_cv_asm_proc=".proc"
pmix_cv_asm_endproc=".endp"
@ -616,21 +544,17 @@ AC_DEFUN([PMIX_CHECK_ASM_GSYM],[
AC_CACHE_CHECK([prefix for global symbol labels],
[pmix_cv_asm_gsym],
[_PMIX_CHECK_ASM_GSYM])
if test "$pmix_cv_asm_gsym" = "none" ; then
AC_MSG_ERROR([Could not determine global symbol label prefix])
fi
AC_DEFINE_UNQUOTED([PMIX_ASM_GSYM], ["$pmix_cv_asm_gsym"],
[Assembly prefix for gsym labels])
PMIX_ASM_GSYM="$pmix_cv_asm_gsym"
AC_SUBST(PMIX_ASM_GSYM)
])
AC_DEFUN([_PMIX_CHECK_ASM_GSYM],[
pmix_cv_asm_gsym="none"
for sym in "_" "" "." ; do
asm_result=0
echo "configure: trying $sym" >&AC_FD_CC
@ -727,7 +651,6 @@ dnl #################################################################
AC_DEFUN([PMIX_CHECK_ASM_ALIGN_LOG],[
AC_REQUIRE([AC_PROG_NM])
AC_REQUIRE([AC_PROG_GREP])
AC_CACHE_CHECK([if .align directive takes logarithmic value],
[pmix_cv_asm_align_log],
[ PMIX_TRY_ASSEMBLE([ $pmix_cv_asm_text
@ -746,17 +669,14 @@ foo$pmix_cv_asm_label_suffix
else
pmix_cv_asm_align_log="no"
fi])
if test "$pmix_cv_asm_align_log" = "yes" || test "$pmix_cv_asm_align_log" = "1" ; then
pmix_asm_align_log_result=1
else
pmix_asm_align_log_result=0
fi
AC_DEFINE_UNQUOTED([PMIX_ASM_ALIGN_LOG],
[$asm_align_log_result],
[Assembly align directive expects logarithmic value])
unset omp_asm_addr asm_result
])dnl
@ -777,7 +697,6 @@ AC_DEFUN([PMIX_CHECK_ASM_TYPE],[
AC_CACHE_CHECK([prefix for function in .type],
[pmix_cv_asm_type],
[_PMIX_CHECK_ASM_TYPE])
AC_DEFINE_UNQUOTED([PMIX_ASM_TYPE], ["$pmix_cv_asm_type"],
[How to set function type in .type directive])
PMIX_ASM_TYPE="$pmix_cv_asm_type"
@ -786,7 +705,6 @@ AC_DEFUN([PMIX_CHECK_ASM_TYPE],[
AC_DEFUN([_PMIX_CHECK_ASM_TYPE],[
pmix_cv_asm_type=""
case "${host}" in
*-sun-solaris*)
# GCC on solaris seems to accept just about anything, not
@ -809,7 +727,6 @@ mysym:],
;;
esac
rm -f conftest.out
unset asm_result type
])dnl
@ -829,13 +746,11 @@ AC_DEFUN([PMIX_CHECK_ASM_SIZE],[
PMIX_TRY_ASSEMBLE([ .size mysym, 1],
[pmix_cv_asm_need_size="yes"])
rm -f conftest.out])
if test "$pmix_cv_asm_need_size" = "yes" ; then
pmix_asm_size=1
else
pmix_asm_size=0
fi
AC_DEFINE_UNQUOTED([PMIX_ASM_SIZE], ["$pmix_asm_size"],
[Do we need to give a .size directive])
PMIX_ASM_SIZE="$pmix_asm_size"
@ -850,7 +765,6 @@ AC_DEFUN([PMIX_CHECK_ASM_SIZE],[
# disable execable stacks with GAS
AC_DEFUN([PMIX_CHECK_ASM_GNU_STACKEXEC], [
AC_REQUIRE([AC_PROG_GREP])
AC_CHECK_PROG([OBJDUMP], [objdump], [objdump])
AC_CACHE_CHECK([if .note.GNU-stack is needed],
[pmix_cv_asm_gnu_stack_result],
@ -860,7 +774,7 @@ AC_DEFUN([PMIX_CHECK_ASM_GNU_STACKEXEC], [
int testfunc() {return 0; }
EOF
PMIX_LOG_COMMAND([$CC $CFLAGS -c conftest.c -o conftest.$OBJEXT],
[$OBJDUMP -x conftest.$OBJEXT | $GREP '\.note\.GNU-stack' > /dev/null && pmix_cv_asm_gnu_stack_result=yes],
[$OBJDUMP -x conftest.$OBJEXT 2>&1 | $GREP '\.note\.GNU-stack' &> /dev/null && pmix_cv_asm_gnu_stack_result=yes],
[PMIX_LOG_MSG([the failed program was:], 1)
PMIX_LOG_FILE([conftest.c])
pmix_cv_asm_gnu_stack_result=no])
@ -899,7 +813,6 @@ AC_DEFUN([PMIX_CHECK_POWERPC_REG],[
else
AC_MSG_RESULT([no])
fi
AC_DEFINE_UNQUOTED([PMIX_POWERPC_R_REGISTERS],
[$pmix_cv_asm_powerpc_r_reg],
[Whether r notation is used for ppc registers])
@ -939,7 +852,6 @@ AC_DEFUN([PMIX_CHECK_POWERPC_64BIT],[
ppc64_result=0
;;
esac
if test "$ppc64_result" = "1" ; then
AC_MSG_RESULT([yes])
ifelse([$1],,:,[$1])
@ -947,34 +859,10 @@ AC_DEFUN([PMIX_CHECK_POWERPC_64BIT],[
AC_MSG_RESULT([no])
ifelse([$2],,:,[$2])
fi
unset ppc64_result ldarx_asm
])dnl
dnl #################################################################
dnl
dnl PMIX_CHECK_SPARCV8PLUS
dnl
dnl #################################################################
AC_DEFUN([PMIX_CHECK_SPARCV8PLUS],[
AC_MSG_CHECKING([if have Sparc v8+/v9 support])
sparc_result=0
PMIX_TRY_ASSEMBLE([$pmix_cv_asm_text
casa [%o0] 0x80, %o1, %o2],
[sparc_result=1],
[sparc_result=0])
if test "$sparc_result" = "1" ; then
AC_MSG_RESULT([yes])
ifelse([$1],,:,[$1])
else
AC_MSG_RESULT([no])
ifelse([$2],,:,[$2])
fi
unset sparc_result
])dnl
dnl #################################################################
dnl
dnl PMIX_CHECK_CMPXCHG16B
@ -983,7 +871,6 @@ dnl #################################################################
AC_DEFUN([PMIX_CMPXCHG16B_TEST_SOURCE],[[
#include <stdint.h>
#include <assert.h>
union pmix_counted_pointer_t {
struct {
uint64_t counter;
@ -996,17 +883,13 @@ union pmix_counted_pointer_t {
#endif
};
typedef union pmix_counted_pointer_t pmix_counted_pointer_t;
int main(int argc, char* argv) {
volatile pmix_counted_pointer_t a;
pmix_counted_pointer_t b;
a.data.counter = 0;
a.data.item = 0x1234567890ABCDEF;
b.data.counter = a.data.counter;
b.data.item = a.data.item;
/* bozo checks */
assert(16 == sizeof(pmix_counted_pointer_t));
assert(a.data.counter == b.data.counter);
@ -1029,7 +912,6 @@ int main(int argc, char* argv) {
AC_DEFUN([PMIX_CHECK_CMPXCHG16B],[
PMIX_VAR_SCOPE_PUSH([cmpxchg16b_result])
PMIX_ASM_CHECK_ATOMIC_FUNC([cmpxchg16b],
[AC_LANG_PROGRAM([[unsigned char tmp[16];]],
[[__asm__ __volatile__ ("lock cmpxchg16b (%%rsi)" : : "S" (tmp) : "memory", "cc");]])],
@ -1044,7 +926,6 @@ AC_DEFUN([PMIX_CHECK_CMPXCHG16B],[
AC_MSG_RESULT([no])],
[AC_MSG_RESULT([cannot test -- assume yes (cross compiling)])])
])
AC_DEFINE_UNQUOTED([PMIX_HAVE_CMPXCHG16B], [$cmpxchg16b_result],
[Whether the processor supports the cmpxchg16b instruction])
PMIX_VAR_SCOPE_POP
@ -1079,9 +960,7 @@ dnl #################################################################
AC_DEFUN([PMIX_CHECK_INLINE_C_GCC],[
assembly="$1"
asm_result="unknown"
AC_MSG_CHECKING([if $CC supports GCC inline assembly])
if test ! "$assembly" = "" ; then
AC_RUN_IFELSE([AC_LANG_PROGRAM([AC_INCLUDES_DEFAULT],[[
int ret = 1;
@ -1094,7 +973,6 @@ return ret;
else
assembly="test skipped - assuming no"
fi
# if we're cross compiling, just try to compile and figure good enough
if test "$asm_result" = "unknown" ; then
AC_LINK_IFELSE([AC_LANG_PROGRAM([AC_INCLUDES_DEFAULT],[[
@ -1105,20 +983,16 @@ return ret;
]])],
[asm_result="yes"], [asm_result="no"])
fi
AC_MSG_RESULT([$asm_result])
if test "$asm_result" = "yes" ; then
PMIX_C_GCC_INLINE_ASSEMBLY=1
pmix_cv_asm_inline_supported="yes"
else
PMIX_C_GCC_INLINE_ASSEMBLY=0
fi
AC_DEFINE_UNQUOTED([PMIX_C_GCC_INLINE_ASSEMBLY],
[$PMIX_C_GCC_INLINE_ASSEMBLY],
[Whether C compiler supports GCC style inline assembly])
unset PMIX_C_GCC_INLINE_ASSEMBLY assembly asm_result
])dnl
@ -1136,32 +1010,28 @@ dnl #################################################################
AC_DEFUN([PMIX_CONFIG_ASM],[
AC_REQUIRE([PMIX_SETUP_CC])
AC_REQUIRE([AM_PROG_AS])
AC_ARG_ENABLE([c11-atomics],[AC_HELP_STRING([--enable-c11-atomics],
[Enable use of C11 atomics if available (default: enabled)])])
AC_ARG_ENABLE([builtin-atomics],
[AC_HELP_STRING([--enable-builtin-atomics],
[Enable use of __sync builtin atomics (default: disabled)])])
[Enable use of GCC built-in atomics (default: autodetect)])])
PMIX_CHECK_C11_CSWAP_INT128
pmix_cv_asm_builtin="BUILTIN_NO"
PMIX_CHECK_GCC_ATOMIC_BUILTINS
if test "x$enable_c11_atomics" != "xno" && test "$pmix_cv_c11_supported" = "yes" ; then
pmix_cv_asm_builtin="BUILTIN_C11"
PMIX_CHECK_C11_CSWAP_INT128
elif test "x$enable_c11_atomics" = "xyes"; then
AC_MSG_WARN([C11 atomics were requested but are not supported])
AC_MSG_ERROR([Cannot continue])
elif test "$enable_builtin_atomics" = "yes" ; then
if test $pmix_cv_have___atomic = "yes" ; then
pmix_cv_asm_builtin="BUILTIN_GCC"
else
pmix_cv_asm_builtin="BUILTIN_NO"
AS_IF([test "$pmix_cv_asm_builtin" = "BUILTIN_NO" && test "$enable_builtin_atomics" = "yes"],
[PMIX_CHECK_GCC_ATOMIC_BUILTINS([pmix_cv_asm_builtin="BUILTIN_GCC"], [])])
AS_IF([test "$pmix_cv_asm_builtin" = "BUILTIN_NO" && test "$enable_builtin_atomics" = "yes"],
[PMIX_CHECK_SYNC_BUILTINS([pmix_cv_asm_builtin="BUILTIN_SYNC"], [])])
AS_IF([test "$pmix_cv_asm_builtin" = "BUILTIN_NO" && test "$enable_builtin_atomics" = "yes"],
[AC_MSG_ERROR([__sync builtin atomics requested but not found.])])
AC_MSG_WARN([GCC built-in atomics requested but not found.])
AC_MSG_ERROR([Cannot continue])
fi
fi
PMIX_CHECK_ASM_PROC
PMIX_CHECK_ASM_TEXT
PMIX_CHECK_ASM_GLOBAL
@ -1172,11 +1042,14 @@ AC_DEFUN([PMIX_CONFIG_ASM],[
PMIX_CHECK_ASM_TYPE
PMIX_CHECK_ASM_SIZE
PMIX_CHECK_ASM_ALIGN_LOG
# find our architecture for purposes of assembly stuff
pmix_cv_asm_arch="UNSUPPORTED"
PMIX_GCC_INLINE_ASSIGN=""
if test "$pmix_cv_have___atomic_64" ; then
PMIX_ASM_SUPPORT_64BIT=1
else
PMIX_ASM_SUPPORT_64BIT=0
fi
case "${host}" in
x86_64-*x32)
pmix_cv_asm_arch="X86_64"
@ -1193,60 +1066,29 @@ AC_DEFUN([PMIX_CONFIG_ASM],[
PMIX_GCC_INLINE_ASSIGN='"xaddl %1,%0" : "=m"(ret), "+r"(negone) : "m"(ret)'
PMIX_CHECK_CMPXCHG16B
;;
ia64-*)
pmix_cv_asm_arch="IA64"
PMIX_CHECK_SYNC_BUILTINS([pmix_cv_asm_builtin="BUILTIN_SYNC"],
[AC_MSG_ERROR([No atomic primitives available for $host])])
;;
aarch64*)
pmix_cv_asm_arch="ARM64"
PMIX_ASM_SUPPORT_64BIT=1
PMIX_ASM_ARM_VERSION=8
AC_DEFINE_UNQUOTED([PMIX_ASM_ARM_VERSION], [$PMIX_ASM_ARM_VERSION],
[What ARM assembly version to use])
PMIX_GCC_INLINE_ASSIGN='"mov %0, #0" : "=&r"(ret)'
;;
armv7*|arm-*-linux-gnueabihf)
pmix_cv_asm_arch="ARM"
PMIX_ASM_SUPPORT_64BIT=1
PMIX_ASM_ARM_VERSION=7
AC_DEFINE_UNQUOTED([PMIX_ASM_ARM_VERSION], [$PMIX_ASM_ARM_VERSION],
[What ARM assembly version to use])
PMIX_GCC_INLINE_ASSIGN='"mov %0, #0" : "=&r"(ret)'
;;
armv6*)
pmix_cv_asm_arch="ARM"
PMIX_ASM_SUPPORT_64BIT=0
PMIX_ASM_ARM_VERSION=6
CCASFLAGS="$CCASFLAGS -march=armv7-a"
AC_DEFINE_UNQUOTED([PMIX_ASM_ARM_VERSION], [$PMIX_ASM_ARM_VERSION],
[What ARM assembly version to use])
PMIX_GCC_INLINE_ASSIGN='"mov %0, #0" : "=&r"(ret)'
;;
armv5*linux*|armv4*linux*|arm-*-linux-gnueabi)
# uses Linux kernel helpers for some atomic operations
pmix_cv_asm_arch="ARM"
PMIX_CHECK_SYNC_BUILTINS([pmix_cv_asm_builtin="BUILTIN_SYNC"],
[AC_MSG_ERROR([No atomic primitives available for $host])])
;;
mips-*|mips64*)
# Should really find some way to make sure that we are on
# a MIPS III machine (r4000 and later)
pmix_cv_asm_arch="MIPS"
PMIX_CHECK_SYNC_BUILTINS([pmix_cv_asm_builtin="BUILTIN_SYNC"],
[AC_MSG_ERROR([No atomic primitives available for $host])])
;;
powerpc-*|powerpc64-*|powerpcle-*|powerpc64le-*|rs6000-*|ppc-*)
PMIX_CHECK_POWERPC_REG
if test "$ac_cv_sizeof_long" = "4" ; then
pmix_cv_asm_arch="POWERPC32"
# Note that on some platforms (Apple G5), even if we are
# compiling in 32 bit mode (and therefore should assume
# sizeof(long) == 4), we can use the 64 bit test and set
@ -1260,87 +1102,32 @@ AC_DEFUN([PMIX_CONFIG_ASM],[
fi
PMIX_GCC_INLINE_ASSIGN='"1: li %0,0" : "=&r"(ret)'
;;
# There is no current difference between s390 and s390x
# But use two different defines in case some come later
# as s390 is 31bits while s390x is 64bits
s390-*)
pmix_cv_asm_arch="S390"
PMIX_CHECK_SYNC_BUILTINS([pmix_cv_asm_builtin="BUILTIN_SYNC"],
[AC_MSG_ERROR([No atomic primitives available for $host])])
;;
s390x-*)
pmix_cv_asm_arch="S390X"
PMIX_CHECK_SYNC_BUILTINS([pmix_cv_asm_builtin="BUILTIN_SYNC"],
[AC_MSG_ERROR([No atomic primitives available for $host])])
;;
sparc*-*)
# SPARC v9 (and above) are the only ones with 64bit support
# if compiling 32 bit, see if we are v9 (aka v8plus) or
# earlier (casa is v8+/v9).
if test "$ac_cv_sizeof_long" = "4" ; then
have_v8plus=0
PMIX_CHECK_SPARCV8PLUS([have_v8plus=1])
if test "$have_v8plus" = "0" ; then
PMIX_ASM_SUPPORT_64BIT=0
pmix_cv_asm_arch="SPARC"
AC_MSG_WARN([Sparc v8 target is not supported in this release of Open MPI.])
AC_MSG_WARN([You must specify the target architecture v8plus to compile])
AC_MSG_WARN([Open MPI in 32 bit mode on Sparc processors (see the README).])
AC_MSG_ERROR([Can not continue.])
else
PMIX_ASM_SUPPORT_64BIT=1
pmix_cv_asm_arch="SPARCV9_32"
fi
elif test "$ac_cv_sizeof_long" = "8" ; then
PMIX_ASM_SUPPORT_64BIT=1
pmix_cv_asm_arch="SPARCV9_64"
else
AC_MSG_ERROR([Could not determine Sparc word size: $ac_cv_sizeof_long])
fi
PMIX_GCC_INLINE_ASSIGN='"mov 0,%0" : "=&r"(ret)'
;;
*)
PMIX_CHECK_SYNC_BUILTINS([pmix_cv_asm_builtin="BUILTIN_SYNC"],
[AC_MSG_ERROR([No atomic primitives available for $host])])
;;
esac
if test "x$PMIX_ASM_SUPPORT_64BIT" = "x1" && test "$pmix_cv_asm_builtin" = "BUILTIN_SYNC" &&
test "$pmix_asm_sync_have_64bit" = "0" ; then
# __sync builtins exist but do not implement 64-bit support. Fall back on inline asm.
pmix_cv_asm_builtin="BUILTIN_NO"
if test $pmix_cv_have___atomic = "yes" ; then
pmix_cv_asm_builtin="BUILTIN_GCC"
else
AC_MSG_ERROR([No atomic primitives available for $host])
fi
if test "$pmix_cv_asm_builtin" = "BUILTIN_SYNC" || test "$pmix_cv_asm_builtin" = "BUILTIN_GCC" ; then
AC_DEFINE([PMIX_C_GCC_INLINE_ASSEMBLY], [1],
[Whether C compiler supports GCC style inline assembly])
else
AC_DEFINE_UNQUOTED([PMIX_ASM_SUPPORT_64BIT],
[$PMIX_ASM_SUPPORT_64BIT],
[Whether we can do 64bit assembly operations or not. Should not be used outside of the assembly header files])
AC_SUBST([PMIX_ASM_SUPPORT_64BIT])
#
# figure out if we need any special function start / stop code
#
case $host_os in
aix*)
pmix_asm_arch_config="aix"
;;
*)
pmix_asm_arch_config="default"
;;
esac
;;
esac
if ! test -z "$PMIX_ASM_ARM_VERSION" ; then
AC_DEFINE_UNQUOTED([PMIX_ASM_ARM_VERSION], [$PMIX_ASM_ARM_VERSION],
[What ARM assembly version to use])
fi
if test "$pmix_cv_asm_builtin" = "BUILTIN_GCC" ; then
AC_DEFINE([PMIX_C_GCC_INLINE_ASSEMBLY], [1],
[Whether C compiler supports GCC style inline assembly])
else
AC_DEFINE_UNQUOTED([PMIX_ASM_SUPPORT_64BIT],
[$PMIX_ASM_SUPPORT_64BIT],
[Whether we can do 64bit assembly operations or not. Should not be used outside of the assembly header files])
AC_SUBST([PMIX_ASM_SUPPORT_64BIT])
pmix_cv_asm_inline_supported="no"
# now that we know our architecture, try to inline assemble
PMIX_CHECK_INLINE_C_GCC([$PMIX_GCC_INLINE_ASSIGN])
# format:
# config_file-text-global-label_suffix-gsym-lsym-type-size-align_log-ppc_r_reg-64_bit-gnu_stack
asm_format="${pmix_asm_arch_config}"
asm_format="default"
asm_format="${asm_format}-${pmix_cv_asm_text}-${pmix_cv_asm_global}"
asm_format="${asm_format}-${pmix_cv_asm_label_suffix}-${pmix_cv_asm_gsym}"
asm_format="${asm_format}-${pmix_cv_asm_lsym}"
@ -1357,14 +1144,12 @@ AC_MSG_ERROR([Can not continue.])
# this version, but make sure the Makefile gives the right thing
# when regenerating the files because the base has been touched.
PMIX_ASSEMBLY_FORMAT=`echo "$pmix_cv_asm_format" | sed -e 's/\\\$/\\\$\\\$/'`
AC_MSG_CHECKING([for assembly format])
AC_MSG_RESULT([$pmix_cv_asm_format])
AC_DEFINE_UNQUOTED([PMIX_ASSEMBLY_FORMAT], ["$PMIX_ASSEMBLY_FORMAT"],
[Format of assembly file])
AC_SUBST([PMIX_ASSEMBLY_FORMAT])
fi # if pmix_cv_asm_builtin = BUILTIN_SYNC
fi # if pmix_cv_asm_builtin = BUILTIN_GCC
result="PMIX_$pmix_cv_asm_arch"
PMIX_ASSEMBLY_ARCH="$pmix_cv_asm_arch"
AC_MSG_CHECKING([for assembly architecture])
@ -1372,7 +1157,6 @@ AC_MSG_ERROR([Can not continue.])
AC_DEFINE_UNQUOTED([PMIX_ASSEMBLY_ARCH], [$result],
[Architecture type of assembly to use for atomic operations and CMA])
AC_SUBST([PMIX_ASSEMBLY_ARCH])
# Check for RDTSCP support
result=0
AS_IF([test "$pmix_cv_asm_arch" = "PMIX_X86_64" || test "$pmix_cv_asm_arch" = "PMIX_IA32"],
@ -1394,7 +1178,6 @@ int main(int argc, char* argv[])
AC_LANG_POP([C])])
AC_DEFINE_UNQUOTED([PMIX_ASSEMBLY_SUPPORTS_RDTSCP], [$result],
[Whether we have support for RDTSCP instruction])
result="PMIX_$pmix_cv_asm_builtin"
PMIX_ASSEMBLY_BUILTIN="$pmix_cv_asm_builtin"
AC_MSG_CHECKING([for builtin atomics])
@ -1402,9 +1185,7 @@ int main(int argc, char* argv[])
AC_DEFINE_UNQUOTED([PMIX_ASSEMBLY_BUILTIN], [$result],
[Whether to use builtin atomics])
AC_SUBST([PMIX_ASSEMBLY_BUILTIN])
PMIX_ASM_FIND_FILE
unset result asm_format
])dnl
@ -1420,8 +1201,7 @@ dnl #################################################################
AC_DEFUN([PMIX_ASM_FIND_FILE], [
AC_REQUIRE([AC_PROG_GREP])
AC_REQUIRE([AC_PROG_FGREP])
if test "$pmix_cv_asm_arch" != "WINDOWS" && test "$pmix_cv_asm_builtin" != "BUILTIN_SYNC" && test "$pmix_cv_asm_builtin" != "BUILTIN_GCC" && test "$pmix_cv_asm_builtin" != "BUILTIN_OSX" && test "$pmix_cv_asm_inline_arch" = "no" ; then
if test "$pmix_cv_asm_arch" != "WINDOWS" && test "$pmix_cv_asm_builtin" != "BUILTIN_GCC" && test "$pmix_cv_asm_builtin" != "BUILTIN_OSX" && test "$pmix_cv_asm_inline_arch" = "no" ; then
AC_MSG_ERROR([no atomic support available. exiting])
else
# On windows with VC++, atomics are done with compiler primitives

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

@ -12,7 +12,7 @@ dnl Copyright (c) 2004-2005 The Regents of the University of California.
dnl All rights reserved.
dnl Copyright (c) 2007 Sun Microsystems, Inc. All rights reserved.
dnl Copyright (c) 2009 Oak Ridge National Labs. All rights reserved.
dnl Copyright (c) 2009-2016 Cisco Systems, Inc. All rights reserved.
dnl Copyright (c) 2009-2020 Cisco Systems, Inc. All rights reserved.
dnl Copyright (c) 2013-2017 Intel, Inc. All rights reserved.
dnl Copyright (c) 2017 Research Organization for Information Science
dnl and Technology (RIST). All rights reserved.
@ -287,7 +287,7 @@ for val in ${$1}; do
# Check for special cases where we do want to allow repeated
# arguments (per
# http://www.open-mpi.org/community/lists/devel/2012/08/11362.php).
# https://www.open-mpi.org/community/lists/devel/2012/08/11362.php).
case $val in
-Xclang|-Xg)
@ -373,7 +373,7 @@ AC_DEFUN([PMIX_FLAGS_UNIQ],[
# Check for special cases where we do want to allow repeated
# arguments (per
# http://www.open-mpi.org/community/lists/devel/2012/08/11362.php
# https://www.open-mpi.org/community/lists/devel/2012/08/11362.php
# and
# https://github.com/open-mpi/ompi/issues/324).

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

@ -10,7 +10,7 @@ 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) 2014-2020 Intel, Inc. All rights reserved.
dnl Copyright (c) 2015 Research Organization for Information Science
dnl and Technology (RIST). All rights reserved.
dnl $COPYRIGHT$
@ -23,6 +23,9 @@ dnl
# PMIX_LOAD_PLATFORM()
# --------------------
AC_DEFUN([PMIX_LOAD_PLATFORM], [
AC_ARG_WITH([platform-patches-dir],
[AC_HELP_STRING([--with-platform-patches-dir=DIR],
[Location of the platform patches directory. If you use this option, you must also use --with-platform.])])
AC_ARG_WITH([platform],
[AC_HELP_STRING([--with-platform=FILE],
@ -30,7 +33,10 @@ AC_DEFUN([PMIX_LOAD_PLATFORM], [
command line not in FILE are used. Options on the
command line and in FILE are replaced by what is
in FILE.])])
m4_ifval([autogen_platform_file], [
if test "$with_platform" = "" ; then
with_platform=autogen_platform_file
fi])
if test "$with_platform" = "yes" ; then
AC_MSG_ERROR([--with-platform argument must include FILE option])
elif test "$with_platform" = "no" ; then
@ -77,5 +83,106 @@ AC_DEFUN([PMIX_LOAD_PLATFORM], [
# return to where we started
cd "$platform_savedir"
# define an alternate default mca param filename
platform_alt_mca_file="`basename $platform_loaded`.conf"
# look where platform file is located for platform.conf name
if test -r "${platform_file_dir}/${platform_alt_mca_file}" ; then
AC_SUBST(PMIX_DEFAULT_MCA_PARAM_CONF, [$platform_file_dir/$platform_alt_mca_file])
AC_SUBST(PMIX_PARAM_FROM_PLATFORM, "yes")
# if not, see if a file is there with the default name
elif test -r "${platform_file_dir}/pmix-mca-params.conf" ; then
AC_SUBST(PMIX_DEFAULT_MCA_PARAM_CONF, [$platform_file_dir/pmix-mca-params.conf])
AC_SUBST(PMIX_PARAM_FROM_PLATFORM, "yes")
# if not, then just use the default
else
AC_SUBST(PMIX_DEFAULT_MCA_PARAM_CONF, [pmix-mca-params.conf])
AC_SUBST(PMIX_PARAM_FROM_PLATFORM, "no")
fi
patch_dir="${with_platform}.patches"
if test -n "$with_platform_patches_dir"; then
if test "$with_platform_patches_dir" = "yes"; then
patch_dir="${with_platform}.patches"
elif test "$with_platform_patches_dir" = "no"; then
AC_MSG_NOTICE([Disabling platform patches on user request])
patch_dir=""
elif test -d "$with_platform_patches_dir"; then
patch_dir=$with_platform_patches_dir
else
AC_MSG_ERROR([User provided patches directory: $with_platform_patches_dir not found])
fi
fi
patch_done="${srcdir}/.platform_patches"
patch_found=no
if test -d "${patch_dir}"; then
if test ! -f "${patch_done}"; then
AC_MSG_NOTICE([Checking patches from ${patch_dir}/ directory ])
for one_patch in $patch_dir/*.patch ; do
AC_MSG_CHECKING([patch: $one_patch for errors ])
patch -d ${srcdir} -p1 -t -s --dry-run < ${one_patch}
if test "$?" != "0"; then
AC_MSG_RESULT([fail])
AC_MSG_ERROR([Platform patches failed to apply])
else
AC_MSG_RESULT([ok])
fi
AC_MSG_CHECKING([patch: $one_patch for unsupported configury changes ])
has_configury_items=$(patch -d ${srcdir} -p1 -t --dry-run < ${one_patch} 2>&1 | egrep "^patching" | egrep '*\.(am|m4)$' | wc -l)
if test $has_configury_items -ne 0; then
AC_MSG_RESULT([fail])
AC_MSG_ERROR([Platform patches should not change configury files])
else
AC_MSG_RESULT([ok])
fi
done
for one_patch in $patch_dir/*.patch ; do
AC_MSG_NOTICE([Applying patch ${one_patch}])
patch -d ${srcdir} -p1 -t -s < ${one_patch}
if test "$?" != "0"; then
AC_MSG_ERROR([Failed to apply patch ${one_patch}])
fi
patch_found=yes
done
if test "$patch_found" = "yes"; then
platform_root_short="$(basename $platform_base)"
# If platform file resides under platform/ root folder - use filename as ident
if [ test "$platform_root_short" = "platform" ]; then
platform_ident="$platform_file"
else
platform_ident="$(basename $platform_base)"
fi
# Set custom ident for platform patched PMIX
if [ test -z "$with_ident_string" ]; then
with_ident_string="Platform: $platform_ident"
fi
AC_MSG_NOTICE([Platform patches applied, created stamp file ${patch_done}])
touch ${patch_done}
else
AC_MSG_NOTICE([No platform patches in ${patch_dir}])
fi
else
AC_MSG_WARN([Platform patches already applied, skipping. ${patch_done} can be removed to re-apply ])
fi
elif test -n "${patch_dir}"; then
AC_MSG_NOTICE([No platform patches in ${patch_dir}])
fi
else
AC_SUBST(PMIX_DEFAULT_MCA_PARAM_CONF, [pmix-mca-params.conf])
fi
])

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

@ -262,11 +262,6 @@ AC_DEFUN([PMIX_MCA],[
[MCA_pmix_]mca_framework[_CONFIG](mca_framework),
[MCA_CONFIGURE_FRAMEWORK(mca_framework, 1)])])])
# note that mca_wrapper_extra_* is a running list, and we take checkpoints at the end of our project
pmix_mca_wrapper_extra_cppflags="$mca_wrapper_extra_cppflags"
pmix_mca_wrapper_extra_ldflags="$mca_wrapper_extra_ldflags"
pmix_mca_wrapper_extra_libs="$mca_wrapper_extra_libs"
AC_SUBST(MCA_pmix_FRAMEWORKS)
AC_SUBST(MCA_pmix_FRAMEWORKS_SUBDIRS)
AC_SUBST(MCA_pmix_FRAMEWORK_COMPONENT_ALL_SUBDIRS)
@ -622,14 +617,6 @@ AC_DEFUN([MCA_CONFIGURE_ALL_CONFIG_COMPONENTS],[
AC_MSG_WARN([MCA component configure script told me to abort])
AC_MSG_ERROR([cannot continue])
fi
m4_foreach(flags, [LDFLAGS, LIBS],
[[line="`$GREP WRAPPER_EXTRA_]flags[= $infile | cut -d= -f2-`"]
eval "line=$line"
if test -n "$line"; then
$2[_]$3[_WRAPPER_EXTRA_]flags[="$line"]
fi
])dnl
fi
MCA_PROCESS_COMPONENT($1, $component, $2, $3, $4, $5, $compile_mode)
@ -754,38 +741,6 @@ AC_MSG_ERROR([*** $1 component $2 was supposed to be direct-called, but
*** Aborting])
fi
fi
# if the component is building, add it's WRAPPER_EXTRA_LDFLAGS and
# WRAPPER_EXTRA_LIBS. If the component doesn't specify it's
# WRAPPER_EXTRA_LIBS and WRAPPER_EXTRA_LDFLAGS, try using LDFLAGS and LIBS if
# component didn't have it's own configure script (in which case,
# we know it didn't set LDFLAGS and LIBS because it can't) Don't
# have to do this if the component is building dynamically,
# because it will link against these (without a dependency from
# libmpi.so to these flags)
if test "$7" = "static"; then
AS_LITERAL_IF([$2],
[m4_foreach(flags, [LDFLAGS, LIBS],
[AS_IF([test "$$1_$2_WRAPPER_EXTRA_]flags[" = ""],
[PMIX_FLAGS_APPEND_UNIQ([mca_wrapper_extra_]m4_tolower(flags), [$$1_$2_]flags)],
[PMIX_FLAGS_APPEND_UNIQ([mca_wrapper_extra_]m4_tolower(flags), [$$1_$2_WRAPPER_EXTRA_]flags)])
])],
[m4_foreach(flags, [LDFLAGS, LIBS],
[[str="line=\$$1_$2_WRAPPER_EXTRA_]flags["]
eval "$str"
PMIX_FLAGS_APPEND_UNIQ([mca_wrapper_extra_]m4_tolower(flags), [$line])])])
fi
# if needed, copy over WRAPPER_EXTRA_CPPFLAGS. Since a configure script
# component can never be used in a STOP_AT_FIRST framework, we
# don't have to implement the else clause in the literal check...
AS_LITERAL_IF([$2],
[AS_IF([test "$$1_$2_WRAPPER_EXTRA_CPPFLAGS" != ""],
[m4_if(PMIX_EVAL_ARG([MCA_pmix_$1_CONFIGURE_MODE]), [STOP_AT_FIRST], [stop_at_first=1], [stop_at_first=0])
AS_IF([test "$7" = "static" && test "$stop_at_first" = "1"],
[AS_IF([test "$with_devel_headers" = "yes"],
[PMIX_FLAGS_APPEND_UNIQ([mca_wrapper_extra_cppflags], [$$1_$2_WRAPPER_EXTRA_CPPFLAGS])])],
[AC_MSG_WARN([ignoring $1_$2_WRAPPER_EXTRA_CPPFLAGS ($$1_$2_WRAPPER_EXTRA_CPPFLAGS): component conditions not met])])])])
])

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

@ -16,7 +16,7 @@ dnl Copyright (c) 2012-2017 Los Alamos National Security, LLC. All rights
dnl reserved.
dnl Copyright (c) 2015-2019 Research Organization for Information Science
dnl and Technology (RIST). All rights reserved.
dnl Copyright (c) 2018 Intel, Inc. All rights reserved.
dnl Copyright (c) 2018-2020 Intel, Inc. All rights reserved.
dnl $COPYRIGHT$
dnl
dnl Additional copyrights may follow
@ -120,6 +120,28 @@ AC_DEFUN([PMIX_PROG_CC_C11],[
])
# PMIX_CHECK_CC_IQUOTE()
# ----------------------
# Check if the compiler supports the -iquote option. This options
# removes the specified directory from the search path when using
# #include <>. This check works around an issue caused by C++20
# which added a <version> header. This conflicts with the
# VERSION file at the base of our source directory on case-
# insensitive filesystems.
AC_DEFUN([PMIX_CHECK_CC_IQUOTE],[
PMIX_VAR_SCOPE_PUSH([pmix_check_cc_iquote_CFLAGS_save])
pmix_check_cc_iquote_CFLAGS_save=${CFLAGS}
CFLAGS="${CFLAGS} -iquote ."
AC_MSG_CHECKING([for $CC option to add a directory only to the search path for the quote form of include])
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]],[])],
[pmix_cc_iquote="-iquote"],
[pmix_cc_iquote="-I"])
CFLAGS=${pmix_check_cc_iquote_CFLAGS_save}
PMIX_VAR_SCOPE_POP
AC_MSG_RESULT([$pmix_cc_iquote])
])
# PMIX_SETUP_CC()
# ---------------
# Do everything required to setup the C compiler. Safe to AC_REQUIRE
@ -135,7 +157,13 @@ AC_DEFUN([PMIX_SETUP_CC],[
PMIX_VAR_SCOPE_PUSH([pmix_prog_cc_c11_helper__Thread_local_available pmix_prog_cc_c11_helper_atomic_var_available pmix_prog_cc_c11_helper__Atomic_available pmix_prog_cc_c11_helper__static_assert_available pmix_prog_cc_c11_helper__Generic_available pmix_prog_cc__thread_available pmix_prog_cc_c11_helper_atomic_fetch_xor_explicit_available])
# AC_PROG_CC_C99 changes CC (instead of CFLAGS) so save CC (without c99
# flags) for use in our wrappers.
WRAPPER_CC="$CC"
AC_SUBST([WRAPPER_CC])
PMIX_PROG_CC_C11
PMIX_CHECK_CC_IQUOTE
if test $pmix_cv_c11_supported = no ; then
# It is not currently an error if C11 support is not available. Uncomment the

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

@ -2,8 +2,8 @@ dnl -*- shell-script -*-
dnl
dnl Copyright (c) 2016 Research Organization for Information Science
dnl and Technology (RIST). All rights reserved.
dnl Copyright (c) 2017-2019 Intel, Inc. All rights reserved.
dnl Copyright (c) 2018 Cisco, Inc. All rights reserved.
dnl Copyright (c) 2017-2018 Intel, Inc. All rights reserved.
dnl Copyright (c) 2018-2020 Cisco, Inc. All rights reserved.
dnl $COPYRIGHT$
dnl
dnl Additional copyrights may follow
@ -24,7 +24,7 @@ AC_DEFUN([PMIX_CAPTURE_CONFIGURE_CLI],[
PMIX_VAR_SCOPE_PUSH([sed_quote_subst arg quoted_arg])
$1=
for arg in "$[]@"; do
sed_quote_subst='s/\(@<:@`"$\\@:>@\)/\\\1/g'
sed_quote_subst='s/\(@<:@`"\\@:>@\)/\\\1/g'
case "$arg" in
*@<:@\\\`\"\$[]@:>@*)
quoted_arg=\'`echo "$arg" | sed $sed_quote_subst`\' ;;

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

@ -2,7 +2,7 @@
#
# 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) 2013-2020 Intel, Inc. All rights reserved.
# $COPYRIGHT$
#
# Additional copyrights may follow
@ -46,7 +46,7 @@ AC_DEFUN([_PMIX_HWLOC_EMBEDDED_MODE],[
])
AC_DEFUN([_PMIX_HWLOC_EXTERNAL],[
PMIX_VAR_SCOPE_PUSH([pmix_hwloc_dir pmix_hwloc_libdir pmix_hwloc_standard_lib_location pmix_hwloc_standard_header_location])
PMIX_VAR_SCOPE_PUSH([pmix_hwloc_dir pmix_hwloc_libdir pmix_hwloc_standard_lib_location pmix_hwloc_standard_header_location pmix_check_hwloc_save_CPPFLAGS pmix_check_hwloc_save_LDFLAGS pmix_check_hwloc_save_LIBS])
AC_ARG_WITH([hwloc],
[AC_HELP_STRING([--with-hwloc=DIR],
@ -57,13 +57,19 @@ AC_DEFUN([_PMIX_HWLOC_EXTERNAL],[
[Search for hwloc libraries in DIR ])])
pmix_hwloc_support=0
pmix_check_hwloc_save_CPPFLAGS="$CPPFLAGS"
pmix_check_hwloc_save_LDFLAGS="$LDFLAGS"
pmix_check_hwloc_save_LIBS="$LIBS"
pmix_hwloc_standard_header_location=yes
pmix_hwloc_standard_lib_location=yes
AS_IF([test "$with_hwloc" = "internal" || test "$with_hwloc" = "external"],
[with_hwloc=])
if test "$with_hwloc" != "no"; then
AC_MSG_CHECKING([for hwloc in])
if test ! -z "$with_hwloc" && test "$with_hwloc" != "yes"; then
pmix_hwloc_dir=$with_hwloc
pmix_hwloc_dir=$with_hwloc/include
pmix_hwloc_standard_header_location=no
pmix_hwloc_standard_lib_location=no
AS_IF([test -z "$with_hwloc_libdir" || test "$with_hwloc_libdir" = "yes"],
@ -134,6 +140,10 @@ AC_DEFUN([_PMIX_HWLOC_EXTERNAL],[
AC_MSG_ERROR([Cannot continue])])
fi
CPPFLAGS=$pmix_check_hwloc_save_CPPFLAGS
LDFLAGS=$pmix_check_hwloc_save_LDFLAGS
LIBS=$pmix_check_hwloc_save_LIBS
AC_MSG_CHECKING([will hwloc support be built])
if test "$pmix_hwloc_support" != "1"; then
AC_MSG_RESULT([no])
@ -143,6 +153,12 @@ AC_DEFUN([_PMIX_HWLOC_EXTERNAL],[
AC_MSG_RESULT([yes])
pmix_hwloc_source=$pmix_hwloc_dir
pmix_hwloc_support_will_build=yes
AS_IF([test "$pmix_hwloc_standard_header_location" != "yes"],
[PMIX_FLAGS_APPEND_UNIQ(PMIX_FINAL_CPPFLAGS, $pmix_hwloc_CPPFLAGS)])
AS_IF([test "$pmix_hwloc_standard_lib_location" != "yes"],
[PMIX_FLAGS_APPEND_UNIQ(PMIX_FINAL_LDFLAGS, $pmix_hwloc_LDFLAGS)])
PMIX_FLAGS_APPEND_UNIQ(PMIX_FINAL_LIBS, $pmix_hwloc_LIBS)
fi
# Set output variables

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

@ -2,7 +2,7 @@
#
# 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) 2013-2020 Intel, Inc. All rights reserved.
# Copyright (c) 2017-2019 Research Organization for Information Science
# and Technology (RIST). All rights reserved.
# $COPYRIGHT$
@ -15,7 +15,7 @@
# 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])
PMIX_VAR_SCOPE_PUSH([pmix_libev_dir pmix_libev_libdir pmix_libev_standard_header_location pmix_libev_standard_lib_location pmix_check_libev_save_CPPFLAGS pmix_check_libev_save_LDFLAGS pmix_check_libev_save_LIBS])
AC_ARG_WITH([libev],
[AC_HELP_STRING([--with-libev=DIR],
@ -61,7 +61,7 @@ AC_DEFUN([PMIX_LIBEV_CONFIG],[
PMIX_CHECK_PACKAGE([pmix_libev],
[event.h],
[ev],
[event_base_new],
[ev_async_send],
[],
[$pmix_libev_dir],
[$pmix_libev_libdir],
@ -72,12 +72,12 @@ AC_DEFUN([PMIX_LIBEV_CONFIG],[
LIBS="$pmix_check_libev_save_LIBS"])
AS_IF([test $pmix_libev_support -eq 1],
[LIBS="$LIBS $pmix_libev_LIBS"
[PMIX_FLAGS_APPEND_UNIQ(PMIX_FINAL_LIBS, $pmix_libev_LIBS)
AS_IF([test "$pmix_libev_standard_header_location" != "yes"],
[CPPFLAGS="$CPPFLAGS $pmix_libev_CPPFLAGS"])
[PMIX_FLAGS_APPEND_UNIQ(PMIX_FINAL_CPPFLAGS, $pmix_libev_CPPFLAGS)])
AS_IF([test "$pmix_libev_standard_lib_location" != "yes"],
[LDFLAGS="$LDFLAGS $pmix_libev_LDFLAGS"])])
[PMIX_FLAGS_APPEND_UNIQ(PMIX_FINAL_LDFLAGS, $pmix_libev_LDFLAGS)])])
AC_MSG_CHECKING([will libev support be built])
if test $pmix_libev_support -eq 1; then
@ -88,6 +88,10 @@ AC_DEFUN([PMIX_LIBEV_CONFIG],[
PMIX_SUMMARY_ADD([[External Packages]],[[libev]],[libev],[$pmix_libev_dir])
else
AC_MSG_RESULT([no])
# if they asked us to use it, then this is an error
AS_IF([test -n "$with_libev" && test "$with_libev" != "no"],
[AC_MSG_WARN([LIBEV SUPPORT REQUESTED AND NOT FOUND])
AC_MSG_ERROR([CANNOT CONTINUE])])
fi
AC_DEFINE_UNQUOTED([PMIX_HAVE_LIBEV], [$pmix_libev_support], [Whether we are building against libev])

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

@ -2,9 +2,10 @@
#
# 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) 2013-2020 Intel, Inc. All rights reserved.
# Copyright (c) 2017-2019 Research Organization for Information Science
# and Technology (RIST). All rights reserved.
# Copyright (c) 2020 IBM Corporation. All rights reserved.
# $COPYRIGHT$
#
# Additional copyrights may follow
@ -55,7 +56,7 @@ AC_DEFUN([_PMIX_LIBEVENT_EMBEDDED_MODE],[
])
AC_DEFUN([_PMIX_LIBEVENT_EXTERNAL],[
PMIX_VAR_SCOPE_PUSH([pmix_event_dir pmix_event_libdir pmix_event_defaults])
PMIX_VAR_SCOPE_PUSH([pmix_event_dir pmix_event_libdir pmix_event_defaults pmix_check_libevent_save_CPPFLAGS pmix_check_libevent_save_LDFLAGS pmix_check_libevent_save_LIBS])
AC_ARG_WITH([libevent],
[AC_HELP_STRING([--with-libevent=DIR],
@ -68,6 +69,7 @@ AC_DEFUN([_PMIX_LIBEVENT_EXTERNAL],[
pmix_check_libevent_save_CPPFLAGS="$CPPFLAGS"
pmix_check_libevent_save_LDFLAGS="$LDFLAGS"
pmix_check_libevent_save_LIBS="$LIBS"
pmix_event_defaults=yes
# get rid of the trailing slash(es)
libevent_prefix=$(echo $with_libevent | sed -e 'sX/*$XXg')
@ -108,14 +110,36 @@ AC_DEFUN([_PMIX_LIBEVENT_EXTERNAL],[
PMIX_CHECK_PACKAGE([pmix_libevent],
[event.h],
[event],
[event_core],
[event_config_new],
[-levent -levent_pthreads],
[-levent_pthreads],
[$pmix_event_dir],
[$pmix_event_libdir],
[pmix_libevent_support=1],
[pmix_libevent_support=0])
# Check to see if the above check failed because it conflicted with LSF's libevent.so
# This can happen if LSF's library is in the LDFLAGS envar or default search
# path. The 'event_getcode4name' function is only defined in LSF's libevent.so and not
# in Libevent's libevent.so
if test $pmix_libevent_support -eq 0; then
AC_CHECK_LIB([event], [event_getcode4name],
[AC_MSG_WARN([===================================================================])
AC_MSG_WARN([Possible conflicting libevent.so libraries detected on the system.])
AC_MSG_WARN([])
AC_MSG_WARN([LSF provides a libevent.so that is not from Libevent in its])
AC_MSG_WARN([library path. It is possible that you have installed Libevent])
AC_MSG_WARN([on the system, but the linker is picking up the wrong version.])
AC_MSG_WARN([])
AC_MSG_WARN([You will need to address this linker path issue. One way to do so is])
AC_MSG_WARN([to make sure the libevent system library path occurs before the])
AC_MSG_WARN([LSF library path.])
AC_MSG_WARN([===================================================================])
])
fi
# need to add resulting flags to global ones so we can
# test for thread support
AS_IF([test "$pmix_event_defaults" = "no"],
[PMIX_FLAGS_APPEND_UNIQ(CPPFLAGS, $pmix_libevent_CPPFLAGS)
PMIX_FLAGS_APPEND_UNIQ(LDFLAGS, $pmix_libevent_LDFLAGS)])
@ -125,7 +149,7 @@ AC_DEFUN([_PMIX_LIBEVENT_EXTERNAL],[
# 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_CHECK_LIB([event_core], [evthread_set_lock_callbacks],
[],
[AC_MSG_WARN([External libevent does not have thread support])
AC_MSG_WARN([PMIx requires libevent to be compiled with])
@ -156,9 +180,9 @@ AC_DEFUN([_PMIX_LIBEVENT_EXTERNAL],[
[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)
[PMIX_FLAGS_APPEND_UNIQ(PMIX_FINAL_CPPFLAGS, $pmix_libevent_CPPFLAGS)
PMIX_FLAGS_APPEND_UNIQ(PMIX_FINAL_LDFLAGS, $pmix_libevent_LDFLAGS)])
PMIX_FLAGS_APPEND_UNIQ(PMIX_FINAL_LIBS, $pmix_libevent_LIBS)
else
AC_MSG_RESULT([no])
fi

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

@ -0,0 +1,91 @@
dnl -*- shell-script -*-
dnl
dnl Copyright (c) 2020 Cisco Systems, Inc. All rights reserved.
dnl
dnl Copyright (c) 2020 Intel, Inc. All rights reserved.
dnl $COPYRIGHT$
dnl
dnl Additional copyrights may follow
dnl
dnl $HEADER$
dnl
dnl
dnl Just in case someone looks for it here someday, here is a
dnl conveninent reference for what Markdown pandoc supports:
dnl
dnl https://rmarkdown.rstudio.com/authoring_pandoc_markdown.html
dnl
AC_DEFUN([PMIX_SETUP_MAN_PAGES],[
AC_ARG_ENABLE(man-pages,
[AC_HELP_STRING([--disable-man-pages],
[Do not generate/install man pages (default: enabled)])])
PANDOC=
PMIX_ENABLE_MAN_PAGES=0
AC_MSG_CHECKING([if want man pages])
AS_IF([test -z "$enable_man_pages" || test "$enable_man_pages" = "yes"],
[AC_MSG_RESULT([yes])
PMIX_ENABLE_MAN_PAGES=1
_PMIX_SETUP_PANDOC],
[AC_MSG_RESULT([no])])
AC_SUBST(PANDOC)
AM_CONDITIONAL([PMIX_ENABLE_MAN_PAGES], [test $PMIX_ENABLE_MAN_PAGES -eq 1])
AC_DEFINE_UNQUOTED([PMIX_ENABLE_MAN_PAGES], [$PMIX_ENABLE_MAN_PAGES],
[Whether or not we will build manpages])
AS_IF([test $PMIX_ENABLE_MAN_PAGES -eq 1],
[PMIX_SUMMARY_ADD([[Options]],[[Manpages built]], [pmix_manpages], [yes])],
[PMIX_SUMMARY_ADD([[Options]],[[Manpages built]], [pmix_manpages], [yes])])
])
dnl Back-end pandoc setup
AC_DEFUN([_PMIX_SETUP_PANDOC],[
PMIX_VAR_SCOPE_PUSH([min_major_version min_minor_version pandoc_version pandoc_major pandoc_minor])
# If we need to generate man pages, we need pandoc >v1.12.
AC_PATH_PROG([PANDOC], [pandoc])
# If we found Pandoc, check its version. We need >=v1.12.
# To be clear: I know that v1.12 works, and I know that v1.9 does not
# work. I did not test the versions in between to know exactly what
# the lowest version is that works. Someone is free to update this
# check someday to be more accurate if they wish.
min_major_version=1
min_minor_version=12
AS_IF([test -n "$PANDOC"],
[pandoc_version=`pandoc --version | head -n 1 | awk '{ print $[2] }'`
pandoc_major=`echo $pandoc_version | cut -d\. -f1`
pandoc_minor=`echo $pandoc_version | cut -d\. -f2`
AC_MSG_CHECKING([pandoc version])
AC_MSG_RESULT([major: $pandoc_major, minor: $pandoc_minor])
AC_MSG_CHECKING([if pandoc version is >=v$min_major_version.$min_minor_version])
AS_IF([test $pandoc_major -lt $min_major_version], [PANDOC=])
AS_IF([test $pandoc_major -eq $min_major_version && test $pandoc_minor -lt $min_minor_version],
[PANDOC=])
AS_IF([test -n "$PANDOC"],
[AC_MSG_RESULT([yes])],
[AC_MSG_RESULT([no])])
])
AS_IF([test -z "$PANDOC" || test -n "`echo $PANDOC | $GREP missing`"],
[AS_IF([test "$PMIX_DEVEL" = "1" && test -z "$enable_man_pages"],
[AC_MSG_CHECKING([man pages will be built])
AC_MSG_RESULT([no - adequate pandoc installation not found])
PANDOC=
PMIX_ENABLE_MAN_PAGES=0],
[AS_IF([test ! -f "$srcdir/tools/wrapper/pmix_wrapper.1"],
[AC_MSG_WARN([*** Could not find a suitable pandoc on your system.])
AC_MSG_WARN([*** You need pandoc >=$min_major_version.$min_minor_version to build OpenPMIx man pages.])
AC_MSG_WARN([*** See pandoc.org.])
AC_MSG_WARN([*** NOTE: If you are building from a tarball downloaded from the OpenPMIx GitHub repository, you do not need Pandoc])
AC_MSG_ERROR([Cannot continue])
])])
])
PMIX_VAR_SCOPE_POP
])

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

@ -2,7 +2,7 @@
#
# Copyright (c) 2009-2015 Cisco Systems, Inc. All rights reserved.
# Copyright (c) 2013 Los Alamos National Security, LLC. All rights reserved.
# Copyright (c) 2013-2017 Intel, Inc. All rights reserved.
# Copyright (c) 2013-2020 Intel, Inc. All rights reserved.
# $COPYRIGHT$
#
# Additional copyrights may follow

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

@ -5,7 +5,7 @@ dnl reserved.
dnl Copyright (c) 2016-2018 Cisco Systems, Inc. All rights reserved
dnl Copyright (c) 2016 Research Organization for Information Science
dnl and Technology (RIST). All rights reserved.
dnl Copyright (c) 2018-2019 Intel, Inc. All rights reserved.
dnl Copyright (c) 2018 Intel, Inc. All rights reserved.
dnl $COPYRIGHT$
dnl
dnl Additional copyrights may follow

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

@ -10,7 +10,7 @@
# University of Stuttgart. All rights reserved.
# Copyright (c) 2004-2005 The Regents of the University of California.
# All rights reserved.
# Copyright (c) 2006-2016 Cisco Systems, Inc. All rights reserved.
# Copyright (c) 2006-2020 Cisco Systems, Inc. All rights reserved
# Copyright (c) 2006-2008 Sun Microsystems, Inc. All rights reserved.
# Copyright (c) 2006-2017 Los Alamos National Security, LLC. All rights
# reserved.
@ -19,7 +19,7 @@
# Copyright (c) 2012 Oracle and/or its affiliates. All rights reserved.
# Copyright (c) 2013 Mellanox Technologies, Inc.
# All rights reserved.
# Copyright (c) 2014-2019 Intel, Inc. All rights reserved.
# Copyright (c) 2014-2020 Intel, Inc. All rights reserved.
# Copyright (c) 2016 IBM Corporation. All rights reserved.
# Copyright (c) 2016-2018 Research Organization for Information Science
# and Technology (RIST). All rights reserved.
@ -44,7 +44,7 @@ m4_include([config/autogen_found_items.m4])
AC_INIT([pmix],
[m4_normalize(esyscmd([config/pmix_get_version.sh VERSION --tarball]))],
[http://pmix.github.io/master], [pmix])
[https://github.com/pmix/pmix/issues], [pmix])
AC_PREREQ(2.69)
AC_CONFIG_AUX_DIR(./config)
# Note that this directory must *exactly* match what was specified via
@ -94,7 +94,7 @@ pmix_show_title "Configuring PMIx"
AC_CANONICAL_TARGET
# Init automake
AM_INIT_AUTOMAKE([foreign dist-bzip2 subdir-objects no-define 1.13.4 -Wall -Werror])
AM_INIT_AUTOMAKE([foreign dist-bzip2 subdir-objects no-define 1.13.4])
# SILENT_RULES is new in AM 1.11, but we require 1.13.4 or higher via
# autogen. Limited testing shows that calling SILENT_RULES directly
@ -143,11 +143,11 @@ AH_TOP([/* -*- c -*-
#ifndef PMIX_CONFIG_H
#define PMIX_CONFIG_H
#include <src/include/pmix_config_top.h>
#include "src/include/pmix_config_top.h"
])
AH_BOTTOM([
#include <src/include/pmix_config_bottom.h>
#include "src/include/pmix_config_bottom.h"
#endif /* PMIX_CONFIG_H */
])
@ -231,6 +231,7 @@ AS_IF([test ! -z "$PMIX_CFLAGS_cache"], [CFLAGS="$CFLAGS $PMIX_CFLAGS_cache"])
#fi
# Cleanup duplicate flags
PMIX_FLAGS_UNIQ(CFLAGS)
PMIX_FLAGS_UNIQ(CPPFLAGS)
PMIX_FLAGS_UNIQ(LDFLAGS)
PMIX_FLAGS_UNIQ(LIBS)
@ -257,6 +258,43 @@ AC_MSG_RESULT([$LDFLAGS])
AC_MSG_CHECKING([final LIBS])
AC_MSG_RESULT([$LIBS])
####################################################################
# Setup variables for pkg-config file (maint/pmix.pc.in)
####################################################################
#
# Dependencies that themselves have a pkg-config file available.
#
PC_REQUIRES=""
AS_IF([test "$pmix_hwloc_support_will_build" = "yes"],
[PC_REQUIRES="$PC_REQUIRES hwloc"])
AS_IF([test $pmix_libevent_support -eq 1],
[PC_REQUIRES="$PC_REQUIRES libevent"])
AS_IF([test "$pmix_zlib_support" = "1"],
[PC_REQUIRES="$PC_REQUIRES zlib"])
AC_SUBST([PC_REQUIRES], ["$PC_REQUIRES"])
#
# Dependencies that don't have a pkg-config file available.
# In this case we need to manually add -L<path> and -l<lib>
# to the PC_PRIVATE_LIBS variable.
#
PC_PRIVATE_LIBS=""
AS_IF([test $pmix_libev_support -eq 1],
[PC_PRIVATE_LIBS="$PC_PRIVATE_LIBS $pmix_libev_LDFLAGS $pmix_libev_LIBS"])
AC_SUBST([PC_PRIVATE_LIBS], ["$PC_PRIVATE_LIBS"])
####################################################################
# -Werror for CI scripts
####################################################################
AC_ARG_ENABLE(werror,
AC_HELP_STRING([--enable-werror],
[Treat compiler warnings as errors]),
[
CFLAGS="$CFLAGS -Werror"
])
####################################################################
# Version information
####################################################################
@ -275,7 +313,8 @@ AC_SUBST([libmca_common_dstore_so_version])
AC_CONFIG_FILES(pmix_config_prefix[contrib/Makefile]
pmix_config_prefix[examples/Makefile]
pmix_config_prefix[test/Makefile]
pmix_config_prefix[test/simple/Makefile])
pmix_config_prefix[test/simple/Makefile]
pmix_config_prefix[maint/pmix.pc])
pmix_show_title "Configuration complete"

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

@ -14,7 +14,7 @@
# Copyright (c) 2010-2011 Oak Ridge National Labs. All rights reserved.
# Copyright (c) 2013-2016 Los Alamos National Security, Inc. All rights
# reserved.
# Copyright (c) 2013-2016 Intel, Inc. All rights reserved.
# Copyright (c) 2013-2020 Intel, Inc. All rights reserved.
# $COPYRIGHT$
#
# Additional copyrights may follow
@ -25,12 +25,13 @@
EXTRA_DIST = \
make_dist_tarball \
buildrpm.sh \
platform/optimized \
pmix_jenkins.sh \
pmix-release.sh \
pmix.spec \
update-my-copyright.pl \
whitespace-purge.sh
pmix_jenkins.sh \
pmix-release.sh \
pmix.spec \
update-my-copyright.pl \
whitespace-purge.sh \
make_manpage.pl \
platform/optimized
include perf_tools/Makefile.include

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

@ -264,7 +264,7 @@ make_tarball() {
#
echo "*** Running autogen $autogen_args..."
rm -f success
(./autogen.sh $autogen_args 2>&1 && touch success) | tee auto.out
(./autogen.pl $autogen_args 2>&1 && touch success) | tee auto.out
if test ! -f success; then
echo "Autogen failed. Aborting"
exit 1

56
opal/mca/pmix/pmix3x/pmix/contrib/make_manpage.pl Исполняемый файл
Просмотреть файл

@ -0,0 +1,56 @@
#!/usr/bin/env perl
#
# Copyright (c) 2015 Research Organization for Information Science
# and Technology (RIST). All rights reserved.
# Copyright (c) 2015 Cisco Systems, Inc. All rights reserved.
# Copyright (c) 2016-2019 Intel, Inc. All rights reserved.
# $COPYRIGHT$
#
# Subroutine to generate a bunch of Fortran declarations and symbols
#
use strict;
use Getopt::Long;
my $package_name;
my $package_version;
my $pmix_date;
my $input;
my $output;
my $help_arg = 0;
&Getopt::Long::Configure("bundling");
my $ok = Getopt::Long::GetOptions("package-name=s" => \$package_name,
"package-version=s" => \$package_version,
"pmix-date=s" => \$pmix_date,
"input=s" => \$input,
"output=s" => \$output);
if ($help_arg || !$ok ||
!defined($input) ||
!defined($output) ||
!defined($package_name) ||
!defined($package_version) ||
!defined($pmix_date)) {
print "Usage: $0 --package-name=<package name> --package-version=<package version> --pmix-date=<pmix date> --input=<input file> --output=<output file>\n";
exit(1 - $ok);
}
open(FILE, $input) ||
die "Can't open $input";
my $file;
$file .= $_
while(<FILE>);
close(FILE);
$file =~ s/#PACKAGE_NAME#/$package_name/g;
$file =~ s/#PACKAGE_VERSION#/$package_version/g;
$file =~ s/#PMIX_DATE#/$pmix_date/g;
open(FILE, ">$output") ||
die "Can't open $output";
print FILE $file;
close(FILE);
exit(0);

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

@ -192,7 +192,7 @@
Summary: An extended/exascale implementation of PMI
Name: %{?_name:%{_name}}%{!?_name:pmix}
Version: 3.1.5
Version: 3.2.1rc1
Release: 1%{?dist}
License: BSD
Group: Development/Libraries
@ -493,7 +493,7 @@ test "x$RPM_BUILD_ROOT" != "x" && rm -rf $RPM_BUILD_ROOT
%if !%{sysconfdir_in_prefix}
%{_sysconfdir}/*
%endif
# If %{install_in_opt}, then we're installing PMIx to
# If %%{install_in_opt}, then we're installing PMIx to
# /opt/pmix<version>. But be sure to also explicitly mention
# /opt/pmix so that it can be removed by RPM when everything under
# there is also removed.

14
opal/mca/pmix/pmix3x/pmix/contrib/pmix_jenkins.sh Исполняемый файл → Обычный файл
Просмотреть файл

@ -195,19 +195,13 @@ if [ "$jenkins_test_build" = "yes" ]; then
tar zxf libevent-2.0.22-stable.tar.gz
cd libevent-2.0.22-stable
libevent_dir=$PWD/install
./autogen.sh && ./configure --prefix=$libevent_dir && make && make install
./autogen.pl && ./configure --prefix=$libevent_dir && make && make install
cd $WORKSPACE
if [ -x "autogen.sh" ]; then
autogen_script=./autogen.sh
else
autogen_script=./autogen.pl
fi
configure_args="--with-libevent=$libevent_dir"
# build pmix
$autogen_script
./autogen.pl
echo ./configure --prefix=$pmix_dir $configure_args | bash -xeE
make $make_opt install
jenkins_build_passed=1
@ -270,7 +264,7 @@ if [ "$jenkins_test_src_rpm" = "yes" ]; then
# check distclean
make $make_opt distclean
$autogen_script
./autogen.pl
echo ./configure --prefix=$pmix_dir $configure_args | bash -xeE || exit 11
if [ -x /usr/bin/dpkg-buildpackage ]; then
@ -316,7 +310,7 @@ if [ -n "$JENKINS_RUN_TESTS" -a "$JENKINS_RUN_TESTS" -ne "0" ]; then
rm -rf $run_tap
# build pmix
$autogen_script
./autogen.pl
echo ./configure --prefix=$pmix_dir $configure_args --disable-visibility | bash -xeE
make $make_opt install

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

@ -9,8 +9,8 @@
# University of Stuttgart. All rights reserved.
# Copyright (c) 2004-2005 The Regents of the University of California.
# All rights reserved.
# Copyright (c) 2008 Cisco Systems, Inc. All rights reserved.
# Copyright (c) 2017 Intel, Inc. All rights reserved.
# Copyright (c) 2008-2020 Cisco Systems, Inc. All rights reserved.
# Copyright (c) 2019-2020 Intel, Inc. All rights reserved.
# $COPYRIGHT$
#
# Additional copyrights may follow
@ -18,39 +18,39 @@
# $HEADER$
#
pmix_config_files = pmix-mca-params.conf
pmix_file_from_platform = no
pmix_config_files = @PMIX_DEFAULT_MCA_PARAM_CONF@
pmix_file_from_platform = @PMIX_PARAM_FROM_PLATFORM@
EXTRA_DIST = $(pmix_config_files)
# Steal a little trickery from a generated Makefile to only install
# files if they do not already exist at the target. Be sure to read
# thread starting here
# (http://www.open-mpi.org/community/lists/devel/2008/06/4080.php) for
# (https://www.open-mpi.org/community/lists/devel/2008/06/4080.php) for
# details why the mkdir is in install-data-local.
install-data-local:
$(MKDIR_P) $(DESTDIR)$(sysconfdir)
@ p="$(pmix_config_files)"; \
if test "$(pmix_file_from_platform)" = "yes"; then \
if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
echo " $(INSTALL_DATA) $$d$$p $(DESTDIR)$(sysconfdir)/pmix-mca-params.conf"; \
$(INSTALL_DATA) $$d$$p $(DESTDIR)$(sysconfdir)/pmix-mca-params.conf; \
if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
echo " $(INSTALL_DATA) $$d$$p $(DESTDIR)$(sysconfdir)/pmix-mca-params.conf"; \
$(INSTALL_DATA) $$d$$p $(DESTDIR)$(sysconfdir)/pmix-mca-params.conf; \
else \
for file in $$p; do \
if test -f $(DESTDIR)$(sysconfdir)/pmix-mca-params.conf; then \
echo "******************************* WARNING ************************************"; \
echo "*** Not installing new $$file over existing file in:"; \
echo "*** $(DESTDIR)$(sysconfdir)/$$file"; \
echo "******************************* WARNING ************************************"; \
else \
if test -f "$$file"; then d=; else d="$(srcdir)/"; fi; \
f="`echo $$file | sed -e 's|^.*/||'`"; \
echo " $(INSTALL_DATA) $$d$$file $(DESTDIR)$(sysconfdir)/$$f"; \
$(INSTALL_DATA) $$d$$file $(DESTDIR)$(sysconfdir)/$$f; \
fi; \
done \
fi;
if test -f $(DESTDIR)$(sysconfdir)/pmix-mca-params.conf; then \
echo "******************************* WARNING ************************************"; \
echo "*** Not installing new $$file over existing file in:"; \
echo "*** $(DESTDIR)$(sysconfdir)/$$file"; \
echo "******************************* WARNING ************************************"; \
else \
if test -f "$$file"; then d=; else d="$(srcdir)/"; fi; \
f="`echo $$file | sed -e 's|^.*/||'`"; \
echo " $(INSTALL_DATA) $$d$$file $(DESTDIR)$(sysconfdir)/$$f"; \
$(INSTALL_DATA) $$d$$file $(DESTDIR)$(sysconfdir)/$$f; \
fi; \
done \
fi;
# Only remove if exactly the same as what in our tree
@ -61,7 +61,7 @@ uninstall-local:
@ p="$(pmix_config_files)"; \
for file in $$p; do \
if test -f "$(DESTDIR)$(sysconfdir)/$$file"; then \
if test -f "$$file"; then d=; else d="$(srcdir)/"; fi; \
if test -f "$$file"; then d=; else d="$(srcdir)/"; fi; \
if diff "$(DESTDIR)$(sysconfdir)/$$file" "$$d$$file" > /dev/null 2>&1 ; then \
echo "rm -f $(DESTDIR)$(sysconfdir)/$$file" ; \
rm -f "$(DESTDIR)$(sysconfdir)/$$file" ; \

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

@ -13,8 +13,9 @@
* 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-2019 Intel, Inc. All rights reserved.
* Copyright (c) 2013-2020 Intel, Inc. All rights reserved.
* Copyright (c) 2015 Mellanox Technologies, Inc. All rights reserved.
* Copyright (c) 2019 IBM Corporation. All rights reserved.
* $COPYRIGHT$
*
* Additional copyrights may follow
@ -153,8 +154,7 @@ int main(int argc, char **argv)
{
pmix_proc_t myproc;
int rc;
pmix_value_t value;
pmix_value_t *val = &value;
pmix_value_t *val = NULL;
pmix_proc_t proc;
uint32_t nprocs;
pmix_info_t *info;
@ -175,8 +175,7 @@ int main(int argc, char **argv)
/* get our universe size */
PMIX_PROC_CONSTRUCT(&proc);
(void)strncpy(proc.nspace, myproc.nspace, PMIX_MAX_NSLEN);
proc.rank = PMIX_RANK_WILDCARD;
PMIX_LOAD_PROCID(&proc, myproc.nspace, PMIX_RANK_WILDCARD);
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);
goto done;

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

@ -13,8 +13,9 @@
* 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-2019 Intel, Inc. All rights reserved.
* Copyright (c) 2013-2020 Intel, Inc. All rights reserved.
* Copyright (c) 2015 Mellanox Technologies, Inc. All rights reserved.
* Copyright (c) 2019 IBM Corporation. All rights reserved.
* $COPYRIGHT$
*
* Additional copyrights may follow
@ -124,7 +125,7 @@ int main(int argc, char **argv)
{
pmix_status_t rc;
pmix_value_t value;
pmix_value_t *val = &value;
pmix_value_t *val = NULL;
char *tmp;
pmix_proc_t proc;
uint32_t nprocs, n;
@ -168,8 +169,7 @@ int main(int argc, char **argv)
* wildcard rank as it doesn't relate to a specific rank. Setup
* a name to retrieve such values */
PMIX_PROC_CONSTRUCT(&proc);
(void)strncpy(proc.nspace, myproc.nspace, PMIX_MAX_NSLEN);
proc.rank = PMIX_RANK_WILDCARD;
PMIX_LOAD_PROCID(&proc, myproc.nspace, PMIX_RANK_WILDCARD);
/* check to see if we have been instructed to wait for a debugger
* to attach to us. We won't get both a stop-in-init AND a
@ -197,6 +197,8 @@ int main(int argc, char **argv)
/* wait for debugger release */
DEBUG_WAIT_THREAD(&myrel.lock);
DEBUG_DESTRUCT_MYREL(&myrel);
PMIX_VALUE_RELEASE(val);
}
/* get our universe size */
@ -205,6 +207,8 @@ int main(int argc, char **argv)
goto done;
}
fprintf(stderr, "Client %s:%d universe size %d\n", myproc.nspace, myproc.rank, val->data.uint32);
PMIX_VALUE_RELEASE(val);
/* get the number of procs in our job - univ size is the total number of allocated
* slots, not the number of procs in the job */
if (PMIX_SUCCESS != (rc = PMIx_Get(&proc, PMIX_JOB_SIZE, NULL, 0, &val))) {
@ -219,6 +223,7 @@ int main(int argc, char **argv)
if (0 > asprintf(&tmp, "%s-%d-internal", myproc.nspace, myproc.rank)) {
exit(1);
}
value.type = PMIX_UINT32;
value.data.uint32 = 1234;
if (PMIX_SUCCESS != (rc = PMIx_Store_internal(&myproc, tmp, &value))) {
@ -277,6 +282,7 @@ int main(int argc, char **argv)
}
if (PMIX_SUCCESS != (rc = PMIx_Get(&myproc, tmp, NULL, 0, &val))) {
fprintf(stderr, "Client ns %s rank %d: PMIx_Get %s failed: %d\n", myproc.nspace, myproc.rank, tmp, rc);
free(tmp);
goto done;
}
if (PMIX_UINT64 != val->type) {
@ -299,6 +305,7 @@ int main(int argc, char **argv)
}
if (PMIX_SUCCESS != (rc = PMIx_Get(&myproc, tmp, NULL, 0, &val))) {
fprintf(stderr, "Client ns %s rank %d: PMIx_Get %s failed: %d\n", myproc.nspace, myproc.rank, tmp, rc);
free(tmp);
goto done;
}
if (PMIX_STRING != val->type) {

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

@ -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-2019 Intel, Inc. All rights reserved.
* Copyright (c) 2013-2020 Intel, Inc. All rights reserved.
* Copyright (c) 2015 Mellanox Technologies, Inc. All rights reserved.
* $COPYRIGHT$
*
@ -116,8 +116,7 @@ int main(int argc, char **argv)
* wildcard rank as it doesn't relate to a specific rank. Setup
* a name to retrieve such values */
PMIX_PROC_CONSTRUCT(&proc);
(void)strncpy(proc.nspace, myproc.nspace, PMIX_MAX_NSLEN);
proc.rank = PMIX_RANK_WILDCARD;
PMIX_LOAD_PROCID(&proc, myproc.nspace, PMIX_RANK_WILDCARD);
/* get our job size */
if (PMIX_SUCCESS != (rc = PMIx_Get(&proc, PMIX_JOB_SIZE, NULL, 0, &val))) {

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

@ -41,7 +41,6 @@ typedef struct {
} myquery_data_t;
static volatile bool waiting_for_debugger = true;
static pmix_proc_t myproc;
/* this is a callback function for the PMIx_Query

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

@ -13,8 +13,9 @@
* 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-2019 Intel, Inc. All rights reserved.
* Copyright (c) 2013-2020 Intel, Inc. All rights reserved.
* Copyright (c) 2015 Mellanox Technologies, Inc. All rights reserved.
* Copyright (c) 2019 IBM Corporation. All rights reserved.
* $COPYRIGHT$
*
* Additional copyrights may follow
@ -23,8 +24,8 @@
*
*/
#include <src/include/pmix_config.h>
#include <pmix.h>
#include "src/include/pmix_config.h"
#include "../include/pmix.h"
#include <stdio.h>
#include <stdlib.h>
@ -38,13 +39,13 @@ int main(int argc, char **argv)
{
int rc;
pmix_value_t value;
pmix_value_t *val = &value;
pmix_value_t *val = NULL;
char *tmp;
pmix_proc_t proc;
uint32_t n, k, nlocal;
bool local, all_local;
bool local, all_local = false;
char **peers;
pmix_rank_t *locals;
pmix_rank_t *locals = NULL;
uint8_t j;
/* init us */
@ -55,8 +56,7 @@ int main(int argc, char **argv)
fprintf(stderr, "Client ns %s rank %d: Running\n", myproc.nspace, myproc.rank);
/* get our job size */
(void)strncpy(proc.nspace, myproc.nspace, PMIX_MAX_NSLEN);
proc.rank = PMIX_RANK_WILDCARD;
PMIX_LOAD_PROCID(&proc, myproc.nspace, 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));
@ -146,36 +146,54 @@ int main(int argc, char **argv)
}
}
if (local) {
(void)asprintf(&tmp, "%s-%d-local", myproc.nspace, n);
if( 0 > asprintf(&tmp, "%s-%d-local", myproc.nspace, n)) {
exit(1);
}
proc.rank = n;
if (PMIX_SUCCESS != (rc = PMIx_Get(&proc, tmp, NULL, 0, &val))) {
fprintf(stderr, "Client ns %s rank %d: PMIx_Get %s failed: %d\n", myproc.nspace, n, tmp, rc);
free(tmp);
goto done;
}
if (PMIX_UINT64 != val->type) {
fprintf(stderr, "%s:%d: PMIx_Get Key %s returned wrong type: %d\n", myproc.nspace, myproc.rank, tmp, val->type);
PMIX_VALUE_RELEASE(val);
free(tmp);
goto done;
}
if (1234 != val->data.uint64) {
fprintf(stderr, "%s:%d: PMIx_Get Key %s returned wrong value: %d\n", myproc.nspace, myproc.rank, tmp, (int)val->data.uint64);
PMIX_VALUE_RELEASE(val);
free(tmp);
goto done;
}
fprintf(stderr, "%s:%d Local value for %s:%d successfully retrieved\n", myproc.nspace, myproc.rank, proc.nspace, proc.rank);
PMIX_VALUE_RELEASE(val);
free(tmp);
} else {
(void)asprintf(&tmp, "%s-%d-remote", myproc.nspace, n);
if( 0 > asprintf(&tmp, "%s-%d-remote", myproc.nspace, n)) {
exit(1);
}
if (PMIX_SUCCESS != (rc = PMIx_Get(&proc, tmp, NULL, 0, &val))) {
fprintf(stderr, "Client ns %s rank %d: PMIx_Get %s failed: %d\n", myproc.nspace, n, tmp, rc);
free(tmp);
goto done;
}
if (PMIX_STRING != val->type) {
fprintf(stderr, "%s:%d: PMIx_Get Key %s returned wrong type: %d\n", myproc.nspace, myproc.rank, tmp, val->type);
PMIX_VALUE_RELEASE(val);
free(tmp);
goto done;
}
if (0 != strcmp(val->data.string, "1234")) {
fprintf(stderr, "%s:%d: PMIx_Get Key %s returned wrong value: %s\n", myproc.nspace, myproc.rank, tmp, val->data.string);
PMIX_VALUE_RELEASE(val);
free(tmp);
goto done;
}
fprintf(stderr, "%s:%d Remote value for %s:%d successfully retrieved\n", myproc.nspace, myproc.rank, proc.nspace, proc.rank);
PMIX_VALUE_RELEASE(val);
free(tmp);
}
/* if this isn't us, then get the ghex key */
if (n != myproc.rank) {
@ -185,13 +203,16 @@ int main(int argc, char **argv)
}
if (PMIX_BYTE_OBJECT != val->type) {
fprintf(stderr, "%s:%d: PMIx_Get ghex returned wrong type: %d\n", myproc.nspace, myproc.rank, val->type);
PMIX_VALUE_RELEASE(val);
goto done;
}
if (128 != val->data.bo.size) {
fprintf(stderr, "%s:%d: PMIx_Get ghex returned wrong size: %d\n", myproc.nspace, myproc.rank, (int)val->data.bo.size);
PMIX_VALUE_RELEASE(val);
goto done;
}
fprintf(stderr, "%s:%d Ghex for %s:%d successfully retrieved\n", myproc.nspace, myproc.rank, proc.nspace, proc.rank);
PMIX_VALUE_RELEASE(val);
}
}

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

@ -13,10 +13,11 @@
* 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-2019 Intel, Inc. All rights reserved.
* Copyright (c) 2013-2020 Intel, Inc. All rights reserved.
* Copyright (c) 2015 Mellanox Technologies, Inc. All rights reserved.
* Copyright (c) 2016 Research Organization for Information Science
* and Technology (RIST). All rights reserved.
* Copyright (c) 2019 IBM Corporation. All rights reserved.
* $COPYRIGHT$
*
* Additional copyrights may follow
@ -42,8 +43,7 @@ static pmix_proc_t myproc;
int main(int argc, char **argv)
{
int rc;
pmix_value_t value;
pmix_value_t *val = &value;
pmix_value_t *val = NULL;
pmix_proc_t proc;
uint32_t nprocs;
char nsp2[PMIX_MAX_NSLEN+1];
@ -66,8 +66,7 @@ int main(int argc, char **argv)
fprintf(stderr, "Client ns %s rank %d: Running\n", myproc.nspace, myproc.rank);
PMIX_PROC_CONSTRUCT(&proc);
(void)strncpy(proc.nspace, myproc.nspace, PMIX_MAX_NSLEN);
proc.rank = PMIX_RANK_WILDCARD;
PMIX_LOAD_PROCID(&proc, myproc.nspace, PMIX_RANK_WILDCARD);
/* get our job size */
if (PMIX_SUCCESS != (rc = PMIx_Get(&proc, PMIX_JOB_SIZE, NULL, 0, &val))) {
@ -79,8 +78,7 @@ int main(int argc, char **argv)
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);
proc.rank = PMIX_RANK_WILDCARD;
PMIX_LOAD_PROCID(&proc, myproc.nspace, PMIX_RANK_WILDCARD);
if (PMIX_SUCCESS != (rc = PMIx_Fence(&proc, 1, NULL, 0))) {
fprintf(stderr, "Client ns %s rank %d: PMIx_Fence failed: %d\n", myproc.nspace, myproc.rank, rc);
goto done;
@ -111,8 +109,7 @@ int main(int argc, char **argv)
/* get their universe size */
val = NULL;
(void)strncpy(proc.nspace, nsp2, PMIX_MAX_NSLEN);
proc.rank = PMIX_RANK_WILDCARD;
PMIX_LOAD_PROCID(&proc, nsp2, PMIX_RANK_WILDCARD);
if (PMIX_SUCCESS != (rc = PMIx_Get(&proc, PMIX_JOB_SIZE, NULL, 0, &val)) ||
NULL == val) {
fprintf(stderr, "Client ns %s rank %d: PMIx_Get job size failed: %d\n", myproc.nspace, myproc.rank, rc);
@ -124,7 +121,6 @@ int main(int argc, char **argv)
/* 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) {
@ -138,8 +134,7 @@ int main(int argc, char **argv)
done:
/* call fence to sync */
(void)strncpy(proc.nspace, myproc.nspace, PMIX_MAX_NSLEN);
proc.rank = PMIX_RANK_WILDCARD;
PMIX_LOAD_PROCID(&proc, myproc.nspace, PMIX_RANK_WILDCARD);
if (PMIX_SUCCESS != (rc = PMIx_Fence(&proc, 1, NULL, 0))) {
fprintf(stderr, "Client ns %s rank %d: PMIx_Fence failed: %d\n", myproc.nspace, myproc.rank, rc);
goto done;

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

@ -13,8 +13,11 @@
* 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-2019 Intel, Inc. All rights reserved.
* Copyright (c) 2013-2020 Intel, Inc. All rights reserved.
* Copyright (c) 2015 Mellanox Technologies, Inc. All rights reserved.
* Copyright (c) 2019 Triad National Security, LLC. All rights
* reserved.
* Copyright (c) 2019 IBM Corporation. All rights reserved.
* $COPYRIGHT$
*
* Additional copyrights may follow
@ -45,7 +48,7 @@ static void notification_fn(size_t evhdlr_registration_id,
{
myrel_t *lock;
bool found;
int exit_code;
int exit_code = 0;
size_t n;
pmix_proc_t *affected = NULL;
@ -109,8 +112,7 @@ static void evhandler_reg_callbk(pmix_status_t status,
int main(int argc, char **argv)
{
int rc;
pmix_value_t value;
pmix_value_t *val = &value;
pmix_value_t *val = NULL;
pmix_proc_t proc;
uint32_t nprocs;
pmix_info_t *info;
@ -126,8 +128,7 @@ int main(int argc, char **argv)
fprintf(stderr, "Client ns %s rank %d: Running\n", myproc.nspace, myproc.rank);
PMIX_PROC_CONSTRUCT(&proc);
(void)strncpy(proc.nspace, myproc.nspace, PMIX_MAX_NSLEN);
proc.rank = PMIX_RANK_WILDCARD;
PMIX_LOAD_PROCID(&proc, myproc.nspace, PMIX_RANK_WILDCARD);
/* get our universe size */
if (PMIX_SUCCESS != (rc = PMIx_Get(&proc, PMIX_UNIV_SIZE, NULL, 0, &val))) {
@ -161,8 +162,7 @@ int main(int argc, char **argv)
/* call fence to sync */
PMIX_PROC_CONSTRUCT(&proc);
(void)strncpy(proc.nspace, myproc.nspace, PMIX_MAX_NSLEN);
proc.rank = PMIX_RANK_WILDCARD;
PMIX_LOAD_PROCID(&proc, myproc.nspace, PMIX_RANK_WILDCARD);
if (PMIX_SUCCESS != (rc = PMIx_Fence(&proc, 1, NULL, 0))) {
fprintf(stderr, "Client ns %s rank %d: PMIx_Fence failed: %d\n", myproc.nspace, myproc.rank, rc);
goto done;

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

@ -13,8 +13,9 @@
* 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-2019 Intel, Inc. All rights reserved.
* Copyright (c) 2013-2020 Intel, Inc. All rights reserved.
* Copyright (c) 2015 Mellanox Technologies, Inc. All rights reserved.
* Copyright (c) 2019 IBM Corporation. All rights reserved.
* $COPYRIGHT$
*
* Additional copyrights may follow
@ -95,8 +96,7 @@ static void infocbfunc(pmix_status_t status,
int main(int argc, char **argv)
{
pmix_status_t rc;
pmix_value_t value;
pmix_value_t *val = &value;
pmix_value_t *val = NULL;
pmix_proc_t proc;
uint32_t nprocs, n;
pmix_info_t *info, *iptr;
@ -131,8 +131,7 @@ int main(int argc, char **argv)
* wildcard rank as it doesn't relate to a specific rank. Setup
* a name to retrieve such values */
PMIX_PROC_CONSTRUCT(&proc);
(void)strncpy(proc.nspace, myproc.nspace, PMIX_MAX_NSLEN);
proc.rank = PMIX_RANK_WILDCARD;
PMIX_LOAD_PROCID(&proc, myproc.nspace, PMIX_RANK_WILDCARD);
/* get our universe size */
if (PMIX_SUCCESS != (rc = PMIx_Get(&proc, PMIX_UNIV_SIZE, NULL, 0, &val))) {

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

@ -13,8 +13,9 @@
* 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-2020 Intel, Inc. All rights reserved.
* Copyright (c) 2015 Mellanox Technologies, Inc. All rights reserved.
* Copyright (c) 2019 IBM Corporation. All rights reserved.
* $COPYRIGHT$
*
* Additional copyrights may follow
@ -35,8 +36,7 @@ int main(int argc, char **argv)
{
pmix_proc_t myproc;
int rc;
pmix_value_t value;
pmix_value_t *val = &value;
pmix_value_t *val = NULL;
pmix_proc_t proc;
uint32_t nprocs;
pmix_info_t *info;
@ -51,8 +51,7 @@ int main(int argc, char **argv)
/* get our universe size */
PMIX_PROC_CONSTRUCT(&proc);
(void)strncpy(proc.nspace, myproc.nspace, PMIX_MAX_NSLEN);
proc.rank = PMIX_RANK_WILDCARD;
PMIX_LOAD_PROCID(&proc, myproc.nspace, PMIX_RANK_WILDCARD);
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);
goto done;

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

@ -13,8 +13,9 @@
* 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-2020 Intel, Inc. All rights reserved.
* Copyright (c) 2015 Mellanox Technologies, Inc. All rights reserved.
* Copyright (c) 2019 IBM Corporation. All rights reserved.
* $COPYRIGHT$
*
* Additional copyrights may follow
@ -35,8 +36,7 @@ int main(int argc, char **argv)
{
pmix_proc_t myproc;
int rc;
pmix_value_t value;
pmix_value_t *val = &value;
pmix_value_t *val = NULL;
pmix_proc_t proc;
uint32_t nprocs;
pmix_info_t *info;
@ -52,8 +52,7 @@ int main(int argc, char **argv)
/* get our universe size */
PMIX_PROC_CONSTRUCT(&proc);
(void)strncpy(proc.nspace, myproc.nspace, PMIX_MAX_NSLEN);
proc.rank = PMIX_RANK_WILDCARD;
PMIX_LOAD_PROCID(&proc, myproc.nspace, PMIX_RANK_WILDCARD);
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);
goto done;

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

@ -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-2020 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.
@ -25,10 +25,10 @@
*
*/
#include <src/include/pmix_config.h>
#include <pmix_server.h>
#include <src/include/types.h>
#include <src/include/pmix_globals.h>
#include "src/include/pmix_config.h"
#include "../include/pmix_server.h"
#include "src/include/types.h"
#include "src/include/pmix_globals.h"
#include <stdio.h>
#include <stdlib.h>
@ -42,8 +42,6 @@
#include <sys/stat.h>
#include <dirent.h>
#include PMIX_EVENT_HEADER
#include "src/class/pmix_list.h"
#include "src/util/pmix_environ.h"
#include "src/util/output.h"
@ -266,9 +264,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);
/* see if we were passed the number of procs to run or
* the executable to use */
@ -424,7 +422,7 @@ static void set_namespace(int nprocs, char *ranks, char *nspace,
char hostname[PMIX_MAXHOSTNAMELEN];
pmix_status_t rc;
myxfer_t myxfer;
size_t i;
size_t i = 0;
gethostname(hostname, sizeof(hostname));
@ -486,6 +484,7 @@ static void set_namespace(int nprocs, char *ranks, char *nspace,
PMIx_server_register_nspace(nspace, nprocs, x->info, x->ninfo,
cbfunc, x);
}
static void errhandler(size_t evhdlr_registration_id,
@ -871,7 +870,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;
}

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

@ -1,5 +1,5 @@
#
# Copyright (c) 2015-2018 Intel, Inc. All rights reserved.
# Copyright (c) 2015-2020 Intel, Inc. All rights reserved.
#
# $COPYRIGHT$
#
@ -15,7 +15,7 @@ include_HEADERS = \
pmix.h \
pmix_server.h \
pmix_tool.h \
pmix_extend.h
pmix_extend.h
if WANT_PMI_BACKWARD
include_HEADERS += \
@ -25,7 +25,6 @@ endif
nodist_include_HEADERS = \
pmix_common.h \
pmix_version.h \
pmix_rename.h
pmix_version.h
endif

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

@ -1,5 +1,5 @@
/*
* Copyright (c) 2013-2018 Intel, Inc. All rights reserved.
* Copyright (c) 2013-2020 Intel, Inc. All rights reserved.
* Copyright (c) 2016 Research Organization for Information Science
* and Technology (RIST). All rights reserved.
*
@ -394,7 +394,8 @@ PMIX_EXPORT pmix_status_t PMIx_Disconnect_nb(const pmix_proc_t ranges[], size_t
* for releasing the array when done with it - the PMIX_PROC_FREE macro is
* provided for this purpose.
*/
PMIX_EXPORT pmix_status_t PMIx_Resolve_peers(const char *nodename, const pmix_nspace_t nspace,
PMIX_EXPORT pmix_status_t PMIx_Resolve_peers(const char *nodename,
const pmix_nspace_t nspace,
pmix_proc_t **procs, size_t *nprocs);
@ -575,7 +576,6 @@ PMIX_EXPORT pmix_status_t PMIx_Process_monitor_nb(const pmix_info_t *monitor, pm
PMIX_EXPORT pmix_status_t PMIx_Get_credential(const pmix_info_t info[], size_t ninfo,
pmix_credential_cbfunc_t cbfunc, void *cbdata);
/* Request validation of a credential by the PMIx server/SMS
* Input values include:
*
@ -696,7 +696,7 @@ PMIX_EXPORT pmix_status_t PMIx_IOF_deregister(size_t iofhdlr,
pmix_op_cbfunc_t cbfunc, void *cbdata);
/* Push data collected locally (typically from stdin) to
* target recipients.
* stdin of target recipients.
*
* targets - array of process identifiers to which the data is to be delivered. Note
* that a WILDCARD rank indicates that all procs in the given nspace are
@ -714,7 +714,7 @@ PMIX_EXPORT pmix_status_t PMIx_IOF_deregister(size_t iofhdlr,
*
* bo - pointer to a byte object containing the stdin data
*
* cbfunc - callback function when the data has been forwarded
* cbfunc - callback function when the data has been forwarded.
*
* cbdata - object to be returned in cbfunc
*/
@ -723,6 +723,10 @@ PMIX_EXPORT pmix_status_t PMIx_IOF_push(const pmix_proc_t targets[], size_t ntar
const pmix_info_t directives[], size_t ndirs,
pmix_op_cbfunc_t cbfunc, void *cbdata);
/****************************************/
/**** COMMON SUPPORT FUNCTIONS ****/
/* Found in pmix_common.h.in in the v3.x and earlier series */
/****************************************/
#if defined(c_plusplus) || defined(__cplusplus)
}

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

@ -1,10 +1,10 @@
/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil -*- */
/*
* Copyright (c) 2013-2019 Intel, Inc. All rights reserved.
* Copyright (c) 2016-2018 Research Organization for Information Science
* and Technology (RIST). All rights reserved.
* Copyright (c) 2016 IBM Corporation. All rights reserved.
* Copyright (c) 2016-2018 Mellanox Technologies, Inc.
* Copyright (c) 2013-2020 Intel, Inc. All rights reserved.
* Copyright (c) 2016-2019 Research Organization for Information Science
* and Technology (RIST). All rights reserved.
* Copyright (c) 2016-2020 IBM Corporation. All rights reserved.
* Copyright (c) 2016-2019 Mellanox Technologies, Inc.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@ -71,7 +71,6 @@
#endif
#include <pmix_rename.h>
#include <pmix_version.h>
#if defined(c_plusplus) || defined(__cplusplus)
@ -139,17 +138,20 @@ typedef uint32_t pmix_rank_t;
#define PMIX_ATTR_UNDEF NULL
/* initialization attributes */
#define PMIX_EVENT_BASE "pmix.evbase" // (struct event_base *) pointer to libevent event_base to use in place
// of the internal progress thread
#define PMIX_SERVER_TOOL_SUPPORT "pmix.srvr.tool" // (bool) The host RM wants to declare itself as willing to
// accept tool connection requests
#define PMIX_SERVER_REMOTE_CONNECTIONS "pmix.srvr.remote" // (bool) Allow connections from remote tools (do not use loopback device)
#define PMIX_SERVER_SYSTEM_SUPPORT "pmix.srvr.sys" // (bool) The host RM wants to declare itself as being the local
// system server for PMIx connection requests
#define PMIX_EVENT_BASE "pmix.evbase" // (struct event_base *) pointer to libevent event_base
// to use in place of the internal progress thread
#define PMIX_SERVER_TOOL_SUPPORT "pmix.srvr.tool" // (bool) The host RM wants to declare itself as willing
// to accept tool connection requests
#define PMIX_SERVER_REMOTE_CONNECTIONS "pmix.srvr.remote" // (bool) Allow connections from remote tools (do not use
// loopback device)
#define PMIX_SERVER_SYSTEM_SUPPORT "pmix.srvr.sys" // (bool) The host RM wants to declare itself as being
// the local system server for PMIx connection
// requests
#define PMIX_SERVER_TMPDIR "pmix.srvr.tmpdir" // (char*) temp directory where PMIx server will place
// client rendezvous points and contact info
#define PMIX_SYSTEM_TMPDIR "pmix.sys.tmpdir" // (char*) temp directory for this system, where PMIx
// server will place tool rendezvous points and contact info
// server will place tool rendezvous points and
// contact info
#define PMIX_SERVER_ENABLE_MONITORING "pmix.srv.monitor" // (bool) Enable PMIx internal monitoring by server
#define PMIX_SERVER_NSPACE "pmix.srv.nspace" // (char*) Name of the nspace to use for this server
#define PMIX_SERVER_RANK "pmix.srv.rank" // (pmix_rank_t) Rank of this server
@ -253,9 +255,11 @@ typedef uint32_t pmix_rank_t;
#define PMIX_ALLOCATED_NODELIST "pmix.alist" // (char*) comma-delimited list of all nodes in this allocation regardless of
// whether or not they currently host procs.
#define PMIX_HOSTNAME "pmix.hname" // (char*) name of the host the specified proc is on
#define PMIX_HOSTNAME_ALIASES "pmix.alias" // (char*) comma-delimited list of names by which this node is known
#define PMIX_HOSTNAME_KEEP_FQDN "pmix.fqdn" // (bool) FQDN hostnames are being retained
#define PMIX_NODEID "pmix.nodeid" // (uint32_t) node identifier where the specified proc is located
#define PMIX_LOCAL_PEERS "pmix.lpeers" // (char*) comma-delimited string of ranks on this node within the specified nspace
#define PMIX_LOCAL_PROCS "pmix.lprocs" // (pmix_proc_t array) array of pmix_proc_t of procs on the specified node
#define PMIX_LOCAL_PROCS "pmix.lprocs" // (pmix_data_array_t*) array of pmix_proc_t of procs on the specified node
#define PMIX_LOCAL_CPUSETS "pmix.lcpus" // (char*) colon-delimited cpusets of local peers within the specified nspace
#define PMIX_PROC_URI "pmix.puri" // (char*) URI containing contact info for proc
#define PMIX_LOCALITY "pmix.loc" // (uint16_t) relative locality of two procs
@ -263,7 +267,6 @@ typedef uint32_t pmix_rank_t;
// to launch this proc's application
#define PMIX_EXIT_CODE "pmix.exit.code" // (int) exit code returned when proc terminated
/* size info */
#define PMIX_UNIV_SIZE "pmix.univ.size" // (uint32_t) #procs in this nspace
#define PMIX_JOB_SIZE "pmix.job.size" // (uint32_t) #procs in this job
@ -320,10 +323,12 @@ typedef uint32_t pmix_rank_t;
// specified operation
#define PMIX_JOB_TERM_STATUS "pmix.job.term.status" // (pmix_status_t) status returned upon job termination
#define PMIX_PROC_STATE_STATUS "pmix.proc.state" // (pmix_proc_state_t) process state
#define PMIX_GET_REFRESH_CACHE "pmix.get.refresh" // (bool) when retrieving data for a remote process, refresh the existing
// local data cache for the process in case new values have been
// put and committed by it since the last refresh
/* attributes used by host server to pass data to the server convenience library - the
* data will then be parsed and provided to the local clients */
/* attributes used by host server to pass data to/from the server convenience library - the
* data will then be parsed and provided to the local clients. Not generally accessible by users */
#define PMIX_REGISTER_NODATA "pmix.reg.nodata" // (bool) Registration is for nspace only, do not copy job data
#define PMIX_PROC_DATA "pmix.pdata" // (pmix_data_array_t*) starts with rank, then contains more data
#define PMIX_NODE_MAP "pmix.nmap" // (char*) regex of nodes containing procs for this job
@ -331,6 +336,7 @@ typedef uint32_t pmix_rank_t;
#define PMIX_ANL_MAP "pmix.anlmap" // (char*) process mapping in ANL notation (used in PMI-1/PMI-2)
#define PMIX_APP_MAP_TYPE "pmix.apmap.type" // (char*) type of mapping used to layout the application (e.g., cyclic)
#define PMIX_APP_MAP_REGEX "pmix.apmap.regex" // (char*) regex describing the result of the mapping
#define PMIX_REQUIRED_KEY "pmix.req.key" // (char*) key the user needs prior to responding from a dmodex request
/* attributes used internally to communicate data from the server to the client */
@ -400,7 +406,8 @@ typedef uint32_t pmix_rank_t;
#define PMIX_TAG_OUTPUT "pmix.tagout" // (bool) tag application output with the ID of the source
#define PMIX_TIMESTAMP_OUTPUT "pmix.tsout" // (bool) timestamp output from applications
#define PMIX_MERGE_STDERR_STDOUT "pmix.mergeerrout" // (bool) merge stdout and stderr streams from application procs
#define PMIX_OUTPUT_TO_FILE "pmix.outfile" // (char*) output application output to given file
#define PMIX_OUTPUT_TO_FILE "pmix.outfile" // (char*) direct application output into files of form
// "<filename>.rank" with both stdout and stderr redirected into it
#define PMIX_INDEX_ARGV "pmix.indxargv" // (bool) mark the argv with the rank of the proc
#define PMIX_CPUS_PER_PROC "pmix.cpuperproc" // (uint32_t) #cpus to assign to each rank
#define PMIX_NO_PROCS_ON_HEAD "pmix.nolocal" // (bool) do not place procs on the head node
@ -426,27 +433,36 @@ typedef uint32_t pmix_rank_t;
#define PMIX_QUERY_NAMESPACE_INFO "pmix.qry.nsinfo" // (pmix_data_array_t) request an array of active nspace information - each
// element will contain an array including the namespace plus the
// command line of the application executing within it
#define PMIX_QUERY_JOB_STATUS "pmix.qry.jst" // (pmix_status_t) status of a specified currently executing job
#define PMIX_QUERY_QUEUE_LIST "pmix.qry.qlst" // (char*) request a comma-delimited list of scheduler queues
#define PMIX_QUERY_QUEUE_STATUS "pmix.qry.qst" // (TBD) status of a specified scheduler queue
#define PMIX_QUERY_PROC_TABLE "pmix.qry.ptable" // (char*) input nspace of job whose info is being requested
// returns (pmix_data_array_t*) an array of pmix_proc_info_t
#define PMIX_QUERY_LOCAL_PROC_TABLE "pmix.qry.lptable" // (char*) input nspace of job whose info is being requested
// returns (pmix_data_array_t*) an array of pmix_proc_info_t for
// procs in job on same node
#define PMIX_QUERY_AUTHORIZATIONS "pmix.qry.auths" // (bool) return operations tool is authorized to perform
#define PMIX_QUERY_SPAWN_SUPPORT "pmix.qry.spawn" // (bool) return a comma-delimited list of supported spawn attributes
#define PMIX_QUERY_DEBUG_SUPPORT "pmix.qry.debug" // (bool) return a comma-delimited list of supported debug attributes
#define PMIX_QUERY_MEMORY_USAGE "pmix.qry.mem" // (bool) return info on memory usage for the procs indicated in the qualifiers
#define PMIX_QUERY_JOB_STATUS "pmix.qry.jst" // (pmix_status_t) returns status of a specified currently executing job
// REQUIRES a PMIX_NSPACE qualifier indicating the nspace being queried
#define PMIX_QUERY_QUEUE_LIST "pmix.qry.qlst" // (char*) request a comma-delimited list of scheduler queues. NO QUALIFIERS
#define PMIX_QUERY_QUEUE_STATUS "pmix.qry.qst" // (pmix_data_array_t*) returns array where each element contains the name and
// status of a scheduler queue
// SUPPORTED QUALIFIERS: PMIX_ALLOC_QUEUE naming specific queue whose status
// is being requested
#define PMIX_QUERY_PROC_TABLE "pmix.qry.ptable" // (pmix_data_array_t*) returns (pmix_data_array_t*) an array of pmix_proc_info_t
// REQUIRES a PMIX_NSPACE qualifier indicating the nspace being queried
#define PMIX_QUERY_LOCAL_PROC_TABLE "pmix.qry.lptable" // (pmix_data_array_t*) returns (pmix_data_array_t*) an array of pmix_proc_info_t
// of pmix_proc_info_t for procs in job on same node
// REQUIRES a PMIX_NSPACE qualifier indicating the nspace being queried
#define PMIX_QUERY_AUTHORIZATIONS "pmix.qry.auths" // (pmix_data_array_t*) return operations tool is authorized to perform. The contents
// of the array elements have not yet been standardized. NO QUALIFIERS
#define PMIX_QUERY_SPAWN_SUPPORT "pmix.qry.spawn" // (char*) return a comma-delimited list of supported spawn attributes. NO QUALIFIERS
#define PMIX_QUERY_DEBUG_SUPPORT "pmix.qry.debug" // (char*) return a comma-delimited list of supported debug attributes. NO QUALIFIERS
#define PMIX_QUERY_MEMORY_USAGE "pmix.qry.mem" // (pmix_data_array_t*) return info on memory usage for the procs indicated in the qualifiers
// SUPPORTED QUALIFIERS: PMIX_NSPACE/PMIX_RANK, or PMIX_PROCID of specific proc(s)
// whose info is being requested
#define PMIX_QUERY_LOCAL_ONLY "pmix.qry.local" // (bool) constrain the query to local information only
#define PMIX_QUERY_REPORT_AVG "pmix.qry.avg" // (bool) report average values
#define PMIX_QUERY_REPORT_MINMAX "pmix.qry.minmax" // (bool) report minimum and maximum value
#define PMIX_QUERY_ALLOC_STATUS "pmix.query.alloc" // (char*) string identifier of the allocation whose status
// is being requested
#define PMIX_TIME_REMAINING "pmix.time.remaining" // (char*) query number of seconds (uint32_t) remaining in allocation
// for the specified nspace
#define PMIX_QUERY_ALLOC_STATUS "pmix.query.alloc" // (char*) return a string reporting status of an allocation request
// REQUIRES a PMIX_ALLOC_ID qualifier indicating the allocation request being queried
#define PMIX_TIME_REMAINING "pmix.time.remaining" // (uint32_t) returns number of seconds remaining in allocation
// for the specified nspace (defaults to allocation containing the caller)
// SUPPORTED QUALIFIERS: PMIX_NSPACE of the nspace whose info is being requested
/* information retrieval attributes */
/* PMIx_Get information retrieval attributes */
#define PMIX_SESSION_INFO "pmix.ssn.info" // (bool) Return information about the specified session. If information
// about a session other than the one containing the requesting
// process is desired, then the attribute array must contain a
@ -471,24 +487,26 @@ typedef uint32_t pmix_rank_t;
// then the attribute array must contain either the PMIX_NODEID or
// PMIX_HOSTNAME attribute identifying the desired target.
/* information storage attributes */
#define PMIX_SESSION_INFO_ARRAY "pmix.ssn.arr" // (pmix_data_array_t) Provide an array of pmix_info_t containing
#define PMIX_SESSION_INFO_ARRAY "pmix.ssn.arr" // (pmix_data_array_t*) Provide an array of pmix_info_t containing
// session-level information. The PMIX_SESSION_ID attribute is required
// to be included in the array.
#define PMIX_JOB_INFO_ARRAY "pmix.job.arr" // (pmix_data_array_t) Provide an array of pmix_info_t containing job-level
#define PMIX_JOB_INFO_ARRAY "pmix.job.arr" // (pmix_data_array_t*) Provide an array of pmix_info_t containing job-level
// information. Information is registered one job (aka namespace) at a time
// via the PMIx_server_register_nspace API. Thus, there is no requirement that
// the array contain either the PMIX_NSPACE or PMIX_JOBID attributes, though
// either or both of them may be included.
#define PMIX_APP_INFO_ARRAY "pmix.app.arr" // (pmix_data_array_t) Provide an array of pmix_info_t containing app-level
#define PMIX_APP_INFO_ARRAY "pmix.app.arr" // (pmix_data_array_t*) Provide an array of pmix_info_t containing app-level
// information. The PMIX_NSPACE or PMIX_JOBID attributes of the job containing
// the appplication, plus its PMIX_APPNUM attribute, are required to be
// included in the array.
#define PMIX_NODE_INFO_ARRAY "pmix.node.arr" // (pmix_data_array_t) Provide an array of pmix_info_t containing node-level
#define PMIX_NODE_INFO_ARRAY "pmix.node.arr" // (pmix_data_array_t*) Provide an array of pmix_info_t containing node-level
// information. At a minimum, either the PMIX_NODEID or PMIX_HOSTNAME
// attribute is required to be included in the array, though both may be
// included.
/* log attributes */
#define PMIX_LOG_SOURCE "pmix.log.source" // (pmix_proc_t*) ID of source of the log request
#define PMIX_LOG_STDERR "pmix.log.stderr" // (char*) log string to stderr
@ -516,7 +534,7 @@ typedef uint32_t pmix_rank_t;
#define PMIX_LOG_EMAIL_SERVER "pmix.log.esrvr" // (char*) hostname (or IP addr) of estmp server
#define PMIX_LOG_EMAIL_SRVR_PORT "pmix.log.esrvrprt" // (int32_t) port the email server is listening to
#define PMIX_LOG_GLOBAL_DATASTORE "pmix.log.gstore" // (bool)
#define PMIX_LOG_GLOBAL_DATASTORE "pmix.log.gstore" // (bool) log the provided data to a global datastore
#define PMIX_LOG_JOB_RECORD "pmix.log.jrec" // (bool) log the provided information to the RM's job record
@ -531,7 +549,6 @@ typedef uint32_t pmix_rank_t;
#define PMIX_DEBUG_JOB_DIRECTIVES "pmix.dbg.jdirs" // (pmix_data_array_t*) array of job-level directives
#define PMIX_DEBUG_APP_DIRECTIVES "pmix.dbg.adirs" // (pmix_data_array_t*) array of app-level directives
/* Resource Manager identification */
#define PMIX_RM_NAME "pmix.rm.name" // (char*) string name of the resource manager
#define PMIX_RM_VERSION "pmix.rm.version" // (char*) RM version string
@ -549,8 +566,9 @@ typedef uint32_t pmix_rank_t;
// creating the envar if it doesn't already exist
/* attributes relating to allocations */
#define PMIX_ALLOC_ID "pmix.alloc.id" // (char*) provide a string identifier for this allocation request
// which can later be used to query status of the request
#define PMIX_ALLOC_ID "pmix.alloc.id" // (char*) A string identifier (provided by the host environment) for
// the resulting allocation which can later be used to reference
// the allocated resources in, for example, a call to PMIx_Spawn
#define PMIX_ALLOC_NUM_NODES "pmix.alloc.nnodes" // (uint64_t) number of nodes
#define PMIX_ALLOC_NODE_LIST "pmix.alloc.nlist" // (char*) regex of specific nodes
#define PMIX_ALLOC_NUM_CPUS "pmix.alloc.ncpus" // (uint64_t) number of cpus
@ -605,7 +623,7 @@ typedef uint32_t pmix_rank_t;
#define PMIX_JOB_CTRL_CHECKPOINT_EVENT "pmix.jctrl.ckptev" // (bool) use event notification to trigger process checkpoint
#define PMIX_JOB_CTRL_CHECKPOINT_SIGNAL "pmix.jctrl.ckptsig" // (int) use the given signal to trigger process checkpoint
#define PMIX_JOB_CTRL_CHECKPOINT_TIMEOUT "pmix.jctrl.ckptsig" // (int) time in seconds to wait for checkpoint to complete
#define PMIX_JOB_CTRL_CHECKPOINT_METHOD "pmix.jctrl.ckmethod" // (pmix_data_array_t) array of pmix_info_t declaring each
#define PMIX_JOB_CTRL_CHECKPOINT_METHOD "pmix.jctrl.ckmethod" // (pmix_data_array_t*) array of pmix_info_t declaring each
// method and value supported by this application
#define PMIX_JOB_CTRL_SIGNAL "pmix.jctrl.sig" // (int) send given signal to specified processes
#define PMIX_JOB_CTRL_PROVISION "pmix.jctrl.pvn" // (char*) regex identifying nodes that are to be provisioned
@ -631,8 +649,8 @@ typedef uint32_t pmix_rank_t;
// monitoring for this process)
#define PMIX_MONITOR_APP_CONTROL "pmix.monitor.appctrl" // (bool) the application desires to control the response to
// a monitoring event
#define PMIX_MONITOR_HEARTBEAT "pmix.monitor.mbeat" // (void) register to have the server monitor the requestor for heartbeats
#define PMIX_SEND_HEARTBEAT "pmix.monitor.beat" // (void) send heartbeat to local server
#define PMIX_MONITOR_HEARTBEAT "pmix.monitor.mbeat" // (bool) register to have the server monitor the requestor for heartbeats
#define PMIX_SEND_HEARTBEAT "pmix.monitor.beat" // (bool) send heartbeat to local server
#define PMIX_MONITOR_HEARTBEAT_TIME "pmix.monitor.btime" // (uint32_t) time in seconds before declaring heartbeat missed
#define PMIX_MONITOR_HEARTBEAT_DROPS "pmix.monitor.bdrop" // (uint32_t) number of heartbeats that can be missed before
// generating the event
@ -907,6 +925,7 @@ typedef uint16_t pmix_data_type_t;
// Hole left by deprecation/removal of PMIX_INFO_ARRAY
#define PMIX_IOF_CHANNEL 45
#define PMIX_ENVAR 46
#define PMIX_REGEX 49 // numerical ID matches v4
/********************/
/* define a boundary for implementers so they can add their own data types */
@ -1477,6 +1496,8 @@ typedef struct pmix_value {
} \
} while(0)
#if 0
// This macro is no longer supported in the v3.2 and later series
#define PMIX_VALUE_COMPRESSED_STRING_UNPACK(s) \
do { \
char *tmp; \
@ -1496,6 +1517,7 @@ typedef struct pmix_value {
} \
} \
} while(0)
#endif
/**** PMIX INFO STRUCT ****/
typedef struct pmix_info {
@ -1830,7 +1852,6 @@ typedef struct pmix_query {
*
* @param argv Pointer to an argv array.
* @param str Pointer to the string to append.
* @param bool Whether or not to overwrite a matching value if found
*
* @retval PMIX_SUCCESS On success
* @retval PMIX_ERROR On failure
@ -1866,7 +1887,7 @@ typedef struct pmix_query {
* @retval argv pointer to new argv array on success
* @retval NULL on error
*
* All strings are insertted into the argv array by value; the
* All strings are inserted into the argv array by value; the
* newly-allocated array makes no references to the src_string
* argument (i.e., it can be freed after calling this function
* without invalidating the output argv).
@ -2160,8 +2181,9 @@ typedef void (*pmix_validation_cbfunc_t)(pmix_status_t status,
pmix_info_t info[], size_t ninfo,
void *cbdata);
/**** COMMON SUPPORT FUNCTIONS ****/
/* Note that these are moved to pmix.h in the v4.x series and later */
/****** EVENT NOTIFICATION SUPPORT ******/
/* Register an event handler to report events. Three types of events
* can be reported:
*
@ -2194,6 +2216,10 @@ typedef void (*pmix_validation_cbfunc_t)(pmix_status_t status,
* deregistering the current evhdlr, and then registering it
* using a new set of info values.
*
* If cbfunc is NULL, then this is treated as a BLOCKING call - a positive
* return value represents the reference ID for the request, while
* negative values indicate the corresponding error
*
* See pmix_common.h for a description of the notification function */
PMIX_EXPORT void PMIx_Register_event_handler(pmix_status_t codes[], size_t ncodes,
pmix_info_t info[], size_t ninfo,
@ -2246,6 +2272,9 @@ PMIX_EXPORT void PMIx_Deregister_event_handler(size_t evhdlr_ref,
* will have been queued, but may not have been transmitted
* by this time. Note that the caller is required to maintain
* the input data until the callback function has been executed!
* If cbfunc is NULL, then this is treated as a BLOCKING call and
* the result of the operation is provided in the returned
* status
*
* cbdata - the caller's provided void* object
*/
@ -2255,6 +2284,8 @@ PMIX_EXPORT pmix_status_t PMIx_Notify_event(pmix_status_t status,
const pmix_info_t info[], size_t ninfo,
pmix_op_cbfunc_t cbfunc, void *cbdata);
/****** PRETTY-PRINT DEFINED VALUE TYPES ******/
/* Provide a string representation for several types of value. Note
* that the provided string is statically defined and must NOT be
* free'd. Supported value types:
@ -2288,6 +2319,8 @@ PMIX_EXPORT const char* PMIx_Get_version(void);
PMIX_EXPORT pmix_status_t PMIx_Store_internal(const pmix_proc_t *proc,
const pmix_key_t key, pmix_value_t *val);
/****** DATA BUFFER PACK/UNPACK SUPPORT ******/
/**
* Top-level interface function to pack one or more values into a
* buffer.
@ -2516,6 +2549,7 @@ PMIX_EXPORT pmix_status_t PMIx_Data_copy_payload(pmix_data_buffer_t *dest,
pmix_data_buffer_t *src);
/******** STANDARD MACROS FOR DARRAY AND VALUE SUPPORT ********/
static inline void pmix_darray_destruct(pmix_data_array_t *m);
static inline void pmix_value_destruct(pmix_value_t * m)
@ -2690,7 +2724,9 @@ static inline void pmix_darray_destruct(pmix_data_array_t *m)
* @param len Size of the dest array - 1
*
*/
static inline void pmix_strncpy(char *dest, const char *src, size_t len)
static inline void pmix_strncpy(char *dest,
const char *src,
size_t len)
{
size_t i, k;
char *new_dest = dest;

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

@ -1,9 +1,9 @@
/*
* Copyright (c) 2013-2019 Intel, Inc. All rights reserved.
* Copyright (c) 2013-2020 Intel, Inc. All rights reserved.
* Copyright (c) 2015 Artem Y. Polyakov <artpol84@gmail.com>.
* All rights reserved.
* Copyright (c) 2015 Research Organization for Information Science
* and Technology (RIST). All rights reserved.
* Copyright (c) 2015-2019 Research Organization for Information Science
* and Technology (RIST). All rights reserved.
* $COPYRIGHT$
*
* Redistribution and use in source and binary forms, with or without

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

@ -1,618 +0,0 @@
#define PMI2_Abort @PMIX_RENAME@PMI2_Abort
#define PMI2_Finalize @PMIX_RENAME@PMI2_Finalize
#define PMI2_Info_GetJobAttr @PMIX_RENAME@PMI2_Info_GetJobAttr
#define PMI2_Info_GetJobAttrIntArray @PMIX_RENAME@PMI2_Info_GetJobAttrIntArray
#define PMI2_Info_GetNodeAttr @PMIX_RENAME@PMI2_Info_GetNodeAttr
#define PMI2_Info_GetNodeAttrIntArray @PMIX_RENAME@PMI2_Info_GetNodeAttrIntArray
#define PMI2_Info_GetSize @PMIX_RENAME@PMI2_Info_GetSize
#define PMI2_Info_PutNodeAttr @PMIX_RENAME@PMI2_Info_PutNodeAttr
#define PMI2_Init @PMIX_RENAME@PMI2_Init
#define PMI2_Initialized @PMIX_RENAME@PMI2_Initialized
#define PMI2_Job_Connect @PMIX_RENAME@PMI2_Job_Connect
#define PMI2_Job_Disconnect @PMIX_RENAME@PMI2_Job_Disconnect
#define PMI2_Job_GetId @PMIX_RENAME@PMI2_Job_GetId
#define PMI2_Job_GetRank @PMIX_RENAME@PMI2_Job_GetRank
#define PMI2_Job_Spawn @PMIX_RENAME@PMI2_Job_Spawn
#define PMI2_KVS_Fence @PMIX_RENAME@PMI2_KVS_Fence
#define PMI2_KVS_Get @PMIX_RENAME@PMI2_KVS_Get
#define PMI2_KVS_Put @PMIX_RENAME@PMI2_KVS_Put
#define PMI2_Nameserv_lookup @PMIX_RENAME@PMI2_Nameserv_lookup
#define PMI2_Nameserv_publish @PMIX_RENAME@PMI2_Nameserv_publish
#define PMI2_Nameserv_unpublish @PMIX_RENAME@PMI2_Nameserv_unpublish
#define PMI_Abort @PMIX_RENAME@PMI_Abort
#define PMI_Args_to_keyval @PMIX_RENAME@PMI_Args_to_keyval
#define PMI_Barrier @PMIX_RENAME@PMI_Barrier
#define PMI_Finalize @PMIX_RENAME@PMI_Finalize
#define PMI_Free_keyvals @PMIX_RENAME@PMI_Free_keyvals
#define PMI_Get_appnum @PMIX_RENAME@PMI_Get_appnum
#define PMI_Get_clique_ranks @PMIX_RENAME@PMI_Get_clique_ranks
#define PMI_Get_clique_size @PMIX_RENAME@PMI_Get_clique_size
#define PMI_Get_id @PMIX_RENAME@PMI_Get_id
#define PMI_Get_id_length_max @PMIX_RENAME@PMI_Get_id_length_max
#define PMI_Get_kvs_domain_id @PMIX_RENAME@PMI_Get_kvs_domain_id
#define PMI_Get_options @PMIX_RENAME@PMI_Get_options
#define PMI_Get_rank @PMIX_RENAME@PMI_Get_rank
#define PMI_Get_size @PMIX_RENAME@PMI_Get_size
#define PMI_Get_universe_size @PMIX_RENAME@PMI_Get_universe_size
#define PMI_Init @PMIX_RENAME@PMI_Init
#define PMI_Initialized @PMIX_RENAME@PMI_Initialized
#define PMI_KVS_Commit @PMIX_RENAME@PMI_KVS_Commit
#define PMI_KVS_Create @PMIX_RENAME@PMI_KVS_Create
#define PMI_KVS_Destroy @PMIX_RENAME@PMI_KVS_Destroy
#define PMI_KVS_Get @PMIX_RENAME@PMI_KVS_Get
#define PMI_KVS_Get_key_length_max @PMIX_RENAME@PMI_KVS_Get_key_length_max
#define PMI_KVS_Get_my_name @PMIX_RENAME@PMI_KVS_Get_my_name
#define PMI_KVS_Get_name_length_max @PMIX_RENAME@PMI_KVS_Get_name_length_max
#define PMI_KVS_Get_value_length_max @PMIX_RENAME@PMI_KVS_Get_value_length_max
#define PMI_KVS_Iter_first @PMIX_RENAME@PMI_KVS_Iter_first
#define PMI_KVS_Iter_next @PMIX_RENAME@PMI_KVS_Iter_next
#define PMI_KVS_Put @PMIX_RENAME@PMI_KVS_Put
#define PMI_Lookup_name @PMIX_RENAME@PMI_Lookup_name
#define PMI_Parse_option @PMIX_RENAME@PMI_Parse_option
#define PMI_Publish_name @PMIX_RENAME@PMI_Publish_name
#define PMI_Spawn_multiple @PMIX_RENAME@PMI_Spawn_multiple
#define PMI_Unpublish_name @PMIX_RENAME@PMI_Unpublish_name
#define PMIx_Abort @PMIX_RENAME@PMIx_Abort
#define PMIx_Allocation_request_nb @PMIX_RENAME@PMIx_Allocation_request_nb
#define PMIx_Alloc_directive_string @PMIX_RENAME@PMIx_Alloc_directive_string
#define pmix_argv_append @PMIX_RENAME@pmix_argv_append
#define pmix_argv_append_nosize @PMIX_RENAME@pmix_argv_append_nosize
#define pmix_argv_append_unique_nosize @PMIX_RENAME@pmix_argv_append_unique_nosize
#define pmix_argv_copy @PMIX_RENAME@pmix_argv_copy
#define pmix_argv_count @PMIX_RENAME@pmix_argv_count
#define pmix_argv_delete @PMIX_RENAME@pmix_argv_delete
#define pmix_argv_free @PMIX_RENAME@pmix_argv_free
#define pmix_argv_insert @PMIX_RENAME@pmix_argv_insert
#define pmix_argv_insert_element @PMIX_RENAME@pmix_argv_insert_element
#define pmix_argv_join @PMIX_RENAME@pmix_argv_join
#define pmix_argv_join_range @PMIX_RENAME@pmix_argv_join_range
#define pmix_argv_len @PMIX_RENAME@pmix_argv_len
#define pmix_argv_prepend_nosize @PMIX_RENAME@pmix_argv_prepend_nosize
#define pmix_argv_split @PMIX_RENAME@pmix_argv_split
#define pmix_argv_split_with_empty @PMIX_RENAME@pmix_argv_split_with_empty
#define pmix_asprintf @PMIX_RENAME@pmix_asprintf
#define pmix_basename @PMIX_RENAME@pmix_basename
#define pmix_bfrop_base_copy_persist @PMIX_RENAME@pmix_bfrop_base_copy_persist
#define pmix_bfrop_base_select @PMIX_RENAME@pmix_bfrop_base_select
#define pmix_bfrop_buffer_extend @PMIX_RENAME@pmix_bfrop_buffer_extend
#define pmix_bfrop_get_data_type @PMIX_RENAME@pmix_bfrop_get_data_type
#define pmix_bfrops_base_assign_module @PMIX_RENAME@pmix_bfrops_base_assign_module
#define pmix_bfrops_base_copy @PMIX_RENAME@pmix_bfrops_base_copy
#define pmix_bfrops_base_copy_app @PMIX_RENAME@pmix_bfrops_base_copy_app
#define pmix_bfrops_base_copy_array @PMIX_RENAME@pmix_bfrops_base_copy_array
#define pmix_bfrops_base_copy_bo @PMIX_RENAME@pmix_bfrops_base_copy_bo
#define pmix_bfrops_base_copy_buf @PMIX_RENAME@pmix_bfrops_base_copy_buf
#define pmix_bfrops_base_copy_darray @PMIX_RENAME@pmix_bfrops_base_copy_darray
#define pmix_bfrops_base_copy_info @PMIX_RENAME@pmix_bfrops_base_copy_info
#define pmix_bfrops_base_copy_kval @PMIX_RENAME@pmix_bfrops_base_copy_kval
#define pmix_bfrops_base_copy_modex @PMIX_RENAME@pmix_bfrops_base_copy_modex
#define pmix_bfrops_base_copy_payload @PMIX_RENAME@pmix_bfrops_base_copy_payload
#define pmix_bfrops_base_copy_pdata @PMIX_RENAME@pmix_bfrops_base_copy_pdata
#define pmix_bfrops_base_copy_pinfo @PMIX_RENAME@pmix_bfrops_base_copy_pinfo
#define pmix_bfrops_base_copy_proc @PMIX_RENAME@pmix_bfrops_base_copy_proc
#define pmix_bfrops_base_copy_query @PMIX_RENAME@pmix_bfrops_base_copy_query
#define pmix_bfrops_base_copy_string @PMIX_RENAME@pmix_bfrops_base_copy_string
#define pmix_bfrops_base_copy_value @PMIX_RENAME@pmix_bfrops_base_copy_value
#define pmix_bfrops_base_data_type_string @PMIX_RENAME@pmix_bfrops_base_data_type_string
#define pmix_bfrops_base_framework @PMIX_RENAME@pmix_bfrops_base_framework
#define pmix_bfrops_base_get_available_modules @PMIX_RENAME@pmix_bfrops_base_get_available_modules
#define pmix_bfrops_base_output @PMIX_RENAME@pmix_bfrops_base_output
#define pmix_bfrops_base_pack @PMIX_RENAME@pmix_bfrops_base_pack
#define pmix_bfrops_base_pack_alloc_directive @PMIX_RENAME@pmix_bfrops_base_pack_alloc_directive
#define pmix_bfrops_base_pack_app @PMIX_RENAME@pmix_bfrops_base_pack_app
#define pmix_bfrops_base_pack_array @PMIX_RENAME@pmix_bfrops_base_pack_array
#define pmix_bfrops_base_pack_bo @PMIX_RENAME@pmix_bfrops_base_pack_bo
#define pmix_bfrops_base_pack_bool @PMIX_RENAME@pmix_bfrops_base_pack_bool
#define pmix_bfrops_base_pack_buf @PMIX_RENAME@pmix_bfrops_base_pack_buf
#define pmix_bfrops_base_pack_buffer @PMIX_RENAME@pmix_bfrops_base_pack_buffer
#define pmix_bfrops_base_pack_byte @PMIX_RENAME@pmix_bfrops_base_pack_byte
#define pmix_bfrops_base_pack_cmd @PMIX_RENAME@pmix_bfrops_base_pack_cmd
#define pmix_bfrops_base_pack_darray @PMIX_RENAME@pmix_bfrops_base_pack_darray
#define pmix_bfrops_base_pack_datatype @PMIX_RENAME@pmix_bfrops_base_pack_datatype
#define pmix_bfrops_base_pack_double @PMIX_RENAME@pmix_bfrops_base_pack_double
#define pmix_bfrops_base_pack_float @PMIX_RENAME@pmix_bfrops_base_pack_float
#define pmix_bfrops_base_pack_info @PMIX_RENAME@pmix_bfrops_base_pack_info
#define pmix_bfrops_base_pack_info_directives @PMIX_RENAME@pmix_bfrops_base_pack_info_directives
#define pmix_bfrops_base_pack_int @PMIX_RENAME@pmix_bfrops_base_pack_int
#define pmix_bfrops_base_pack_int16 @PMIX_RENAME@pmix_bfrops_base_pack_int16
#define pmix_bfrops_base_pack_int32 @PMIX_RENAME@pmix_bfrops_base_pack_int32
#define pmix_bfrops_base_pack_int64 @PMIX_RENAME@pmix_bfrops_base_pack_int64
#define pmix_bfrops_base_pack_kval @PMIX_RENAME@pmix_bfrops_base_pack_kval
#define pmix_bfrops_base_pack_modex @PMIX_RENAME@pmix_bfrops_base_pack_modex
#define pmix_bfrops_base_pack_pdata @PMIX_RENAME@pmix_bfrops_base_pack_pdata
#define pmix_bfrops_base_pack_persist @PMIX_RENAME@pmix_bfrops_base_pack_persist
#define pmix_bfrops_base_pack_pid @PMIX_RENAME@pmix_bfrops_base_pack_pid
#define pmix_bfrops_base_pack_pinfo @PMIX_RENAME@pmix_bfrops_base_pack_pinfo
#define pmix_bfrops_base_pack_proc @PMIX_RENAME@pmix_bfrops_base_pack_proc
#define pmix_bfrops_base_pack_pstate @PMIX_RENAME@pmix_bfrops_base_pack_pstate
#define pmix_bfrops_base_pack_ptr @PMIX_RENAME@pmix_bfrops_base_pack_ptr
#define pmix_bfrops_base_pack_query @PMIX_RENAME@pmix_bfrops_base_pack_query
#define pmix_bfrops_base_pack_range @PMIX_RENAME@pmix_bfrops_base_pack_range
#define pmix_bfrops_base_pack_rank @PMIX_RENAME@pmix_bfrops_base_pack_rank
#define pmix_bfrops_base_pack_scope @PMIX_RENAME@pmix_bfrops_base_pack_scope
#define pmix_bfrops_base_pack_sizet @PMIX_RENAME@pmix_bfrops_base_pack_sizet
#define pmix_bfrops_base_pack_status @PMIX_RENAME@pmix_bfrops_base_pack_status
#define pmix_bfrops_base_pack_string @PMIX_RENAME@pmix_bfrops_base_pack_string
#define pmix_bfrops_base_pack_time @PMIX_RENAME@pmix_bfrops_base_pack_time
#define pmix_bfrops_base_pack_timeval @PMIX_RENAME@pmix_bfrops_base_pack_timeval
#define pmix_bfrops_base_pack_val @PMIX_RENAME@pmix_bfrops_base_pack_val
#define pmix_bfrops_base_pack_value @PMIX_RENAME@pmix_bfrops_base_pack_value
#define pmix_bfrops_base_print @PMIX_RENAME@pmix_bfrops_base_print
#define pmix_bfrops_base_print_alloc_directive @PMIX_RENAME@pmix_bfrops_base_print_alloc_directive
#define pmix_bfrops_base_print_app @PMIX_RENAME@pmix_bfrops_base_print_app
#define pmix_bfrops_base_print_array @PMIX_RENAME@pmix_bfrops_base_print_array
#define pmix_bfrops_base_print_bo @PMIX_RENAME@pmix_bfrops_base_print_bo
#define pmix_bfrops_base_print_bool @PMIX_RENAME@pmix_bfrops_base_print_bool
#define pmix_bfrops_base_print_buf @PMIX_RENAME@pmix_bfrops_base_print_buf
#define pmix_bfrops_base_print_byte @PMIX_RENAME@pmix_bfrops_base_print_byte
#define pmix_bfrops_base_print_cmd @PMIX_RENAME@pmix_bfrops_base_print_cmd
#define pmix_bfrops_base_print_darray @PMIX_RENAME@pmix_bfrops_base_print_darray
#define pmix_bfrops_base_print_datatype @PMIX_RENAME@pmix_bfrops_base_print_datatype
#define pmix_bfrops_base_print_double @PMIX_RENAME@pmix_bfrops_base_print_double
#define pmix_bfrops_base_print_float @PMIX_RENAME@pmix_bfrops_base_print_float
#define pmix_bfrops_base_print_info @PMIX_RENAME@pmix_bfrops_base_print_info
#define pmix_bfrops_base_print_info_directives @PMIX_RENAME@pmix_bfrops_base_print_info_directives
#define pmix_bfrops_base_print_int @PMIX_RENAME@pmix_bfrops_base_print_int
#define pmix_bfrops_base_print_int16 @PMIX_RENAME@pmix_bfrops_base_print_int16
#define pmix_bfrops_base_print_int32 @PMIX_RENAME@pmix_bfrops_base_print_int32
#define pmix_bfrops_base_print_int64 @PMIX_RENAME@pmix_bfrops_base_print_int64
#define pmix_bfrops_base_print_int8 @PMIX_RENAME@pmix_bfrops_base_print_int8
#define pmix_bfrops_base_print_kval @PMIX_RENAME@pmix_bfrops_base_print_kval
#define pmix_bfrops_base_print_modex @PMIX_RENAME@pmix_bfrops_base_print_modex
#define pmix_bfrops_base_print_pdata @PMIX_RENAME@pmix_bfrops_base_print_pdata
#define pmix_bfrops_base_print_persist @PMIX_RENAME@pmix_bfrops_base_print_persist
#define pmix_bfrops_base_print_pid @PMIX_RENAME@pmix_bfrops_base_print_pid
#define pmix_bfrops_base_print_pinfo @PMIX_RENAME@pmix_bfrops_base_print_pinfo
#define pmix_bfrops_base_print_proc @PMIX_RENAME@pmix_bfrops_base_print_proc
#define pmix_bfrops_base_print_pstate @PMIX_RENAME@pmix_bfrops_base_print_pstate
#define pmix_bfrops_base_print_ptr @PMIX_RENAME@pmix_bfrops_base_print_ptr
#define pmix_bfrops_base_print_query @PMIX_RENAME@pmix_bfrops_base_print_query
#define pmix_bfrops_base_print_range @PMIX_RENAME@pmix_bfrops_base_print_range
#define pmix_bfrops_base_print_rank @PMIX_RENAME@pmix_bfrops_base_print_rank
#define pmix_bfrops_base_print_scope @PMIX_RENAME@pmix_bfrops_base_print_scope
#define pmix_bfrops_base_print_size @PMIX_RENAME@pmix_bfrops_base_print_size
#define pmix_bfrops_base_print_status @PMIX_RENAME@pmix_bfrops_base_print_status
#define pmix_bfrops_base_print_string @PMIX_RENAME@pmix_bfrops_base_print_string
#define pmix_bfrops_base_print_time @PMIX_RENAME@pmix_bfrops_base_print_time
#define pmix_bfrops_base_print_timeval @PMIX_RENAME@pmix_bfrops_base_print_timeval
#define pmix_bfrops_base_print_uint @PMIX_RENAME@pmix_bfrops_base_print_uint
#define pmix_bfrops_base_print_uint16 @PMIX_RENAME@pmix_bfrops_base_print_uint16
#define pmix_bfrops_base_print_uint32 @PMIX_RENAME@pmix_bfrops_base_print_uint32
#define pmix_bfrops_base_print_uint64 @PMIX_RENAME@pmix_bfrops_base_print_uint64
#define pmix_bfrops_base_print_uint8 @PMIX_RENAME@pmix_bfrops_base_print_uint8
#define pmix_bfrops_base_print_value @PMIX_RENAME@pmix_bfrops_base_print_value
#define pmix_bfrops_base_std_copy @PMIX_RENAME@pmix_bfrops_base_std_copy
#define pmix_bfrops_base_unpack @PMIX_RENAME@pmix_bfrops_base_unpack
#define pmix_bfrops_base_unpack_alloc_directive @PMIX_RENAME@pmix_bfrops_base_unpack_alloc_directive
#define pmix_bfrops_base_unpack_app @PMIX_RENAME@pmix_bfrops_base_unpack_app
#define pmix_bfrops_base_unpack_array @PMIX_RENAME@pmix_bfrops_base_unpack_array
#define pmix_bfrops_base_unpack_bo @PMIX_RENAME@pmix_bfrops_base_unpack_bo
#define pmix_bfrops_base_unpack_bool @PMIX_RENAME@pmix_bfrops_base_unpack_bool
#define pmix_bfrops_base_unpack_buf @PMIX_RENAME@pmix_bfrops_base_unpack_buf
#define pmix_bfrops_base_unpack_byte @PMIX_RENAME@pmix_bfrops_base_unpack_byte
#define pmix_bfrops_base_unpack_cmd @PMIX_RENAME@pmix_bfrops_base_unpack_cmd
#define pmix_bfrops_base_unpack_darray @PMIX_RENAME@pmix_bfrops_base_unpack_darray
#define pmix_bfrops_base_unpack_datatype @PMIX_RENAME@pmix_bfrops_base_unpack_datatype
#define pmix_bfrops_base_unpack_double @PMIX_RENAME@pmix_bfrops_base_unpack_double
#define pmix_bfrops_base_unpack_float @PMIX_RENAME@pmix_bfrops_base_unpack_float
#define pmix_bfrops_base_unpack_info @PMIX_RENAME@pmix_bfrops_base_unpack_info
#define pmix_bfrops_base_unpack_info_directives @PMIX_RENAME@pmix_bfrops_base_unpack_info_directives
#define pmix_bfrops_base_unpack_int @PMIX_RENAME@pmix_bfrops_base_unpack_int
#define pmix_bfrops_base_unpack_int16 @PMIX_RENAME@pmix_bfrops_base_unpack_int16
#define pmix_bfrops_base_unpack_int32 @PMIX_RENAME@pmix_bfrops_base_unpack_int32
#define pmix_bfrops_base_unpack_int64 @PMIX_RENAME@pmix_bfrops_base_unpack_int64
#define pmix_bfrops_base_unpack_kval @PMIX_RENAME@pmix_bfrops_base_unpack_kval
#define pmix_bfrops_base_unpack_modex @PMIX_RENAME@pmix_bfrops_base_unpack_modex
#define pmix_bfrops_base_unpack_pdata @PMIX_RENAME@pmix_bfrops_base_unpack_pdata
#define pmix_bfrops_base_unpack_persist @PMIX_RENAME@pmix_bfrops_base_unpack_persist
#define pmix_bfrops_base_unpack_pid @PMIX_RENAME@pmix_bfrops_base_unpack_pid
#define pmix_bfrops_base_unpack_pinfo @PMIX_RENAME@pmix_bfrops_base_unpack_pinfo
#define pmix_bfrops_base_unpack_proc @PMIX_RENAME@pmix_bfrops_base_unpack_proc
#define pmix_bfrops_base_unpack_pstate @PMIX_RENAME@pmix_bfrops_base_unpack_pstate
#define pmix_bfrops_base_unpack_ptr @PMIX_RENAME@pmix_bfrops_base_unpack_ptr
#define pmix_bfrops_base_unpack_query @PMIX_RENAME@pmix_bfrops_base_unpack_query
#define pmix_bfrops_base_unpack_range @PMIX_RENAME@pmix_bfrops_base_unpack_range
#define pmix_bfrops_base_unpack_rank @PMIX_RENAME@pmix_bfrops_base_unpack_rank
#define pmix_bfrops_base_unpack_scope @PMIX_RENAME@pmix_bfrops_base_unpack_scope
#define pmix_bfrops_base_unpack_sizet @PMIX_RENAME@pmix_bfrops_base_unpack_sizet
#define pmix_bfrops_base_unpack_status @PMIX_RENAME@pmix_bfrops_base_unpack_status
#define pmix_bfrops_base_unpack_string @PMIX_RENAME@pmix_bfrops_base_unpack_string
#define pmix_bfrops_base_unpack_time @PMIX_RENAME@pmix_bfrops_base_unpack_time
#define pmix_bfrops_base_unpack_timeval @PMIX_RENAME@pmix_bfrops_base_unpack_timeval
#define pmix_bfrops_base_unpack_val @PMIX_RENAME@pmix_bfrops_base_unpack_val
#define pmix_bfrops_base_unpack_value @PMIX_RENAME@pmix_bfrops_base_unpack_value
#define pmix_bfrops_base_value_cmp @PMIX_RENAME@pmix_bfrops_base_value_cmp
#define pmix_bfrops_base_value_load @PMIX_RENAME@pmix_bfrops_base_value_load
#define pmix_bfrops_base_value_unload @PMIX_RENAME@pmix_bfrops_base_value_unload
#define pmix_bfrops_base_value_xfer @PMIX_RENAME@pmix_bfrops_base_value_xfer
#define pmix_bfrops_globals @PMIX_RENAME@pmix_bfrops_globals
#define pmix_bfrop_store_data_type @PMIX_RENAME@pmix_bfrop_store_data_type
#define pmix_bfrop_too_small @PMIX_RENAME@pmix_bfrop_too_small
#define pmix_bfrop_type_info_t_class @PMIX_RENAME@pmix_bfrop_type_info_t_class
#define pmix_buffer_t_class @PMIX_RENAME@pmix_buffer_t_class
#define pmix_cb_t_class @PMIX_RENAME@pmix_cb_t_class
#define pmix_class_finalize @PMIX_RENAME@pmix_class_finalize
#define pmix_class_init_epoch @PMIX_RENAME@pmix_class_init_epoch
#define pmix_class_initialize @PMIX_RENAME@pmix_class_initialize
#define pmix_client_globals @PMIX_RENAME@pmix_client_globals
#define pmix_cmd_line_add @PMIX_RENAME@pmix_cmd_line_add
#define pmix_cmd_line_create @PMIX_RENAME@pmix_cmd_line_create
#define pmix_cmd_line_get_argc @PMIX_RENAME@pmix_cmd_line_get_argc
#define pmix_cmd_line_get_argv @PMIX_RENAME@pmix_cmd_line_get_argv
#define pmix_cmd_line_get_ninsts @PMIX_RENAME@pmix_cmd_line_get_ninsts
#define pmix_cmd_line_get_param @PMIX_RENAME@pmix_cmd_line_get_param
#define pmix_cmd_line_get_tail @PMIX_RENAME@pmix_cmd_line_get_tail
#define pmix_cmd_line_get_usage_msg @PMIX_RENAME@pmix_cmd_line_get_usage_msg
#define pmix_cmd_line_is_taken @PMIX_RENAME@pmix_cmd_line_is_taken
#define pmix_cmd_line_make_opt3 @PMIX_RENAME@pmix_cmd_line_make_opt3
#define pmix_cmd_line_make_opt_mca @PMIX_RENAME@pmix_cmd_line_make_opt_mca
#define pmix_cmd_line_parse @PMIX_RENAME@pmix_cmd_line_parse
#define pmix_cmd_line_t_class @PMIX_RENAME@pmix_cmd_line_t_class
#define pmix_command_string @PMIX_RENAME@pmix_command_string
#define PMIx_Commit @PMIX_RENAME@PMIx_Commit
#define PMIx_Connect @PMIX_RENAME@PMIx_Connect
#define PMIx_Connect_nb @PMIX_RENAME@PMIx_Connect_nb
#define PMIx_Data_copy @PMIX_RENAME@PMIx_Data_copy
#define PMIx_Data_copy_payload @PMIX_RENAME@PMIx_Data_copy_payload
#define PMIx_Data_pack @PMIX_RENAME@PMIx_Data_pack
#define PMIx_Data_print @PMIX_RENAME@PMIx_Data_print
#define PMIx_Data_range_string @PMIX_RENAME@PMIx_Data_range_string
#define PMIx_Data_type_string @PMIX_RENAME@PMIx_Data_type_string
#define PMIx_Data_unpack @PMIX_RENAME@PMIx_Data_unpack
#define pmix_debug_threads @PMIX_RENAME@pmix_debug_threads
#define PMIx_Deregister_event_handler @PMIX_RENAME@PMIx_Deregister_event_handler
#define pmix_deregister_params @PMIX_RENAME@pmix_deregister_params
#define pmix_dirname @PMIX_RENAME@pmix_dirname
#define PMIx_Disconnect @PMIX_RENAME@PMIx_Disconnect
#define PMIx_Disconnect_nb @PMIX_RENAME@PMIx_Disconnect_nb
#define pmix_environ_merge @PMIX_RENAME@pmix_environ_merge
#define PMIx_Error_string @PMIX_RENAME@PMIx_Error_string
#define pmix_fd_read @PMIX_RENAME@pmix_fd_read
#define pmix_fd_set_cloexec @PMIX_RENAME@pmix_fd_set_cloexec
#define pmix_fd_write @PMIX_RENAME@pmix_fd_write
#define PMIx_Fence @PMIX_RENAME@PMIx_Fence
#define PMIx_Fence_nb @PMIX_RENAME@PMIx_Fence_nb
#define PMIx_Finalize @PMIX_RENAME@PMIx_Finalize
#define pmix_find_absolute_path @PMIX_RENAME@pmix_find_absolute_path
#define pmix_gds_base_assign_module @PMIX_RENAME@pmix_gds_base_assign_module
#define pmix_gds_base_framework @PMIX_RENAME@pmix_gds_base_framework
#define pmix_gds_base_get_available_modules @PMIX_RENAME@pmix_gds_base_get_available_modules
#define pmix_gds_base_output @PMIX_RENAME@pmix_gds_base_output
#define pmix_gds_base_select @PMIX_RENAME@pmix_gds_base_select
#define pmix_gds_base_setup_fork @PMIX_RENAME@pmix_gds_base_setup_fork
#define pmix_gds_globals @PMIX_RENAME@pmix_gds_globals
#define PMIx_generate_ppn @PMIX_RENAME@PMIx_generate_ppn
#define PMIx_generate_regex @PMIX_RENAME@PMIx_generate_regex
#define PMIx_Get @PMIX_RENAME@PMIx_Get
#define PMIx_Get_nb @PMIX_RENAME@PMIx_Get_nb
#define PMIx_Get_version @PMIX_RENAME@PMIx_Get_version
#define pmix_global_lock @PMIX_RENAME@pmix_global_lock
#define pmix_globals @PMIX_RENAME@pmix_globals
#define pmix_hash_fetch @PMIX_RENAME@pmix_hash_fetch
#define pmix_hash_fetch_by_key @PMIX_RENAME@pmix_hash_fetch_by_key
#define pmix_hash_remove_data @PMIX_RENAME@pmix_hash_remove_data
#define pmix_hash_store @PMIX_RENAME@pmix_hash_store
#define pmix_hash_table_get_first_key_ptr @PMIX_RENAME@pmix_hash_table_get_first_key_ptr
#define pmix_hash_table_get_first_key_uint32 @PMIX_RENAME@pmix_hash_table_get_first_key_uint32
#define pmix_hash_table_get_first_key_uint64 @PMIX_RENAME@pmix_hash_table_get_first_key_uint64
#define pmix_hash_table_get_next_key_ptr @PMIX_RENAME@pmix_hash_table_get_next_key_ptr
#define pmix_hash_table_get_next_key_uint32 @PMIX_RENAME@pmix_hash_table_get_next_key_uint32
#define pmix_hash_table_get_next_key_uint64 @PMIX_RENAME@pmix_hash_table_get_next_key_uint64
#define pmix_hash_table_get_value_ptr @PMIX_RENAME@pmix_hash_table_get_value_ptr
#define pmix_hash_table_get_value_uint32 @PMIX_RENAME@pmix_hash_table_get_value_uint32
#define pmix_hash_table_get_value_uint64 @PMIX_RENAME@pmix_hash_table_get_value_uint64
#define pmix_hash_table_init @PMIX_RENAME@pmix_hash_table_init
#define pmix_hash_table_init2 @PMIX_RENAME@pmix_hash_table_init2
#define pmix_hash_table_remove_all @PMIX_RENAME@pmix_hash_table_remove_all
#define pmix_hash_table_remove_value_ptr @PMIX_RENAME@pmix_hash_table_remove_value_ptr
#define pmix_hash_table_remove_value_uint32 @PMIX_RENAME@pmix_hash_table_remove_value_uint32
#define pmix_hash_table_remove_value_uint64 @PMIX_RENAME@pmix_hash_table_remove_value_uint64
#define pmix_hash_table_set_value_ptr @PMIX_RENAME@pmix_hash_table_set_value_ptr
#define pmix_hash_table_set_value_uint32 @PMIX_RENAME@pmix_hash_table_set_value_uint32
#define pmix_hash_table_set_value_uint64 @PMIX_RENAME@pmix_hash_table_set_value_uint64
#define pmix_hash_table_t_class @PMIX_RENAME@pmix_hash_table_t_class
#define pmix_home_directory @PMIX_RENAME@pmix_home_directory
#define pmix_host_server @PMIX_RENAME@pmix_host_server
#define pmix_hotel_init @PMIX_RENAME@pmix_hotel_init
#define pmix_ifaddrtokindex @PMIX_RENAME@pmix_ifaddrtokindex
#define pmix_ifaddrtoname @PMIX_RENAME@pmix_ifaddrtoname
#define pmix_ifbegin @PMIX_RENAME@pmix_ifbegin
#define pmix_ifcount @PMIX_RENAME@pmix_ifcount
#define pmix_ifgetaliases @PMIX_RENAME@pmix_ifgetaliases
#define pmix_ifindextoaddr @PMIX_RENAME@pmix_ifindextoaddr
#define pmix_ifindextoflags @PMIX_RENAME@pmix_ifindextoflags
#define pmix_ifindextokindex @PMIX_RENAME@pmix_ifindextokindex
#define pmix_ifindextomac @PMIX_RENAME@pmix_ifindextomac
#define pmix_ifindextomask @PMIX_RENAME@pmix_ifindextomask
#define pmix_ifindextomtu @PMIX_RENAME@pmix_ifindextomtu
#define pmix_ifindextoname @PMIX_RENAME@pmix_ifindextoname
#define pmix_ifislocal @PMIX_RENAME@pmix_ifislocal
#define pmix_ifisloopback @PMIX_RENAME@pmix_ifisloopback
#define pmix_ifkindextoaddr @PMIX_RENAME@pmix_ifkindextoaddr
#define pmix_ifkindextoname @PMIX_RENAME@pmix_ifkindextoname
#define pmix_ifmatches @PMIX_RENAME@pmix_ifmatches
#define pmix_ifnametoaddr @PMIX_RENAME@pmix_ifnametoaddr
#define pmix_ifnametoindex @PMIX_RENAME@pmix_ifnametoindex
#define pmix_ifnametokindex @PMIX_RENAME@pmix_ifnametokindex
#define pmix_ifnext @PMIX_RENAME@pmix_ifnext
#define pmix_iftupletoaddr @PMIX_RENAME@pmix_iftupletoaddr
#define pmix_info_caddy_t_class @PMIX_RENAME@pmix_info_caddy_t_class
#define PMIx_Info_directives_string @PMIX_RENAME@PMIx_Info_directives_string
#define PMIx_Init @PMIX_RENAME@PMIx_Init
#define pmix_init_called @PMIX_RENAME@pmix_init_called
#define pmix_initialized @PMIX_RENAME@pmix_initialized
#define PMIx_Initialized @PMIX_RENAME@PMIx_Initialized
#define PMIx_Job_control_nb @PMIX_RENAME@PMIx_Job_control_nb
#define pmix_kval_t_class @PMIX_RENAME@pmix_kval_t_class
#define pmix_listener_t_class @PMIX_RENAME@pmix_listener_t_class
#define pmix_list_item_t_class @PMIX_RENAME@pmix_list_item_t_class
#define pmix_list_t_class @PMIX_RENAME@pmix_list_t_class
#define PMIx_Log_nb @PMIX_RENAME@PMIx_Log_nb
#define PMIx_Lookup @PMIX_RENAME@PMIx_Lookup
#define PMIx_Lookup_nb @PMIX_RENAME@PMIx_Lookup_nb
#define pmix_mca_base_close @PMIX_RENAME@pmix_mca_base_close
#define pmix_mca_base_cmd_line_process_args @PMIX_RENAME@pmix_mca_base_cmd_line_process_args
#define pmix_mca_base_cmd_line_setup @PMIX_RENAME@pmix_mca_base_cmd_line_setup
#define pmix_mca_base_cmd_line_wrap_args @PMIX_RENAME@pmix_mca_base_cmd_line_wrap_args
#define pmix_mca_base_component_close @PMIX_RENAME@pmix_mca_base_component_close
#define pmix_mca_base_component_compare @PMIX_RENAME@pmix_mca_base_component_compare
#define pmix_mca_base_component_compare_priority @PMIX_RENAME@pmix_mca_base_component_compare_priority
#define pmix_mca_base_component_compatible @PMIX_RENAME@pmix_mca_base_component_compatible
#define pmix_mca_base_component_disable_dlopen @PMIX_RENAME@pmix_mca_base_component_disable_dlopen
#define pmix_mca_base_component_find @PMIX_RENAME@pmix_mca_base_component_find
#define pmix_mca_base_component_find_finalize @PMIX_RENAME@pmix_mca_base_component_find_finalize
#define pmix_mca_base_component_list_item_t_class @PMIX_RENAME@pmix_mca_base_component_list_item_t_class
#define pmix_mca_base_component_parse_requested @PMIX_RENAME@pmix_mca_base_component_parse_requested
#define pmix_mca_base_component_path @PMIX_RENAME@pmix_mca_base_component_path
#define pmix_mca_base_component_priority_list_item_t_class @PMIX_RENAME@pmix_mca_base_component_priority_list_item_t_class
#define pmix_mca_base_component_repository_add @PMIX_RENAME@pmix_mca_base_component_repository_add
#define pmix_mca_base_component_repository_finalize @PMIX_RENAME@pmix_mca_base_component_repository_finalize
#define pmix_mca_base_component_repository_get_components @PMIX_RENAME@pmix_mca_base_component_repository_get_components
#define pmix_mca_base_component_repository_init @PMIX_RENAME@pmix_mca_base_component_repository_init
#define pmix_mca_base_component_repository_item_t_class @PMIX_RENAME@pmix_mca_base_component_repository_item_t_class
#define pmix_mca_base_component_repository_open @PMIX_RENAME@pmix_mca_base_component_repository_open
#define pmix_mca_base_component_repository_release @PMIX_RENAME@pmix_mca_base_component_repository_release
#define pmix_mca_base_component_repository_retain_component @PMIX_RENAME@pmix_mca_base_component_repository_retain_component
#define pmix_mca_base_components_close @PMIX_RENAME@pmix_mca_base_components_close
#define pmix_mca_base_components_filter @PMIX_RENAME@pmix_mca_base_components_filter
#define pmix_mca_base_component_show_load_errors @PMIX_RENAME@pmix_mca_base_component_show_load_errors
#define pmix_mca_base_component_to_string @PMIX_RENAME@pmix_mca_base_component_to_string
#define pmix_mca_base_component_track_load_errors @PMIX_RENAME@pmix_mca_base_component_track_load_errors
#define pmix_mca_base_component_unload @PMIX_RENAME@pmix_mca_base_component_unload
#define pmix_mca_base_component_var_register @PMIX_RENAME@pmix_mca_base_component_var_register
#define pmix_mca_base_failed_component_t_class @PMIX_RENAME@pmix_mca_base_failed_component_t_class
#define pmix_mca_base_framework_close @PMIX_RENAME@pmix_mca_base_framework_close
#define pmix_mca_base_framework_components_close @PMIX_RENAME@pmix_mca_base_framework_components_close
#define pmix_mca_base_framework_components_open @PMIX_RENAME@pmix_mca_base_framework_components_open
#define pmix_mca_base_framework_components_register @PMIX_RENAME@pmix_mca_base_framework_components_register
#define pmix_mca_base_framework_is_open @PMIX_RENAME@pmix_mca_base_framework_is_open
#define pmix_mca_base_framework_is_registered @PMIX_RENAME@pmix_mca_base_framework_is_registered
#define pmix_mca_base_framework_open @PMIX_RENAME@pmix_mca_base_framework_open
#define pmix_mca_base_framework_register @PMIX_RENAME@pmix_mca_base_framework_register
#define pmix_mca_base_framework_var_register @PMIX_RENAME@pmix_mca_base_framework_var_register
#define pmix_mca_base_open @PMIX_RENAME@pmix_mca_base_open
#define pmix_mca_base_select @PMIX_RENAME@pmix_mca_base_select
#define pmix_mca_base_system_default_path @PMIX_RENAME@pmix_mca_base_system_default_path
#define pmix_mca_base_user_default_path @PMIX_RENAME@pmix_mca_base_user_default_path
#define pmix_mca_base_var_build_env @PMIX_RENAME@pmix_mca_base_var_build_env
#define pmix_mca_base_var_cache_files @PMIX_RENAME@pmix_mca_base_var_cache_files
#define pmix_mca_base_var_check_exclusive @PMIX_RENAME@pmix_mca_base_var_check_exclusive
#define pmix_mca_base_var_deregister @PMIX_RENAME@pmix_mca_base_var_deregister
#define pmix_mca_base_var_dump @PMIX_RENAME@pmix_mca_base_var_dump
#define pmix_mca_base_var_env_name @PMIX_RENAME@pmix_mca_base_var_env_name
#define pmix_mca_base_var_finalize @PMIX_RENAME@pmix_mca_base_var_finalize
#define pmix_mca_base_var_find @PMIX_RENAME@pmix_mca_base_var_find
#define pmix_mca_base_var_find_by_name @PMIX_RENAME@pmix_mca_base_var_find_by_name
#define pmix_mca_base_var_get @PMIX_RENAME@pmix_mca_base_var_get
#define pmix_mca_base_var_get_count @PMIX_RENAME@pmix_mca_base_var_get_count
#define pmix_mca_base_var_get_value @PMIX_RENAME@pmix_mca_base_var_get_value
#define pmix_mca_base_var_group_component_register @PMIX_RENAME@pmix_mca_base_var_group_component_register
#define pmix_mca_base_var_group_deregister @PMIX_RENAME@pmix_mca_base_var_group_deregister
#define pmix_mca_base_var_group_find @PMIX_RENAME@pmix_mca_base_var_group_find
#define pmix_mca_base_var_group_find_by_name @PMIX_RENAME@pmix_mca_base_var_group_find_by_name
#define pmix_mca_base_var_group_get @PMIX_RENAME@pmix_mca_base_var_group_get
#define pmix_mca_base_var_group_get_count @PMIX_RENAME@pmix_mca_base_var_group_get_count
#define pmix_mca_base_var_group_get_stamp @PMIX_RENAME@pmix_mca_base_var_group_get_stamp
#define pmix_mca_base_var_group_register @PMIX_RENAME@pmix_mca_base_var_group_register
#define pmix_mca_base_var_group_set_var_flag @PMIX_RENAME@pmix_mca_base_var_group_set_var_flag
#define pmix_mca_base_var_group_t_class @PMIX_RENAME@pmix_mca_base_var_group_t_class
#define pmix_mca_base_var_init @PMIX_RENAME@pmix_mca_base_var_init
#define pmix_mca_base_var_process_env_list @PMIX_RENAME@pmix_mca_base_var_process_env_list
#define pmix_mca_base_var_process_env_list_from_file @PMIX_RENAME@pmix_mca_base_var_process_env_list_from_file
#define pmix_mca_base_var_register @PMIX_RENAME@pmix_mca_base_var_register
#define pmix_mca_base_var_register_synonym @PMIX_RENAME@pmix_mca_base_var_register_synonym
#define pmix_mca_base_var_set_flag @PMIX_RENAME@pmix_mca_base_var_set_flag
#define pmix_mca_base_var_set_value @PMIX_RENAME@pmix_mca_base_var_set_value
#define pmix_mca_base_var_t_class @PMIX_RENAME@pmix_mca_base_var_t_class
#define pmix_mutex_t_class @PMIX_RENAME@pmix_mutex_t_class
#define pmix_namelist_t_class @PMIX_RENAME@pmix_namelist_t_class
#define pmix_net_addr_isipv4public @PMIX_RENAME@pmix_net_addr_isipv4public
#define pmix_net_finalize @PMIX_RENAME@pmix_net_finalize
#define pmix_net_get_hostname @PMIX_RENAME@pmix_net_get_hostname
#define pmix_net_get_port @PMIX_RENAME@pmix_net_get_port
#define pmix_net_init @PMIX_RENAME@pmix_net_init
#define pmix_net_isaddr @PMIX_RENAME@pmix_net_isaddr
#define pmix_net_islocalhost @PMIX_RENAME@pmix_net_islocalhost
#define pmix_net_prefix2netmask @PMIX_RENAME@pmix_net_prefix2netmask
#define pmix_net_samenetwork @PMIX_RENAME@pmix_net_samenetwork
#define PMIx_Notify_event @PMIX_RENAME@PMIx_Notify_event
#define pmix_nspace_caddy_t_class @PMIX_RENAME@pmix_nspace_caddy_t_class
#define pmix_nspace_t_class @PMIX_RENAME@pmix_nspace_t_class
#define pmix_object_t_class @PMIX_RENAME@pmix_object_t_class
#define pmix_os_path @PMIX_RENAME@pmix_os_path
#define pmix_output @PMIX_RENAME@pmix_output
#define pmix_output_close @PMIX_RENAME@pmix_output_close
#define pmix_output_finalize @PMIX_RENAME@pmix_output_finalize
#define pmix_output_get_verbosity @PMIX_RENAME@pmix_output_get_verbosity
#define pmix_output_check_verbosity @PMIX_RENAME@pmix_output_check_verbosity
#define pmix_output_hexdump @PMIX_RENAME@pmix_output_hexdump
#define pmix_output_init @PMIX_RENAME@pmix_output_init
#define pmix_output_open @PMIX_RENAME@pmix_output_open
#define pmix_output_reopen @PMIX_RENAME@pmix_output_reopen
#define pmix_output_reopen_all @PMIX_RENAME@pmix_output_reopen_all
#define pmix_output_set_output_file_info @PMIX_RENAME@pmix_output_set_output_file_info
#define pmix_output_set_verbosity @PMIX_RENAME@pmix_output_set_verbosity
#define pmix_output_switch @PMIX_RENAME@pmix_output_switch
#define pmix_output_vverbose @PMIX_RENAME@pmix_output_vverbose
#define pmix_path_access @PMIX_RENAME@pmix_path_access
#define pmix_path_df @PMIX_RENAME@pmix_path_df
#define pmix_path_find @PMIX_RENAME@pmix_path_find
#define pmix_path_findv @PMIX_RENAME@pmix_path_findv
#define pmix_path_is_absolute @PMIX_RENAME@pmix_path_is_absolute
#define pmix_path_nfs @PMIX_RENAME@pmix_path_nfs
#define pmix_pdl_base_framework @PMIX_RENAME@pmix_pdl_base_framework
#define pmix_peer_t_class @PMIX_RENAME@pmix_peer_t_class
#define pmix_pending_connection_t_class @PMIX_RENAME@pmix_pending_connection_t_class
#define PMIx_Persistence_string @PMIX_RENAME@PMIx_Persistence_string
#define pmix_pif_base_framework @PMIX_RENAME@pmix_pif_base_framework
#define pmix_pinstall_dirs @PMIX_RENAME@pmix_pinstall_dirs
#define pmix_pinstalldirs_base_framework @PMIX_RENAME@pmix_pinstalldirs_base_framework
#define pmix_pnet @PMIX_RENAME@pmix_pnet
#define pmix_pnet_base_child_finalized @PMIX_RENAME@pmix_pnet_base_child_finalized
#define pmix_pnet_base_framework @PMIX_RENAME@pmix_pnet_base_framework
#define pmix_pnet_base_local_app_finalized @PMIX_RENAME@pmix_pnet_base_local_app_finalized
#define pmix_pnet_base_select @PMIX_RENAME@pmix_pnet_base_select
#define pmix_pnet_base_setup_app @PMIX_RENAME@pmix_pnet_base_setup_app
#define pmix_pnet_base_setup_fork @PMIX_RENAME@pmix_pnet_base_setup_fork
#define pmix_pnet_base_setup_local_network @PMIX_RENAME@pmix_pnet_base_setup_local_network
#define pmix_pnet_globals @PMIX_RENAME@pmix_pnet_globals
#define pmix_pointer_array_add @PMIX_RENAME@pmix_pointer_array_add
#define pmix_pointer_array_init @PMIX_RENAME@pmix_pointer_array_init
#define pmix_pointer_array_set_item @PMIX_RENAME@pmix_pointer_array_set_item
#define pmix_pointer_array_set_size @PMIX_RENAME@pmix_pointer_array_set_size
#define pmix_pointer_array_t_class @PMIX_RENAME@pmix_pointer_array_t_class
#define pmix_pointer_array_test_and_set_item @PMIX_RENAME@pmix_pointer_array_test_and_set_item
#define pmix_preg @PMIX_RENAME@pmix_preg
#define pmix_preg_base_framework @PMIX_RENAME@pmix_preg_base_framework
#define pmix_preg_base_generate_node_regex @PMIX_RENAME@pmix_preg_base_generate_node_regex
#define pmix_preg_base_generate_ppn @PMIX_RENAME@pmix_preg_base_generate_ppn
#define pmix_preg_base_parse_nodes @PMIX_RENAME@pmix_preg_base_parse_nodes
#define pmix_preg_base_parse_procs @PMIX_RENAME@pmix_preg_base_parse_procs
#define pmix_preg_base_resolve_nodes @PMIX_RENAME@pmix_preg_base_resolve_nodes
#define pmix_preg_base_resolve_peers @PMIX_RENAME@pmix_preg_base_resolve_peers
#define pmix_preg_base_select @PMIX_RENAME@pmix_preg_base_select
#define pmix_preg_globals @PMIX_RENAME@pmix_preg_globals
#define PMIx_Process_monitor_nb @PMIX_RENAME@PMIx_Process_monitor_nb
#define PMIx_Proc_state_string @PMIX_RENAME@PMIx_Proc_state_string
#define pmix_psec_base_assign_module @PMIX_RENAME@pmix_psec_base_assign_module
#define pmix_psec_base_framework @PMIX_RENAME@pmix_psec_base_framework
#define pmix_psec_base_get_available_modules @PMIX_RENAME@pmix_psec_base_get_available_modules
#define pmix_psec_base_select @PMIX_RENAME@pmix_psec_base_select
#define pmix_psensor @PMIX_RENAME@pmix_psensor
#define pmix_psensor_base @PMIX_RENAME@pmix_psensor_base
#define pmix_psensor_base_framework @PMIX_RENAME@pmix_psensor_base_framework
#define pmix_psensor_base_select @PMIX_RENAME@pmix_psensor_base_select
#define pmix_psensor_base_start @PMIX_RENAME@pmix_psensor_base_start
#define pmix_psensor_base_stop @PMIX_RENAME@pmix_psensor_base_stop
#define pmix_pshmem @PMIX_RENAME@pmix_pshmem
#define pmix_pshmem_base_framework @PMIX_RENAME@pmix_pshmem_base_framework
#define pmix_pshmem_base_select @PMIX_RENAME@pmix_pshmem_base_select
#define pmix_ptl_base_assign_module @PMIX_RENAME@pmix_ptl_base_assign_module
#define pmix_ptl_base_cancel_recv @PMIX_RENAME@pmix_ptl_base_cancel_recv
#define pmix_ptl_base_connect @PMIX_RENAME@pmix_ptl_base_connect
#define pmix_ptl_base_connect_to_peer @PMIX_RENAME@pmix_ptl_base_connect_to_peer
#define pmix_ptl_base_framework @PMIX_RENAME@pmix_ptl_base_framework
#define pmix_ptl_base_get_available_modules @PMIX_RENAME@pmix_ptl_base_get_available_modules
#define pmix_ptl_base_lost_connection @PMIX_RENAME@pmix_ptl_base_lost_connection
#define pmix_ptl_base_output @PMIX_RENAME@pmix_ptl_base_output
#define pmix_ptl_base_process_msg @PMIX_RENAME@pmix_ptl_base_process_msg
#define pmix_ptl_base_recv_blocking @PMIX_RENAME@pmix_ptl_base_recv_blocking
#define pmix_ptl_base_recv_handler @PMIX_RENAME@pmix_ptl_base_recv_handler
#define pmix_ptl_base_register_recv @PMIX_RENAME@pmix_ptl_base_register_recv
#define pmix_ptl_base_select @PMIX_RENAME@pmix_ptl_base_select
#define pmix_ptl_base_send @PMIX_RENAME@pmix_ptl_base_send
#define pmix_ptl_base_send_blocking @PMIX_RENAME@pmix_ptl_base_send_blocking
#define pmix_ptl_base_send_handler @PMIX_RENAME@pmix_ptl_base_send_handler
#define pmix_ptl_base_send_recv @PMIX_RENAME@pmix_ptl_base_send_recv
#define pmix_ptl_base_set_blocking @PMIX_RENAME@pmix_ptl_base_set_blocking
#define pmix_ptl_base_set_nonblocking @PMIX_RENAME@pmix_ptl_base_set_nonblocking
#define pmix_ptl_base_set_notification_cbfunc @PMIX_RENAME@pmix_ptl_base_set_notification_cbfunc
#define pmix_ptl_base_start_listening @PMIX_RENAME@pmix_ptl_base_start_listening
#define pmix_ptl_base_stop_listening @PMIX_RENAME@pmix_ptl_base_stop_listening
#define pmix_ptl_globals @PMIX_RENAME@pmix_ptl_globals
#define pmix_ptl_posted_recv_t_class @PMIX_RENAME@pmix_ptl_posted_recv_t_class
#define pmix_ptl_queue_t_class @PMIX_RENAME@pmix_ptl_queue_t_class
#define pmix_ptl_recv_t_class @PMIX_RENAME@pmix_ptl_recv_t_class
#define pmix_ptl_send_t_class @PMIX_RENAME@pmix_ptl_send_t_class
#define pmix_ptl_sr_t_class @PMIX_RENAME@pmix_ptl_sr_t_class
#define PMIx_Publish @PMIX_RENAME@PMIx_Publish
#define PMIx_Publish_nb @PMIX_RENAME@PMIx_Publish_nb
#define PMIx_Put @PMIX_RENAME@PMIx_Put
#define pmix_query_caddy_t_class @PMIX_RENAME@pmix_query_caddy_t_class
#define PMIx_Query_info_nb @PMIX_RENAME@PMIx_Query_info_nb
#define pmix_rand @PMIX_RENAME@pmix_rand
#define pmix_random @PMIX_RENAME@pmix_random
#define pmix_rank_info_t_class @PMIX_RENAME@pmix_rank_info_t_class
#define pmix_recursive_mutex_t_class @PMIX_RENAME@pmix_recursive_mutex_t_class
#define pmix_regex_range_t_class @PMIX_RENAME@pmix_regex_range_t_class
#define pmix_regex_value_t_class @PMIX_RENAME@pmix_regex_value_t_class
#define PMIx_Register_event_handler @PMIX_RENAME@PMIx_Register_event_handler
#define pmix_register_params @PMIX_RENAME@pmix_register_params
#define PMIx_Resolve_nodes @PMIX_RENAME@PMIx_Resolve_nodes
#define PMIx_Resolve_peers @PMIX_RENAME@PMIx_Resolve_peers
#define pmix_ring_buffer_init @PMIX_RENAME@pmix_ring_buffer_init
#define pmix_ring_buffer_poke @PMIX_RENAME@pmix_ring_buffer_poke
#define pmix_ring_buffer_pop @PMIX_RENAME@pmix_ring_buffer_pop
#define pmix_ring_buffer_push @PMIX_RENAME@pmix_ring_buffer_push
#define pmix_rte_finalize @PMIX_RENAME@pmix_rte_finalize
#define pmix_rte_init @PMIX_RENAME@pmix_rte_init
#define PMIx_Scope_string @PMIX_RENAME@PMIx_Scope_string
#define PMIx_server_deregister_client @PMIX_RENAME@PMIx_server_deregister_client
#define PMIx_server_deregister_nspace @PMIX_RENAME@PMIx_server_deregister_nspace
#define PMIx_server_dmodex_request @PMIX_RENAME@PMIx_server_dmodex_request
#define PMIx_server_finalize @PMIX_RENAME@PMIx_server_finalize
#define pmix_server_globals @PMIX_RENAME@pmix_server_globals
#define PMIx_server_init @PMIX_RENAME@PMIx_server_init
#define PMIx_server_register_client @PMIX_RENAME@PMIx_server_register_client
#define PMIx_server_register_nspace @PMIX_RENAME@PMIx_server_register_nspace
#define PMIx_server_setup_application @PMIX_RENAME@PMIx_server_setup_application
#define PMIx_server_setup_fork @PMIX_RENAME@PMIx_server_setup_fork
#define PMIx_server_setup_local_support @PMIX_RENAME@PMIx_server_setup_local_support
#define pmix_setenv @PMIX_RENAME@pmix_setenv
#define pmix_setup_caddy_t_class @PMIX_RENAME@pmix_setup_caddy_t_class
#define pmix_shift_caddy_t_class @PMIX_RENAME@pmix_shift_caddy_t_class
#define pmix_show_help @PMIX_RENAME@pmix_show_help
#define pmix_show_help_add_dir @PMIX_RENAME@pmix_show_help_add_dir
#define pmix_show_help_finalize @PMIX_RENAME@pmix_show_help_finalize
#define pmix_show_help_init @PMIX_RENAME@pmix_show_help_init
#define pmix_show_help_string @PMIX_RENAME@pmix_show_help_string
#define pmix_show_help_vstring @PMIX_RENAME@pmix_show_help_vstring
#define pmix_show_vhelp @PMIX_RENAME@pmix_show_vhelp
#define pmix_snprintf @PMIX_RENAME@pmix_snprintf
#define PMIx_Spawn @PMIX_RENAME@PMIx_Spawn
#define PMIx_Spawn_nb @PMIX_RENAME@PMIx_Spawn_nb
#define pmix_srand @PMIX_RENAME@pmix_srand
#define PMIx_Store_internal @PMIX_RENAME@PMIx_Store_internal
#define pmix_sync_wait_mt @PMIX_RENAME@pmix_sync_wait_mt
#define pmix_thread_get_self @PMIX_RENAME@pmix_thread_get_self
#define pmix_thread_join @PMIX_RENAME@pmix_thread_join
#define pmix_thread_kill @PMIX_RENAME@pmix_thread_kill
#define pmix_thread_self_compare @PMIX_RENAME@pmix_thread_self_compare
#define pmix_thread_set_main @PMIX_RENAME@pmix_thread_set_main
#define pmix_thread_start @PMIX_RENAME@pmix_thread_start
#define pmix_thread_t_class @PMIX_RENAME@pmix_thread_t_class
#define pmix_tmp_directory @PMIX_RENAME@pmix_tmp_directory
#define PMIx_tool_finalize @PMIX_RENAME@PMIx_tool_finalize
#define PMIx_tool_init @PMIX_RENAME@PMIx_tool_init
#define pmix_tsd_key_create @PMIX_RENAME@pmix_tsd_key_create
#define pmix_tsd_keys_destruct @PMIX_RENAME@pmix_tsd_keys_destruct
#define PMIx_Unpublish @PMIX_RENAME@PMIx_Unpublish
#define PMIx_Unpublish_nb @PMIX_RENAME@PMIx_Unpublish_nb
#define pmix_unsetenv @PMIX_RENAME@pmix_unsetenv
#define pmix_util_compress_string @PMIX_RENAME@pmix_util_compress_string
#define pmix_util_getid @PMIX_RENAME@pmix_util_getid
#define pmix_util_get_ranges @PMIX_RENAME@pmix_util_get_ranges
#define pmix_util_keyval_parse @PMIX_RENAME@pmix_util_keyval_parse
#define pmix_util_keyval_parse_finalize @PMIX_RENAME@pmix_util_keyval_parse_finalize
#define pmix_util_keyval_parse_init @PMIX_RENAME@pmix_util_keyval_parse_init
#define pmix_util_keyval_parse_lineno @PMIX_RENAME@pmix_util_keyval_parse_lineno
#define pmix_util_keyval_save_internal_envars @PMIX_RENAME@pmix_util_keyval_save_internal_envars
#define pmix_util_parse_range_options @PMIX_RENAME@pmix_util_parse_range_options
#define pmix_util_uncompress_string @PMIX_RENAME@pmix_util_uncompress_string
#define pmix_value_array_set_size @PMIX_RENAME@pmix_value_array_set_size
#define pmix_value_array_t_class @PMIX_RENAME@pmix_value_array_t_class
#define pmix_value_load @PMIX_RENAME@pmix_value_load
#define pmix_value_xfer @PMIX_RENAME@pmix_value_xfer
#define pmix_var_type_names @PMIX_RENAME@pmix_var_type_names
#define pmix_vasprintf @PMIX_RENAME@pmix_vasprintf
#define pmix_vsnprintf @PMIX_RENAME@pmix_vsnprintf

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

@ -1,5 +1,5 @@
/*
* Copyright (c) 2013-2018 Intel, Inc. All rights reserved.
* Copyright (c) 2013-2020 Intel, Inc. All rights reserved.
* Copyright (c) 2015 Artem Y. Polyakov <artpol84@gmail.com>.
* All rights reserved.
* Copyright (c) 2015 Research Organization for Information Science
@ -543,34 +543,41 @@ PMIX_EXPORT pmix_status_t PMIx_server_init(pmix_server_module_t *module,
* memory usage is released */
PMIX_EXPORT pmix_status_t PMIx_server_finalize(void);
/* given a semicolon-separated list of input values, generate
* a regex that can be passed down to the client for parsing.
* The caller is responsible for free'ing the resulting
* string
/* Given a comma-separated list of \refarg{input} values, generate
* a reduced size representation of the input that can be passed
* down to PMIx_server_register_nspace for parsing. The order of
* the individual values in the \refarg{input} string is preserved
* across the operation. The caller is responsible for releasing
* the returned data.
*
* If values have leading zero's, then that is preserved. You
* have to add back any prefix/suffix for node names
* odin[009-015,017-023,076-086]
*
* "pmix:odin[009-015,017-023,076-086]"
*
* Note that the "pmix" at the beginning of each regex indicates
* that the PMIx native parser is to be used by the client for
* parsing the provided regex. Other parsers may be supported - see
* the pmix_client.h header for a list.
* The returned representation may be an arbitrary array of bytes
* as opposed to a valid NULL-terminated string. However, the
* method used to generate the representation shall be identified
* with a colon-delimited string at the beginning of the output.
* For example, an output starting with "pmix:" indicates that
* the representation is a PMIx-defined regular expression.
* In contrast, an output starting with "blob:" is a compressed
* binary array.
*/
PMIX_EXPORT pmix_status_t PMIx_generate_regex(const char *input, char **regex);
/* The input is expected to consist of a comma-separated list
* of ranges. Thus, an input of:
* "1-4;2-5;8,10,11,12;6,7,9"
* would generate a regex of
* "[pmix:2x(3);8,10-12;6-7,9]"
/* The input shall consist of a semicolon-separated list of ranges
* representing the ranks of processes on each node of the job -
* e.g., "1-4;2-5;8,10,11,12;6,7,9". Each field of the input must
* correspond to the node name provided at that position in the
* input to PMIx_generate_regex. Thus, in the example, ranks 1-4
* would be located on the first node of the comma-separated list
* of names provided to PMIx_generate_regex, and ranks 2-5 would
* be on the second name in the list.
*
* Note that the "pmix" at the beginning of each regex indicates
* that the PMIx native parser is to be used by the client for
* parsing the provided regex. Other parsers may be supported - see
* the pmix_client.h header for a list.
* The returned representation may be an arbitrary array of bytes
* as opposed to a valid NULL-terminated string. However, the
* method used to generate the representation shall be identified
* with a colon-delimited string at the beginning of the output.
* For example, an output starting with "pmix:" indicates that
* the representation is a PMIx-defined regular expression.
* In contrast, an output starting with "blob:" is a compressed
* binary array.
*/
PMIX_EXPORT pmix_status_t PMIx_generate_ppn(const char *input, char **ppn);
@ -751,6 +758,7 @@ PMIX_EXPORT pmix_status_t PMIx_server_deliver_inventory(pmix_info_t info[], size
pmix_info_t directives[], size_t ndirs,
pmix_op_cbfunc_t cbfunc, void *cbdata);
#if defined(c_plusplus) || defined(__cplusplus)
}
#endif

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

@ -1,5 +1,5 @@
/*
* Copyright (c) 2013-2018 Intel, Inc. All rights reserved.
* Copyright (c) 2013-2020 Intel, Inc. All rights reserved.
* Copyright (c) 2015 Artem Y. Polyakov <artpol84@gmail.com>.
* All rights reserved.
* Copyright (c) 2015 Research Organization for Information Science

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

@ -2,7 +2,7 @@
* Copyright (c) 2016 Mellanox Technologies, Inc.
* All rights reserved.
* Copyright (c) 2018 IBM Corporation. All rights reserved.
* Copyright (c) 2018-2019 Intel, Inc. All rights reserved.
* Copyright (c) 2018 Intel, Inc. All rights reserved.
* Copyright (c) 2019 Research Organization for Information Science
* and Technology (RIST). All rights reserved.
* $COPYRIGHT$

12
opal/mca/pmix/pmix3x/pmix/maint/pmix.pc.in Обычный файл
Просмотреть файл

@ -0,0 +1,12 @@
prefix=@prefix@
exec_prefix=@exec_prefix@
libdir=@libdir@
includedir=@includedir@
Name: pmix
Description: Process Management Interface for Exascale (PMIx)
Version: @PACKAGE_VERSION@
URL: https://pmix.org/
Requires: @PC_REQUIRES@
Libs: -L${libdir} -lpmix @PC_PRIVATE_LIBS@
Cflags: -I${includedir}

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

@ -11,7 +11,7 @@
# All rights reserved.
# Copyright (c) 2006-2016 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
@ -42,6 +42,8 @@ sources =
nodist_headers =
EXTRA_DIST =
dist_pmixdata_DATA =
nobase_pmix_HEADERS =
pmixdir = $(pmixincludedir)/$(subdir)
# place to capture sources for backward compatibility libs
pmi1_sources =
@ -105,6 +107,11 @@ include tools/Makefile.include
include common/Makefile.include
include hwloc/Makefile.include
if WANT_INSTALL_HEADERS
nobase_pmix_HEADERS += $(headers)
endif
MAINTAINERCLEANFILES = Makefile.in config.h config.h.in
DISTCLEANFILES = Makefile
CLEANFILES = core.* *~

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

@ -15,7 +15,7 @@
# 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-2020 Intel, Inc. All rights reserved.
# $COPYRIGHT$
#
# Additional copyrights may follow
@ -38,6 +38,4 @@ include atomics/sys/arm/Makefile.include
include atomics/sys/arm64/Makefile.include
include atomics/sys/ia32/Makefile.include
include atomics/sys/powerpc/Makefile.include
include atomics/sys/sparcv9/Makefile.include
include atomics/sys/sync_builtin/Makefile.include
include atomics/sys/gcc_builtin/Makefile.include

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

@ -10,7 +10,7 @@
* Copyright (c) 2004-2005 The Regents of the University of California.
* All rights reserved.
* Copyright (c) 2011 Sandia National Laboratories. All rights reserved.
* Copyright (c) 2014-2018 Intel, Inc. All rights reserved.
* Copyright (c) 2014-2020 Intel, Inc. All rights reserved.
* Copyright (c) 2016 Los Alamos National Security, LLC. All rights
* reserved.
* Copyright (c) 2017 Research Organization for Information Science
@ -32,27 +32,16 @@
/* Architectures */
#define PMIX_UNSUPPORTED 0000
#define PMIX_IA32 0010
#define PMIX_IA64 0020
#define PMIX_X86_64 0030
#define PMIX_POWERPC32 0050
#define PMIX_POWERPC64 0051
#define PMIX_SPARC 0060
#define PMIX_SPARCV9_32 0061
#define PMIX_SPARCV9_64 0062
#define PMIX_MIPS 0070
#define PMIX_ARM 0100
#define PMIX_ARM64 0101
#define PMIX_S390 0110
#define PMIX_S390X 0111
#define PMIX_BUILTIN_SYNC 0200
#define PMIX_BUILTIN_GCC 0202
#define PMIX_BUILTIN_NO 0203
#define PMIX_BUILTIN_C11 0204
/* Formats */
#define PMIX_DEFAULT 1000 /* standard for given architecture */
#define PMIX_DARWIN 1001 /* Darwin / OS X on PowerPC */
#define PMIX_PPC_LINUX 1002 /* Linux on PowerPC */
#define PMIX_AIX 1003 /* AIX on Power / PowerPC */
#endif /* #ifndef PMIX_SYS_ARCHITECTURE_H */

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

@ -16,7 +16,7 @@
* reserved.
* Copyright (c) 2017 Research Organization for Information Science
* and Technology (RIST). All rights reserved.
* Copyright (c) 2018 Intel, Inc. All rights reserved.
* Copyright (c) 2018-2020 Intel, Inc. All rights reserved.
* $COPYRIGHT$
*
* Additional copyrights may follow
@ -52,7 +52,7 @@
#ifndef PMIX_SYS_ATOMIC_H
#define PMIX_SYS_ATOMIC_H 1
#include "pmix_config.h"
#include "src/include/pmix_config.h"
#include <stdbool.h>
@ -164,8 +164,6 @@ enum {
*********************************************************************/
#if defined(DOXYGEN)
/* don't include system-level gorp when generating doxygen files */
#elif PMIX_ASSEMBLY_BUILTIN == PMIX_BUILTIN_SYNC
#include "src/atomics/sys/sync_builtin/atomic.h"
#elif PMIX_ASSEMBLY_BUILTIN == PMIX_BUILTIN_GCC
#include "src/atomics/sys/gcc_builtin/atomic.h"
#elif PMIX_ASSEMBLY_ARCH == PMIX_X86_64
@ -176,20 +174,10 @@ enum {
#include "src/atomics/sys/arm64/atomic.h"
#elif PMIX_ASSEMBLY_ARCH == PMIX_IA32
#include "src/atomics/sys/ia32/atomic.h"
#elif PMIX_ASSEMBLY_ARCH == PMIX_IA64
#include "src/atomics/sys/ia64/atomic.h"
#elif PMIX_ASSEMBLY_ARCH == PMIX_MIPS
#include "src/atomics/sys/mips/atomic.h"
#elif PMIX_ASSEMBLY_ARCH == PMIX_POWERPC32
#include "src/atomics/sys/powerpc/atomic.h"
#elif PMIX_ASSEMBLY_ARCH == PMIX_POWERPC64
#include "src/atomics/sys/powerpc/atomic.h"
#elif PMIX_ASSEMBLY_ARCH == PMIX_SPARC
#include "src/atomics/sys/sparc/atomic.h"
#elif PMIX_ASSEMBLY_ARCH == PMIX_SPARCV9_32
#include "src/atomics/sys/sparcv9/atomic.h"
#elif PMIX_ASSEMBLY_ARCH == PMIX_SPARCV9_64
#include "src/atomics/sys/sparcv9/atomic.h"
#endif
#ifndef DOXYGEN

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

@ -215,6 +215,7 @@ typedef atomic_flag pmix_atomic_lock_t;
*/
static inline void pmix_atomic_lock_init (pmix_atomic_lock_t *lock, bool value)
{
(void)value;
atomic_flag_clear (lock);
}

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

@ -4,7 +4,7 @@
* reserved.
* Copyright (c) 2017 Research Organization for Information Science
* and Technology (RIST). All rights reserved.
* Copyright (c) 2018 Intel, Inc. All rights reserved.
* Copyright (c) 2018-2020 Intel, Inc. All rights reserved.
* $COPYRIGHT$
*/
@ -44,9 +44,6 @@
#elif PMIX_ASSEMBLY_ARCH == PMIX_IA32
#define __NR_process_vm_readv 347
#define __NR_process_vm_writev 348
#elif PMIX_ASSEMBLY_ARCH == PMIX_IA64
#define __NR_process_vm_readv 1332
#define __NR_process_vm_writev 1333
#elif PMIX_ASSEMBLY_ARCH == PMIX_POWERPC32
#define __NR_process_vm_readv 351
#define __NR_process_vm_writev 352
@ -65,33 +62,6 @@
#define __NR_process_vm_readv 270
#define __NR_process_vm_writev 271
#elif PMIX_ASSEMBLY_ARCH == PMIX_MIPS
#if _MIPS_SIM == _MIPS_SIM_ABI64
#define __NR_process_vm_readv 5304
#define __NR_process_vm_writev 5305
#elif _MIPS_SIM == _MIPS_SIM_NABI32
#define __NR_process_vm_readv 6309
#define __NR_process_vm_writev 6310
#else
#error "Unsupported MIPS architecture for process_vm_readv and process_vm_writev syscalls"
#endif
#elif PMIX_ASSEMBLY_ARCH == PMIX_S390
#define __NR_process_vm_readv 340
#define __NR_process_vm_writev 341
#elif PMIX_ASSEMBLY_ARCH == PMIX_S390X
#define __NR_process_vm_readv 340
#define __NR_process_vm_writev 341
#else
#error "Unsupported architecture for process_vm_readv and process_vm_writev syscalls"

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

@ -1,24 +0,0 @@
#
# Copyright (c) 2004-2005 The Trustees of Indiana University and Indiana
# University Research and Technology
# Corporation. All rights reserved.
# 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,
# University of Stuttgart. All rights reserved.
# Copyright (c) 2004-2005 The Regents of the University of California.
# All rights reserved.
# Copyright (c) 2017 Intel, Inc. All rights reserved.
# $COPYRIGHT$
#
# Additional copyrights may follow
#
# $HEADER$
#
# This makefile.am does not stand on its own - it is included from pmix/include/Makefile.am
headers += \
atomics/sys/sparcv9/atomic.h \
atomics/sys/sparcv9/timer.h

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

@ -1,203 +0,0 @@
/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil -*- */
/*
* Copyright (c) 2004-2005 The Trustees of Indiana University and Indiana
* University Research and Technology
* Corporation. All rights reserved.
* Copyright (c) 2004-2005 The University of Tennessee and The University
* of Tennessee Research Foundation. All rights
* reserved.
* Copyright (c) 2004-2005 High Performance Computing Center Stuttgart,
* University of Stuttgart. All rights reserved.
* Copyright (c) 2004-2005 The Regents of the University of California.
* All rights reserved.
* Copyright (c) 2007 Sun Microsystems, Inc. All rights reserverd.
* Copyright (c) 2016 Research Organization for Information Science
* and Technology (RIST). All rights reserved.
* Copyright (c) 2017-2018 Los Alamos National Security, LLC. All rights
* reserved.
* Copyright (c) 2018 Intel, Inc. All rights reserved.
* $COPYRIGHT$
*
* Additional copyrights may follow
*
* $HEADER$
*/
#ifndef PMIX_SYS_ARCH_ATOMIC_H
#define PMIX_SYS_ARCH_ATOMIC_H 1
/*
* On sparc v9, use casa and casxa (compare and swap) instructions.
*/
#define ASI_P "0x80"
#define MEPMIXMBAR(type) __asm__ __volatile__ ("membar " type : : : "memory")
/**********************************************************************
*
* Define constants for Sparc v9 (Ultra Sparc)
*
*********************************************************************/
#define PMIX_HAVE_ATOMIC_MEM_BARRIER 1
#define PMIX_HAVE_ATOMIC_COMPARE_EXCHANGE_32 1
#define PMIX_HAVE_ATOMIC_COMPARE_EXCHANGE_64 1
/**********************************************************************
*
* Memory Barriers
*
*********************************************************************/
#if PMIX_GCC_INLINE_ASSEMBLY
static inline void pmix_atomic_mb(void)
{
MEPMIXMBAR("#LoadLoad | #LoadStore | #StoreStore | #StoreLoad");
}
static inline void pmix_atomic_rmb(void)
{
MEPMIXMBAR("#LoadLoad");
}
static inline void pmix_atomic_wmb(void)
{
MEPMIXMBAR("#StoreStore");
}
static inline void pmix_atomic_isync(void)
{
}
#endif /* PMIX_GCC_INLINE_ASSEMBLY */
/**********************************************************************
*
* Atomic math operations
*
*********************************************************************/
#if PMIX_GCC_INLINE_ASSEMBLY
static inline bool pmix_atomic_compare_exchange_strong_32 (pmix_atomic_int32_t *addr, int32_t *oldval, int32_t newval)
{
/* casa [reg(rs1)] %asi, reg(rs2), reg(rd)
*
* if (*(reg(rs1)) == reg(rs2) )
* swap reg(rd), *(reg(rs1))
* else
* reg(rd) = *(reg(rs1))
*/
int32_t prev = newval;
bool ret;
__asm__ __volatile__("casa [%1] " ASI_P ", %2, %0"
: "+r" (prev)
: "r" (addr), "r" (*oldval));
ret = (prev == *oldval);
*oldval = prev;
return ret;
}
static inline bool pmix_atomic_compare_exchange_strong_acq_32 (pmix_atomic_int32_t *addr, int32_t *oldval, int32_t newval)
{
bool rc;
rc = pmix_atomic_compare_exchange_strong_32 (addr, oldval, newval);
pmix_atomic_rmb();
return rc;
}
static inline bool pmix_atomic_compare_exchange_strong_rel_32 (pmix_atomic_int32_t *addr, int32_t *oldval, int32_t newval)
{
pmix_atomic_wmb();
return pmix_atomic_compare_exchange_strong_32 (addr, oldval, newval);
}
#if PMIX_ASSEMBLY_ARCH == PMIX_SPARCV9_64
static inline bool pmix_atomic_compare_exchange_strong_64 (pmix_atomic_int64_t *addr, int64_t *oldval, int64_t newval)
{
/* casa [reg(rs1)] %asi, reg(rs2), reg(rd)
*
* if (*(reg(rs1)) == reg(rs1) )
* swap reg(rd), *(reg(rs1))
* else
* reg(rd) = *(reg(rs1))
*/
int64_t prev = newval;
bool ret;
__asm__ __volatile__("casxa [%1] " ASI_P ", %2, %0"
: "+r" (prev)
: "r" (addr), "r" (*oldval));
ret = (prev == *oldval);
*oldval = prev;
return ret;
}
#else /* PMIX_ASSEMBLY_ARCH == PMIX_SPARCV9_64 */
static inline bool pmix_atomic_compare_exchange_strong_64 (pmix_atomic_int64_t *addr, int64_t *oldval, int64_t newval)
{
/* casa [reg(rs1)] %asi, reg(rs2), reg(rd)
*
* if (*(reg(rs1)) == reg(rs1) )
* swap reg(rd), *(reg(rs1))
* else
* reg(rd) = *(reg(rs1))
*
*/
int64_t prev = newval;
bool ret;
__asm__ __volatile__(
"ldx %0, %%g1 \n\t" /* g1 = ret */
"ldx %2, %%g2 \n\t" /* g2 = oldval */
"casxa [%1] " ASI_P ", %%g2, %%g1 \n\t"
"stx %%g1, %0 \n"
: "+m"(prev)
: "r"(addr), "m"(*oldval)
: "%g1", "%g2"
);
ret = (prev == *oldval);
*oldval = prev;
return ret;
}
#endif /* PMIX_ASSEMBLY_ARCH == PMIX_SPARCV9_64 */
static inline bool pmix_atomic_compare_exchange_strong_acq_64 (pmix_atomic_int64_t *addr, int64_t *oldval, int64_t newval)
{
bool rc;
rc = pmix_atomic_compare_exchange_strong_64 (addr, oldval, newval);
pmix_atomic_rmb();
return rc;
}
static inline bool pmix_atomic_compare_exchange_strong_rel_64 (pmix_atomic_int64_t *addr, int64_t *oldval, int64_t newval)
{
pmix_atomic_wmb();
return pmix_atomic_compare_exchange_strong_64 (addr, oldval, newval);
}
#endif /* PMIX_GCC_INLINE_ASSEMBLY */
#endif /* ! PMIX_SYS_ARCH_ATOMIC_H */

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

@ -1,67 +0,0 @@
/*
* Copyright (c) 2004-2005 The Trustees of Indiana University and Indiana
* University Research and Technology
* Corporation. All rights reserved.
* 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,
* University of Stuttgart. All rights reserved.
* Copyright (c) 2004-2005 The Regents of the University of California.
* All rights reserved.
* $COPYRIGHT$
*
* Additional copyrights may follow
*
* $HEADER$
*/
#ifndef PMIX_SYS_ARCH_TIMER_H
#define PMIX_SYS_ARCH_TIMER_H 1
typedef uint64_t pmix_timer_t;
#if PMIX_GCC_INLINE_ASSEMBLY
#if PMIX_ASSEMBLY_ARCH == PMIX_SPARCV9_64
static inline pmix_timer_t
pmix_sys_timer_get_cycles(void)
{
pmix_timer_t ret;
__asm__ __volatile__("rd %%tick, %0" : "=r"(ret));
return ret;
}
#else /* PMIX_SPARCV9_32 */
static inline pmix_timer_t
pmix_sys_timer_get_cycles(void)
{
pmix_timer_t ret;
int a, b;
__asm__ __volatile__("rd %%tick, %0 \n"
"srlx %0, 32, %1 " :
"=r"(a), "=r"(b)
);
ret = (0x00000000FFFFFFFF & a) | (((pmix_timer_t) b) << 32);
return ret;
}
#endif
#define PMIX_HAVE_SYS_TIMER_GET_CYCLES 1
#else
#define PMIX_HAVE_SYS_TIMER_GET_CYCLES 0
#endif /* PMIX_GCC_INLINE_ASSEMBLY */
#endif /* ! PMIX_SYS_ARCH_TIMER_H */

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

@ -1,24 +0,0 @@
#
# Copyright (c) 2004-2005 The Trustees of Indiana University and Indiana
# University Research and Technology
# Corporation. All rights reserved.
# Copyright (c) 2004-2005 The University of Tennessee and The University
# of Tennessee Research Foundation. All rights
# reserved.
# Copyright (c) 2004-2009 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) 2011 Sandia National Laboratories. All rights reserved.
# Copyright (c) 2017 Intel, Inc. All rights reserved.
# $COPYRIGHT$
#
# Additional copyrights may follow
#
# $HEADER$
#
# This makefile.am does not stand on its own - it is included from pmix/include/Makefile.am
headers += \
atomics/sys/sync_builtin/atomic.h

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

@ -1,166 +0,0 @@
/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil -*- */
/*
* Copyright (c) 2004-2005 The Trustees of Indiana University and Indiana
* University Research and Technology
* Corporation. All rights reserved.
* Copyright (c) 2004-2013 The University of Tennessee and The University
* of Tennessee Research Foundation. All rights
* reserved.
* Copyright (c) 2004-2005 High Performance Computing Center Stuttgart,
* University of Stuttgart. All rights reserved.
* Copyright (c) 2004-2005 The Regents of the University of California.
* All rights reserved.
* Copyright (c) 2011 Sandia National Laboratories. All rights reserved.
* Copyright (c) 2014-2018 Los Alamos National Security, LLC. All rights
* reserved.
* Copyright (c) 2017 Research Organization for Information Science
* and Technology (RIST). All rights reserved.
* Copyright (c) 2018 Intel, Inc. All rights reserved.
* $COPYRIGHT$
*
* Additional copyrights may follow
*
* $HEADER$
*/
#ifndef PMIX_SYS_ARCH_ATOMIC_H
#define PMIX_SYS_ARCH_ATOMIC_H 1
/**********************************************************************
*
* Memory Barriers
*
*********************************************************************/
#define PMIX_HAVE_ATOMIC_MEM_BARRIER 1
static inline void pmix_atomic_mb(void)
{
__sync_synchronize();
}
static inline void pmix_atomic_rmb(void)
{
__sync_synchronize();
}
static inline void pmix_atomic_wmb(void)
{
__sync_synchronize();
}
#define PMIXMB() pmix_atomic_mb()
/**********************************************************************
*
* Atomic math operations
*
*********************************************************************/
#define PMIX_HAVE_ATOMIC_COMPARE_EXCHANGE_32 1
static inline bool pmix_atomic_compare_exchange_strong_32 (pmix_atomic_int32_t *addr, int32_t *oldval, int32_t newval)
{
int32_t prev = __sync_val_compare_and_swap (addr, *oldval, newval);
bool ret = prev == *oldval;
*oldval = prev;
return ret;
}
#define pmix_atomic_compare_exchange_strong_acq_32 pmix_atomic_compare_exchange_strong_32
#define pmix_atomic_compare_exchange_strong_rel_32 pmix_atomic_compare_exchange_strong_32
#define PMIX_HAVE_ATOMIC_MATH_32 1
#define PMIX_HAVE_ATOMIC_ADD_32 1
static inline int32_t pmix_atomic_fetch_add_32(pmix_atomic_int32_t *addr, int32_t delta)
{
return __sync_fetch_and_add(addr, delta);
}
#define PMIX_HAVE_ATOMIC_AND_32 1
static inline int32_t pmix_atomic_fetch_and_32(pmix_atomic_int32_t *addr, int32_t value)
{
return __sync_fetch_and_and(addr, value);
}
#define PMIX_HAVE_ATOMIC_OR_32 1
static inline int32_t pmix_atomic_fetch_or_32(pmix_atomic_int32_t *addr, int32_t value)
{
return __sync_fetch_and_or(addr, value);
}
#define PMIX_HAVE_ATOMIC_XOR_32 1
static inline int32_t pmix_atomic_fetch_xor_32(pmix_atomic_int32_t *addr, int32_t value)
{
return __sync_fetch_and_xor(addr, value);
}
#define PMIX_HAVE_ATOMIC_SUB_32 1
static inline int32_t pmix_atomic_fetch_sub_32(pmix_atomic_int32_t *addr, int32_t delta)
{
return __sync_fetch_and_sub(addr, delta);
}
#if PMIX_ASM_SYNC_HAVE_64BIT
#define PMIX_HAVE_ATOMIC_COMPARE_EXCHANGE_64 1
static inline bool pmix_atomic_compare_exchange_strong_64 (pmix_atomic_int64_t *addr, int64_t *oldval, int64_t newval)
{
int64_t prev = __sync_val_compare_and_swap (addr, *oldval, newval);
bool ret = prev == *oldval;
*oldval = prev;
return ret;
}
#define pmix_atomic_compare_exchange_strong_acq_64 pmix_atomic_compare_exchange_strong_64
#define pmix_atomic_compare_exchange_strong_rel_64 pmix_atomic_compare_exchange_strong_64
#define PMIX_HAVE_ATOMIC_MATH_64 1
#define PMIX_HAVE_ATOMIC_ADD_64 1
static inline int64_t pmix_atomic_fetch_add_64(pmix_atomic_int64_t *addr, int64_t delta)
{
return __sync_fetch_and_add(addr, delta);
}
#define PMIX_HAVE_ATOMIC_AND_64 1
static inline int64_t pmix_atomic_fetch_and_64(pmix_atomic_int64_t *addr, int64_t value)
{
return __sync_fetch_and_and(addr, value);
}
#define PMIX_HAVE_ATOMIC_OR_64 1
static inline int64_t pmix_atomic_fetch_or_64(pmix_atomic_int64_t *addr, int64_t value)
{
return __sync_fetch_and_or(addr, value);
}
#define PMIX_HAVE_ATOMIC_XOR_64 1
static inline int64_t pmix_atomic_fetch_xor_64(pmix_atomic_int64_t *addr, int64_t value)
{
return __sync_fetch_and_xor(addr, value);
}
#define PMIX_HAVE_ATOMIC_SUB_64 1
static inline int64_t pmix_atomic_fetch_sub_64(pmix_atomic_int64_t *addr, int64_t delta)
{
return __sync_fetch_and_sub(addr, delta);
}
#endif
#if PMIX_HAVE_SYNC_BUILTIN_CSWAP_INT128
static inline bool pmix_atomic_compare_exchange_strong_128 (pmix_atomic_int128_t *addr,
pmix_int128_t *oldval, pmix_int128_t newval)
{
pmix_int128_t prev = __sync_val_compare_and_swap (addr, *oldval, newval);
bool ret = prev == *oldval;
*oldval = prev;
return ret;
}
#define PMIX_HAVE_ATOMIC_COMPARE_EXCHANGE_128 1
#endif
#endif /* ! PMIX_SYS_ARCH_ATOMIC_H */

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

@ -13,7 +13,7 @@
* Copyright (c) 2016 Broadcom Limited. All rights reserved.
* Copyright (c) 2016-2017 Los Alamos National Security, LLC. All rights
* reserved.
* Copyright (c) 2018 Intel, Inc. All rights reserved.
* Copyright (c) 2018-2020 Intel, Inc. All rights reserved.
* $COPYRIGHT$
*
* Additional copyrights may follow
@ -79,18 +79,10 @@ BEGIN_C_DECLS
#include "src/atomics/sys/arm64/timer.h"
#elif PMIX_ASSEMBLY_ARCH == PMIX_IA32
#include "src/atomics/sys/ia32/timer.h"
#elif PMIX_ASSEMBLY_ARCH == PMIX_IA64
#include "src/atomics/sys/ia64/timer.h"
#elif PMIX_ASSEMBLY_ARCH == PMIX_POWERPC32
#include "src/atomics/sys/powerpc/timer.h"
#elif PMIX_ASSEMBLY_ARCH == PMIX_POWERPC64
#include "src/atomics/sys/powerpc/timer.h"
#elif PMIX_ASSEMBLY_ARCH == PMIX_SPARCV9_32
#include "src/atomics/sys/sparcv9/timer.h"
#elif PMIX_ASSEMBLY_ARCH == PMIX_SPARCV9_64
#include "src/atomics/sys/sparcv9/timer.h"
#elif PMIX_ASSEMBLY_ARCH == PMIX_MIPS
#include "src/atomics/sys/mips/timer.h"
#endif
#ifndef DOXYGEN

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

@ -11,7 +11,7 @@
* All rights reserved.
* Copyright (c) 2007 Cisco Systems, Inc. All rights reserved.
* Copyright (c) 2010-2012 Oak Ridge National Labs. All rights reserved.
* Copyright (c) 2014-2018 Intel, Inc. All rights reserved.
* Copyright (c) 2014-2020 Intel, Inc. All rights reserved.
* Copyright (c) 2015 Research Organization for Information Science
* and Technology (RIST). All rights reserved.
* $COPYRIGHT$
@ -21,12 +21,12 @@
* $HEADER$
*/
#include <src/include/pmix_config.h>
#include "src/include/pmix_config.h"
#include <stdio.h>
#include <limits.h>
#include "pmix_common.h"
#include "include/pmix_common.h"
#include "src/class/pmix_bitmap.h"
/* The number of bits in the underlying type of the bitmap field

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

@ -12,7 +12,7 @@
* All rights reserved.
* Copyright (c) 2007 Cisco Systems, Inc. All rights reserved.
* Copyright (c) 2010-2012 Oak Ridge National Labs. All rights reserved.
* Copyright (c) 2018 Intel, Inc. All rights reserved.
* Copyright (c) 2018-2020 Intel, Inc. All rights reserved.
* $COPYRIGHT$
*
* Additional copyrights may follow
@ -41,7 +41,7 @@
#ifndef PMIX_BITMAP_H
#define PMIX_BITMAP_H
#include <src/include/pmix_config.h>
#include "src/include/pmix_config.h"
#include <string.h>

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

@ -11,7 +11,7 @@
* All rights reserved.
* Copyright (c) 2014-2015 Research Organization for Information Science
* and Technology (RIST). All rights reserved.
* Copyright (c) 2014-2015 Intel, Inc. All rights reserved
* Copyright (c) 2014-2020 Intel, Inc. All rights reserved.
* $COPYRIGHT$
*
* Additional copyrights may follow
@ -19,7 +19,7 @@
* $HEADER$
*/
#include <src/include/pmix_config.h>
#include "src/include/pmix_config.h"
#include <string.h>
#include <stdlib.h>

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

@ -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) 2015-2017 Intel, Inc. All rights reserved.
* Copyright (c) 2015-2020 Intel, Inc. All rights reserved.
* Copyright (c) 2015-2016 Research Organization for Information Science
* and Technology (RIST). All rights reserved.
* Copyright (c) 2016 Mellanox Technologies, Inc.
@ -34,8 +34,8 @@
#ifndef PMIX_HASH_TABLE_H
#define PMIX_HASH_TABLE_H
#include <src/include/pmix_config.h>
#include <src/include/prefetch.h>
#include "src/include/pmix_config.h"
#include "src/include/prefetch.h"
#ifdef HAVE_STDINT_H
#include <stdint.h>
@ -43,7 +43,7 @@
#include "src/class/pmix_list.h"
#include <pmix_common.h>
#include "include/pmix_common.h"
BEGIN_C_DECLS

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

@ -2,7 +2,7 @@
/*
* Copyright (c) 2012-2016 Cisco Systems, Inc. All rights reserved.
* Copyright (c) 2012 Los Alamos National Security, LLC. All rights reserved
* Copyright (c) 2015-2018 Intel, Inc. All rights reserved.
* Copyright (c) 2015-2020 Intel, Inc. All rights reserved.
* Copyright (c) 2020 IBM Corporation. All rights reserved.
* $COPYRIGHT$
*
@ -11,7 +11,7 @@
* $HEADER$
*/
#include <src/include/pmix_config.h>
#include "src/include/pmix_config.h"
#include <stdio.h>
#include <stddef.h>
@ -22,6 +22,8 @@
static void local_eviction_callback(int fd, short flags, void *arg)
{
(void)fd;
(void)flags;
pmix_hotel_room_eviction_callback_arg_t *eargs =
(pmix_hotel_room_eviction_callback_arg_t*) arg;
void *occupant = eargs->hotel->rooms[eargs->room_num].occupant;

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

@ -2,7 +2,9 @@
/*
* Copyright (c) 2012-2016 Cisco Systems, Inc. All rights reserved.
* Copyright (c) 2012 Los Alamos National Security, LLC. All rights reserved
* Copyright (c) 2015-2019 Intel, Inc. All rights reserved.
* Copyright (c) 2015-2020 Intel, Inc. All rights reserved.
* Copyright (c) 2019 Research Organization for Information Science
* and Technology (RIST). All rights reserved.
* Copyright (c) 2020 IBM Corporation. All rights reserved.
* $COPYRIGHT$
*
@ -53,10 +55,10 @@
#ifndef PMIX_HOTEL_H
#define PMIX_HOTEL_H
#include <src/include/pmix_config.h>
#include "src/include/types.h"
#include "src/include/pmix_config.h"
#include "src/include/prefetch.h"
#include "pmix_common.h"
#include "include/pmix_common.h"
#include "src/include/types.h"
#include "src/class/pmix_object.h"
#include PMIX_EVENT_HEADER
@ -307,7 +309,7 @@ static inline void pmix_hotel_checkout_and_return_occupant(pmix_hotel_t *hotel,
*occupant = room->occupant;
room->occupant = NULL;
if (NULL != hotel->evbase) {
event_del(&(room->eviction_timer_event));
pmix_event_del(&(room->eviction_timer_event));
}
hotel->last_unoccupied_room++;
assert(hotel->last_unoccupied_room < hotel->num_rooms);

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

@ -11,7 +11,7 @@
* Copyright (c) 2004-2005 The Regents of the University of California.
* All rights reserved.
* Copyright (c) 2007 Voltaire All rights reserved.
* Copyright (c) 2013-2015 Intel, Inc. All rights reserved
* Copyright (c) 2013-2020 Intel, Inc. All rights reserved.
* $COPYRIGHT$
*
* Additional copyrights may follow
@ -19,7 +19,7 @@
* $HEADER$
*/
#include <src/include/pmix_config.h>
#include "src/include/pmix_config.h"
#include "include/pmix_common.h"
#include "src/class/pmix_list.h"
@ -143,7 +143,7 @@ bool pmix_list_insert(pmix_list_t *list, pmix_list_item_t *item, long long idx)
#if PMIX_ENABLE_DEBUG
/* Spot check: ensure this item is only on the list that we
just insertted it into */
just inserted it into */
item->pmix_list_item_refcount += 1;
assert(1 == item->pmix_list_item_refcount);

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

@ -13,7 +13,7 @@
* Copyright (c) 2007 Voltaire All rights reserved.
* Copyright (c) 2013 Los Alamos National Security, LLC. All rights
* reserved.
* Copyright (c) 2013-2018 Intel, Inc. All rights reserved.
* Copyright (c) 2013-2020 Intel, Inc. All rights reserved.
* $COPYRIGHT$
*
* Additional copyrights may follow
@ -67,7 +67,7 @@
#ifndef PMIX_LIST_H
#define PMIX_LIST_H
#include <src/include/pmix_config.h>
#include "src/include/pmix_config.h"
#include <stdio.h>
#include <stdlib.h>
#if HAVE_STDBOOL_H
@ -119,6 +119,14 @@ struct pmix_list_item_t
*/
typedef struct pmix_list_item_t pmix_list_item_t;
/* static initializer for pmix_list_t */
#define PMIX_LIST_ITEM_STATIC_INIT \
{ \
.super = PMIX_OBJ_STATIC_INIT(pmix_object_t), \
.pmix_list_next = NULL, \
.pmix_list_prev = NULL, \
.item_free = 0 \
}
/**
* Get the next item in a list.
@ -160,6 +168,15 @@ struct pmix_list_t
*/
typedef struct pmix_list_t pmix_list_t;
/* static initializer for pmix_list_t */
#define PMIX_LIST_STATIC_INIT \
{ \
.super = PMIX_OBJ_STATIC_INIT(pmix_object_t), \
.pmix_list_sentinel = PMIX_LIST_ITEM_STATIC_INIT, \
.pmix_list_length = 0 \
}
/** Cleanly destruct a list
*
* The pmix_list_t destructor doesn't release the items on the

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

@ -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-2017 Intel, Inc. All rights reserved.
* Copyright (c) 2014-2020 Intel, Inc. All rights reserved.
* Copyright (c) 2016 Research Organization for Information Science
* and Technology (RIST). All rights reserved.
* $COPYRIGHT$
@ -25,7 +25,7 @@
* Implementation of pmix_object_t, the base pmix foundation class
*/
#include <src/include/pmix_config.h>
#include "src/include/pmix_config.h"
/* Symbol transforms */

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

@ -11,7 +11,7 @@
* Copyright (c) 2004-2005 The Regents of the University of California.
* All rights reserved.
* Copyright (c) 2007 Cisco Systems, Inc. All rights reserved.
* Copyright (c) 2013-2018 Intel, Inc. All rights reserved.
* Copyright (c) 2013-2020 Intel, Inc. All rights reserved.
* Copyright (c) 2016 Research Organization for Information Science
* and Technology (RIST). All rights reserved.
* $COPYRIGHT$
@ -120,8 +120,8 @@
#ifndef PMIX_OBJECT_H
#define PMIX_OBJECT_H
#include <src/include/pmix_config.h>
#include <pmix_common.h>
#include "src/include/pmix_config.h"
#include "include/pmix_common.h"
#include <assert.h>
#ifdef HAVE_STDLIB_H
@ -175,9 +175,20 @@ PMIX_EXPORT extern int pmix_class_init_epoch;
* @param NAME Name of the class to initialize
*/
#if PMIX_ENABLE_DEBUG
#define PMIX_OBJ_STATIC_INIT(BASE_CLASS) { PMIX_OBJ_MAGIC_ID, PMIX_CLASS(BASE_CLASS), 1, __FILE__, __LINE__ }
#define PMIX_OBJ_STATIC_INIT(BASE_CLASS) \
{ \
.obj_magic_id = PMIX_OBJ_MAGIC_ID, \
.obj_class = PMIX_CLASS(BASE_CLASS), \
.obj_reference_count = 1, \
.cls_init_file_name = __FILE__, \
.cls_init_lineno = __LINE__, \
}
#else
#define PMIX_OBJ_STATIC_INIT(BASE_CLASS) { PMIX_CLASS(BASE_CLASS), 1 }
#define PMIX_OBJ_STATIC_INIT(BASE_CLASS) \
{ \
.obj_class = PMIX_CLASS(BASE_CLASS), \
.obj_reference_count = 1, \
}
#endif
/**

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

@ -10,7 +10,7 @@
* University of Stuttgart. All rights reserved.
* Copyright (c) 2004-2005 The Regents of the University of California.
* All rights reserved.
* Copyright (c) 2017 Intel, Inc. All rights reserved.
* Copyright (c) 2017-2020 Intel, Inc. All rights reserved.
* $COPYRIGHT$
*
* Additional copyrights may follow
@ -19,7 +19,7 @@
*/
#include "pmix_config.h"
#include "pmix_common.h"
#include "include/pmix_common.h"
#include <stdlib.h>
#include <stdio.h>

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

@ -11,7 +11,7 @@
* Copyright (c) 2004-2005 The Regents of the University of California.
* All rights reserved.
* Copyright (c) 2010 Cisco Systems, Inc. All rights reserved.
* Copyright (c) 2016 Intel, Inc. All rights reserved
* Copyright (c) 2016-2020 Intel, Inc. All rights reserved.
* $COPYRIGHT$
*
* Additional copyrights may follow
@ -19,13 +19,13 @@
* $HEADER$
*/
#include <src/include/pmix_config.h>
#include "src/include/pmix_config.h"
#include <stdlib.h>
#include <stdio.h>
#include <assert.h>
#include "pmix_common.h"
#include "include/pmix_common.h"
#include "src/class/pmix_ring_buffer.h"
#include "src/util/output.h"

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

@ -11,7 +11,7 @@
* Copyright (c) 2004-2005 The Regents of the University of California.
* All rights reserved.
* Copyright (c) 2010 Cisco Systems, Inc. All rights reserved.
* Copyright (c) 2016 Intel, Inc. All rights reserved.
* Copyright (c) 2016-2020 Intel, Inc. All rights reserved.
* $COPYRIGHT$
*
* Additional copyrights may follow
@ -25,7 +25,7 @@
#ifndef PMIX_RING_BUFFER_H
#define PMIX_RING_BUFFER_H
#include <src/include/pmix_config.h>
#include "src/include/pmix_config.h"
#include "src/class/pmix_object.h"
#include "src/util/output.h"

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

@ -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) 2016-2017 Intel, Inc. All rights reserved.
* Copyright (c) 2016-2020 Intel, Inc. All rights reserved.
* $COPYRIGHT$
*
* Additional copyrights may follow
@ -17,7 +17,7 @@
* $HEADER$
*/
#include <src/include/pmix_config.h>
#include "src/include/pmix_config.h"
#include "src/class/pmix_value_array.h"

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

@ -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) 2016-2017 Intel, Inc. All rights reserved.
* Copyright (c) 2016-2020 Intel, Inc. All rights reserved.
* $COPYRIGHT$
*
* Additional copyrights may follow
@ -20,7 +20,7 @@
#ifndef PMIX_VALUE_ARRAY_H
#define PMIX_VALUE_ARRAY_H
#include <src/include/pmix_config.h>
#include "src/include/pmix_config.h"
#include <string.h>
#ifdef HAVE_STRINGS_H
@ -31,7 +31,7 @@
#if PMIX_ENABLE_DEBUG
#include "src/util/output.h"
#endif
#include "pmix_common.h"
#include "include/pmix_common.h"
BEGIN_C_DECLS

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

@ -1,9 +1,9 @@
# -*- makefile -*-
#
# Copyright (c) 2014-2017 Intel, Inc. All rights reserved.
# Copyright (c) 2014-2020 Intel, Inc. All rights reserved.
# Copyright (c) 2014 Artem Y. Polyakov <artpol84@gmail.com>.
# All rights reserved.
# Copyright (c) 2016 Cisco Systems, Inc. All rights reserved.
# Copyright (c) 2016 Cisco Systems, Inc. All rights reserved.
# $COPYRIGHT$
#
# Additional copyrights may follow

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

@ -1,6 +1,6 @@
/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil -*- */
/*
* Copyright (c) 2014-2019 Intel, Inc. All rights reserved.
* Copyright (c) 2014-2020 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.
@ -12,12 +12,10 @@
* $HEADER$
*/
#include <src/include/pmix_config.h>
#include "src/include/pmix_config.h"
#include <src/include/types.h>
#include <pmix.h>
#include <pmi.h>
#include "include/pmix.h"
#include "include/pmi.h"
#include "src/include/pmix_globals.h"

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

@ -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) 2015 Research Organization for Information Science
* and Technology (RIST). All rights reserved.
* Copyright (c) 2014-2020 Intel, Inc. All rights reserved.
* Copyright (c) 2015-2019 Research Organization for Information Science
* and Technology (RIST). All rights reserved.
* Copyright (c) 2016 Mellanox Technologies, Inc.
* All rights reserved.
* $COPYRIGHT$
@ -12,9 +12,7 @@
* $HEADER$
*/
#include <src/include/pmix_config.h>
#include <src/include/types.h>
#include "src/include/pmix_config.h"
#ifdef HAVE_STRING_H
#include <string.h>
@ -27,8 +25,8 @@
#endif
#include PMIX_EVENT_HEADER
#include <pmi2.h>
#include <pmix.h>
#include "include/pmi2.h"
#include "include/pmix.h"
#include "src/mca/bfrops/bfrops.h"
#include "src/util/argv.h"

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

@ -1,8 +1,8 @@
/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil -*- */
/*
* 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-2020 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-2017 Mellanox Technologies, Inc.
@ -15,14 +15,12 @@
* $HEADER$
*/
#include <src/include/pmix_config.h>
#include "src/include/pmix_config.h"
#include <src/include/types.h>
#include <src/include/pmix_stdint.h>
#include <src/include/pmix_socket_errno.h>
#include "src/include/pmix_stdint.h"
#include "src/include/pmix_socket_errno.h"
#include <pmix.h>
#include <pmix_rename.h>
#include "include/pmix.h"
#include "src/include/pmix_globals.h"
@ -46,11 +44,8 @@
#include <sys/types.h>
#endif
#if PMIX_HAVE_ZLIB
#include <zlib.h>
#endif
#include PMIX_EVENT_HEADER
#if ! PMIX_HAVE_LIBEV
#ifdef PMIX_EVENT2_THREAD_HEADER
#include PMIX_EVENT2_THREAD_HEADER
#endif
@ -60,7 +55,6 @@ static pmix_status_t pmix_init_result = PMIX_ERR_INIT;
#include "src/class/pmix_list.h"
#include "src/event/pmix_event.h"
#include "src/util/argv.h"
#include "src/util/compress.h"
#include "src/util/error.h"
#include "src/util/hash.h"
#include "src/util/name_fns.h"
@ -69,6 +63,7 @@ static pmix_status_t pmix_init_result = PMIX_ERR_INIT;
#include "src/runtime/pmix_rte.h"
#include "src/threads/threads.h"
#include "src/mca/bfrops/base/base.h"
#include "src/mca/pcompress/base/base.h"
#include "src/mca/gds/base/base.h"
#include "src/mca/preg/preg.h"
#include "src/mca/ptl/base/base.h"
@ -82,7 +77,56 @@ static pmix_status_t pmix_init_result = PMIX_ERR_INIT;
static void _notify_complete(pmix_status_t status, void *cbdata)
{
pmix_event_chain_t *chain = (pmix_event_chain_t*)cbdata;
pmix_notify_caddy_t *cd;
size_t n;
pmix_status_t rc;
PMIX_ACQUIRE_OBJECT(chain);
/* if the event wasn't found, then cache it as it might
* be registered later */
if (PMIX_ERR_NOT_FOUND == status && !chain->cached) {
cd = PMIX_NEW(pmix_notify_caddy_t);
cd->status = chain->status;
PMIX_LOAD_PROCID(&cd->source, chain->source.nspace, chain->source.rank);
cd->range = chain->range;
if (0 < chain->ninfo) {
cd->ninfo = chain->ninfo;
PMIX_INFO_CREATE(cd->info, cd->ninfo);
cd->nondefault = chain->nondefault;
/* need to copy the info */
for (n=0; n < cd->ninfo; n++) {
PMIX_INFO_XFER(&cd->info[n], &chain->info[n]);
}
}
if (NULL != chain->targets) {
cd->ntargets = chain->ntargets;
PMIX_PROC_CREATE(cd->targets, cd->ntargets);
memcpy(cd->targets, chain->targets, cd->ntargets * sizeof(pmix_proc_t));
}
if (NULL != chain->affected) {
cd->naffected = chain->naffected;
PMIX_PROC_CREATE(cd->affected, cd->naffected);
if (NULL == cd->affected) {
cd->naffected = 0;
goto cleanup;
}
memcpy(cd->affected, chain->affected, cd->naffected * sizeof(pmix_proc_t));
}
/* cache it */
pmix_output_verbose(2, pmix_client_globals.event_output,
"%s pmix:client_notify - processing complete, caching",
PMIX_NAME_PRINT(&pmix_globals.myid));
rc = pmix_notify_event_cache(cd);
if (PMIX_SUCCESS != rc) {
PMIX_ERROR_LOG(rc);
PMIX_RELEASE(cd);
goto cleanup;
}
chain->cached = true;
}
cleanup:
PMIX_RELEASE(chain);
}
@ -96,8 +140,9 @@ static void pmix_client_notify_recv(struct pmix_peer_t *peer,
pmix_event_chain_t *chain;
size_t ninfo;
pmix_output_verbose(2, pmix_client_globals.base_output,
"pmix:client_notify_recv - processing event");
pmix_output_verbose(2, pmix_client_globals.event_output,
"%s pmix:client_notify_recv - processing event",
PMIX_NAME_PRINT(&pmix_globals.myid));
/* a zero-byte buffer indicates that this recv is being
* completed due to a lost connection */
@ -175,17 +220,18 @@ static void pmix_client_notify_recv(struct pmix_peer_t *peer,
/* prep the chain for processing */
pmix_prep_event_chain(chain, chain->info, ninfo, false);
pmix_output_verbose(2, pmix_client_globals.base_output,
"[%s:%d] pmix:client_notify_recv - processing event %s, calling errhandler",
pmix_globals.myid.nspace, pmix_globals.myid.rank, PMIx_Error_string(chain->status));
pmix_output_verbose(2, pmix_client_globals.event_output,
"%s pmix:client_notify_recv - processing event %s, calling errhandler",
PMIX_NAME_PRINT(&pmix_globals.myid), PMIx_Error_string(chain->status));
pmix_invoke_local_event_hdlr(chain);
return;
error:
/* we always need to return */
pmix_output_verbose(2, pmix_client_globals.base_output,
"pmix:client_notify_recv - unpack error status =%d, calling def errhandler", rc);
pmix_output_verbose(2, pmix_client_globals.event_output,
"%s pmix:client_notify_recv - unpack error status =%s, calling def errhandler",
PMIX_NAME_PRINT(&pmix_globals.myid), PMIx_Error_string(rc));
chain = PMIX_NEW(pmix_event_chain_t);
if (NULL == chain) {
PMIX_ERROR_LOG(PMIX_ERR_NOMEM);
@ -471,7 +517,7 @@ PMIX_EXPORT pmix_status_t PMIx_Init(pmix_proc_t *proc,
pmix_info_t info[], size_t ninfo)
{
char *evar;
pmix_status_t rc;
pmix_status_t rc = PMIX_SUCCESS;
pmix_cb_t cb;
pmix_buffer_t *req;
pmix_cmd_t cmd = PMIX_REQ_CMD;
@ -484,6 +530,7 @@ PMIX_EXPORT pmix_status_t PMIx_Init(pmix_proc_t *proc,
bool found;
pmix_ptl_posted_recv_t *rcv;
pid_t pid;
pmix_kval_t *kptr;
PMIX_ACQUIRE_THREAD(&pmix_global_lock);
@ -657,7 +704,7 @@ PMIX_EXPORT pmix_status_t PMIx_Init(pmix_proc_t *proc,
found = false;
if (info != NULL) {
for (n=0; n < ninfo; n++) {
if (0 == strncmp(info[n].key, PMIX_GDS_MODULE, PMIX_MAX_KEYLEN)) {
if (PMIX_CHECK_KEY(&info[n], PMIX_GDS_MODULE)) {
PMIX_INFO_LOAD(&ginfo, PMIX_GDS_MODULE, info[n].value.data.string, PMIX_STRING);
found = true;
break;
@ -687,6 +734,7 @@ PMIX_EXPORT pmix_status_t PMIx_Init(pmix_proc_t *proc,
PMIX_RELEASE_THREAD(&pmix_global_lock);
return rc;
}
rc = PMIX_ERR_UNREACH;
} else {
/* connect to the server */
rc = pmix_ptl_base_connect_to_peer((struct pmix_peer_t*)pmix_client_globals.myserver, info, ninfo);
@ -747,7 +795,7 @@ PMIX_EXPORT pmix_status_t PMIx_Init(pmix_proc_t *proc,
PMIX_CONSTRUCT_LOCK(&releaselock);
PMIX_INFO_LOAD(&evinfo[0], PMIX_EVENT_RETURN_OBJECT, &releaselock, PMIX_POINTER);
PMIX_INFO_LOAD(&evinfo[1], PMIX_EVENT_HDLR_NAME, "WAIT-FOR-DEBUGGER", PMIX_STRING);
pmix_output_verbose(2, pmix_client_globals.base_output,
pmix_output_verbose(2, pmix_client_globals.event_output,
"[%s:%d] WAITING IN INIT FOR DEBUGGER",
pmix_globals.myid.nspace, pmix_globals.myid.rank);
PMIx_Register_event_handler(&code, 1, evinfo, 2,
@ -767,7 +815,39 @@ PMIX_EXPORT pmix_status_t PMIx_Init(pmix_proc_t *proc,
if (NULL != info) {
_check_for_notify(info, ninfo);
}
return PMIX_SUCCESS;
/* store our server's ID */
if (NULL != pmix_client_globals.myserver &&
NULL != pmix_client_globals.myserver->info) {
kptr = PMIX_NEW(pmix_kval_t);
kptr->key = strdup(PMIX_SERVER_NSPACE);
PMIX_VALUE_CREATE(kptr->value, 1);
kptr->value->type = PMIX_STRING;
kptr->value->data.string = strdup(pmix_client_globals.myserver->info->pname.nspace);
PMIX_GDS_STORE_KV(rc, pmix_globals.mypeer,
&pmix_globals.myid,
PMIX_INTERNAL, kptr);
if (PMIX_SUCCESS != rc) {
PMIX_ERROR_LOG(rc);
return rc;
}
PMIX_RELEASE(kptr); // maintain accounting
kptr = PMIX_NEW(pmix_kval_t);
kptr->key = strdup(PMIX_SERVER_RANK);
PMIX_VALUE_CREATE(kptr->value, 1);
kptr->value->type = PMIX_PROC_RANK;
kptr->value->data.rank = pmix_client_globals.myserver->info->pname.rank;
PMIX_GDS_STORE_KV(rc, pmix_globals.mypeer,
&pmix_globals.myid,
PMIX_INTERNAL, kptr);
if (PMIX_SUCCESS != rc) {
PMIX_ERROR_LOG(rc);
return rc;
}
PMIX_RELEASE(kptr); // maintain accounting
}
return rc;
}
PMIX_EXPORT int PMIx_Initialized(void)
@ -1051,7 +1131,7 @@ static void _putfn(int sd, short args, void *cbdata)
kv->value = (pmix_value_t*)malloc(sizeof(pmix_value_t));
if (PMIX_STRING_SIZE_CHECK(cb->value)) {
/* compress large strings */
if (pmix_util_compress_string(cb->value->data.string, &tmp, &len)) {
if (pmix_compress.compress_string(cb->value->data.string, &tmp, &len)) {
if (NULL == tmp) {
PMIX_ERROR_LOG(PMIX_ERR_NOMEM);
rc = PMIX_ERR_NOMEM;
@ -1398,12 +1478,22 @@ PMIX_EXPORT pmix_status_t PMIx_Resolve_peers(const char *nodename,
for (n=0; NULL != tmp[n]; n++) {
/* find the nspace delimiter */
prs = strchr(tmp[n], ':');
if (NULL == prs) {
/* should never happen, but silence a Coverity warning */
rc = PMIX_ERR_BAD_PARAM;
pmix_argv_free(tmp);
PMIX_PROC_FREE(pa, np);
*procs = NULL;
*nprocs = 0;
goto done;
}
*prs = '\0';
++prs;
p = pmix_argv_split(prs, ',');
for (m=0; NULL != p[m]; m++) {
PMIX_LOAD_NSPACE(&pa[np].nspace, tmp[n]);
pa[n].rank = strtoul(p[m], NULL, 10);
pa[np].rank = strtoul(p[m], NULL, 10);
++np;
}
pmix_argv_free(p);
}

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

@ -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-2017 Research Organization for Information Science
* and Technology (RIST). All rights reserved.
* Copyright (c) 2014-2020 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.
@ -15,13 +15,11 @@
* $HEADER$
*/
#include <src/include/pmix_config.h>
#include "src/include/pmix_config.h"
#include <src/include/types.h>
#include <src/include/pmix_stdint.h>
#include "src/include/pmix_stdint.h"
#include <pmix.h>
#include <pmix_rename.h>
#include "include/pmix.h"
#include "src/include/pmix_globals.h"
#include "src/mca/gds/base/base.h"

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

@ -1,6 +1,6 @@
/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil -*- */
/*
* Copyright (c) 2014-2019 Intel, Inc. All rights reserved.
* Copyright (c) 2014-2020 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>.
@ -15,13 +15,11 @@
* $HEADER$
*/
#include <src/include/pmix_config.h>
#include "src/include/pmix_config.h"
#include <src/include/types.h>
#include <src/include/pmix_stdint.h>
#include "src/include/pmix_stdint.h"
#include <pmix.h>
#include <pmix_rename.h>
#include "include/pmix.h"
#include "src/include/pmix_globals.h"

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

@ -1,8 +1,8 @@
/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil -*- */
/*
* Copyright (c) 2014-2020 Intel, Inc. All rights reserved.
* Copyright (c) 2014-2016 Research Organization for Information Science
* and Technology (RIST). 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-2018 Mellanox Technologies, Inc.
@ -15,13 +15,11 @@
* $HEADER$
*/
#include <src/include/pmix_config.h>
#include "src/include/pmix_config.h"
#include <src/include/types.h>
#include <src/include/pmix_stdint.h>
#include "src/include/pmix_stdint.h"
#include <pmix.h>
#include <pmix_rename.h>
#include "include/pmix.h"
#include "src/include/pmix_globals.h"
@ -45,17 +43,14 @@
#include <sys/types.h>
#endif
#if PMIX_HAVE_ZLIB
#include <zlib.h>
#endif
#include PMIX_EVENT_HEADER
#include "src/class/pmix_list.h"
#include "src/mca/bfrops/bfrops.h"
#include "src/mca/pcompress/base/base.h"
#include "src/mca/ptl/base/base.h"
#include "src/threads/threads.h"
#include "src/util/argv.h"
#include "src/util/compress.h"
#include "src/util/error.h"
#include "src/util/hash.h"
#include "src/util/name_fns.h"
@ -65,7 +60,7 @@
#include "pmix_client_ops.h"
static pmix_buffer_t* _pack_get(char *nspace, pmix_rank_t rank,
static pmix_buffer_t* _pack_get(char *nspace, pmix_rank_t rank, char *key,
const pmix_info_t info[], size_t ninfo,
pmix_cmd_t cmd);
@ -136,11 +131,13 @@ PMIX_EXPORT pmix_status_t PMIx_Get_nb(const pmix_proc_t *proc, const pmix_key_t
pmix_status_t rc;
size_t n, nfo;
bool wantinfo = false;
bool haveid = false;
char *hostname = NULL;
uint32_t nodeid = UINT32_MAX;
uint32_t appnum = UINT32_MAX;
uint32_t app;
pmix_proc_t p;
pmix_info_t *iptr;
bool copy = false;
uint32_t appnum;
pmix_value_t *ival = NULL;
PMIX_ACQUIRE_THREAD(&pmix_global_lock);
@ -151,6 +148,11 @@ PMIX_EXPORT pmix_status_t PMIx_Get_nb(const pmix_proc_t *proc, const pmix_key_t
}
PMIX_RELEASE_THREAD(&pmix_global_lock);
if (NULL == cbfunc) {
/* no way to return the result! */
return PMIX_ERR_BAD_PARAM;
}
/* if the proc is NULL, then the caller is assuming
* that the key is universally unique within the caller's
* own nspace. This most likely indicates that the code
@ -200,15 +202,29 @@ PMIX_EXPORT pmix_status_t PMIx_Get_nb(const pmix_proc_t *proc, const pmix_key_t
PMIX_NAME_PRINT(&p), (NULL == key) ? "NULL" : key);
if (!PMIX_PEER_IS_EARLIER(pmix_client_globals.myserver, 3, 1, 5)) {
/* ]don't consider the fastpath option
/* don't consider the fastpath option
* for undefined rank or NULL keys */
if (PMIX_RANK_UNDEF == p.rank || NULL == key) {
goto doget;
}
/* if they are asking about a node-level piece of info,
* then the rank must be UNDEF */
/* if they passed our nspace and an INVALID rank, and are asking
* for PMIX_RANK, then they are asking for our process rank */
if (PMIX_RANK_INVALID == p.rank &&
PMIX_CHECK_NSPACE(p.nspace, pmix_globals.myid.nspace) &&
NULL != key && 0 == strcmp(key, PMIX_RANK)) {
PMIX_VALUE_CREATE(ival, 1);
if (NULL == ival) {
return PMIX_ERR_NOMEM;
}
ival->type = PMIX_PROC_RANK;
ival->data.rank = pmix_globals.myid.rank;
cbfunc(PMIX_SUCCESS, ival, cbdata);
/* ownership of the memory in ival is passed to the
* user in the cbfunc, so don't release it here */
return PMIX_SUCCESS;
}
/* see if they are asking about a node-level piece of info */
if (pmix_check_node_info(key)) {
p.rank = PMIX_RANK_UNDEF;
/* the key is node-related - see if the target node is in the
* info array and if they tagged the request accordingly */
if (NULL != info) {
@ -216,26 +232,55 @@ PMIX_EXPORT pmix_status_t PMIx_Get_nb(const pmix_proc_t *proc, const pmix_key_t
if (PMIX_CHECK_KEY(&info[n], PMIX_NODE_INFO)) {
wantinfo = true;
} else if (PMIX_CHECK_KEY(&info[n], PMIX_HOSTNAME)) {
haveid = true;
hostname = info[n].value.data.string;
} else if (PMIX_CHECK_KEY(&info[n], PMIX_NODEID)) {
haveid = true;
PMIX_VALUE_GET_NUMBER(rc, &info[n].value, nodeid, uint32_t);
if (PMIX_SUCCESS != rc) {
PMIX_ERROR_LOG(rc);
return rc;
}
}
}
}
if (wantinfo && haveid) {
if (PMIX_PEER_IS_EARLIER(pmix_client_globals.myserver, 3, 2, PMIX_RELEASE_WILDCARD)) {
p.rank = PMIX_RANK_UNDEF;
/* see if they told us to get node info */
if (!wantinfo) {
/* guess not - better do it */
nfo = ninfo + 1;
PMIX_INFO_CREATE(iptr, nfo);
for (n=0; n < ninfo; n++) {
PMIX_INFO_XFER(&iptr[n], &info[n]);
}
PMIX_INFO_LOAD(&iptr[ninfo], PMIX_NODE_INFO, NULL, PMIX_BOOL);
copy = true;
p.rank = PMIX_RANK_UNDEF;
goto doget;
}
goto doget;
}
if (wantinfo && (NULL != hostname || UINT32_MAX != nodeid)) {
/* they provided the "node-info" attribute. if they also
* specified the target node and it is NOT us, then dstore cannot
* resolve it and we need the rank to be undefined */
if ((NULL != hostname && 0 == strcmp(hostname, pmix_globals.hostname)) ||
nodeid == pmix_globals.nodeid) {
goto fastpath;
}
p.rank = PMIX_RANK_UNDEF;
goto doget;
} else if (wantinfo) {
/* missing the nodeid/hostname - add our hostname */
nfo = ninfo + 1;
PMIX_INFO_CREATE(iptr, nfo);
for (n=0; n < ninfo; n++) {
PMIX_INFO_XFER(&iptr[n], &info[n]);
/* they provided "node-info" but are missing the nodeid/hostname - assume
* they are asking for info about our node. The dstore would have that */
goto fastpath;
} else if (NULL != hostname) {
/* they did not provide the "node-info" attribute but did specify
* a hostname - if the ID is other than us, then we just need to
* flag it as "node-info" and mark it for the undefined rank so
* the GDS will know where to look */
if (0 == strcmp(hostname, pmix_globals.hostname)) {
goto fastpath;
}
PMIX_INFO_LOAD(&iptr[ninfo], PMIX_HOSTNAME, pmix_globals.hostname, PMIX_STRING);
copy = true;
goto doget;
} else if (haveid) {
/* flag that we want node info */
nfo = ninfo + 1;
PMIX_INFO_CREATE(iptr, nfo);
for (n=0; n < ninfo; n++) {
@ -243,26 +288,35 @@ PMIX_EXPORT pmix_status_t PMIx_Get_nb(const pmix_proc_t *proc, const pmix_key_t
}
PMIX_INFO_LOAD(&iptr[ninfo], PMIX_NODE_INFO, NULL, PMIX_BOOL);
copy = true;
p.rank = PMIX_RANK_UNDEF;
goto doget;
} else if (UINT32_MAX != nodeid) {
/* they did not provide the "node-info" attribute but did specify
* the nodeid - if the ID is other than us, then we just need to
* flag it as "node-info" and mark it for the undefined rank so
* the GDS will know where to look */
if (nodeid == pmix_globals.nodeid) {
goto fastpath;
}
nfo = ninfo + 1;
PMIX_INFO_CREATE(iptr, nfo);
for (n=0; n < ninfo; n++) {
PMIX_INFO_XFER(&iptr[n], &info[n]);
}
PMIX_INFO_LOAD(&iptr[ninfo], PMIX_NODE_INFO, NULL, PMIX_BOOL);
copy = true;
p.rank = PMIX_RANK_UNDEF;
goto doget;
} else {
/* missing both */
nfo = ninfo + 2;
PMIX_INFO_CREATE(iptr, nfo);
for (n=0; n < ninfo; n++) {
PMIX_INFO_XFER(&iptr[n], &info[n]);
}
PMIX_INFO_LOAD(&iptr[ninfo], PMIX_NODE_INFO, NULL, PMIX_BOOL);
PMIX_INFO_LOAD(&iptr[ninfo+1], PMIX_HOSTNAME, pmix_globals.hostname, PMIX_STRING);
copy = true;
goto doget;
/* nothing was given, so assume this is about our node and
* pass it along */
goto fastpath;
}
}
/* see if they are asking about an app-level piece of info */
wantinfo = false;
haveid = false;
if (pmix_check_app_info(key)) {
p.rank = PMIX_RANK_UNDEF;
/* the key is app-related - see if the target appnum is in the
* info array and if they tagged the request accordingly */
if (NULL != info) {
@ -271,32 +325,68 @@ PMIX_EXPORT pmix_status_t PMIx_Get_nb(const pmix_proc_t *proc, const pmix_key_t
wantinfo = true;
} else if (PMIX_CHECK_KEY(&info[n], PMIX_APPNUM) &&
0 != info[n].value.data.uint32) {
haveid = true;
PMIX_VALUE_GET_NUMBER(rc, &info[n].value, appnum, uint32_t);
if (PMIX_SUCCESS != rc) {
PMIX_ERROR_LOG(rc);
return rc;
}
}
}
}
if (wantinfo && haveid) {
if (PMIX_PEER_IS_EARLIER(pmix_client_globals.myserver, 3, 2, PMIX_RELEASE_WILDCARD)) {
p.rank = PMIX_RANK_UNDEF;
/* see if they told us to get app info */
if (!wantinfo) {
/* guess not - better do it */
nfo = ninfo + 1;
PMIX_INFO_CREATE(iptr, nfo);
for (n=0; n < ninfo; n++) {
PMIX_INFO_XFER(&iptr[n], &info[n]);
}
PMIX_INFO_LOAD(&iptr[ninfo], PMIX_APP_INFO, NULL, PMIX_BOOL);
copy = true;
p.rank = PMIX_RANK_UNDEF;
goto doget;
}
goto doget;
}
if (wantinfo && UINT32_MAX != appnum) {
/* asked for app-level info and provided an appnum - if it
* isn't our appnum, then we need to redirect */
rc = _getfn_fastpath(&pmix_globals.myid, PMIX_APPNUM, NULL, 0, &ival);
if (PMIX_SUCCESS == rc) {
PMIX_VALUE_GET_NUMBER(rc, ival, app, uint32_t);
if (PMIX_SUCCESS != rc) {
PMIX_ERROR_LOG(rc);
return rc;
}
PMIX_VALUE_RELEASE(ival);
if (app == appnum) {
goto fastpath;
}
}
p.rank = PMIX_RANK_UNDEF;
goto doget;
} else if (wantinfo) {
/* missing the appnum - add ours */
nfo = ninfo + 1;
PMIX_INFO_CREATE(iptr, nfo);
for (n=0; n < ninfo; n++) {
PMIX_INFO_XFER(&iptr[n], &info[n]);
}
/* try to retrieve it */
/* missing the appnum - assume it is ours */
goto fastpath;
} else if (UINT32_MAX != appnum) {
/* they did not provide the "app-info" attribute but did specify
* the appnum - if the ID is other than us, then we just need to
* flag it as "app-info" and mark it for the undefined rank so
* the GDS will know where to look */
rc = _getfn_fastpath(&pmix_globals.myid, PMIX_APPNUM, NULL, 0, &ival);
if (PMIX_SUCCESS != rc) {
appnum = ival->data.uint32;
if (PMIX_SUCCESS == rc) {
PMIX_VALUE_GET_NUMBER(rc, ival, app, uint32_t);
if (PMIX_SUCCESS != rc) {
PMIX_ERROR_LOG(rc);
return rc;
}
PMIX_VALUE_RELEASE(ival);
} else {
appnum = 0;
if (app == appnum) {
goto fastpath;
}
}
PMIX_INFO_LOAD(&iptr[ninfo], PMIX_APPNUM, &appnum, PMIX_UINT32);
copy = true;
goto doget;
} else if (haveid) {
/* flag that we want app info */
nfo = ninfo + 1;
PMIX_INFO_CREATE(iptr, nfo);
for (n=0; n < ninfo; n++) {
@ -304,44 +394,29 @@ PMIX_EXPORT pmix_status_t PMIx_Get_nb(const pmix_proc_t *proc, const pmix_key_t
}
PMIX_INFO_LOAD(&iptr[ninfo], PMIX_APP_INFO, NULL, PMIX_BOOL);
copy = true;
p.rank = PMIX_RANK_UNDEF;
goto doget;
} else {
/* missing both */
nfo = ninfo + 2;
PMIX_INFO_CREATE(iptr, nfo);
for (n=0; n < ninfo; n++) {
PMIX_INFO_XFER(&iptr[n], &info[n]);
}
PMIX_INFO_LOAD(&iptr[ninfo], PMIX_APP_INFO, NULL, PMIX_BOOL);
/* try to retrieve it */
rc = _getfn_fastpath(&pmix_globals.myid, PMIX_APPNUM, NULL, 0, &ival);
if (PMIX_SUCCESS != rc) {
appnum = ival->data.uint32;
PMIX_VALUE_RELEASE(ival);
} else {
appnum = 0;
}
PMIX_INFO_LOAD(&iptr[ninfo], PMIX_APPNUM, &appnum, PMIX_UINT32);
copy = true;
goto doget;
/* missing both - all we can do is assume they want our info */
goto fastpath;
}
}
/* see if they are requesting session info or requesting cache refresh */
for (n=0; n < ninfo; n++) {
if (PMIX_CHECK_KEY(info, PMIX_SESSION_INFO)) {
if (PMIX_CHECK_KEY(info, PMIX_SESSION_INFO) ||
PMIX_CHECK_KEY(info, PMIX_GET_REFRESH_CACHE)) {
goto doget;
}
}
}
fastpath:
/* try to get data directly, without threadshift */
if (PMIX_SUCCESS == (rc = _getfn_fastpath(&p, key, iptr, nfo, &ival))) {
if (NULL != cbfunc) {
cbfunc(rc, ival, cbdata);
/* ownership of the memory in ival is passed to the
* user in the cbfunc, so don't release it here */
}
cbfunc(rc, ival, cbdata);
/* ownership of the memory in ival is passed to the
* user in the cbfunc, so don't release it here */
return rc;
}
@ -379,7 +454,7 @@ static void _value_cbfunc(pmix_status_t status, pmix_value_t *kv, void *cbdata)
PMIX_WAKEUP_THREAD(&cb->lock);
}
static pmix_buffer_t* _pack_get(char *nspace, pmix_rank_t rank,
static pmix_buffer_t* _pack_get(char *nspace, pmix_rank_t rank, char *key,
const pmix_info_t info[], size_t ninfo,
pmix_cmd_t cmd)
{
@ -429,6 +504,17 @@ static pmix_buffer_t* _pack_get(char *nspace, pmix_rank_t rank,
return NULL;
}
}
if (NULL != key) {
/* pack the key */
PMIX_BFROPS_PACK(rc, pmix_client_globals.myserver,
msg, &key, 1, PMIX_STRING);
if (PMIX_SUCCESS != rc) {
PMIX_ERROR_LOG(rc);
PMIX_RELEASE(msg);
return NULL;
}
}
return msg;
}
@ -541,19 +627,6 @@ static void _getnb_cbfunc(struct pmix_peer_t *pr,
}
}
static void timeout(int fd, short flags, void *cbdata)
{
pmix_cb_t *cb = (pmix_cb_t*)cbdata;
/* let them know that we timed out */
cb->cbfunc.valuefn(PMIX_ERR_TIMEOUT, NULL, cb->cbdata);
cb->timer_running = false;
/* remove this request */
pmix_list_remove_item(&pmix_client_globals.pending_requests, &cb->super);
PMIX_RELEASE(cb);
}
static pmix_status_t process_values(pmix_value_t **v, pmix_cb_t *cb)
{
pmix_list_t *kvs = &cb->kvs;
@ -602,113 +675,43 @@ static pmix_status_t process_values(pmix_value_t **v, pmix_cb_t *cb)
return PMIX_SUCCESS;
}
static void infocb(pmix_status_t status,
pmix_info_t *info, size_t ninfo,
void *cbdata,
pmix_release_cbfunc_t release_fn,
void *release_cbdata)
{
pmix_query_caddy_t *cd = (pmix_query_caddy_t*)cbdata;
pmix_value_t *kv = NULL;
pmix_status_t rc;
if (PMIX_SUCCESS == status) {
if (NULL != info) {
/* there should be only one returned value */
if (1 != ninfo) {
rc = PMIX_ERR_INVALID_VAL;
} else {
PMIX_VALUE_CREATE(kv, 1);
if (NULL == kv) {
rc = PMIX_ERR_NOMEM;
} else {
/* if this is a compressed string, then uncompress it */
if (PMIX_COMPRESSED_STRING == info[0].value.type) {
kv->type = PMIX_STRING;
pmix_util_uncompress_string(&kv->data.string, (uint8_t*)info[0].value.data.bo.bytes, info[0].value.data.bo.size);
if (NULL == kv->data.string) {
PMIX_ERROR_LOG(PMIX_ERR_NOMEM);
rc = PMIX_ERR_NOMEM;
PMIX_VALUE_FREE(kv, 1);
kv = NULL;
} else {
rc = PMIX_SUCCESS;
}
} else {
rc = pmix_value_xfer(kv, &info[0].value);
}
}
}
} else {
rc = PMIX_ERR_NOT_FOUND;
}
} else {
rc = status;
}
if (NULL != cd->valcbfunc) {
cd->valcbfunc(rc, kv, cd->cbdata);
}
PMIX_RELEASE(cd);
if (NULL != kv) {
PMIX_VALUE_FREE(kv, 1);
}
if (NULL != release_fn) {
release_fn(release_cbdata);
}
}
static pmix_status_t _getfn_fastpath(const pmix_proc_t *proc, const pmix_key_t key,
const pmix_info_t info[], size_t ninfo,
pmix_value_t **val)
{
pmix_cb_t *cb = PMIX_NEW(pmix_cb_t);
pmix_cb_t cb;
pmix_status_t rc = PMIX_SUCCESS;
size_t n;
/* scan the incoming directives */
if (NULL != info) {
for (n=0; n < ninfo; n++) {
if (PMIX_CHECK_KEY(&info[n], PMIX_DATA_SCOPE)) {
cb->scope = info[n].value.data.scope;
} 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;
}
}
}
cb->proc = (pmix_proc_t*)proc;
cb->copy = true;
cb->key = (char*)key;
cb->info = (pmix_info_t*)info;
cb->ninfo = ninfo;
PMIX_CONSTRUCT(&cb, pmix_cb_t);
cb.proc = (pmix_proc_t*)proc;
cb.copy = true;
cb.key = (char*)key;
cb.info = (pmix_info_t*)info;
cb.ninfo = ninfo;
PMIX_GDS_FETCH_IS_TSAFE(rc, pmix_client_globals.myserver);
if (PMIX_SUCCESS == rc) {
PMIX_GDS_FETCH_KV(rc, pmix_client_globals.myserver, cb);
PMIX_GDS_FETCH_KV(rc, pmix_client_globals.myserver, &cb);
if (PMIX_SUCCESS == rc) {
goto done;
}
}
PMIX_GDS_FETCH_IS_TSAFE(rc, pmix_globals.mypeer);
if (PMIX_SUCCESS == rc) {
PMIX_GDS_FETCH_KV(rc, pmix_globals.mypeer, cb);
PMIX_GDS_FETCH_KV(rc, pmix_globals.mypeer, &cb);
if (PMIX_SUCCESS == rc) {
goto done;
}
}
PMIX_RELEASE(cb);
PMIX_DESTRUCT(&cb);
return rc;
done:
rc = process_values(val, cb);
rc = process_values(val, &cb);
if (NULL != *val) {
PMIX_VALUE_COMPRESSED_STRING_UNPACK(*val);
}
PMIX_RELEASE(cb);
PMIX_DESTRUCT(&cb);
return rc;
}
@ -722,17 +725,14 @@ static void _getnbfn(int fd, short flags, void *cbdata)
size_t n;
pmix_proc_t proc;
bool optional = false;
bool immediate = false;
bool internal_only = false;
struct timeval tv;
pmix_query_caddy_t *cd;
/* cb was passed to us from another thread - acquire it */
PMIX_ACQUIRE_OBJECT(cb);
/* set the proc object identifier */
pmix_strncpy(proc.nspace, cb->pname.nspace, PMIX_MAX_NSLEN);
proc.rank = cb->pname.rank;
PMIX_LOAD_PROCID(&proc, cb->pname.nspace, cb->pname.rank);
cb->proc = &proc;
pmix_output_verbose(2, pmix_client_globals.get_output,
"pmix: getnbfn value for proc %s key %s",
@ -744,25 +744,15 @@ static void _getnbfn(int fd, short flags, void *cbdata)
for (n=0; n < cb->ninfo; n++) {
if (PMIX_CHECK_KEY(&cb->info[n], PMIX_OPTIONAL)) {
optional = PMIX_INFO_TRUE(&cb->info[n]);
} else if (PMIX_CHECK_KEY(&cb->info[n], PMIX_IMMEDIATE)) {
immediate = PMIX_INFO_TRUE(&cb->info[n]);
} 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) {
tv.tv_sec = cb->info[n].value.data.integer;
tv.tv_usec = 0;
pmix_event_evtimer_set(pmix_globals.evbase, &cb->ev,
timeout, cb);
pmix_event_evtimer_add(&cb->ev, &tv);
cb->timer_running = true;
}
} 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_NODE_INFO) ||
PMIX_CHECK_KEY(&cb->info[n], PMIX_APP_INFO) ||
PMIX_CHECK_KEY(&cb->info[n], PMIX_SESSION_INFO)) {
internal_only = true;
} else if (PMIX_CHECK_KEY(&cb->info[n], PMIX_GET_REFRESH_CACHE)) {
/* immediately query the server */
goto request;
}
}
}
@ -792,7 +782,7 @@ static void _getnbfn(int fd, short flags, void *cbdata)
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;
rc = PMIX_ERR_NOT_FOUND;
}
if (PMIX_SUCCESS != rc) {
pmix_output_verbose(5, pmix_client_globals.get_output,
@ -806,31 +796,10 @@ static void _getnbfn(int fd, short flags, void *cbdata)
proc.rank = PMIX_RANK_WILDCARD;
goto request;
} else if (NULL != cb->key) {
/* if immediate was given, then we are being directed to
* check with the server even though the caller is looking for
* job-level info. In some cases, a server may elect not
* to provide info at init to save memory */
if (immediate) {
pmix_output_verbose(5, pmix_client_globals.get_output,
"pmix:client IMMEDIATE given - querying data");
/* the direct modex request doesn't pass a key as it
* was intended to support non-job-level information.
* So instead, we will use the PMIx_Query function
* to request the information */
cd = PMIX_NEW(pmix_query_caddy_t);
cd->cbdata = cb->cbdata;
cd->valcbfunc = cb->cbfunc.valuefn;
PMIX_QUERY_CREATE(cd->queries, 1);
cd->nqueries = 1;
pmix_argv_append_nosize(&cd->queries[0].keys, cb->key);
if (PMIX_SUCCESS != (rc = PMIx_Query_info_nb(cd->queries, 1, infocb, cd))) {
PMIX_RELEASE(cd);
goto respond;
}
PMIX_RELEASE(cb);
return;
}
/* we should have had this info, so respond with the error */
/* => cb->key starts with pmix
* we should have had this info, so respond with the error - if
* they want us to check with the server, they should ask us to
* refresh the cache */
pmix_output_verbose(5, pmix_client_globals.get_output,
"pmix:client returning NOT FOUND error");
goto respond;
@ -841,7 +810,7 @@ static void _getnbfn(int fd, short flags, void *cbdata)
}
}
pmix_output_verbose(5, pmix_client_globals.get_output,
"pmix:client job-level data NOT found");
"pmix:client job-level data found");
rc = process_values(&val, cb);
goto respond;
} else if (PMIX_RANK_UNDEF == proc.rank) {
@ -864,6 +833,9 @@ static void _getnbfn(int fd, short flags, void *cbdata)
}
/* return whatever we found */
rc = process_values(&val, cb);
if (PMIX_SUCCESS != rc) {
goto request;
}
}
respond:
@ -913,11 +885,11 @@ static void _getnbfn(int fd, short flags, void *cbdata)
}
}
/* 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(cb->pname.nspace, proc.rank, cb->info, cb->ninfo, PMIX_GETNB_CMD);
/* we don't have a pending request, so let's create one */
msg = _pack_get(cb->proc->nspace, proc.rank, cb->key, cb->info, cb->ninfo, PMIX_GETNB_CMD);
if (NULL == msg) {
rc = PMIX_ERROR;
PMIX_ERROR_LOG(rc);
goto respond;
}

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

@ -1,5 +1,5 @@
/*
* Copyright (c) 2015-2019 Intel, Inc. All rights reserved.
* Copyright (c) 2015-2020 Intel, Inc. All rights reserved.
* $COPYRIGHT$
*
* Additional copyrights may follow
@ -10,7 +10,7 @@
#ifndef PMIX_CLIENT_OPS_H
#define PMIX_CLIENT_OPS_H
#include <src/include/pmix_config.h>
#include "src/include/pmix_config.h"
#include "src/threads/threads.h"

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

@ -1,6 +1,6 @@
/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil -*- */
/*
* Copyright (c) 2014-2019 Intel, Inc. All rights reserved.
* Copyright (c) 2014-2020 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>.
@ -15,13 +15,11 @@
* $HEADER$
*/
#include <src/include/pmix_config.h>
#include "src/include/pmix_config.h"
#include <src/include/types.h>
#include <src/include/pmix_stdint.h>
#include "src/include/pmix_stdint.h"
#include <pmix.h>
#include <pmix_rename.h>
#include "include/pmix.h"
#include "src/include/pmix_globals.h"

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

@ -1,8 +1,8 @@
/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil -*- */
/*
* Copyright (c) 2014-2019 Intel, Inc. All rights reserved.
* Copyright (c) 2014-2017 Research Organization for Information Science
* and Technology (RIST). All rights reserved.
* Copyright (c) 2014-2020 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.
@ -15,13 +15,11 @@
* $HEADER$
*/
#include <src/include/pmix_config.h>
#include "src/include/pmix_config.h"
#include <src/include/types.h>
#include <src/include/pmix_stdint.h>
#include "src/include/pmix_stdint.h"
#include <pmix.h>
#include <pmix_rename.h>
#include "include/pmix.h"
#include "src/include/pmix_globals.h"
@ -52,7 +50,9 @@
#include "src/mca/pnet/base/base.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"
#include "src/mca/gds/gds.h"
#include "src/mca/ptl/ptl.h"
@ -64,16 +64,17 @@ static void wait_cbfunc(struct pmix_peer_t *pr,
static void spawn_cbfunc(pmix_status_t status, char nspace[], void *cbdata);
PMIX_EXPORT pmix_status_t PMIx_Spawn(const pmix_info_t job_info[], size_t ninfo,
const pmix_app_t apps[], size_t napps,
pmix_nspace_t nspace)
const pmix_app_t apps[], size_t napps,
pmix_nspace_t nspace)
{
pmix_status_t rc;
pmix_cb_t *cb;
PMIX_ACQUIRE_THREAD(&pmix_global_lock);
pmix_output_verbose(2, pmix_globals.debug_output,
"pmix: spawn called");
pmix_output_verbose(2, pmix_client_globals.spawn_output,
"%s pmix: spawn called",
PMIX_NAME_PRINT(&pmix_globals.myid));
if (pmix_globals.init_cntr <= 0) {
PMIX_RELEASE_THREAD(&pmix_global_lock);
@ -97,6 +98,12 @@ PMIX_EXPORT pmix_status_t PMIx_Spawn(const pmix_info_t job_info[], size_t ninfo,
cb = PMIX_NEW(pmix_cb_t);
if (PMIX_SUCCESS != (rc = PMIx_Spawn_nb(job_info, ninfo, apps, napps, spawn_cbfunc, cb))) {
/* note: the call may have returned PMIX_OPERATION_SUCCEEDED thus indicating
* that the spawn was atomically completed */
if (PMIX_OPERATION_SUCCEEDED == rc) {
PMIX_LOAD_NSPACE(nspace, cb->pname.nspace);
rc = PMIX_SUCCESS;
}
PMIX_RELEASE(cb);
return rc;
}
@ -122,15 +129,12 @@ PMIX_EXPORT pmix_status_t PMIx_Spawn_nb(const pmix_info_t job_info[], size_t nin
pmix_cb_t *cb;
size_t n, m;
pmix_app_t *aptr;
bool jobenvars = false;
char *harvest[2] = {"PMIX_MCA_", NULL};
pmix_kval_t *kv;
pmix_list_t ilist;
PMIX_ACQUIRE_THREAD(&pmix_global_lock);
pmix_output_verbose(2, pmix_globals.debug_output,
"pmix: spawn called");
pmix_output_verbose(2, pmix_client_globals.spawn_output,
"%s pmix: spawn_nb called",
PMIX_NAME_PRINT(&pmix_globals.myid));
if (pmix_globals.init_cntr <= 0) {
PMIX_RELEASE_THREAD(&pmix_global_lock);
@ -144,32 +148,6 @@ PMIX_EXPORT pmix_status_t PMIx_Spawn_nb(const pmix_info_t job_info[], size_t nin
}
PMIX_RELEASE_THREAD(&pmix_global_lock);
/* check job info for directives */
if (NULL != job_info) {
for (n=0; n < ninfo; n++) {
if (PMIX_CHECK_KEY(&job_info[n], PMIX_SETUP_APP_ENVARS)) {
PMIX_CONSTRUCT(&ilist, pmix_list_t);
rc = pmix_pnet_base_harvest_envars(harvest, NULL, &ilist);
if (PMIX_SUCCESS != rc) {
PMIX_LIST_DESTRUCT(&ilist);
return rc;
}
PMIX_LIST_FOREACH(kv, &ilist, pmix_kval_t) {
/* cycle across all the apps and set this envar */
for (m=0; m < napps; m++) {
aptr = (pmix_app_t*)&apps[m];
pmix_setenv(kv->value->data.envar.envar,
kv->value->data.envar.value,
true, &aptr->env);
}
}
jobenvars = true;
PMIX_LIST_DESTRUCT(&ilist);
break;
}
}
}
for (n=0; n < napps; n++) {
/* do a quick check of the apps directive array to ensure
* the ninfo field has been set */
@ -186,26 +164,6 @@ PMIX_EXPORT pmix_status_t PMIx_Spawn_nb(const pmix_info_t job_info[], size_t nin
}
aptr->ninfo = m;
}
if (!jobenvars) {
for (m=0; m < aptr->ninfo; m++) {
if (PMIX_CHECK_KEY(&aptr->info[m], PMIX_SETUP_APP_ENVARS)) {
PMIX_CONSTRUCT(&ilist, pmix_list_t);
rc = pmix_pnet_base_harvest_envars(harvest, NULL, &ilist);
if (PMIX_SUCCESS != rc) {
PMIX_LIST_DESTRUCT(&ilist);
return rc;
}
PMIX_LIST_FOREACH(kv, &ilist, pmix_kval_t) {
pmix_setenv(kv->value->data.envar.envar,
kv->value->data.envar.value,
true, &aptr->env);
}
jobenvars = true;
PMIX_LIST_DESTRUCT(&ilist);
break;
}
}
}
}
msg = PMIX_NEW(pmix_buffer_t);
@ -330,6 +288,7 @@ static void wait_cbfunc(struct pmix_peer_t *pr,
/* extract and process any job-related info for this nspace */
if (PMIX_SUCCESS != rc) {
PMIX_ERROR_LOG(rc);
ret = rc;
}
}

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

@ -1,6 +1,6 @@
# -*- makefile -*-
#
# Copyright (c) 2015-2018 Intel, Inc. All rights reserved.
# Copyright (c) 2015-2019 Intel, Inc. All rights reserved.
# Copyright (c) 2016 Cisco Systems, Inc. All rights reserved.
# $COPYRIGHT$
#

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

@ -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-2020 Intel, Inc. All rights reserved.
* Copyright (c) 2016 Mellanox Technologies, Inc.
* All rights reserved.
* Copyright (c) 2016 IBM Corporation. All rights reserved.
@ -12,16 +12,14 @@
*
* $HEADER$
*/
#include <src/include/pmix_config.h>
#include "src/include/pmix_config.h"
#include <src/include/types.h>
#include <src/include/pmix_stdint.h>
#include <src/include/pmix_socket_errno.h>
#include "src/include/pmix_stdint.h"
#include "src/include/pmix_socket_errno.h"
#include <pmix.h>
#include <pmix_common.h>
#include <pmix_server.h>
#include <pmix_rename.h>
#include "include/pmix.h"
#include "include/pmix_common.h"
#include "include/pmix_server.h"
#include "src/threads/threads.h"
#include "src/util/argv.h"
@ -120,7 +118,16 @@ static void acb(pmix_status_t status,
void *release_cbdata)
{
pmix_cb_t *cb = (pmix_cb_t*)cbdata;
size_t n;
cb->status = status;
if (0 < ninfo) {
PMIX_INFO_CREATE(cb->info, ninfo);
cb->ninfo = ninfo;
for (n=0; n < ninfo; n++) {
PMIX_INFO_XFER(&cb->info[n], &info[n]);
}
}
if (NULL != release_fn) {
release_fn(release_cbdata);
}
@ -366,7 +373,7 @@ PMIX_EXPORT pmix_status_t PMIx_Process_monitor_nb(const pmix_info_t *monitor, pm
PMIX_RELEASE_THREAD(&pmix_global_lock);
/* if the monitor is PMIX_SEND_HEARTBEAT, then send it */
if (0 == strncmp(monitor->key, PMIX_SEND_HEARTBEAT, PMIX_MAX_KEYLEN)) {
if (PMIX_CHECK_KEY(monitor, PMIX_SEND_HEARTBEAT)) {
msg = PMIX_NEW(pmix_buffer_t);
if (NULL == msg) {
return PMIX_ERR_NOMEM;

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

@ -11,7 +11,7 @@
* All rights reserved.
* Copyright (c) 2007-2012 Los Alamos National Security, LLC.
* All rights reserved.
* Copyright (c) 2014-2019 Intel, Inc. All rights reserved.
* Copyright (c) 2014-2020 Intel, Inc. All rights reserved.
* $COPYRIGHT$
*
* Additional copyrights may follow
@ -19,7 +19,7 @@
* $HEADER$
*/
#include <src/include/pmix_config.h>
#include "src/include/pmix_config.h"
#ifdef HAVE_STRING_H
@ -31,8 +31,7 @@
#include <stdlib.h>
#endif
#include <pmix.h>
#include <pmix_rename.h>
#include "include/pmix.h"
#include "src/mca/bfrops/bfrops.h"
#include "src/include/pmix_globals.h"
@ -88,7 +87,7 @@ static pmix_peer_t* find_peer(const pmix_proc_t *proc)
if (PMIX_PEER_IS_SERVER(pmix_globals.mypeer)) {
/* see if we know this proc */
for (i=0; i < pmix_server_globals.clients.size; i++) {
if (NULL != (peer = (pmix_peer_t*)pmix_pointer_array_get_item(&pmix_server_globals.clients, i))) {
if (NULL == (peer = (pmix_peer_t*)pmix_pointer_array_get_item(&pmix_server_globals.clients, i))) {
continue;
}
if (0 == strncmp(proc->nspace, peer->nptr->nspace, PMIX_MAX_NSLEN)) {
@ -180,7 +179,7 @@ PMIX_EXPORT pmix_status_t PMIx_Data_pack(const pmix_proc_t *target,
pmix_peer_t *peer;
if (NULL == (peer = find_peer(target))) {
return PMIX_ERR_NOT_SUPPORTED;
return PMIX_ERR_NOT_FOUND;
}
/* setup the host */
@ -211,7 +210,7 @@ PMIX_EXPORT pmix_status_t PMIx_Data_unpack(const pmix_proc_t *source,
pmix_peer_t *peer;
if (NULL == (peer = find_peer(source))) {
return PMIX_ERR_NOT_SUPPORTED;
return PMIX_ERR_NOT_FOUND;
}
/* setup the host */

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

@ -1,25 +1,33 @@
/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil -*- */
/*
* Copyright (c) 2014-2018 Intel, Inc. All rights reserved.
* Copyright (c) 2014-2020 Intel, Inc. All rights reserved.
* Copyright (c) 2016 Mellanox Technologies, 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
*
* $HEADER$
*/
#include <src/include/pmix_config.h>
#include "src/include/pmix_config.h"
#include <src/include/types.h>
#include <src/include/pmix_stdint.h>
#include <src/include/pmix_socket_errno.h>
#ifdef HAVE_FCNTL_H
#include <fcntl.h>
#else
#ifdef HAVE_SYS_FCNTL_H
#include <sys/fcntl.h>
#endif
#endif
#include <pmix.h>
#include <pmix_common.h>
#include <pmix_server.h>
#include <pmix_rename.h>
#include "src/include/pmix_stdint.h"
#include "src/include/pmix_socket_errno.h"
#include "include/pmix.h"
#include "include/pmix_common.h"
#include "include/pmix_server.h"
#include "src/threads/threads.h"
#include "src/util/argv.h"
@ -51,13 +59,10 @@ static void msgcbfunc(struct pmix_peer_t *peer,
/* get the reference ID */
m=1;
PMIX_BFROPS_UNPACK(rc, peer, buf, &refid, &m, PMIX_SIZE);
/* store the request - we are in an event, and
* so this is safe */
if (NULL == pmix_pointer_array_get_item(&pmix_globals.iof_requests, refid)) {
pmix_pointer_array_set_item(&pmix_globals.iof_requests, refid, cd->iofreq);
}
/* store the remote reference id */
cd->iofreq->remote_id = refid;
if (NULL != cd->cbfunc.hdlrregcbfn) {
cd->cbfunc.hdlrregcbfn(PMIX_SUCCESS, refid, cd->cbdata);
cd->cbfunc.hdlrregcbfn(PMIX_SUCCESS, cd->iofreq->local_id, cd->cbdata);
}
} else if (PMIX_SUCCESS != rc) {
status = rc;
@ -74,19 +79,37 @@ static void msgcbfunc(struct pmix_peer_t *peer,
} else {
cd->cbfunc.opcbfn(status, cd->cbdata);
}
} else if (PMIX_SUCCESS != status) {
pmix_pointer_array_set_item(&pmix_globals.iof_requests, cd->iofreq->local_id, NULL);
PMIX_RELEASE(cd->iofreq);
} else if (NULL == cd->cbfunc.hdlrregcbfn) {
cd->status = status;
cd->ncodes = refid;
cd->iofreq->remote_id = refid;
PMIX_WAKEUP_THREAD(&cd->lock);
} else {
cd->cbfunc.hdlrregcbfn(PMIX_SUCCESS, refid, cd->cbdata);
}
if (PMIX_SUCCESS != rc && NULL != cd->iofreq) {
PMIX_RELEASE(cd->iofreq);
cd->iofreq->remote_id = refid;
cd->cbfunc.hdlrregcbfn(PMIX_SUCCESS, cd->iofreq->local_id, cd->cbdata);
}
PMIX_RELEASE(cd);
}
static void mycbfn(pmix_status_t status,
size_t refid,
void *cbdata)
{
pmix_shift_caddy_t *cd = (pmix_shift_caddy_t*)cbdata;
PMIX_ACQUIRE_OBJECT(cd);
if (PMIX_SUCCESS == status) {
cd->status = refid;
} else {
cd->status = status;
}
PMIX_WAKEUP_THREAD(&cd->lock);
}
PMIX_EXPORT pmix_status_t PMIx_IOF_pull(const pmix_proc_t procs[], size_t nprocs,
const pmix_info_t directives[], size_t ndirs,
pmix_iof_channel_t channel, pmix_iof_cbfunc_t cbfunc,
@ -94,8 +117,9 @@ PMIX_EXPORT pmix_status_t PMIx_IOF_pull(const pmix_proc_t procs[], size_t nprocs
{
pmix_shift_caddy_t *cd;
pmix_cmd_t cmd = PMIX_IOF_PULL_CMD;
pmix_buffer_t *msg;
pmix_buffer_t *msg = NULL;
pmix_status_t rc;
pmix_iof_req_t *req;
PMIX_ACQUIRE_THREAD(&pmix_global_lock);
@ -132,24 +156,33 @@ PMIX_EXPORT pmix_status_t PMIx_IOF_pull(const pmix_proc_t procs[], size_t nprocs
if (NULL == cd) {
return PMIX_ERR_NOMEM;
}
cd->cbfunc.hdlrregcbfn = regcbfunc;
cd->cbdata = regcbdata;
if (NULL == regcbfunc) {
cd->cbfunc.hdlrregcbfn = mycbfn;
PMIX_RETAIN(cd);
cd->cbdata = cd;
} else {
cd->cbfunc.hdlrregcbfn = regcbfunc;
cd->cbdata = regcbdata;
}
/* setup the request item */
cd->iofreq = PMIX_NEW(pmix_iof_req_t);
if (NULL == cd->iofreq) {
PMIX_RELEASE(cd);
return PMIX_ERR_NOMEM;
req = PMIX_NEW(pmix_iof_req_t);
if (NULL == req) {
rc = PMIX_ERR_NOMEM;
goto cleanup;
}
/* retain the channels and cbfunc */
cd->iofreq->channels = channel;
cd->iofreq->cbfunc = cbfunc;
req->channels = channel;
req->cbfunc = cbfunc;
req->local_id = pmix_pointer_array_add(&pmix_globals.iof_requests, req);
cd->iofreq = req;
/* we don't need the source specifications - only the
* server cares as it will filter against them */
/* setup the registration cmd */
msg = PMIX_NEW(pmix_buffer_t);
if (NULL == msg) {
PMIX_RELEASE(cd->iofreq);
PMIX_RELEASE(req);
PMIX_RELEASE(cd);
return PMIX_ERR_NOMEM;
}
@ -200,8 +233,19 @@ PMIX_EXPORT pmix_status_t PMIx_IOF_pull(const pmix_proc_t procs[], size_t nprocs
cleanup:
if (PMIX_SUCCESS != rc) {
PMIX_ERROR_LOG(rc);
PMIX_RELEASE(msg);
PMIX_RELEASE(cd->iofreq);
if (NULL != msg) {
PMIX_RELEASE(msg);
}
PMIX_RELEASE(req);
PMIX_RELEASE(cd);
} else if (NULL == regcbfunc) {
PMIX_WAIT_THREAD(&cd->lock);
rc = cd->status;
if (0 > rc) {
/* the request failed */
pmix_pointer_array_set_item(&pmix_globals.iof_requests, req->local_id, NULL);
PMIX_RELEASE(req);
}
PMIX_RELEASE(cd);
}
return rc;
@ -215,6 +259,8 @@ PMIX_EXPORT pmix_status_t PMIx_IOF_deregister(size_t iofhdlr,
pmix_cmd_t cmd = PMIX_IOF_DEREG_CMD;
pmix_buffer_t *msg;
pmix_status_t rc;
pmix_iof_req_t *req;
size_t remote_id;
PMIX_ACQUIRE_THREAD(&pmix_global_lock);
@ -240,6 +286,15 @@ PMIX_EXPORT pmix_status_t PMIx_IOF_deregister(size_t iofhdlr,
}
PMIX_RELEASE_THREAD(&pmix_global_lock);
req = (pmix_iof_req_t*)pmix_pointer_array_get_item(&pmix_globals.iof_requests, iofhdlr);
if (NULL == req) {
/* bad value */
return PMIX_ERR_BAD_PARAM;
}
remote_id = req->remote_id;
pmix_pointer_array_set_item(&pmix_globals.iof_requests, iofhdlr, NULL);
PMIX_RELEASE(req);
/* send this request to the server */
cd = PMIX_NEW(pmix_shift_caddy_t);
if (NULL == cd) {
@ -276,9 +331,9 @@ PMIX_EXPORT pmix_status_t PMIx_IOF_deregister(size_t iofhdlr,
}
}
/* pack the handler ID */
/* pack the remote handler ID */
PMIX_BFROPS_PACK(rc, pmix_client_globals.myserver,
msg, &iofhdlr, 1, PMIX_SIZE);
msg, &remote_id, 1, PMIX_SIZE);
pmix_output_verbose(2, pmix_client_globals.iof_output,
"pmix:iof_dereg sending to server");
@ -299,10 +354,29 @@ PMIX_EXPORT pmix_status_t PMIx_IOF_deregister(size_t iofhdlr,
}
typedef struct {
pmix_object_t super;
pmix_event_t ev;
pmix_lock_t lock;
pmix_status_t status;
pmix_op_cbfunc_t cbfunc;
void *cbdata;
} pmix_ltcaddy_t;
static void ltcon(pmix_ltcaddy_t *p)
{
PMIX_CONSTRUCT_LOCK(&p->lock);
}
static void ltdes(pmix_ltcaddy_t *p)
{
PMIX_DESTRUCT_LOCK(&p->lock);
}
static PMIX_CLASS_INSTANCE(pmix_ltcaddy_t,
pmix_object_t,
ltcon, ltdes);
static pmix_event_t stdinsig_ev;
static pmix_iof_read_event_t *stdinev = NULL;
static void stdincbfunc(struct pmix_peer_t *peer,
pmix_ptl_hdr_t *hdr,
pmix_buffer_t *buf, void *cbdata)
@ -334,6 +408,14 @@ static void stdincbfunc(struct pmix_peer_t *peer,
free(cd);
}
static void myopcb(pmix_status_t status, void *cbdata)
{
pmix_ltcaddy_t *cd = (pmix_ltcaddy_t*)cbdata;
cd->status = status;
PMIX_WAKEUP_THREAD(&cd->lock);
}
pmix_status_t PMIx_IOF_push(const pmix_proc_t targets[], size_t ntargets,
pmix_byte_object_t *bo,
const pmix_info_t directives[], size_t ndirs,
@ -341,8 +423,11 @@ pmix_status_t PMIx_IOF_push(const pmix_proc_t targets[], size_t ntargets,
{
pmix_buffer_t *msg;
pmix_cmd_t cmd = PMIX_IOF_PUSH_CMD;
pmix_status_t rc;
pmix_status_t rc = PMIX_SUCCESS;
pmix_ltcaddy_t *cd;
size_t n;
bool begincollecting, stopcollecting;
int flags, fd = fileno(stdin);
PMIX_ACQUIRE_THREAD(&pmix_global_lock);
if (pmix_globals.init_cntr <= 0) {
@ -351,6 +436,104 @@ pmix_status_t PMIx_IOF_push(const pmix_proc_t targets[], size_t ntargets,
}
PMIX_RELEASE_THREAD(&pmix_global_lock);
if (NULL == bo) {
/* check the directives */
for (n=0; n < ndirs; n++) {
if (PMIX_CHECK_KEY(&directives[n], PMIX_IOF_PUSH_STDIN)) {
/* we are to start collecting our stdin and pushing
* it to the specified targets */
begincollecting = PMIX_INFO_TRUE(&directives[n]);
if (begincollecting) {
/* add these targets to our list */
if (!pmix_globals.pushstdin) {
/* not already collecting, so start */
pmix_globals.pushstdin = true;
/* We don't want to set nonblocking on our
* stdio stream. If we do so, we set the file descriptor to
* non-blocking for everyone that has that file descriptor, which
* includes everyone else in our shell pipeline chain. (See
* http://lists.freebsd.org/pipermail/freebsd-hackers/2005-January/009742.html).
* This causes things like "prun -np 1 big_app | cat" to lose
* output, because cat's stdout is then ALSO non-blocking and cat
* isn't built to deal with that case (same with almost all other
* unix text utils).
*/
if (0 != fd) {
if((flags = fcntl(fd, F_GETFL, 0)) < 0) {
pmix_output(pmix_client_globals.iof_output,
"[%s:%d]: fcntl(F_GETFL) failed with errno=%d\n",
__FILE__, __LINE__, errno);
} else {
flags |= O_NONBLOCK;
fcntl(fd, F_SETFL, flags);
}
}
if (isatty(fd)) {
/* We should avoid trying to read from stdin if we
* have a terminal, but are backgrounded. Catch the
* signals that are commonly used when we switch
* between being backgrounded and not. If the
* filedescriptor is not a tty, don't worry about it
* and always stay connected.
*/
pmix_event_signal_set(pmix_globals.evbase, &stdinsig_ev,
SIGCONT, pmix_iof_stdin_cb,
NULL);
/* setup a read event to read stdin, but don't activate it yet. The
* dst_name indicates who should receive the stdin. If that recipient
* doesn't do a corresponding pull, however, then the stdin will
* be dropped upon receipt at the local daemon
*/
PMIX_IOF_READ_EVENT(&stdinev,
targets, ntargets,
directives, ndirs, fd,
pmix_iof_read_local_handler, false);
/* check to see if we want the stdin read event to be
* active - we will always at least define the event,
* but may delay its activation
*/
if (pmix_iof_stdin_check(fd)) {
PMIX_IOF_READ_ACTIVATE(stdinev);
}
} else {
/* if we are not looking at a tty, just setup a read event
* and activate it
*/
PMIX_IOF_READ_EVENT(&stdinev, targets, ntargets,
directives, ndirs, fd,
pmix_iof_read_local_handler, true);
}
}
} else {
if (pmix_globals.pushstdin) {
/* remove these targets from the list of
* recipients - if the list is then empty,
* stop collecting. If the targets param
* is NULL, then remove all targets and stop.
* Flush any cached input before calling
* the cbfunc */
}
}
} else if (PMIX_CHECK_KEY(&directives[n], PMIX_IOF_COMPLETE)) {
/* if we are collecting our stdin for the specified
* targets, then stop - a NULL for targets indicates
* stop for everyone. Flush any remaining cached input
* before calling the cbfunc */
stopcollecting = PMIX_INFO_TRUE(&directives[n]);
if (stopcollecting) {
if (pmix_globals.pushstdin) {
/* remove these targets from the list of
* recipients - if the list is then empty,
* stop collecting */
}
}
}
}
return PMIX_OPERATION_SUCCEEDED;
}
/* if we are not a server, then we send the provided
* data to our server for processing */
if (!PMIX_PEER_IS_SERVER(pmix_globals.mypeer) ||
@ -398,26 +581,40 @@ pmix_status_t PMIx_IOF_push(const pmix_proc_t targets[], size_t ntargets,
return rc;
}
}
PMIX_BFROPS_PACK(rc, pmix_client_globals.myserver,
msg, bo, 1, PMIX_BYTE_OBJECT);
if (PMIX_SUCCESS != rc) {
PMIX_ERROR_LOG(rc);
PMIX_RELEASE(msg);
return rc;
if (NULL != bo) {
PMIX_BFROPS_PACK(rc, pmix_client_globals.myserver,
msg, bo, 1, PMIX_BYTE_OBJECT);
if (PMIX_SUCCESS != rc) {
PMIX_ERROR_LOG(rc);
PMIX_RELEASE(msg);
return rc;
}
}
cd = (pmix_ltcaddy_t*)malloc(sizeof(pmix_ltcaddy_t));
cd = PMIX_NEW(pmix_ltcaddy_t);
if (NULL == cd) {
PMIX_RELEASE(msg);
rc = PMIX_ERR_NOMEM;
return rc;
}
if (NULL == cbfunc) {
cd->cbfunc = myopcb;
PMIX_RETAIN(cd);
cd->cbdata = cd;
} else {
cd->cbfunc = cbfunc;
cd->cbdata = cbdata;
}
PMIX_PTL_SEND_RECV(rc, pmix_client_globals.myserver,
msg, stdincbfunc, cd);
if (PMIX_SUCCESS != rc) {
PMIX_ERROR_LOG(rc);
PMIX_RELEASE(msg);
free(cd);
} else if (NULL == cbfunc) {
PMIX_WAIT_THREAD(&cd->lock);
rc = cd->status;
PMIX_RELEASE(cd);
}
return rc;
}
@ -430,7 +627,7 @@ pmix_status_t PMIx_IOF_push(const pmix_proc_t targets[], size_t ntargets,
targets, ntargets,
directives, ndirs,
bo, cbfunc, cbdata);
return PMIX_SUCCESS;
return rc;
}
pmix_status_t pmix_iof_process_iof(pmix_iof_channel_t channels,
@ -487,8 +684,8 @@ pmix_status_t pmix_iof_process_iof(pmix_iof_channel_t channels,
PMIX_RELEASE(msg);
return rc;
}
/* provide the handler ID so they know which cbfunc to use */
PMIX_BFROPS_PACK(rc, req->requestor, msg, &req->refid, 1, PMIX_SIZE);
/* provide their local handler ID so they know which cbfunc to use */
PMIX_BFROPS_PACK(rc, req->requestor, msg, &req->remote_id, 1, PMIX_SIZE);
if (PMIX_SUCCESS != rc) {
PMIX_ERROR_LOG(rc);
PMIX_RELEASE(msg);
@ -705,6 +902,11 @@ pmix_status_t pmix_iof_write_output(const pmix_proc_t *name,
for (j=0; j < endtaglen && k < PMIX_IOF_BASE_TAGGED_OUT_MAX-1; j++) {
output->data[k++] = endtag[j];
}
if (k == PMIX_IOF_BASE_TAGGED_OUT_MAX) {
/* out of space */
PMIX_ERROR_LOG(PMIX_ERR_OUT_OF_RESOURCE);
goto process;
}
/* move the <cr> over */
output->data[k++] = '\n';
/* if this isn't the end of the data buffer, add a new start tag */
@ -781,7 +983,7 @@ void pmix_iof_static_dump_output(pmix_iof_sink_t *sink)
dump = false;
/* make one last attempt to write this out */
while (NULL != (output = (pmix_iof_write_output_t*)pmix_list_remove_first(&wev->outputs))) {
if (!dump) {
if (!dump && 0 < output->numbytes) {
num_written = write(wev->fd, output->data, output->numbytes);
if (num_written < output->numbytes) {
/* don't retry - just cleanout the list and dump it */
@ -812,7 +1014,7 @@ void pmix_iof_write_handler(int _fd, short event, void *cbdata)
output = (pmix_iof_write_output_t*)item;
if (0 == output->numbytes) {
/* indicates we are to close this stream */
PMIX_RELEASE(sink);
PMIX_DESTRUCT(sink);
return;
}
num_written = write(wev->fd, output->data, output->numbytes);
@ -900,15 +1102,34 @@ void pmix_iof_stdin_cb(int fd, short event, void *cbdata)
}
}
static void restart_stdin(int fd, short event, void *cbdata)
static void iof_stdin_cbfunc(struct pmix_peer_t *peer,
pmix_ptl_hdr_t *hdr,
pmix_buffer_t *buf, void *cbdata)
{
pmix_iof_read_event_t *tm = (pmix_iof_read_event_t*)cbdata;
pmix_iof_read_event_t *stdinev = (pmix_iof_read_event_t*)cbdata;
int cnt;
pmix_status_t rc, ret;
PMIX_ACQUIRE_OBJECT(tm);
PMIX_ACQUIRE_OBJECT(stdinev);
if (!tm->active) {
PMIX_IOF_READ_ACTIVATE(tm);
/* check the return status */
cnt = 1;
PMIX_BFROPS_UNPACK(rc, peer, buf, &ret, &cnt, PMIX_STATUS);
if (PMIX_SUCCESS != rc) {
pmix_event_del(&stdinev->ev);
stdinev->active = false;
PMIX_POST_OBJECT(stdinev);
return;
}
/* if the status wasn't success, then terminate the forward */
if (PMIX_SUCCESS != ret) {
pmix_event_del(&stdinev->ev);
stdinev->active = false;
PMIX_POST_OBJECT(stdinev);
return;
}
pmix_iof_stdin_cb(0, 0, stdinev);
}
/* this is the read handler for stdin */
@ -917,18 +1138,19 @@ void pmix_iof_read_local_handler(int unusedfd, short event, void *cbdata)
pmix_iof_read_event_t *rev = (pmix_iof_read_event_t*)cbdata;
unsigned char data[PMIX_IOF_BASE_MSG_MAX];
int32_t numbytes;
int fd;
pmix_status_t rc;
pmix_buffer_t *msg;
pmix_cmd_t cmd = PMIX_IOF_PUSH_CMD;
pmix_byte_object_t bo;
int fd;
PMIX_ACQUIRE_OBJECT(rev);
/* As we may use timer events, fd can be bogus (-1)
* use the right one here
*/
fd = fileno(stdin);
if (0 > rev->fd) {
fd = fileno(stdin);
} else {
fd = rev->fd;
}
/* read up to the fragment size */
memset(data, 0, PMIX_IOF_BASE_MSG_MAX);
numbytes = read(fd, data, sizeof(data));
@ -968,50 +1190,68 @@ void pmix_iof_read_local_handler(int unusedfd, short event, void *cbdata)
if (PMIX_SUCCESS != rc) {
PMIX_ERROR_LOG(rc);
PMIX_RELEASE(msg);
goto restart;
return;
}
/* pack the number of targets */
PMIX_BFROPS_PACK(rc, pmix_client_globals.myserver,
msg, &numbytes, 1, PMIX_INT32);
msg, &rev->ntargets, 1, PMIX_SIZE);
if (PMIX_SUCCESS != rc) {
PMIX_ERROR_LOG(rc);
PMIX_RELEASE(msg);
goto restart;
return;
}
/* and the targets */
if (0 < rev->ntargets) {
PMIX_BFROPS_PACK(rc, pmix_client_globals.myserver,
msg, rev->targets, rev->ntargets, PMIX_PROC);
if (PMIX_SUCCESS != rc) {
PMIX_ERROR_LOG(rc);
PMIX_RELEASE(msg);
return;
}
}
/* pack the number of directives */
PMIX_BFROPS_PACK(rc, pmix_client_globals.myserver,
msg, data, numbytes, PMIX_BYTE);
msg, &rev->ndirs, 1, PMIX_SIZE);
if (PMIX_SUCCESS != rc) {
PMIX_ERROR_LOG(rc);
PMIX_RELEASE(msg);
goto restart;
return;
}
/* and the directives */
if (0 < rev->ndirs) {
PMIX_BFROPS_PACK(rc, pmix_client_globals.myserver,
msg, rev->directives, rev->ndirs, PMIX_INFO);
if (PMIX_SUCCESS != rc) {
PMIX_ERROR_LOG(rc);
PMIX_RELEASE(msg);
return;
}
}
/* pack the data */
bo.bytes = (char*)data;
bo.size = numbytes;
PMIX_BFROPS_PACK(rc, pmix_client_globals.myserver,
msg, &bo, 1, PMIX_BYTE_OBJECT);
if (PMIX_SUCCESS != rc) {
PMIX_ERROR_LOG(rc);
PMIX_RELEASE(msg);
return;
}
/* send it to the server */
PMIX_PTL_SEND_RECV(rc, pmix_client_globals.myserver,
msg, stdincbfunc, NULL);
msg, iof_stdin_cbfunc, rev);
if (PMIX_SUCCESS != rc) {
PMIX_ERROR_LOG(rc);
PMIX_RELEASE(msg);
}
restart:
/* if num_bytes was zero, or we read the last piece of the file, then we need to terminate the event */
if (0 == numbytes) {
/* this will also close our stdin file descriptor */
PMIX_RELEASE(rev);
} else {
/* if we are looking at a tty, then we just go ahead and restart the
* read event assuming we are not backgrounded
*/
if (pmix_iof_stdin_check(fd)) {
restart_stdin(fd, 0, rev);
} else {
/* delay for awhile and then restart */
pmix_event_evtimer_set(pmix_globals.evbase,
&rev->ev, restart_stdin, rev);
rev->tv.tv_sec = 0;
rev->tv.tv_usec = 10000;
PMIX_POST_OBJECT(rev);
pmix_event_evtimer_add(&rev->ev, &rev->tv);
}
if (0 < numbytes) {
PMIX_IOF_READ_ACTIVATE(rev);
}
/* nothing more to do */
return;
}
@ -1044,12 +1284,19 @@ static void iof_read_event_construct(pmix_iof_read_event_t* rev)
{
rev->fd = -1;
rev->active = false;
rev->childproc = NULL;
rev->tv.tv_sec = 0;
rev->tv.tv_usec = 0;
rev->targets = NULL;
rev->ntargets = 0;
rev->directives = NULL;
rev->ndirs = 0;
}
static void iof_read_event_destruct(pmix_iof_read_event_t* rev)
{
pmix_event_del(&rev->ev);
if (rev->active) {
pmix_event_del(&rev->ev);
}
if (0 <= rev->fd) {
PMIX_OUTPUT_VERBOSE((20, pmix_client_globals.iof_output,
"%s iof: closing fd %d",
@ -1057,6 +1304,12 @@ static void iof_read_event_destruct(pmix_iof_read_event_t* rev)
close(rev->fd);
rev->fd = -1;
}
if (NULL != rev->targets) {
PMIX_PROC_FREE(rev->targets, rev->ntargets);
}
if (NULL != rev->directives) {
PMIX_INFO_FREE(rev->directives, rev->ndirs);
}
}
PMIX_CLASS_INSTANCE(pmix_iof_read_event_t,
pmix_object_t,
@ -1074,14 +1327,16 @@ static void iof_write_event_construct(pmix_iof_write_event_t* wev)
}
static void iof_write_event_destruct(pmix_iof_write_event_t* wev)
{
pmix_event_del(&wev->ev);
if (wev->pending) {
pmix_event_del(&wev->ev);
}
if (2 < wev->fd) {
PMIX_OUTPUT_VERBOSE((20, pmix_client_globals.iof_output,
"%s iof: closing fd %d for write event",
PMIX_NAME_PRINT(&pmix_globals.myid), wev->fd));
close(wev->fd);
}
PMIX_DESTRUCT(&wev->outputs);
PMIX_LIST_DESTRUCT(&wev->outputs);
}
PMIX_CLASS_INSTANCE(pmix_iof_write_event_t,
pmix_list_item_t,

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

@ -12,7 +12,7 @@
* Copyright (c) 2008 Cisco Systems, Inc. All rights reserved.
* Copyright (c) 2012-2013 Los Alamos National Security, LLC.
* All rights reserved.
* Copyright (c) 2015-2018 Intel, Inc. All rights reserved.
* Copyright (c) 2015-2020 Intel, Inc. All rights reserved.
* Copyright (c) 2017 IBM Corporation. All rights reserved.
* Copyright (c) 2017 Mellanox Technologies. All rights reserved.
* Copyright (c) 2018 Research Organization for Information Science
@ -32,7 +32,7 @@
#ifndef PMIX_IOF_H
#define PMIX_IOF_H
#include <src/include/pmix_config.h>
#include "src/include/pmix_config.h"
#ifdef HAVE_SYS_TYPES_H
#include <sys/types.h>
@ -52,8 +52,6 @@
#include "src/include/pmix_globals.h"
#include "src/util/fd.h"
#include "src/common/pmix_iof.h"
BEGIN_C_DECLS
/*
@ -99,7 +97,14 @@ typedef struct {
struct timeval tv;
int fd;
bool active;
void *childproc;
bool always_readable;
pmix_proc_t name;
pmix_iof_channel_t channel;
pmix_proc_t *targets;
size_t ntargets;
pmix_info_t *directives;
size_t ndirs;
} pmix_iof_read_event_t;
PMIX_EXPORT PMIX_CLASS_DECLARATION(pmix_iof_read_event_t);
@ -132,7 +137,7 @@ pmix_iof_fd_always_ready(int fd)
PMIX_POST_OBJECT(wev); \
if (wev->always_writable) { \
/* Regular is always write ready. Use timer to activate */ \
tv = &wev->tv; \
tv = &wev->tv; \
} \
if (pmix_event_add(&wev->ev, tv)) { \
PMIX_ERROR_LOG(PMIX_ERR_BAD_PARAM); \
@ -188,6 +193,44 @@ pmix_iof_fd_always_ready(int fd)
} while(0);
#define PMIX_IOF_READ_EVENT(rv, p, np, d, nd, fid, cbfunc, actv) \
do { \
size_t _ii; \
pmix_iof_read_event_t *rev; \
PMIX_OUTPUT_VERBOSE((1, pmix_client_globals.iof_output, \
"defining read event at: %s %d", \
__FILE__, __LINE__)); \
rev = PMIX_NEW(pmix_iof_read_event_t); \
if (NULL != (p)) { \
(rev)->ntargets = (np); \
PMIX_PROC_CREATE((rev)->targets, (rev)->ntargets); \
memcpy((rev)->targets, (p), (np) * sizeof(pmix_proc_t)); \
} \
if (NULL != (d) && 0 < (nd)) { \
PMIX_INFO_CREATE((rev)->directives, (nd)); \
(rev)->ndirs = (nd); \
for (_ii=0; _ii < (size_t)nd; _ii++) { \
PMIX_INFO_XFER(&((rev)->directives[_ii]), &((d)[_ii])); \
} \
} \
rev->fd = (fid); \
rev->always_readable = pmix_iof_fd_always_ready(fid); \
*(rv) = rev; \
if(rev->always_readable) { \
pmix_event_evtimer_set(pmix_globals.evbase, \
&rev->ev, (cbfunc), rev); \
} else { \
pmix_event_set(pmix_globals.evbase, \
&rev->ev, (fid), \
PMIX_EV_READ, \
(cbfunc), rev); \
} \
if ((actv)) { \
PMIX_IOF_READ_ACTIVATE(rev) \
} \
} while(0);
PMIX_EXPORT pmix_status_t pmix_iof_flush(void);
PMIX_EXPORT pmix_status_t pmix_iof_write_output(const pmix_proc_t *name,
@ -196,10 +239,9 @@ PMIX_EXPORT pmix_status_t pmix_iof_write_output(const pmix_proc_t *name,
pmix_iof_flags_t *flags);
PMIX_EXPORT void pmix_iof_static_dump_output(pmix_iof_sink_t *sink);
PMIX_EXPORT void pmix_iof_write_handler(int fd, short event, void *cbdata);
PMIX_EXPORT void pmix_iof_stdin_write_handler(int fd, short event, void *cbdata);
PMIX_EXPORT bool pmix_iof_stdin_check(int fd);
PMIX_EXPORT void pmix_iof_read_local_handler(int unusedfd, short event, void *cbdata);
PMIX_EXPORT void pmix_iof_stdin_cb(int fd, short event, void *cbdata);
PMIX_EXPORT void pmix_iof_read_local_handler(int fd, short event, void *cbdata);
PMIX_EXPORT pmix_status_t pmix_iof_process_iof(pmix_iof_channel_t channels,
const pmix_proc_t *source,
const pmix_byte_object_t *bo,

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

@ -1,25 +1,25 @@
/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil -*- */
/*
* Copyright (c) 2014-2019 Intel, Inc. All rights reserved.
* Copyright (c) 2014-2020 Intel, Inc. All rights reserved.
* Copyright (c) 2016 Mellanox Technologies, 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
*
* $HEADER$
*/
#include <src/include/pmix_config.h>
#include "src/include/pmix_config.h"
#include <src/include/types.h>
#include <src/include/pmix_stdint.h>
#include <src/include/pmix_socket_errno.h>
#include "src/include/pmix_stdint.h"
#include "src/include/pmix_socket_errno.h"
#include <pmix.h>
#include <pmix_common.h>
#include <pmix_server.h>
#include <pmix_rename.h>
#include "include/pmix.h"
#include "include/pmix_common.h"
#include "include/pmix_server.h"
#include "src/threads/threads.h"
#include "src/util/argv.h"
@ -255,7 +255,7 @@ PMIX_EXPORT pmix_status_t PMIx_Log_nb(const pmix_info_t data[], size_t ndata,
for (n=0; n < ndirs; n++) {
PMIX_INFO_XFER(&cd->directives[n], (pmix_info_t*)&directives[n]);
}
PMIX_INFO_LOAD(&cd->directives[ndirs], PMIX_LOG_SOURCE, &source, PMIX_PROC);
PMIX_INFO_LOAD(&cd->directives[ndirs], PMIX_LOG_SOURCE, source, PMIX_PROC);
/* call down to process the request - the various components
* will thread shift as required */
rc = pmix_plog.log(source, data, ndata, cd->directives, cd->ndirs, localcbfunc, cd);
@ -263,8 +263,7 @@ PMIX_EXPORT pmix_status_t PMIx_Log_nb(const pmix_info_t data[], size_t ndata,
PMIX_INFO_FREE(cd->directives, cd->ndirs);
PMIX_RELEASE(cd);
}
} else if (0 == strncmp(source->nspace, pmix_globals.myid.nspace, PMIX_MAX_NSLEN) &&
source->rank == pmix_globals.myid.rank) {
} else if (PMIX_CHECK_PROCID(source, &pmix_globals.myid)) {
/* if I am the recorded source, then this is a re-submission of
* something that got "upcalled" by a prior call. In this case,
* we return a "not supported" error as clearly we couldn't

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

@ -1,25 +1,25 @@
/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil -*- */
/*
* Copyright (c) 2014-2019 Intel, Inc. All rights reserved.
* Copyright (c) 2014-2020 Intel, Inc. All rights reserved.
* Copyright (c) 2016 Mellanox Technologies, 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
*
* $HEADER$
*/
#include <src/include/pmix_config.h>
#include "src/include/pmix_config.h"
#include <src/include/types.h>
#include <src/include/pmix_stdint.h>
#include <src/include/pmix_socket_errno.h>
#include "src/include/pmix_stdint.h"
#include "src/include/pmix_socket_errno.h"
#include <pmix.h>
#include <pmix_common.h>
#include <pmix_server.h>
#include <pmix_rename.h>
#include "include/pmix.h"
#include "include/pmix_common.h"
#include "include/pmix_server.h"
#include "src/threads/threads.h"
#include "src/util/argv.h"
@ -27,7 +27,7 @@
#include "src/util/name_fns.h"
#include "src/util/output.h"
#include "src/mca/bfrops/bfrops.h"
#include "src/mca/ptl/ptl.h"
#include "src/mca/ptl/base/base.h"
#include "src/client/pmix_client_ops.h"
#include "src/server/pmix_server_ops.h"
@ -107,7 +107,7 @@ static void query_cbfunc(struct pmix_peer_t *peer,
complete:
pmix_output_verbose(2, pmix_globals.debug_output,
"pmix:query cback from server releasing");
"pmix:query cback from server releasing with status %s", PMIx_Error_string(results->status));
/* release the caller */
if (NULL != cd->cbfunc) {
cd->cbfunc(results->status, results->info, results->ninfo, cd->cbdata, relcbfunc, results);
@ -115,179 +115,14 @@ static void query_cbfunc(struct pmix_peer_t *peer,
PMIX_RELEASE(cd);
}
static void _local_relcb(void *cbdata)
{
pmix_query_caddy_t *cd = (pmix_query_caddy_t*)cbdata;
PMIX_RELEASE(cd);
}
static void _local_cbfunc(int sd, short args, void *cbdata)
{
pmix_query_caddy_t *cd = (pmix_query_caddy_t*)cbdata;
if (NULL != cd->cbfunc) {
cd->cbfunc(cd->status, cd->info, cd->ninfo, cd->cbdata, _local_relcb, cd);
return;
}
PMIX_RELEASE(cd);
}
PMIX_EXPORT pmix_status_t PMIx_Query_info_nb(pmix_query_t queries[], size_t nqueries,
pmix_info_cbfunc_t cbfunc, void *cbdata)
static pmix_status_t request_help(pmix_query_t queries[], size_t nqueries,
pmix_info_cbfunc_t cbfunc, void *cbdata)
{
pmix_query_caddy_t *cd;
pmix_cmd_t cmd = PMIX_QUERY_CMD;
pmix_buffer_t *msg;
pmix_status_t rc;
pmix_cb_t cb;
size_t n, p;
pmix_list_t results;
pmix_kval_t *kv, *kvnxt;
pmix_proc_t proc;
bool rank_given;
PMIX_ACQUIRE_THREAD(&pmix_global_lock);
pmix_output_verbose(2, pmix_globals.debug_output,
"pmix:query non-blocking");
if (pmix_globals.init_cntr <= 0) {
PMIX_RELEASE_THREAD(&pmix_global_lock);
return PMIX_ERR_INIT;
}
if (0 == nqueries || NULL == queries) {
PMIX_RELEASE_THREAD(&pmix_global_lock);
return PMIX_ERR_BAD_PARAM;
}
/* do a quick check of the qualifiers array to ensure
* the nqual field has been set */
for (n=0; n < nqueries; n++) {
if (NULL != queries[n].qualifiers && 0 == queries[n].nqual) {
/* look for the info marked as "end" */
p = 0;
while (!(PMIX_INFO_IS_END(&queries[n].qualifiers[p])) && p < SIZE_MAX) {
++p;
}
if (SIZE_MAX == p) {
/* nothing we can do */
PMIX_RELEASE_THREAD(&pmix_global_lock);
return PMIX_ERR_BAD_PARAM;
}
queries[n].nqual = p;
}
}
/* setup the list of local results */
PMIX_CONSTRUCT(&results, pmix_list_t);
/* check the directives to see if they want us to refresh
* the local cached results - if we wanted to optimize this
* more, we would check each query and allow those that don't
* want to be refreshed to be executed locally, and those that
* did would be sent to the host. However, for now we simply
* */
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])) {
PMIX_LIST_DESTRUCT(&results);
goto query;
}
} 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;
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;
/* 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];
PMIX_GDS_FETCH_KV(rc, pmix_globals.mypeer, &cb);
if (PMIX_SUCCESS != rc) {
/* needs to be passed to the host */
PMIX_LIST_DESTRUCT(&results);
PMIX_DESTRUCT(&cb);
goto query;
}
/* need to retain this result */
PMIX_LIST_FOREACH_SAFE(kv, kvnxt, &cb.kvs, pmix_kval_t) {
pmix_list_remove_item(&cb.kvs, &kv->super);
pmix_list_append(&results, &kv->super);
}
PMIX_DESTRUCT(&cb);
}
}
/* if we get here, then all queries were completely locally
* resolved, so construct the results for return */
cd = PMIX_NEW(pmix_query_caddy_t);
cd->cbfunc = cbfunc;
cd->cbdata = cbdata;
cd->status = PMIX_SUCCESS;
cd->ninfo = pmix_list_get_size(&results);
PMIX_INFO_CREATE(cd->info, cd->ninfo);
n = 0;
PMIX_LIST_FOREACH_SAFE(kv, kvnxt, &results, pmix_kval_t) {
PMIX_LOAD_KEY(cd->info[n].key, kv->key);
rc = pmix_value_xfer(&cd->info[n].value, kv->value);
if (PMIX_SUCCESS != rc) {
cd->status = rc;
PMIX_INFO_FREE(cd->info, cd->ninfo);
break;
}
++n;
}
/* done with the list of results */
PMIX_LIST_DESTRUCT(&results);
/* we need to thread-shift as we are not allowed to
* execute the callback function prior to returning
* from the API */
PMIX_THREADSHIFT(cd, _local_cbfunc);
/* regardless of the result of the query, we return
* PMIX_SUCCESS here to indicate that the operation
* was accepted for processing */
PMIX_RELEASE_THREAD(&pmix_global_lock);
return PMIX_SUCCESS;
query:
/* if we are the server, then we just issue the query and
* return the response */
if (PMIX_PEER_IS_SERVER(pmix_globals.mypeer) &&
@ -350,6 +185,212 @@ PMIX_EXPORT pmix_status_t PMIx_Query_info_nb(pmix_query_t queries[], size_t nque
PMIX_RELEASE(cd);
}
return rc;
}
static void _local_relcb(void *cbdata)
{
pmix_query_caddy_t *cd = (pmix_query_caddy_t*)cbdata;
if (NULL != cd->info) {
PMIX_INFO_FREE(cd->info, cd->ninfo);
}
PMIX_RELEASE(cd);
}
static void localquery(int sd, short args, void *cbdata)
{
pmix_query_caddy_t *cd = (pmix_query_caddy_t*)cbdata;
pmix_query_t *queries = cd->queries;
size_t nqueries = cd->nqueries;
pmix_status_t rc;
pmix_cb_t cb;
size_t n, p;
pmix_list_t results;
pmix_kval_t *kv, *kvnxt;
pmix_proc_t proc;
bool rank_given = false;
/* setup the list of local results */
PMIX_CONSTRUCT(&results, pmix_list_t);
for (n=0; n < nqueries; n++) {
PMIX_LOAD_PROCID(&proc, NULL, PMIX_RANK_INVALID);
for (p=0; p < queries[n].nqual; p++) {
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;
rank_given = true;
}
}
/* first try a local "get" on the data to see if we already have it */
PMIX_CONSTRUCT(&cb, pmix_cb_t);
cb.copy = false;
/* 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;
}
}
/* first see if we already have this info */
for (p=0; NULL != queries[n].keys[p]; p++) {
cb.key = queries[n].keys[p];
PMIX_GDS_FETCH_KV(rc, pmix_globals.mypeer, &cb);
if (PMIX_SUCCESS != rc) {
/* not in our gds */
PMIX_DESTRUCT(&cb);
goto nextstep;
}
/* need to retain this result */
PMIX_LIST_FOREACH_SAFE(kv, kvnxt, &cb.kvs, pmix_kval_t) {
pmix_list_remove_item(&cb.kvs, &kv->super);
pmix_list_append(&results, &kv->super);
}
PMIX_DESTRUCT(&cb);
}
}
nextstep:
if (PMIX_OPERATION_SUCCEEDED == rc) {
/* if we get here, then all queries were locally
* resolved, so construct the results for return */
cd->status = PMIX_SUCCESS;
cd->ninfo = pmix_list_get_size(&results);
if (0 < cd->ninfo) {
PMIX_INFO_CREATE(cd->info, cd->ninfo);
n = 0;
PMIX_LIST_FOREACH_SAFE(kv, kvnxt, &results, pmix_kval_t) {
PMIX_LOAD_KEY(cd->info[n].key, kv->key);
rc = pmix_value_xfer(&cd->info[n].value, kv->value);
if (PMIX_SUCCESS != rc) {
cd->status = rc;
PMIX_INFO_FREE(cd->info, cd->ninfo);
break;
}
++n;
}
}
/* done with the list of results */
PMIX_LIST_DESTRUCT(&results);
if (NULL != cd->cbfunc) {
cd->cbfunc(cd->status, cd->info, cd->ninfo, cd->cbdata, _local_relcb, cd);
}
} else if (PMIX_SUCCESS != rc) {
/* need to ask our host */
rc = request_help(cd->queries, cd->nqueries, cd->cbfunc, cd->cbdata);
if (PMIX_SUCCESS != rc) {
/* we have to return the error to the caller */
if (NULL != cd->cbfunc) {
cd->cbfunc(rc, NULL, 0, cd->cbdata, NULL, NULL);
}
}
PMIX_RELEASE(cd);
return;
}
/* get here if the query returned PMIX_SUCCESS, which means
* that the query is being processed and will call the cbfunc
* when complete */
}
PMIX_EXPORT pmix_status_t PMIx_Query_info_nb(pmix_query_t queries[], size_t nqueries,
pmix_info_cbfunc_t cbfunc, void *cbdata)
{
pmix_query_caddy_t *cd;
pmix_status_t rc;
size_t n, p;
PMIX_ACQUIRE_THREAD(&pmix_global_lock);
pmix_output_verbose(2, pmix_globals.debug_output,
"pmix:query non-blocking");
if (pmix_globals.init_cntr <= 0) {
PMIX_RELEASE_THREAD(&pmix_global_lock);
return PMIX_ERR_INIT;
}
PMIX_RELEASE_THREAD(&pmix_global_lock);
if (0 == nqueries || NULL == queries) {
return PMIX_ERR_BAD_PARAM;
}
/* do a quick check of the qualifiers arrays to ensure
* the nqual field has been set */
for (n=0; n < nqueries; n++) {
if (NULL != queries[n].qualifiers && 0 == queries[n].nqual) {
/* look for the info marked as "end" */
p = 0;
while (!(PMIX_INFO_IS_END(&queries[n].qualifiers[p])) && p < SIZE_MAX) {
++p;
}
if (SIZE_MAX == p) {
/* nothing we can do */
return PMIX_ERR_BAD_PARAM;
}
queries[n].nqual = p;
}
}
/* check the directives to see if they want us to refresh
* the local cached results - if we wanted to optimize this
* more, we would check each query and allow those that don't
* want to be refreshed to be executed locally, and those that
* did would be sent to the host. However, for now we simply
* assume that any requirement to refresh will force all to
* do so */
for (n=0; n < nqueries; n++) {
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])) {
/* need to refresh the cache from our host */
rc = request_help(queries, nqueries, cbfunc, cbdata);
return rc;
}
}
}
}
/* we get here if a refresh isn't required - need to
* threadshift this to access our internal data */
cd = PMIX_NEW(pmix_query_caddy_t);
cd->queries = queries;
cd->nqueries = nqueries;
cd->cbfunc = cbfunc;
cd->cbdata = cbdata;
PMIX_THREADSHIFT(cd, localquery);
/* regardless of the result of the query, we return
* PMIX_SUCCESS here to indicate that the operation
* was accepted for processing */
return PMIX_SUCCESS;
}
static void acb(pmix_status_t status,

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

@ -1,25 +1,25 @@
/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil -*- */
/*
* Copyright (c) 2014-2018 Intel, Inc. All rights reserved.
* Copyright (c) 2014-2020 Intel, Inc. All rights reserved.
* Copyright (c) 2016 Mellanox Technologies, 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
*
* $HEADER$
*/
#include <src/include/pmix_config.h>
#include "src/include/pmix_config.h"
#include <src/include/types.h>
#include <src/include/pmix_stdint.h>
#include <src/include/pmix_socket_errno.h>
#include "src/include/pmix_stdint.h"
#include "src/include/pmix_socket_errno.h"
#include <pmix.h>
#include <pmix_common.h>
#include <pmix_server.h>
#include <pmix_rename.h>
#include "include/pmix.h"
#include "include/pmix_common.h"
#include "include/pmix_server.h"
#include "src/threads/threads.h"
#include "src/util/argv.h"

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

@ -11,7 +11,7 @@
* All rights reserved.
* Copyright (c) 2007-2012 Los Alamos National Security, LLC.
* All rights reserved.
* Copyright (c) 2014-2018 Intel, Inc. All rights reserved.
* Copyright (c) 2014-2020 Intel, Inc. All rights reserved.
* Copyright (c) 2018 Research Organization for Information Science
* and Technology (RIST). All rights reserved.
* $COPYRIGHT$
@ -21,7 +21,7 @@
* $HEADER$
*/
#include <src/include/pmix_config.h>
#include "src/include/pmix_config.h"
#ifdef HAVE_STRING_H
@ -33,8 +33,7 @@
#include <stdlib.h>
#endif
#include <pmix_common.h>
#include <pmix_rename.h>
#include "include/pmix_common.h"
#include "src/include/pmix_globals.h"
@ -230,6 +229,16 @@ PMIX_EXPORT const char* pmix_command_string(pmix_cmd_t cmd)
return "IOF PUSH";
case PMIX_IOF_PULL_CMD:
return "IOF PULL";
case PMIX_GROUP_CONSTRUCT_CMD:
return "GROUP CONSTRUCT";
case PMIX_GROUP_JOIN_CMD:
return "GROUP JOIN";
case PMIX_GROUP_INVITE_CMD:
return "GROUP INVITE";
case PMIX_GROUP_LEAVE_CMD:
return "GROUP LEAVE";
case PMIX_GROUP_DESTRUCT_CMD:
return "GROUP DESTRUCT";
default:
return "UNKNOWN";
}

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

@ -10,7 +10,8 @@
* University of Stuttgart. All rights reserved.
* Copyright (c) 2004-2005 The Regents of the University of California.
* All rights reserved.
* Copyright (c) 2015-2019 Intel, Inc. All rights reserved.
* Copyright (c) 2015-2020 Intel, Inc. All rights reserved.
* Copyright (c) 2020 IBM Corporation. All rights reserved.
* $COPYRIGHT$
*
* Additional copyrights may follow
@ -21,11 +22,11 @@
#ifndef PMIX_EVENT_H
#define PMIX_EVENT_H
#include <src/include/pmix_config.h>
#include "src/include/pmix_config.h"
#include "src/include/types.h"
#include PMIX_EVENT_HEADER
#include <pmix_common.h>
#include "include/pmix_common.h"
#include "src/class/pmix_list.h"
#include "src/util/output.h"
@ -122,6 +123,7 @@ typedef struct pmix_event_chain_t {
bool timer_active;
bool nondefault;
bool endchain;
bool cached;
pmix_proc_t source;
pmix_data_range_t range;
/* When generating events, callers can specify
@ -147,30 +149,30 @@ PMIX_CLASS_DECLARATION(pmix_event_chain_t);
/* prepare a chain for processing by cycling across provided
* info structs and translating those supported by the event
* system into the chain object*/
pmix_status_t pmix_prep_event_chain(pmix_event_chain_t *chain,
const pmix_info_t *info, size_t ninfo,
bool xfer);
PMIX_EXPORT pmix_status_t pmix_prep_event_chain(pmix_event_chain_t *chain,
const pmix_info_t *info, size_t ninfo,
bool xfer);
/* invoke the error handler that is registered against the given
* status, passing it the provided info on the procs that were
* affected, plus any additional info provided by the server */
void pmix_invoke_local_event_hdlr(pmix_event_chain_t *chain);
PMIX_EXPORT void pmix_invoke_local_event_hdlr(pmix_event_chain_t *chain);
bool pmix_notify_check_range(pmix_range_trkr_t *rng,
const pmix_proc_t *proc);
PMIX_EXPORT bool pmix_notify_check_range(pmix_range_trkr_t *rng,
const pmix_proc_t *proc);
bool pmix_notify_check_affected(pmix_proc_t *interested, size_t ninterested,
pmix_proc_t *affected, size_t naffected);
PMIX_EXPORT bool pmix_notify_check_affected(pmix_proc_t *interested, size_t ninterested,
pmix_proc_t *affected, size_t naffected);
/* invoke the server event notification handler */
pmix_status_t pmix_server_notify_client_of_event(pmix_status_t status,
const pmix_proc_t *source,
pmix_data_range_t range,
const pmix_info_t info[], size_t ninfo,
pmix_op_cbfunc_t cbfunc, void *cbdata);
PMIX_EXPORT pmix_status_t pmix_server_notify_client_of_event(pmix_status_t status,
const pmix_proc_t *source,
pmix_data_range_t range,
const pmix_info_t info[], size_t ninfo,
pmix_op_cbfunc_t cbfunc, void *cbdata);
void pmix_event_timeout_cb(int fd, short flags, void *arg);
PMIX_EXPORT void pmix_event_timeout_cb(int fd, short flags, void *arg);
#define PMIX_REPORT_EVENT(e, p, r, f) \
do { \
@ -246,8 +248,11 @@ void pmix_event_timeout_cb(int fd, short flags, void *arg);
ch->info = info; \
ch->ninfo = ninfo - 2; \
/* reset the timer */ \
pmix_event_del(&ch->ev); \
if (ch->timer_active) { \
pmix_event_del(&ch->ev); \
} \
PMIX_POST_OBJECT(ch); \
ch->timer_active = true; \
pmix_event_add(&ch->ev, &pmix_globals.event_window); \
} \
} while(0)

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

@ -1,6 +1,6 @@
/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil -*- */
/*
* Copyright (c) 2014-2019 Intel, Inc. All rights reserved.
* Copyright (c) 2014-2020 Intel, Inc. All rights reserved.
* Copyright (c) 2017-2019 Research Organization for Information Science
* and Technology (RIST). All rights reserved.
* Copyright (c) 2017 IBM Corporation. All rights reserved.
@ -11,15 +11,15 @@
*
* $HEADER$
*/
#include <src/include/pmix_config.h>
#include "src/include/pmix_config.h"
#include <pmix.h>
#include <pmix_common.h>
#include <pmix_server.h>
#include <pmix_rename.h>
#include "include/pmix.h"
#include "include/pmix_common.h"
#include "include/pmix_server.h"
#include "src/threads/threads.h"
#include "src/util/error.h"
#include "src/util/name_fns.h"
#include "src/util/output.h"
#include "src/mca/bfrops/bfrops.h"
@ -71,7 +71,7 @@ PMIX_EXPORT pmix_status_t PMIx_Notify_event(pmix_status_t status,
}
/* if we aren't connected, don't attempt to send */
if (!pmix_globals.connected) {
if (!pmix_globals.connected && PMIX_RANGE_PROC_LOCAL != range) {
PMIX_RELEASE_THREAD(&pmix_global_lock);
return PMIX_ERR_UNREACH;
}
@ -93,6 +93,7 @@ PMIX_EXPORT pmix_status_t PMIx_Notify_event(pmix_status_t status,
static void notify_event_cbfunc(struct pmix_peer_t *pr, pmix_ptl_hdr_t *hdr,
pmix_buffer_t *buf, void *cbdata)
{
(void)hdr;
pmix_status_t rc, ret;
int32_t cnt = 1;
pmix_cb_t *cb = (pmix_cb_t*)cbdata;
@ -110,7 +111,7 @@ static void notify_event_cbfunc(struct pmix_peer_t *pr, pmix_ptl_hdr_t *hdr,
PMIX_RELEASE(cb);
}
static pmix_status_t notify_event_cache(pmix_notify_caddy_t *cd)
pmix_status_t pmix_notify_event_cache(pmix_notify_caddy_t *cd)
{
pmix_status_t rc;
int j;
@ -219,8 +220,12 @@ static pmix_status_t notify_server_of_event(pmix_status_t status,
/* setup for our own local callbacks */
chain = PMIX_NEW(pmix_event_chain_t);
chain->status = status;
pmix_strncpy(chain->source.nspace, pmix_globals.myid.nspace, PMIX_MAX_NSLEN);
chain->source.rank = pmix_globals.myid.rank;
chain->range = range;
if (NULL == source) {
PMIX_LOAD_PROCID(&chain->source, pmix_globals.myid.nspace, pmix_globals.myid.rank);
} else {
PMIX_LOAD_PROCID(&chain->source, source->nspace, source->rank);
}
/* we always leave space for event hdlr name and a callback object */
chain->nallocated = ninfo + 2;
PMIX_INFO_CREATE(chain->info, chain->nallocated);
@ -231,14 +236,8 @@ static pmix_status_t notify_server_of_event(pmix_status_t status,
* ourselves should someone later register for it */
cd = PMIX_NEW(pmix_notify_caddy_t);
cd->status = status;
if (NULL == source) {
pmix_strncpy(cd->source.nspace, "UNDEF", PMIX_MAX_NSLEN);
cd->source.rank = PMIX_RANK_UNDEF;
} else {
pmix_strncpy(cd->source.nspace, source->nspace, PMIX_MAX_NSLEN);
cd->source.rank = source->rank;
}
cd->range = range;
PMIX_LOAD_PROCID(&cd->source, chain->source.nspace, chain->source.rank);
cd->range = chain->range;
if (0 < chain->ninfo) {
cd->ninfo = chain->ninfo;
PMIX_INFO_CREATE(cd->info, cd->ninfo);
@ -264,12 +263,13 @@ static pmix_status_t notify_server_of_event(pmix_status_t status,
memcpy(cd->affected, chain->affected, cd->naffected * sizeof(pmix_proc_t));
}
/* cache it */
rc = notify_event_cache(cd);
rc = pmix_notify_event_cache(cd);
if (PMIX_SUCCESS != rc) {
PMIX_ERROR_LOG(rc);
PMIX_RELEASE(cd);
goto cleanup;
}
chain->cached = true;
if (PMIX_RANGE_PROC_LOCAL != range && NULL != msg) {
/* create a callback object as we need to pass it to the
@ -327,6 +327,10 @@ static void progress_local_event_hdlr(pmix_status_t status,
pmix_list_item_t *item;
pmix_event_hdlr_t *nxt;
pmix_output_verbose(2, pmix_client_globals.event_output,
"%s progressing local event",
PMIX_NAME_PRINT(&pmix_globals.myid));
/* aggregate the results per RFC0018 - first search the
* prior chained results to see if any keys have been NULL'd
* as this indicates that info struct should be removed */
@ -620,8 +624,8 @@ void pmix_invoke_local_event_hdlr(pmix_event_chain_t *chain)
bool found;
pmix_output_verbose(2, pmix_client_globals.event_output,
"%s:%d invoke_local_event_hdlr for status %s",
pmix_globals.myid.nspace, pmix_globals.myid.rank,
"%s invoke_local_event_hdlr for status %s",
PMIX_NAME_PRINT(&pmix_globals.myid),
PMIx_Error_string(chain->status));
/* sanity check */
@ -629,6 +633,9 @@ void pmix_invoke_local_event_hdlr(pmix_event_chain_t *chain)
/* should never happen as space must always be
* reserved for handler name and callback object*/
rc = PMIX_ERR_BAD_PARAM;
pmix_output_verbose(8, pmix_client_globals.event_output,
"%s %s:%d", PMIX_NAME_PRINT(&pmix_globals.myid),
__FILE__, __LINE__);
goto complete;
}
@ -636,15 +643,25 @@ void pmix_invoke_local_event_hdlr(pmix_event_chain_t *chain)
if (NULL != chain->targets) {
found = false;
for (i=0; i < chain->ntargets; i++) {
pmix_output_verbose(8, pmix_client_globals.event_output,
"%s CHECKING TARGET %s",
PMIX_NAME_PRINT(&pmix_globals.myid),
PMIX_NAME_PRINT(&chain->targets[i]));
if (PMIX_CHECK_PROCID(&chain->targets[i], &pmix_globals.myid)) {
found = true;
break;
}
}
if (!found) {
pmix_output_verbose(8, pmix_client_globals.event_output,
"%s %s:%d", PMIX_NAME_PRINT(&pmix_globals.myid),
__FILE__, __LINE__);
goto complete;
}
}
pmix_output_verbose(8, pmix_client_globals.event_output,
"%s %s:%d", PMIX_NAME_PRINT(&pmix_globals.myid),
__FILE__, __LINE__);
/* if we registered a "first" handler, and it fits the given range,
* then invoke it first */
@ -656,6 +673,9 @@ void pmix_invoke_local_event_hdlr(pmix_event_chain_t *chain)
chain->affected, chain->naffected)) {
/* invoke the handler */
chain->evhdlr = pmix_globals.events.first;
pmix_output_verbose(8, pmix_client_globals.event_output,
"%s %s:%d", PMIX_NAME_PRINT(&pmix_globals.myid),
__FILE__, __LINE__);
goto invk;
} else if (NULL != pmix_globals.events.first->codes) {
/* need to check if this code is included in the array */
@ -671,6 +691,9 @@ void pmix_invoke_local_event_hdlr(pmix_event_chain_t *chain)
if (found && pmix_notify_check_range(&pmix_globals.events.first->rng, &chain->source)) {
/* invoke the handler */
chain->evhdlr = pmix_globals.events.first;
pmix_output_verbose(8, pmix_client_globals.event_output,
"%s %s:%d", PMIX_NAME_PRINT(&pmix_globals.myid),
__FILE__, __LINE__);
goto invk;
}
} else {
@ -678,11 +701,17 @@ void pmix_invoke_local_event_hdlr(pmix_event_chain_t *chain)
if (pmix_notify_check_range(&pmix_globals.events.first->rng, &chain->source)) {
/* invoke the handler */
chain->evhdlr = pmix_globals.events.first;
pmix_output_verbose(8, pmix_client_globals.event_output,
"%s %s:%d", PMIX_NAME_PRINT(&pmix_globals.myid),
__FILE__, __LINE__);
goto invk;
}
}
/* get here if there is no match, so fall thru */
}
pmix_output_verbose(8, pmix_client_globals.event_output,
"%s %s:%d", PMIX_NAME_PRINT(&pmix_globals.myid),
__FILE__, __LINE__);
/* cycle thru the single-event registrations first */
PMIX_LIST_FOREACH(evhdlr, &pmix_globals.events.single_events, pmix_event_hdlr_t) {
@ -692,6 +721,9 @@ void pmix_invoke_local_event_hdlr(pmix_event_chain_t *chain)
chain->affected, chain->naffected)) {
/* invoke the handler */
chain->evhdlr = evhdlr;
pmix_output_verbose(8, pmix_client_globals.event_output,
"%s %s:%d", PMIX_NAME_PRINT(&pmix_globals.myid),
__FILE__, __LINE__);
goto invk;
}
}
@ -707,11 +739,17 @@ void pmix_invoke_local_event_hdlr(pmix_event_chain_t *chain)
chain->affected, chain->naffected)) {
/* invoke the handler */
chain->evhdlr = evhdlr;
pmix_output_verbose(8, pmix_client_globals.event_output,
"%s %s:%d", PMIX_NAME_PRINT(&pmix_globals.myid),
__FILE__, __LINE__);
goto invk;
}
}
}
}
pmix_output_verbose(8, pmix_client_globals.event_output,
"%s %s:%d", PMIX_NAME_PRINT(&pmix_globals.myid),
__FILE__, __LINE__);
/* if they didn't want it to go to a default handler, then ignore them */
if (!chain->nondefault) {
@ -722,6 +760,9 @@ void pmix_invoke_local_event_hdlr(pmix_event_chain_t *chain)
chain->affected, chain->naffected)) {
/* invoke the handler */
chain->evhdlr = evhdlr;
pmix_output_verbose(8, pmix_client_globals.event_output,
"%s %s:%d", PMIX_NAME_PRINT(&pmix_globals.myid),
__FILE__, __LINE__);
goto invk;
}
}
@ -737,23 +778,37 @@ void pmix_invoke_local_event_hdlr(pmix_event_chain_t *chain)
if (1 == pmix_globals.events.last->ncodes &&
pmix_globals.events.last->codes[0] == chain->status) {
chain->evhdlr = pmix_globals.events.last;
pmix_output_verbose(8, pmix_client_globals.event_output,
"%s %s:%d", PMIX_NAME_PRINT(&pmix_globals.myid),
__FILE__, __LINE__);
goto invk;
} else if (NULL != pmix_globals.events.last->codes) {
/* need to check if this code is included in the array */
for (i=0; i < pmix_globals.events.last->ncodes; i++) {
if (pmix_globals.events.last->codes[i] == chain->status) {
chain->evhdlr = pmix_globals.events.last;
pmix_output_verbose(8, pmix_client_globals.event_output,
"%s %s:%d", PMIX_NAME_PRINT(&pmix_globals.myid),
__FILE__, __LINE__);
goto invk;
}
}
} else {
/* gets run for all codes */
chain->evhdlr = pmix_globals.events.last;
pmix_output_verbose(8, pmix_client_globals.event_output,
"%s %s:%d", PMIX_NAME_PRINT(&pmix_globals.myid),
__FILE__, __LINE__);
goto invk;
}
}
pmix_output_verbose(8, pmix_client_globals.event_output,
"%s %s:%d", PMIX_NAME_PRINT(&pmix_globals.myid),
__FILE__, __LINE__);
/* if we got here, then nothing was found */
rc = PMIX_ERR_NOT_FOUND;
complete:
/* we still have to call their final callback */
@ -766,6 +821,9 @@ void pmix_invoke_local_event_hdlr(pmix_event_chain_t *chain)
invk:
pmix_output_verbose(8, pmix_client_globals.event_output,
"%s %s:%d", PMIX_NAME_PRINT(&pmix_globals.myid),
__FILE__, __LINE__);
/* start with the chain holding only the given info */
chain->ninfo = chain->nallocated - 2;
@ -806,6 +864,8 @@ static void local_cbfunc(pmix_status_t status, void *cbdata)
static void _notify_client_event(int sd, short args, void *cbdata)
{
(void)sd;
(void)args;
pmix_notify_caddy_t *cd = (pmix_notify_caddy_t*)cbdata;
pmix_regevents_info_t *reginfoptr;
pmix_peer_events_info_t *pr;
@ -849,7 +909,7 @@ static void _notify_client_event(int sd, short args, void *cbdata)
* the message until all local procs have received it, or it ages to
* the point where it gets pushed out by more recent events */
PMIX_RETAIN(cd);
rc = notify_event_cache(cd);
rc = pmix_notify_event_cache(cd);
if (PMIX_SUCCESS != rc) {
PMIX_ERROR_LOG(rc);
}
@ -859,8 +919,10 @@ static void _notify_client_event(int sd, short args, void *cbdata)
* against our registrations */
chain = PMIX_NEW(pmix_event_chain_t);
chain->status = cd->status;
pmix_strncpy(chain->source.nspace, cd->source.nspace, PMIX_MAX_NSLEN);
chain->source.rank = cd->source.rank;
if (holdcd) {
chain->cached = true;
}
PMIX_LOAD_PROCID(&chain->source, cd->source.nspace, cd->source.rank);
/* we always leave space for a callback object and
* the evhandler name. */
chain->nallocated = cd->ninfo + 2;
@ -1095,15 +1157,6 @@ pmix_status_t pmix_server_notify_client_of_event(pmix_status_t status,
"pmix_server: notify client of event %s",
PMIx_Error_string(status));
if (NULL != info) {
for (n=0; n < ninfo; n++) {
if (PMIX_CHECK_KEY(&info[n], PMIX_EVENT_PROXY) &&
PMIX_CHECK_PROCID(info[n].value.data.proc, &pmix_globals.myid)) {
return PMIX_OPERATION_SUCCEEDED;
}
}
}
cd = PMIX_NEW(pmix_notify_caddy_t);
cd->status = status;
if (NULL == source) {
@ -1212,6 +1265,8 @@ bool pmix_notify_check_affected(pmix_proc_t *interested, size_t ninterested,
void pmix_event_timeout_cb(int fd, short flags, void *arg)
{
(void)fd;
(void)flags;
pmix_event_chain_t *ch = (pmix_event_chain_t*)arg;
/* need to acquire the object from its originating thread */
@ -1374,6 +1429,7 @@ static void chcon(pmix_event_chain_t *p)
p->source.rank = PMIX_RANK_UNDEF;
p->nondefault = false;
p->endchain = false;
p->cached = false;
p->targets = NULL;
p->ntargets = 0;
p->range = PMIX_RANGE_UNDEF;

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

@ -1,6 +1,6 @@
/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil -*- */
/*
* Copyright (c) 2014-2019 Intel, Inc. All rights reserved.
* Copyright (c) 2014-2020 Intel, Inc. All rights reserved.
* Copyright (c) 2017-2018 Research Organization for Information Science
* and Technology (RIST). All rights reserved.
* $COPYRIGHT$
@ -9,12 +9,11 @@
*
* $HEADER$
*/
#include <src/include/pmix_config.h>
#include "src/include/pmix_config.h"
#include <pmix.h>
#include <pmix_common.h>
#include <pmix_server.h>
#include <pmix_rename.h>
#include "include/pmix.h"
#include "include/pmix_common.h"
#include "include/pmix_server.h"
#include "src/threads/threads.h"
#include "src/util/error.h"
@ -30,6 +29,8 @@
pmix_object_t super;
volatile bool active;
pmix_event_t ev;
pmix_lock_t lock;
pmix_status_t status;
size_t index;
bool firstoverall;
bool enviro;
@ -48,6 +49,7 @@
} pmix_rshift_caddy_t;
static void rscon(pmix_rshift_caddy_t *p)
{
PMIX_CONSTRUCT_LOCK(&p->lock);
p->firstoverall = false;
p->enviro = false;
p->list = NULL;
@ -65,6 +67,7 @@ static void rscon(pmix_rshift_caddy_t *p)
}
static void rsdes(pmix_rshift_caddy_t *p)
{
PMIX_DESTRUCT_LOCK(&p->lock);
if (0 < p->ncodes) {
free(p->codes);
}
@ -118,12 +121,12 @@ static void regevents_cbfunc(struct pmix_peer_t *peer, pmix_ptl_hdr_t *hdr,
}
/* call the callback */
if (NULL != cd && NULL != cd->evregcbfn) {
cd->evregcbfn(ret, index, cd->cbdata);
}
if (NULL != cd) {
/* check this event against anything in our cache */
check_cached_events(cd);
if (NULL != cd->evregcbfn) {
cd->evregcbfn(ret, index, cd->cbdata);
}
}
/* release any info we brought along as they are
@ -516,8 +519,22 @@ static void reg_event_hdlr(int sd, short args, void *cbdata)
} else if (0 == strncmp(cd->info[n].key, PMIX_RANGE, PMIX_MAX_KEYLEN)) {
range = cd->info[n].value.data.range;
} else if (0 == strncmp(cd->info[n].key, PMIX_EVENT_CUSTOM_RANGE, PMIX_MAX_KEYLEN)) {
parray = (pmix_proc_t*)cd->info[n].value.data.darray->array;
nprocs = cd->info[n].value.data.darray->size;
/* provides an array of pmix_proc_t identifying the procs
* that are to receive this notification, or a single pmix_proc_t */
if (PMIX_DATA_ARRAY == cd->info[n].value.type &&
NULL != cd->info[n].value.data.darray &&
NULL != cd->info[n].value.data.darray->array) {
parray = (pmix_proc_t*)cd->info[n].value.data.darray->array;
nprocs = cd->info[n].value.data.darray->size;
} else if (PMIX_PROC == cd->info[n].value.type &&
NULL != cd->info[n].value.data.proc) {
parray = cd->info[n].value.data.proc;
nprocs = 1;
} else {
/* this is an error */
rc = PMIX_ERR_BAD_PARAM;
goto ack;
}
} else if (0 == strncmp(cd->info[n].key, PMIX_EVENT_AFFECTED_PROC, PMIX_MAX_KEYLEN)) {
cd->affected = cd->info[n].value.data.proc;
cd->naffected = 1;
@ -617,28 +634,7 @@ static void reg_event_hdlr(int sd, short args, void *cbdata)
cd->list = NULL;
cd->hdlr = evhdlr;
cd->firstoverall = firstoverall;
rc = _add_hdlr(cd, &xfer);
PMIX_LIST_DESTRUCT(&xfer);
if (PMIX_SUCCESS != rc &&
PMIX_ERR_WOULD_BLOCK != rc) {
/* unable to register */
--pmix_globals.events.nhdlrs;
rc = PMIX_ERR_EVENT_REGISTRATION;
index = UINT_MAX;
if (firstoverall) {
pmix_globals.events.first = NULL;
} else {
pmix_globals.events.last = NULL;
}
PMIX_RELEASE(evhdlr);
goto ack;
}
if (PMIX_ERR_WOULD_BLOCK == rc) {
/* the callback will provide our response */
PMIX_RELEASE(cd);
return;
}
goto ack;
goto addtolist;
}
/* get here if this isn't an overall first or last event - start
@ -705,6 +701,109 @@ static void reg_event_hdlr(int sd, short args, void *cbdata)
cd->index = index;
cd->hdlr = evhdlr;
cd->firstoverall = false;
addtolist:
if (NULL != cd->list) {
/* now add this event to the appropriate list - if the registration
* subsequently fails, it will be removed */
/* if the list is empty, or no location was specified, just put this on it */
if (0 == pmix_list_get_size(cd->list) ||
PMIX_EVENT_ORDER_NONE == location) {
pmix_list_prepend(cd->list, &evhdlr->super);
} else if (PMIX_EVENT_ORDER_FIRST == location) {
/* see if the first handler on the list was also declared as "first" */
ev = (pmix_event_hdlr_t*)pmix_list_get_first(cd->list);
if (PMIX_EVENT_ORDER_FIRST == ev->precedence) {
/* this is an error */
--pmix_globals.events.nhdlrs;
rc = PMIX_ERR_EVENT_REGISTRATION;
index = UINT_MAX;
PMIX_RELEASE(evhdlr);
goto ack;
}
/* prepend it to the list */
pmix_list_prepend(cd->list, &evhdlr->super);
} else if (PMIX_EVENT_ORDER_LAST == location) {
/* see if the last handler on the list was also declared as "last" */
ev = (pmix_event_hdlr_t*)pmix_list_get_last(cd->list);
if (PMIX_EVENT_ORDER_LAST == ev->precedence) {
/* this is an error */
--pmix_globals.events.nhdlrs;
rc = PMIX_ERR_EVENT_REGISTRATION;
index = UINT_MAX;
PMIX_RELEASE(evhdlr);
goto ack;
}
/* append it to the list */
pmix_list_append(cd->list, &evhdlr->super);
} else if (PMIX_EVENT_ORDER_PREPEND == location) {
/* we know the list isn't empty - check the first element to see if
* it is designated to be "first". If so, then we need to put this
* right after it */
ev = (pmix_event_hdlr_t*)pmix_list_get_first(cd->list);
if (PMIX_EVENT_ORDER_FIRST == ev->precedence) {
ev = (pmix_event_hdlr_t*)pmix_list_get_next(&ev->super);
if (NULL != ev) {
pmix_list_insert_pos(cd->list, &ev->super, &evhdlr->super);
} else {
/* we are at the end of the list */
pmix_list_append(cd->list, &evhdlr->super);
}
} else {
pmix_list_prepend(cd->list, &evhdlr->super);
}
} else if (PMIX_EVENT_ORDER_APPEND == location) {
/* we know the list isn't empty - check the last element to see if
* it is designated to be "last". If so, then we need to put this
* right before it */
ev = (pmix_event_hdlr_t*)pmix_list_get_last(cd->list);
if (PMIX_EVENT_ORDER_LAST == ev->precedence) {
pmix_list_insert_pos(cd->list, &ev->super, &evhdlr->super);
} else {
pmix_list_append(cd->list, &evhdlr->super);
}
} else {
/* find the named event */
found = false;
PMIX_LIST_FOREACH(ev, cd->list, pmix_event_hdlr_t) {
if (NULL == ev->name) {
continue;
}
if (0 == strcmp(ev->name, name)) {
if (PMIX_EVENT_ORDER_BEFORE == location) {
/* put it before this handler */
pmix_list_insert_pos(cd->list, &ev->super, &evhdlr->super);
} else {
/* put it after this handler */
ev = (pmix_event_hdlr_t*)pmix_list_get_next(&ev->super);
if (NULL != ev) {
pmix_list_insert_pos(cd->list, &ev->super, &evhdlr->super);
} else {
/* we are at the end of the list */
pmix_list_append(cd->list, &evhdlr->super);
}
}
found = true;
break;
}
}
/* if the handler wasn't found, then we return an error. At some
* future time, we may change this behavior and cache this handler
* until the reference one has been registered. However, this could
* turn out to be a laborious search procedure as the reference
* event handler may in turn be dependent on another handler, etc. */
if (!found) {
/* this is an error */
--pmix_globals.events.nhdlrs;
rc = PMIX_ERR_EVENT_REGISTRATION;
index = UINT_MAX;
PMIX_RELEASE(evhdlr);
goto ack;
}
}
}
/* tell the server about it, if necessary - any actions
* will be deferred until after this event completes */
if (PMIX_RANGE_PROC_LOCAL == range) {
@ -719,106 +818,14 @@ static void reg_event_hdlr(int sd, short args, void *cbdata)
--pmix_globals.events.nhdlrs;
rc = PMIX_ERR_EVENT_REGISTRATION;
index = UINT_MAX;
if (firstoverall) {
pmix_globals.events.first = NULL;
} else if (lastoverall) {
pmix_globals.events.last = NULL;
} else if (NULL != cd->list) {
pmix_list_remove_item(cd->list, &evhdlr->super);
}
PMIX_RELEASE(evhdlr);
goto ack;
}
/* now add this event to the appropriate list - if the registration
* subsequently fails, it will be removed */
/* if the list is empty, or no location was specified, just put this on it */
if (0 == pmix_list_get_size(cd->list) ||
PMIX_EVENT_ORDER_NONE == location) {
pmix_list_prepend(cd->list, &evhdlr->super);
} else if (PMIX_EVENT_ORDER_FIRST == location) {
/* see if the first handler on the list was also declared as "first" */
ev = (pmix_event_hdlr_t*)pmix_list_get_first(cd->list);
if (PMIX_EVENT_ORDER_FIRST == ev->precedence) {
/* this is an error */
--pmix_globals.events.nhdlrs;
rc = PMIX_ERR_EVENT_REGISTRATION;
index = UINT_MAX;
PMIX_RELEASE(evhdlr);
goto ack;
}
/* prepend it to the list */
pmix_list_prepend(cd->list, &evhdlr->super);
} else if (PMIX_EVENT_ORDER_LAST == location) {
/* see if the last handler on the list was also declared as "last" */
ev = (pmix_event_hdlr_t*)pmix_list_get_last(cd->list);
if (PMIX_EVENT_ORDER_LAST == ev->precedence) {
/* this is an error */
--pmix_globals.events.nhdlrs;
rc = PMIX_ERR_EVENT_REGISTRATION;
index = UINT_MAX;
PMIX_RELEASE(evhdlr);
goto ack;
}
/* append it to the list */
pmix_list_append(cd->list, &evhdlr->super);
} else if (PMIX_EVENT_ORDER_PREPEND == location) {
/* we know the list isn't empty - check the first element to see if
* it is designated to be "first". If so, then we need to put this
* right after it */
ev = (pmix_event_hdlr_t*)pmix_list_get_first(cd->list);
if (PMIX_EVENT_ORDER_FIRST == ev->precedence) {
ev = (pmix_event_hdlr_t*)pmix_list_get_next(&ev->super);
if (NULL != ev) {
pmix_list_insert_pos(cd->list, &ev->super, &evhdlr->super);
} else {
/* we are at the end of the list */
pmix_list_append(cd->list, &evhdlr->super);
}
} else {
pmix_list_prepend(cd->list, &evhdlr->super);
}
} else if (PMIX_EVENT_ORDER_APPEND == location) {
/* we know the list isn't empty - check the last element to see if
* it is designated to be "last". If so, then we need to put this
* right before it */
ev = (pmix_event_hdlr_t*)pmix_list_get_last(cd->list);
if (PMIX_EVENT_ORDER_LAST == ev->precedence) {
pmix_list_insert_pos(cd->list, &ev->super, &evhdlr->super);
} else {
pmix_list_append(cd->list, &evhdlr->super);
}
} else {
/* find the named event */
found = false;
PMIX_LIST_FOREACH(ev, cd->list, pmix_event_hdlr_t) {
if (NULL == ev->name) {
continue;
}
if (0 == strcmp(ev->name, name)) {
if (PMIX_EVENT_ORDER_BEFORE == location) {
/* put it before this handler */
pmix_list_insert_pos(cd->list, &ev->super, &evhdlr->super);
} else {
/* put it after this handler */
ev = (pmix_event_hdlr_t*)pmix_list_get_next(&ev->super);
if (NULL != ev) {
pmix_list_insert_pos(cd->list, &ev->super, &evhdlr->super);
} else {
/* we are at the end of the list */
pmix_list_append(cd->list, &evhdlr->super);
}
}
found = true;
break;
}
}
/* if the handler wasn't found, then we return an error. At some
* future time, we may change this behavior and cache this handler
* until the reference one has been registered. However, this could
* turn out to be a laborious search procedure as the reference
* event handler may in turn be dependent on another handler, etc. */
if (!found) {
/* this is an error */
--pmix_globals.events.nhdlrs;
rc = PMIX_ERR_EVENT_REGISTRATION;
index = UINT_MAX;
PMIX_RELEASE(evhdlr);
goto ack;
}
}
if (PMIX_ERR_WOULD_BLOCK == rc) {
/* the callback will provide our response */
@ -827,12 +834,6 @@ static void reg_event_hdlr(int sd, short args, void *cbdata)
}
ack:
/* acknowledge the registration so the caller can release
* their data AND record the event handler index */
if (NULL != cd->evregcbfn) {
cd->evregcbfn(rc, index, cd->cbdata);
}
/* check if any matching notifications have been locally cached */
check_cached_events(cd);
if (NULL != cd->codes) {
@ -840,8 +841,27 @@ static void reg_event_hdlr(int sd, short args, void *cbdata)
cd->codes = NULL;
}
/* all done */
PMIX_RELEASE(cd);
/* acknowledge the registration so the caller can release
* their data AND record the event handler index */
if (NULL != cd->evregcbfn) {
cd->evregcbfn(rc, index, cd->cbdata);
PMIX_RELEASE(cd);
}
}
static void mycbfn(pmix_status_t status,
size_t refid,
void *cbdata)
{
pmix_rshift_caddy_t *cd = (pmix_rshift_caddy_t*)cbdata;
PMIX_ACQUIRE_OBJECT(cd);
if (PMIX_SUCCESS == status) {
cd->status = refid;
} else {
cd->status = status;
}
PMIX_WAKEUP_THREAD(&cd->lock);
}
PMIX_EXPORT void PMIx_Register_event_handler(pmix_status_t codes[], size_t ncodes,
@ -858,7 +878,7 @@ PMIX_EXPORT void PMIx_Register_event_handler(pmix_status_t codes[], size_t ncode
if (pmix_globals.init_cntr <= 0) {
PMIX_RELEASE_THREAD(&pmix_global_lock);
if (NULL != cbfunc) {
cbfunc(PMIX_ERR_INIT, 0, cbdata);
cbfunc(PMIX_ERR_INIT, SIZE_MAX, cbdata);
}
return;
}
@ -888,13 +908,30 @@ PMIX_EXPORT void PMIx_Register_event_handler(pmix_status_t codes[], size_t ncode
cd->info = info;
cd->ninfo = ninfo;
cd->evhdlr = event_hdlr;
cd->evregcbfn = cbfunc;
cd->cbdata = cbdata;
pmix_output_verbose(2, pmix_client_globals.event_output,
"pmix_register_event_hdlr shifting to progress thread");
if (NULL != cbfunc) {
pmix_output_verbose(2, pmix_client_globals.event_output,
"pmix_register_event_hdlr shifting to progress thread");
PMIX_THREADSHIFT(cd, reg_event_hdlr);
cd->evregcbfn = cbfunc;
cd->cbdata = cbdata;
PMIX_THREADSHIFT(cd, reg_event_hdlr);
} else {
cd->evregcbfn = mycbfn;
cd->cbdata = cd;
PMIX_RETAIN(cd);
reg_event_hdlr(0, 0, (void*)cd);
PMIX_WAIT_THREAD(&cd->lock);
if (NULL != cbfunc) {
if (0 > cd->status) {
cbfunc(cd->status, SIZE_MAX, cbdata);
} else {
cbfunc(PMIX_SUCCESS, cd->status, cbdata);
}
}
PMIX_RELEASE(cd);
}
return;
}
static void dereg_event_hdlr(int sd, short args, void *cbdata)
@ -1085,6 +1122,15 @@ static void dereg_event_hdlr(int sd, short args, void *cbdata)
PMIX_RELEASE(cd);
}
static void myopcb(pmix_status_t status, void *cbdata)
{
pmix_shift_caddy_t *cd = (pmix_shift_caddy_t*)cbdata;
PMIX_ACQUIRE_OBJECT(cd);
cd->status = status;
PMIX_WAKEUP_THREAD(&cd->lock);
}
PMIX_EXPORT void PMIx_Deregister_event_handler(size_t event_hdlr_ref,
pmix_op_cbfunc_t cbfunc,
void *cbdata)
@ -1103,11 +1149,19 @@ PMIX_EXPORT void PMIx_Deregister_event_handler(size_t event_hdlr_ref,
/* need to thread shift this request */
cd = PMIX_NEW(pmix_shift_caddy_t);
cd->cbfunc.opcbfn = cbfunc;
cd->cbdata = cbdata;
if (NULL == cbfunc) {
cd->cbfunc.opcbfn = myopcb;
PMIX_RETAIN(cd);
cd->cbdata = cd;
} else {
cd->cbfunc.opcbfn = cbfunc;
cd->cbdata = cbdata;
}
cd->ref = event_hdlr_ref;
pmix_output_verbose(2, pmix_client_globals.event_output,
"pmix_deregister_event_hdlr shifting to progress thread");
PMIX_THREADSHIFT(cd, dereg_event_hdlr);
return;
}

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