Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2026-05-09 09:01:22

0001 /* include/pmix_common.h.  Generated from pmix_common.h.in by configure.  */
0002 /* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil -*- */
0003 /*
0004  * Copyright (c) 2013-2020 Intel, Inc.  All rights reserved.
0005  * Copyright (c) 2016-2019 Research Organization for Information Science
0006  *                         and Technology (RIST).  All rights reserved.
0007  * Copyright (c) 2016-2022 IBM Corporation.  All rights reserved.
0008  * Copyright (c) 2016-2019 Mellanox Technologies, Inc.
0009  *                         All rights reserved.
0010  * Copyright (c) 2021      Triad National Security, LLC. All rights
0011  *                         reserved.
0012  *
0013  *
0014  * Redistribution and use in source and binary forms, with or without
0015  * modification, are permitted provided that the following conditions are
0016  * met:
0017  *
0018  * - Redistributions of source code must retain the above copyright
0019  *   notice, this list of conditions and the following disclaimer.
0020  *
0021  * - Redistributions in binary form must reproduce the above copyright
0022  *   notice, this list of conditions and the following disclaimer listed
0023  *   in this license in the documentation and/or other materials
0024  *   provided with the distribution.
0025  *
0026  * - Neither the name of the copyright holders nor the names of its
0027  *   contributors may be used to endorse or promote products derived from
0028  *   this software without specific prior written permission.
0029  *
0030  * The copyright holders provide no reassurances that the source code
0031  * provided does not infringe any patent, copyright, or any other
0032  * intellectual property rights of third parties.  The copyright holders
0033  * disclaim any liability to any recipient for claims brought against
0034  * recipient by any third party for infringement of that parties
0035  * intellectual property rights.
0036  *
0037  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
0038  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
0039  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
0040  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
0041  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
0042  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
0043  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
0044  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
0045  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
0046  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
0047  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
0048  *
0049  * Copyright (c) 2020      Cisco Systems, Inc.  All rights reserved
0050  * Copyright (c) 2021-2026 Nanook Consulting  All rights reserved.
0051  * $COPYRIGHT$
0052  *
0053  * Additional copyrights may follow
0054  *
0055  * $HEADER$
0056  */
0057 
0058 #ifndef PMIx_COMMON_H
0059 #define PMIx_COMMON_H
0060 
0061 #include <stdbool.h>
0062 #include <stdlib.h>
0063 #include <stdint.h>
0064 #include <stdio.h>
0065 #include <string.h>
0066 #include <time.h>
0067 #include <ctype.h>
0068 #include <sys/time.h> /* for struct timeval */
0069 #include <unistd.h> /* for uid_t and gid_t */
0070 #include <sys/types.h> /* for uid_t and gid_t */
0071 
0072 /* Whether C compiler supports -fvisibility */
0073 #define PMIX_HAVE_VISIBILITY 1
0074 
0075 #if PMIX_HAVE_VISIBILITY == 1
0076 #define PMIX_EXPORT __attribute__((__visibility__("default")))
0077 #else
0078 #define PMIX_EXPORT
0079 #endif
0080 
0081 
0082 #include <pmix_version.h>
0083 
0084 #if defined(c_plusplus) || defined(__cplusplus)
0085 extern "C" {
0086 #endif
0087 
0088 /****  PMIX CONSTANTS    ****/
0089 
0090 /* define maximum value and key sizes */
0091 #define PMIX_MAX_NSLEN     255
0092 #define PMIX_MAX_KEYLEN    511
0093 
0094 /* define abstract types for namespaces and keys */
0095 typedef char pmix_nspace_t[PMIX_MAX_NSLEN+1];
0096 typedef char pmix_key_t[PMIX_MAX_KEYLEN+1];
0097 
0098 /* define a type for rank values */
0099 typedef uint32_t pmix_rank_t;
0100 
0101 /* define a value for requests for job-level data
0102  * where the info itself isn't associated with any
0103  * specific rank, or when a request involves
0104  * a rank that isn't known - e.g., when someone requests
0105  * info thru one of the legacy interfaces where the rank
0106  * is typically encoded into the key itself since there is
0107  * no rank parameter in the API itself */
0108 #define PMIX_RANK_UNDEF     UINT32_MAX
0109 /* define a value to indicate that the user wants the
0110  * data for the given key from every rank that posted
0111  * that key */
0112 #define PMIX_RANK_WILDCARD  UINT32_MAX-1
0113 /* other special rank values will be used to define
0114  * groups of ranks for use in collectives */
0115 #define PMIX_RANK_LOCAL_NODE    UINT32_MAX-2        // all ranks on local node
0116 #define PMIX_RANK_LOCAL_PEERS   UINT32_MAX-4        // all peers (i.e., all procs within the same nspace) on local node
0117 /* define an invalid value */
0118 #define PMIX_RANK_INVALID   UINT32_MAX-3
0119 /* define a boundary for valid ranks */
0120 #define PMIX_RANK_VALID         UINT32_MAX-50
0121 /* define a macro for testing for valid ranks */
0122 #define PMIX_RANK_IS_VALID(r)   \
0123     ((r) < PMIX_RANK_VALID)
0124 
0125 /* define a value to indicate that data applies
0126  * to all apps in a job */
0127 #define PMIX_APP_WILDCARD  UINT32_MAX
0128 
0129 /****  PMIX ENVIRONMENTAL PARAMETERS  ****/
0130 /* URI of tool waiting for launcher to rendezvous back to it */
0131 #define PMIX_LAUNCHER_RNDZ_URI "PMIX_LAUNCHER_RNDZ_URI"
0132 
0133 /* PMIX_LAUNCHER_RNDZ_FILE - if set, contains the full pathname
0134  * of a file the launcher is to write that contains its connection info.
0135  * Works in addition to anything else the launcher may output.
0136  */
0137 #define PMIX_LAUNCHER_RNDZ_FILE "PMIX_LAUNCHER_RNDZ_FILE"
0138 
0139 /* pipe to be monitored that indicates when the parent process
0140  * terminates - used by fork'd tools to identify when the tool
0141  * that started them has died */
0142 #define PMIX_KEEPALIVE_PIPE "PMIX_KEEPALIVE_PIPE"
0143 
0144 
0145 /* define a set of "standard" PMIx attributes that can
0146  * be queried. Implementations (and users) are free to extend as
0147  * desired, so the get functions need to be capable
0148  * of handling the "not found" condition. Note that these
0149  * are attributes of the system and the job as opposed to
0150  * values the application (or underlying MPI library)
0151  * might choose to expose - i.e., they are values provided
0152  * by the resource manager as opposed to the application. Thus,
0153  * these keys are RESERVED */
0154 #define PMIX_ATTR_UNDEF      "pmix.undef"
0155 
0156 /* initialization attributes */
0157 #define PMIX_EXTERNAL_PROGRESS              "pmix.evext"            // (bool) The host shall progress the PMIx library via
0158                                                                     //        calls to PMIx_Progress
0159 #define PMIX_PROGRESS_THREAD_FLUSH          "pmix.evflush"          // (bool) Flush the internal progress thread before stopping
0160 #define PMIX_PROGRESS_THREAD_NAME           "pmix.evname"           // (char*) Name of specific progress thread to stop. NULL is
0161                                                                     //         interpreted to mean all threads
0162 #define PMIX_EXTERNAL_AUX_EVENT_BASE        "pmix.evaux"            // (void*) event base to be used for auxiliary
0163                                                                     //        functions (e.g., capturing signals) that would
0164                                                                     //        otherwise interfere with the host
0165 #define PMIX_SERVER_TOOL_SUPPORT            "pmix.srvr.tool"        // (bool) The host RM wants to declare itself as willing
0166                                                                     //        to accept tool connection requests - rendezvous
0167                                                                     //        files will be readable only by the host's user ID
0168 #define PMIX_SERVER_ALLOW_FOREIGN_TOOLS     "pmix.srvr.ftools"      // (bool) Mark the tool rendezvous files as readable
0169                                                                     //        by all users and allow tools from user IDs other
0170                                                                     //        than that of the server to connect. Note that the
0171                                                                     //        host has ultimate authority over such connections,
0172                                                                     //        and can restrict execution of tool requests as per
0173                                                                     //        host policy (e.g., limit foreign tools to "queries")
0174 #define PMIX_ALLOW_CLIENT_CLONES            "pmix.allow.clones"     // (bool) Allow connections from forks of client processes
0175 #define PMIX_SERVER_REMOTE_CONNECTIONS      "pmix.srvr.remote"      // (bool) Allow connections from remote tools (do not use
0176                                                                     //        loopback device)
0177 #define PMIX_SERVER_SYSTEM_SUPPORT          "pmix.srvr.sys"         // (bool) The host RM wants to declare itself as being
0178                                                                     //        the local system server for PMIx connection
0179                                                                     //        requests - rendezvous files will be readable
0180                                                                     //        only by the host's user ID
0181 #define PMIX_SERVER_SESSION_SUPPORT         "pmix.srvr.sess"        // (bool) The host RM wants to declare itself as being
0182                                                                     //        the local session server for PMIx connection
0183                                                                     //        requests
0184 #define PMIX_SERVER_TMPDIR                  "pmix.srvr.tmpdir"      // (char*) temp directory where PMIx server will place
0185                                                                     //        client rendezvous points and contact info
0186 #define PMIX_SYSTEM_TMPDIR                  "pmix.sys.tmpdir"       // (char*) temp directory for this system, where PMIx
0187                                                                     //        server will place tool rendezvous points and
0188                                                                     //        contact info
0189 #define PMIX_SERVER_SHARE_TOPOLOGY          "pmix.srvr.share"       // (bool) server is to share its copy of the local node
0190                                                                     // topology (whether given to it or self-discovered) with any clients.
0191 #define PMIX_SERVER_ENABLE_MONITORING       "pmix.srv.monitor"      // (bool) Enable PMIx internal monitoring by server
0192 #define PMIX_SERVER_NSPACE                  "pmix.srv.nspace"       // (char*) Name of the nspace to use for this server
0193 #define PMIX_SERVER_RANK                    "pmix.srv.rank"         // (pmix_rank_t) Rank of this server
0194 #define PMIX_SERVER_GATEWAY                 "pmix.srv.gway"         // (bool) Server is acting as a gateway for PMIx requests
0195                                                                     //        that cannot be serviced on backend nodes
0196                                                                     //        (e.g., logging to email)
0197 #define PMIX_SERVER_SYS_CONTROLLER          "pmix.srv.ctrlr"        // (bool) Server is hosted by the system controller for
0198                                                                     //        the cluster
0199 #define PMIX_SERVER_SCHEDULER               "pmix.srv.sched"        // (bool) Server is hosted by the system scheduler
0200 #define PMIX_SERVER_START_TIME              "pmix.srv.strtime"      // (char*) Time when the server started - i.e., when the server created
0201                                                                     //         it's rendezvous file (given in ctime string format)
0202 #define PMIX_HOMOGENEOUS_SYSTEM             "pmix.homo"             // (bool) The nodes comprising the session are homogeneous - i.e., they
0203                                                                     //        each contain the same number of identical packages, fabric interfaces,
0204                                                                     //        GPU, and other devices
0205 #define PMIX_SINGLETON                      "pmix.singleton"        // (char*) String representation (nspace.rank) of proc ID for the singleton
0206                                                                     //         the server was started to support
0207 #define PMIX_BIND_PROGRESS_THREAD           "pmix.bind.pt"          // (char*) Comma-delimited ranges of CPUs that the internal PMIx progress
0208                                                                     //         thread shall be bound to
0209 #define PMIX_BIND_REQUIRED                  "pmix.bind.reqd"        // (bool) Return error if the internal PMIx progress thread cannot be bound
0210 
0211 
0212 /* tool-related attributes */
0213 #define PMIX_TOOL_NSPACE                    "pmix.tool.nspace"      // (char*) Name of the nspace to use for this tool
0214 #define PMIX_TOOL_RANK                      "pmix.tool.rank"        // (uint32_t) Rank of this tool
0215 #define PMIX_SERVER_PIDINFO                 "pmix.srvr.pidinfo"     // (pid_t) pid of the target server for a tool
0216 #define PMIX_CONNECT_TO_SYSTEM              "pmix.cnct.sys"         // (bool) The requestor requires that a connection be made only to
0217                                                                     //        a local system-level PMIx server
0218 #define PMIX_CONNECT_SYSTEM_FIRST           "pmix.cnct.sys.first"   // (bool) Preferentially look for a system-level PMIx server first
0219 #define PMIX_CONNECT_TO_SCHEDULER           "pmix.cnct.sched"       // (bool) Connect to the system scheduler
0220 #define PMIX_CONNECT_TO_SYS_CONTROLLER      "pmix.cnct.ctrlr"       // (bool) Connect to the system controller
0221 #define PMIX_CONNECTION_ORDER               "pmix.cnct.ord"         // (char*) Comma-delimited list of attributes defining the order in which
0222                                                                     //        connections should be attempted, from first to last. If the
0223                                                                     //        final entry is not an "only" flag (e.g., PMIX_CONNECT_TO_SYSTEM),
0224                                                                     //        then connection will default to the local server if no preceding
0225                                                                     //        option succeeds. Thus, the following list:
0226                                                                     //              PMIX_CONNECT_TO_SCHEDULER
0227                                                                     //              PMIX_CONNECT_TO_SYS_CONTROLLER
0228                                                                     //              PMIX_CONNECT_TO_SYSTEM
0229                                                                     //        would first attempt to connect to the scheduler, then the system
0230                                                                     //        controller, and then the local system-level server. If none of those
0231                                                                     //        succeed, then the connection attempt will error out.
0232                                                                     //        However, if the last entry were PMIX_CONNECT_SYSTEM_FIRST, then the
0233                                                                     //        connection procedure would (after failing to connect to a local
0234                                                                     //        system-level server) continue to include an attempt to connect
0235                                                                     //        to any local server that accepted the connection request.
0236 #define PMIX_SERVER_URI                     "pmix.srvr.uri"         // (char*) URI of server to be contacted
0237 #define PMIX_MYSERVER_URI                   "pmix.mysrvr.uri"       // (char*) URI of this proc's listener socket
0238 #define PMIX_SERVER_HOSTNAME                "pmix.srvr.host"        // (char*) node where target server is located
0239 #define PMIX_CONNECT_MAX_RETRIES            "pmix.tool.mretries"    // (uint32_t) maximum number of times to try to connect to server
0240 #define PMIX_CONNECT_RETRY_DELAY            "pmix.tool.retry"       // (uint32_t) time in seconds between connection attempts
0241 #define PMIX_TOOL_DO_NOT_CONNECT            "pmix.tool.nocon"       // (bool) the tool wants to use internal PMIx support, but does
0242                                                                     //        not want to connect to a PMIx server
0243                                                                     //        from the specified processes to this tool
0244 #define PMIX_TOOL_CONNECT_OPTIONAL          "pmix.tool.conopt"      // (bool) tool shall connect to a server if available, but otherwise
0245                                                                     //        continue to operate unconnected
0246 #define PMIX_LAUNCHER                       "pmix.tool.launcher"    // (bool) tool is a launcher and needs rendezvous files created
0247 #define PMIX_LAUNCHER_RENDEZVOUS_FILE       "pmix.tool.lncrnd"      // (char*) Pathname of file where connection info is to be stored
0248 #define PMIX_TOOL_ATTACHMENT_FILE           "pmix.tool.attach"      // (char*) File containing connection info to be used for attaching to server
0249 #define PMIX_PRIMARY_SERVER                 "pmix.pri.srvr"         // (bool) The server to which the tool is connecting shall be designated
0250                                                                     //        the primary server once connection has been accomplished.
0251 #define PMIX_NOHUP                          "pmix.nohup"            // (bool) Any processes started on behalf of the calling tool (or the
0252                                                                     //        specified namespace, if such specification is included in the
0253                                                                     //        list of attributes) should continue after the tool disconnects
0254                                                                     //        from its server
0255 #define PMIX_LAUNCHER_DAEMON                "pmix.lnch.dmn"         // (char*) Path to executable that is to be used as the backend daemon
0256                                                                     //        for the launcher. This replaces the launcher's own daemon with
0257                                                                     //        the specified executable. Note that the user is therefore
0258                                                                     //        responsible for ensuring compatibility of the specified
0259                                                                     //        executable and the host launcher.
0260 #define PMIX_EXEC_AGENT                     "pmix.exec.agnt"        // (char*) Path to executable that the launcher's backend daemons are to
0261                                                                     //        fork/exec in place of the actual application processes. The
0262                                                                     //        launcher's daemon shall pass the full command line of the
0263                                                                     //        application on the command line of the exec agent, which shall
0264                                                                     //        not connect back to the launcher's daemon. The exec agent is
0265                                                                     //        responsible for exec'ing the specified application process in
0266                                                                     //        its own place.
0267 #define PMIX_LAUNCH_DIRECTIVES              "pmix.lnch.dirs"        // (pmix_data_array_t*) Array of pmix_info_t containing directives for
0268                                                                     //        the launcher - a convenience attribute for retrieving all
0269                                                                     //        directives with a single call to PMIx_Get
0270 
0271 /* identification attributes */
0272 #define PMIX_REALUID                        "pmix.ruid"             // (uint32_t) real user id
0273 #define PMIX_USERID                         "pmix.euid"             // (uint32_t) effective user id
0274 #define PMIX_REALGID                        "pmix.rgid"             // (uint32_t) real group id
0275 #define PMIX_GRPID                          "pmix.egid"             // (uint32_t) effective group id
0276 #define PMIX_REQUESTOR                      "pmix.requestor"        // (pmix_proc_t*) ID of the process requesting the
0277                                                                     //         specified operation. Used when relaying
0278                                                                     //         a request to the PMIx library on behalf
0279                                                                     //         of someone else where the API doesn't
0280                                                                     //         include a "requestor" parameter
0281 #define PMIX_VERSION_INFO                   "pmix.version"          // (char*) PMIx version of contactor
0282 #define PMIX_REQUESTOR_IS_TOOL              "pmix.req.tool"         // (bool) requesting process is a tool
0283 #define PMIX_REQUESTOR_IS_CLIENT            "pmix.req.client"       // (bool) requesting process is a client process
0284 #define PMIX_PSET_NAME                      "pmix.pset.nm"          // (char*) The name of the newly defined process set.
0285 #define PMIX_PSET_NAMES                     "pmix.pset.nms"         // (pmix_data_array_t*) Returns an array of string names of the
0286                                                                     //          process sets in which the given process is a member.
0287 #define PMIX_PSET_MEMBERS                   "pmix.pset.mems"        // (pmix_data_array_t*) An array of pmix_proc_t containing
0288                                                                     //          the members of the newly defined process set.
0289 #define PMIX_REINCARNATION                  "pmix.reinc"            // (uint32_t) number of times this process has been instantiated - i.e.,
0290                                                                     //            tracks the number of times it has been restarted
0291 
0292 /* model attributes */
0293 #define PMIX_PROGRAMMING_MODEL              "pmix.pgm.model"        // (char*) programming model being initialized (e.g., "MPI" or "OpenMP")
0294 #define PMIX_MODEL_LIBRARY_NAME             "pmix.mdl.name"         // (char*) programming model implementation ID (e.g., "OpenMPI" or "MPICH")
0295 #define PMIX_MODEL_LIBRARY_VERSION          "pmix.mld.vrs"          // (char*) programming model version string (e.g., "2.1.1")
0296 #define PMIX_THREADING_MODEL                "pmix.threads"          // (char*) threading model used (e.g., "pthreads")
0297 #define PMIX_MODEL_NUM_THREADS              "pmix.mdl.nthrds"       // (uint64_t) number of active threads being used by the model
0298 #define PMIX_MODEL_NUM_CPUS                 "pmix.mdl.ncpu"         // (uint64_t) number of cpus being used by the model
0299 #define PMIX_MODEL_CPU_TYPE                 "pmix.mdl.cputype"      // (char*) granularity - "hwthread", "core", etc.
0300 #define PMIX_MODEL_PHASE_NAME               "pmix.mdl.phase"        // (char*) user-assigned name for a phase in the application execution - e.g.,
0301                                                                     //         "cfd reduction"
0302 #define PMIX_MODEL_PHASE_TYPE               "pmix.mdl.ptype"        // (char*) type of phase being executed - e.g., "matrix multiply"
0303 #define PMIX_MODEL_AFFINITY_POLICY          "pmix.mdl.tap"          // (char*) thread affinity policy - e.g.:
0304                                                                     //           "master" (thread co-located with master thread),
0305                                                                     //           "close" (thread located on cpu close to master thread)
0306                                                                     //           "spread" (threads load-balanced across available cpus)
0307 
0308 /* attributes for TCP connections */
0309 #define PMIX_TCP_REPORT_URI                 "pmix.tcp.repuri"       // (char*) output URI - '-' => stdout, '+' => stderr, or filename
0310 #define PMIX_TCP_URI                        "pmix.tcp.uri"          // (char*) URI of server to connect to, or file:<name of file containing it>
0311 #define PMIX_TCP_IF_INCLUDE                 "pmix.tcp.ifinclude"    // (char*) comma-delimited list of devices and/or CIDR notation
0312 #define PMIX_TCP_IF_EXCLUDE                 "pmix.tcp.ifexclude"    // (char*) comma-delimited list of devices and/or CIDR notation
0313 #define PMIX_TCP_IPV4_PORT                  "pmix.tcp.ipv4"         // (int) IPv4 port to be used
0314 #define PMIX_TCP_IPV6_PORT                  "pmix.tcp.ipv6"         // (int) IPv6 port to be used
0315 #define PMIX_TCP_DISABLE_IPV4               "pmix.tcp.disipv4"      // (bool) true to disable IPv4 family
0316 #define PMIX_TCP_DISABLE_IPV6               "pmix.tcp.disipv6"      // (bool) true to disable IPv6 family
0317 
0318 
0319 /* general proc-level attributes */
0320 #define PMIX_CPUSET                         "pmix.cpuset"           // (char*) String representation of bitmap applied to process upon launch
0321 #define PMIX_CPUSET_BITMAP                  "pmix.bitmap"           // (pmix_cpuset_t*) Bitmap applied to process at launch
0322 #define PMIX_CREDENTIAL                     "pmix.cred"             // (char*) security credential assigned to proc
0323 #define PMIX_SPAWNED                        "pmix.spawned"          // (bool) true if this proc resulted from a call to PMIx_Spawn
0324 #define PMIX_NODE_OVERSUBSCRIBED            "pmix.ndosub"           // (bool) true if number of procs from this job on this node
0325                                                                     //        exceeds the number of slots allocated to it
0326 
0327 /* scratch directory locations for use by applications */
0328 #define PMIX_TMPDIR                         "pmix.tmpdir"           // (char*) top-level tmp dir assigned to session
0329 #define PMIX_NSDIR                          "pmix.nsdir"            // (char*) sub-tmpdir assigned to namespace
0330 #define PMIX_PROCDIR                        "pmix.pdir"             // (char*) sub-nsdir assigned to proc
0331 #define PMIX_TDIR_RMCLEAN                   "pmix.tdir.rmclean"     // (bool)  Resource Manager will clean session directories
0332 
0333 
0334 /* information about relative ranks as assigned by the RM */
0335 #define PMIX_CLUSTER_ID                     "pmix.clid"             // (char*) a string name for the cluster this proc is executing on
0336 #define PMIX_PROCID                         "pmix.procid"           // (pmix_proc_t*) process identifier
0337 #define PMIX_NSPACE                         "pmix.nspace"           // (char*) nspace of a job
0338 #define PMIX_JOBID                          "pmix.jobid"            // (char*) jobid assigned by scheduler
0339 #define PMIX_APPNUM                         "pmix.appnum"           // (uint32_t) app number within the job
0340 #define PMIX_RANK                           "pmix.rank"             // (pmix_rank_t) process rank within the job
0341 #define PMIX_GLOBAL_RANK                    "pmix.grank"            // (pmix_rank_t) rank spanning across all jobs in this session
0342 #define PMIX_APP_RANK                       "pmix.apprank"          // (pmix_rank_t) rank within this app
0343 #define PMIX_NPROC_OFFSET                   "pmix.offset"           // (pmix_rank_t) starting global rank of this job
0344 #define PMIX_LOCAL_RANK                     "pmix.lrank"            // (uint16_t) rank on this node within this job
0345 #define PMIX_NODE_RANK                      "pmix.nrank"            // (uint16_t) rank on this node spanning all jobs
0346 #define PMIX_PACKAGE_RANK                   "pmix.pkgrank"          // (uint16_t) rank within this job on the package where this proc resides
0347 #define PMIX_LOCALLDR                       "pmix.lldr"             // (pmix_rank_t) lowest rank on this node within this job
0348 #define PMIX_APPLDR                         "pmix.aldr"             // (pmix_rank_t) lowest rank in this app within this job
0349 #define PMIX_PROC_PID                       "pmix.ppid"             // (pid_t) pid of specified proc
0350 #define PMIX_SESSION_ID                     "pmix.session.id"       // (uint32_t) session identifier
0351 #define PMIX_NODE_LIST                      "pmix.nlist"            // (char*) comma-delimited list of nodes running procs for the specified nspace
0352 #define PMIX_ALLOCATED_NODELIST             "pmix.alist"            // (char*) comma-delimited list of all nodes in this allocation regardless of
0353                                                                     //         whether or not they currently host procs.
0354 #define PMIX_HOSTNAME                       "pmix.hname"            // (char*) name of the host the specified proc is on
0355 #define PMIX_HOSTNAME_ALIASES               "pmix.alias"            // (char*) comma-delimited list of names by which this node is known
0356 #define PMIX_HOSTNAME_KEEP_FQDN             "pmix.fqdn"             // (bool) FQDN hostnames are being retained
0357 #define PMIX_NODEID                         "pmix.nodeid"           // (uint32_t) node identifier where the specified proc is located
0358 #define PMIX_LOCAL_PEERS                    "pmix.lpeers"           // (char*) comma-delimited string of ranks on this node within the specified nspace
0359 #define PMIX_LOCAL_PROCS                    "pmix.lprocs"           // (pmix_data_array_t*) array of pmix_proc_t of procs on the specified node
0360 #define PMIX_LOCAL_CPUSETS                  "pmix.lcpus"            // (char*) colon-delimited cpusets of local peers within the specified nspace
0361 #define PMIX_PARENT_ID                      "pmix.parent"           // (pmix_proc_t*) identifier of the process that called PMIx_Spawn
0362                                                                     //                to launch this proc's application
0363 #define PMIX_EXIT_CODE                      "pmix.exit.code"        // (int) exit code returned when proc terminated
0364 
0365 /* size info */
0366 #define PMIX_UNIV_SIZE                      "pmix.univ.size"        // (uint32_t) #slots in this session
0367 #define PMIX_JOB_SIZE                       "pmix.job.size"         // (uint32_t) #procs in this job
0368 #define PMIX_JOB_NUM_APPS                   "pmix.job.napps"        // (uint32_t) #apps in this job
0369 #define PMIX_APP_SIZE                       "pmix.app.size"         // (uint32_t) #procs in this application
0370 #define PMIX_LOCAL_SIZE                     "pmix.local.size"       // (uint32_t) #procs in this job on this node
0371 #define PMIX_NODE_SIZE                      "pmix.node.size"        // (uint32_t) #procs across all jobs on this node
0372 #define PMIX_MAX_PROCS                      "pmix.max.size"         // (uint32_t) max #procs for this job
0373 #define PMIX_NUM_SLOTS                      "pmix.num.slots"        // (uint32_t) #slots allocated
0374 #define PMIX_NUM_NODES                      "pmix.num.nodes"        // (uint32_t) #nodes currently hosting processes in the specified realm.
0375 #define PMIX_NUM_ALLOCATED_NODES            "pmix.num.anodes"       // (uint32_t) #nodes in the specified realm regardless of whether or
0376                                                                     //            not they currently host processes.
0377 
0378 /* Memory info */
0379 #define PMIX_AVAIL_PHYS_MEMORY              "pmix.pmem"             // (uint64_t) total available physical memory on this node
0380 #define PMIX_DAEMON_MEMORY                  "pmix.dmn.mem"          // (float) Mbytes of memory currently used by daemon
0381 #define PMIX_CLIENT_AVG_MEMORY              "pmix.cl.mem.avg"       // (float) Average Mbytes of memory used by client processes
0382 
0383 
0384 /* topology info */
0385 #define PMIX_TOPOLOGY2                      "pmix.topo2"            // (pmix_topology_t*) pointer to a PMIx topology object
0386 #define PMIX_LOCALITY_STRING                "pmix.locstr"           // (char*) string describing a proc's location
0387 #define PMIX_TOPOLOGY_INDEX                 "pmix.topo.index"       // (int)  index of a topology in a storage array
0388 
0389 
0390 /* request-related info */
0391 #define PMIX_COLLECT_DATA                   "pmix.collect"          // (bool) collect data and return it at the end of the operation
0392 #define PMIX_ALL_CLONES_PARTICIPATE         "pmix.clone.part"       // (bool) All clones of the calling process must participate in the collective operation.
0393 #define PMIX_COLLECT_GENERATED_JOB_INFO     "pmix.collect.gen"      // (bool) Collect all job-level information (i.e., reserved keys) that was locally
0394                                                                     //        generated by PMIx servers. Some job-level information (e.g., distance between
0395                                                                     //        processes and fabric devices) is best determined on a distributed basis as it
0396                                                                     //        primarily pertains to local processes. Should remote processes need to access
0397                                                                     //        the information, it can either be obtained collectively using the PMIx_Fence
0398                                                                     //        operation with this directive, or can be retrieved one peer at a time using
0399                                                                     //        PMIx_Get without first having performed the job-wide collection.
0400 #define PMIX_TIMEOUT                        "pmix.timeout"          // (int) time in sec before specified operation should time out (0 => infinite)
0401 #define PMIX_IMMEDIATE                      "pmix.immediate"        // (bool) specified operation should immediately return an error from the PMIx
0402                                                                     //        server if requested data cannot be found - do not request it from
0403                                                                     //        the host RM
0404 #define PMIX_WAIT                           "pmix.wait"             // (int) caller requests that the server wait until at least the specified
0405                                                                     //       #values are found (0 => all and is the default)
0406 #define PMIX_NOTIFY_COMPLETION              "pmix.notecomp"         // (bool) notify parent process upon termination of child job
0407 #define PMIX_RANGE                          "pmix.range"            // (pmix_data_range_t) value for calls to publish/lookup/unpublish or for
0408                                                                     //        monitoring event notifications
0409 #define PMIX_PERSISTENCE                    "pmix.persist"          // (pmix_persistence_t) value for calls to publish
0410 #define PMIX_DATA_SCOPE                     "pmix.scope"            // (pmix_scope_t) scope of the data to be found in a PMIx_Get call
0411 #define PMIX_OPTIONAL                       "pmix.optional"         // (bool) look only in the client's local data store for the requested value - do
0412                                                                     //        not request data from the server if not found
0413 #define PMIX_GET_STATIC_VALUES              "pmix.get.static"       // (bool) Request that the data be returned in the provided storage location
0414 #define PMIX_GET_POINTER_VALUES             "pmix.get.pntrs"        // (bool) Request that any pointers in the returned value point directly
0415                                                                     //       to values in the key-value store
0416 #define PMIX_EMBED_BARRIER                  "pmix.embed.barrier"    // (bool) execute a blocking fence operation before executing the
0417                                                                     //        specified operation
0418 #define PMIX_JOB_TERM_STATUS                "pmix.job.term.status"  // (pmix_status_t) status returned upon job termination
0419 #define PMIX_PROC_TERM_STATUS               "pmix.proc.term.status" // (pmix_status_t) status returned upon process termination
0420 #define PMIX_PROC_STATE_STATUS              "pmix.proc.state"       // (pmix_proc_state_t) process state
0421 #define PMIX_GET_REFRESH_CACHE              "pmix.get.refresh"      // (bool) when retrieving data for a remote process, refresh the existing
0422                                                                     //        local data cache for the process in case new values have been
0423                                                                     //        put and committed by it since the last refresh
0424 #define PMIX_ACCESS_PERMISSIONS             "pmix.aperms"           // (pmix_data_array_t*) Define access permissions for the published
0425                                                                     //        data. The value shall contain an array of pmix_info_t structs
0426                                                                     //        containing the specified permissions.
0427 #define PMIX_ACCESS_USERIDS                 "pmix.auids"            // (pmix_data_array_t*) Array of effective UIDs that are allowed to
0428                                                                     //        access the published data
0429 #define PMIX_ACCESS_GRPIDS                  "pmix.agids"            // (pmix_data_array_t*) Array of effective GIDs that are allowed to
0430                                                                     //        access the published data
0431 #define PMIX_WAIT_FOR_CONNECTION            "pmix.wait.conn"        // (bool) wait until the specified connection has been made
0432 #define PMIX_QUALIFIED_VALUE                "pmix.qual.val"         // (pmix_data_array_t*) Value being provided consists of the primary
0433                                                                     //        key-value pair in first position, followed by one or more
0434                                                                     //        key-value qualifiers to be used when subsequently retrieving
0435                                                                     //        the primary value
0436 
0437 
0438 /* attributes used by host server to pass data to/from the server convenience library - the
0439  * data will then be parsed and provided to the local clients. Not generally accessible by users */
0440 #define PMIX_REGISTER_NODATA                "pmix.reg.nodata"       // (bool) Registration is for nspace only, do not copy job data
0441 #define PMIX_NODE_MAP                       "pmix.nmap"             // (char*) regex of nodes containing procs for this job
0442 #define PMIX_NODE_MAP_RAW                   "pmix.nmap.raw"         // (char*) comma-delimited list of nodes containing procs for this job
0443 #define PMIX_PROC_MAP                       "pmix.pmap"             // (char*) regex describing procs on each node within this job
0444 #define PMIX_PROC_MAP_RAW                   "pmix.pmap.raw"         // (char*) semi-colon delimited list of strings, each string containing
0445                                                                     //         a comma-delimited list of ranks on the corresponding node
0446 #define PMIX_ANL_MAP                        "pmix.anlmap"           // (char*) process mapping in ANL notation (used in PMI-1/PMI-2)
0447 #define PMIX_APP_MAP_TYPE                   "pmix.apmap.type"       // (char*) type of mapping used to layout the application (e.g., cyclic)
0448 #define PMIX_APP_MAP_REGEX                  "pmix.apmap.regex"      // (char*) regex describing the result of the mapping
0449 #define PMIX_REQUIRED_KEY                   "pmix.req.key"          // (char*) key the user needs prior to responding from a dmodex request
0450 #define PMIX_LOCAL_COLLECTIVE_STATUS        "pmix.loc.col.st"       // (pmix_status_t) status code for local collective operation being
0451                                                                     //         reported to host by server library
0452 #define PMIX_SORTED_PROC_ARRAY              "pmix.sorted.parr"      // (bool) Proc array being passed has been sorted
0453 
0454 
0455 /* event handler registration and notification info keys */
0456 #define PMIX_EVENT_HDLR_NAME                "pmix.evname"           // (char*) string name identifying this handler
0457 #define PMIX_EVENT_HDLR_FIRST               "pmix.evfirst"          // (bool) invoke this event handler before any other handlers
0458 #define PMIX_EVENT_HDLR_LAST                "pmix.evlast"           // (bool) invoke this event handler after all other handlers have been called
0459 #define PMIX_EVENT_HDLR_FIRST_IN_CATEGORY   "pmix.evfirstcat"       // (bool) invoke this event handler before any other handlers in this category
0460 #define PMIX_EVENT_HDLR_LAST_IN_CATEGORY    "pmix.evlastcat"        // (bool) invoke this event handler after all other handlers in this category have been called
0461 #define PMIX_EVENT_HDLR_BEFORE              "pmix.evbefore"         // (char*) put this event handler immediately before the one specified in the (char*) value
0462 #define PMIX_EVENT_HDLR_AFTER               "pmix.evafter"          // (char*) put this event handler immediately after the one specified in the (char*) value
0463 #define PMIX_EVENT_HDLR_PREPEND             "pmix.evprepend"        // (bool) prepend this handler to the precedence list within its category
0464 #define PMIX_EVENT_HDLR_APPEND              "pmix.evappend"         // (bool) append this handler to the precedence list within its category
0465 #define PMIX_EVENT_CUSTOM_RANGE             "pmix.evrange"          // (pmix_data_array_t*) array of pmix_proc_t defining range of event notification
0466 #define PMIX_EVENT_AFFECTED_PROC            "pmix.evproc"           // (pmix_proc_t*) single proc that was affected
0467 #define PMIX_EVENT_AFFECTED_PROCS           "pmix.evaffected"       // (pmix_data_array_t*) array of pmix_proc_t defining affected procs
0468 #define PMIX_EVENT_NON_DEFAULT              "pmix.evnondef"         // (bool) event is not to be delivered to default event handlers
0469 #define PMIX_EVENT_RETURN_OBJECT            "pmix.evobject"         // (void*) object to be returned whenever the registered cbfunc is invoked
0470                                                                     //     NOTE: the object will _only_ be returned to the process that
0471                                                                     //           registered it
0472 #define PMIX_EVENT_DO_NOT_CACHE             "pmix.evnocache"        // (bool) instruct the PMIx server not to cache the event
0473 #define PMIX_EVENT_SILENT_TERMINATION       "pmix.evsilentterm"     // (bool) do not generate an event when this job normally terminates
0474 #define PMIX_EVENT_PROXY                    "pmix.evproxy"          // (pmix_proc_t*) PMIx server that sourced the event
0475 #define PMIX_EVENT_TEXT_MESSAGE             "pmix.evtext"           // (char*) text message suitable for output by recipient - e.g., describing
0476                                                                     //         the cause of the event
0477 #define PMIX_EVENT_TIMESTAMP                "pmix.evtstamp"         // (time_t) System time when the associated event occurred.
0478 #define PMIX_EVENT_ONESHOT                  "pmix.evone"            // (bool) when registering, indicate that this event handler is to be deleted
0479                                                                     //        after being invoked
0480 #define PMIX_EVENT_STAYS_LOCAL              "pmix.evlocal"          // (bool) Event is not to be passed up to the host environment - used
0481                                                                     //        when the range is custom to also indicate range=local and prevent
0482                                                                     //        infinite loops with the host
0483 
0484 /* fault tolerance-related events */
0485 #define PMIX_EVENT_TERMINATE_SESSION        "pmix.evterm.sess"      // (bool) RM intends to terminate session
0486 #define PMIX_EVENT_TERMINATE_JOB            "pmix.evterm.job"       // (bool) RM intends to terminate this job
0487 #define PMIX_EVENT_TERMINATE_NODE           "pmix.evterm.node"      // (bool) RM intends to terminate all procs on this node
0488 #define PMIX_EVENT_TERMINATE_PROC           "pmix.evterm.proc"      // (bool) RM intends to terminate just this process
0489 #define PMIX_EVENT_ACTION_TIMEOUT           "pmix.evtimeout"        // (int) time in sec before RM will execute error response
0490 
0491 
0492 /* attributes used to describe "spawn" directives */
0493 #define PMIX_PERSONALITY                    "pmix.pers"             // (char*) name of personality to use
0494 #define PMIX_HOST                           "pmix.host"             // (char*) comma-delimited list of hosts to use for spawned procs
0495 #define PMIX_HOSTFILE                       "pmix.hostfile"         // (char*) hostfile to use for spawned procs
0496 #define PMIX_ADD_HOST                       "pmix.addhost"          // (char*) comma-delimited list of hosts to add to allocation
0497 #define PMIX_ADD_HOSTFILE                   "pmix.addhostfile"      // (char*) hostfile to add to existing allocation
0498 #define PMIX_PREFIX                         "pmix.prefix"           // (char*) prefix to be used by an app to look for its
0499                                                                     //         PMIx installation on remote nodes. A NULL
0500                                                                     //         value indicates that no prefix is to be given
0501 #define PMIX_WDIR                           "pmix.wdir"             // (char*) working directory for spawned procs
0502 #define PMIX_WDIR_USER_SPECIFIED            "pmix.wdir.user"        // (bool) User specified the working directory
0503 #define PMIX_DISPLAY_MAP                    "pmix.dispmap"          // (bool) display placement map upon spawn
0504 #define PMIX_DISPLAY_MAP_DETAILED           "pmix.dispmapdet"       // (bool) display a highly detailed placement map upon spawn
0505 #define PMIX_DISPLAY_ALLOCATION             "pmix.dispalloc"        // (bool) display the resource allocation
0506 #define PMIX_DISPLAY_TOPOLOGY               "pmix.disptopo"         // (char*) comma-delimited list of hosts whose topology is
0507                                                                     //         to be displayed
0508 #define PMIX_DISPLAY_PROCESSORS             "pmix.dispcpus"         // (char*) comma-delimited list of hosts whose available
0509                                                                     //         CPUs are to be displayed
0510 #define PMIX_DISPLAY_PARSEABLE_OUTPUT       "pmix.dispparse"        // (bool) display requested info in a format more amenable
0511                                                                     //        to machine parsing
0512 #define PMIX_PPR                            "pmix.ppr"              // (char*) #procs to spawn on each identified resource
0513 #define PMIX_MAPBY                          "pmix.mapby"            // (char*) mapping policy
0514 #define PMIX_RANKBY                         "pmix.rankby"           // (char*) ranking policy
0515 #define PMIX_BINDTO                         "pmix.bindto"           // (char*) binding policy
0516 #define PMIX_PRELOAD_BIN                    "pmix.preloadbin"       // (bool) preload binaries
0517 #define PMIX_PRELOAD_FILES                  "pmix.preloadfiles"     // (char*) comma-delimited list of files to pre-position
0518 #define PMIX_STDIN_TGT                      "pmix.stdin"            // (pmix_proc_t*) proc that is to receive stdin
0519                                                                     //                (PMIX_RANK_WILDCARD = all in given nspace)
0520 #define PMIX_DEBUGGER_DAEMONS               "pmix.debugger"         // (bool) spawned app consists of debugger daemons
0521 #define PMIX_COSPAWN_APP                    "pmix.cospawn"          // (bool) designated app is to be spawned as a disconnected
0522                                                                     //        job - i.e., not part of the "comm_world" of the job
0523 #define PMIX_COLOCATE_PROCS                 "pmix.colproc"          // (pmix_data_array_t*) Array of pmix_proc_t identifying the procs
0524                                                                     //        with which the new job's procs are to be colocated
0525 #define PMIX_COLOCATE_NPERPROC              "pmix.colnum.proc"      // (uint16_t) Number of procs to colocate with each identified proc
0526 #define PMIX_COLOCATE_NPERNODE              "pmix.colnum.node"      // (uint16_t) Number of procs to colocate on the node of each identified proc
0527 #define PMIX_SET_SESSION_CWD                "pmix.ssncwd"           // (bool) set the application's current working directory to
0528                                                                     //        the session working directory assigned by the RM
0529 #define PMIX_INDEX_ARGV                     "pmix.indxargv"         // (bool) mark the argv with the rank of the proc
0530 #define PMIX_CPUS_PER_PROC                  "pmix.cpuperproc"       // (uint32_t) #cpus to assign to each rank
0531 #define PMIX_NO_PROCS_ON_HEAD               "pmix.nolocal"          // (bool) do not place procs on the head node
0532 #define PMIX_NO_OVERSUBSCRIBE               "pmix.noover"           // (bool) do not oversubscribe the cpus
0533 #define PMIX_REPORT_BINDINGS                "pmix.repbind"          // (bool) report bindings of the individual procs
0534 #define PMIX_REPORT_PHYSICAL_CPUS           "pmix.repphys.cpus"     // (bool) report bindings using physical cpu IDs
0535 #define PMIX_CPU_LIST                       "pmix.cpulist"          // (char*) list of cpus to use for this job
0536 #define PMIX_JOB_RECOVERABLE                "pmix.recover"          // (bool) application supports recoverable operations
0537 #define PMIX_JOB_CONTINUOUS                 "pmix.continuous"       // (bool) application is continuous, all failed procs should
0538                                                                         //        be immediately restarted
0539 #define PMIX_MAX_RESTARTS                   "pmix.maxrestarts"      // (uint32_t) max number of times to restart a job
0540 #define PMIX_FWD_STDIN                      "pmix.fwd.stdin"        // (bool) forward the stdin from this process to the target processes
0541 #define PMIX_FWD_STDOUT                     "pmix.fwd.stdout"       // (bool) forward stdout from the spawned processes to this process (typically used by a tool)
0542 #define PMIX_FWD_STDERR                     "pmix.fwd.stderr"       // (bool) forward stderr from the spawned processes to this process (typically used by a tool)
0543 #define PMIX_FWD_STDDIAG                    "pmix.fwd.stddiag"      // (bool) if a diagnostic channel exists, forward any output on it
0544                                                                     //        from the spawned processes to this process (typically used by a tool)
0545 #define PMIX_SPAWN_TOOL                     "pmix.spwn.tool"        // (bool) job being spawned is a tool
0546 #define PMIX_CMD_LINE                       "pmix.cmd.line"         // (char*) command line executing in the specified nspace
0547 #define PMIX_FORKEXEC_AGENT                 "pmix.fe.agnt"          // (char*) command line of fork/exec agent to be used for starting
0548                                                                     //         local processes
0549 #define PMIX_JOB_TIMEOUT                    "pmix.job.time"         // (int) time in sec before job should time out (0 => infinite)
0550 #define PMIX_SPAWN_TIMEOUT                  "pmix.sp.time"          // (int) time in sec before spawn operation should time out (0 => infinite)
0551                                                                     //       Logically equivalent to passing the PMIX_TIMEOUT attribute to the
0552                                                                     //       PMIx_Spawn API, it is provided as a separate attribute to distinguish
0553                                                                     //       it from the PMIX_JOB_TIMEOUT attribute
0554 #define PMIX_TIMEOUT_STACKTRACES            "pmix.tim.stack"        // (bool) include process stacktraces in timeout report from a job
0555 #define PMIX_TIMEOUT_REPORT_STATE           "pmix.tim.state"        // (bool) report process states in timeout report from a job
0556 #define PMIX_APP_ARGV                       "pmix.app.argv"         // (char*) consolidated argv passed to the spawn command for the given app
0557 #define PMIX_NOTIFY_JOB_EVENTS              "pmix.note.jev"         // (bool) Requests that the launcher generate the PMIX_EVENT_JOB_START,
0558                                                                     //        PMIX_LAUNCH_COMPLETE, and PMIX_EVENT_JOB_END events. Each event is to
0559                                                                     //        include at least the namespace of the corresponding job and a
0560                                                                     //        PMIX_EVENT_TIMESTAMP indicating the time the event occurred.
0561 #define PMIX_NOTIFY_PROC_TERMINATION        "pmix.noteproc"         // (bool) Requests that the launcher generate the PMIX_EVENT_PROC_TERMINATED
0562                                                                     //        event whenever a process either normally or abnormally terminates.
0563 #define PMIX_NOTIFY_PROC_ABNORMAL_TERMINATION   "pmix.noteabproc"   // (bool) Requests that the launcher generate the PMIX_EVENT_PROC_TERMINATED
0564                                                                     //        event only when a process abnormally terminates.
0565 #define PMIX_ENVARS_HARVESTED               "pmix.evar.hvstd"       // (bool) Envars have been harvested by the spawn requestor
0566 #define PMIX_RUNTIME_OPTIONS                "pmix.runopt"           // (char*) Environment-specific runtime directives that control job behavior
0567 #define PMIX_ABORT_NON_ZERO_TERM            "pmix.abnz"             // (bool) Abort the spawned job if any process terminates with non-zero status
0568 #define PMIX_DO_NOT_LAUNCH                  "pmix.dnl"              // (bool) Execute all procedures to prepare the requested job for launch,
0569                                                                     //        but do not launch it. Typically combined with the PMIX_DISPLAY_MAP
0570                                                                     //        or PMIX_DISPLAY_MAP_DETAILED for debugging purposes.
0571 #define PMIX_SHOW_LAUNCH_PROGRESS           "pmix.showprog"         // (bool) Provide periodic progress reports on job launch procedure (e.g., after
0572                                                                     //        every 100 processes have been spawned)
0573 #define PMIX_AGGREGATE_HELP                 "pmix.agg.help"         // (bool) Aggregate help messages, reporting each unique help message once
0574                                                                     //        accompanied by the number of processes that reported it
0575 #define PMIX_REPORT_CHILD_SEP               "pmix.rptchildsep"      // (bool) Report the exit status of any child jobs spawned by the primary job
0576                                                                     //        separately. If false, then the final exit status reported will be
0577                                                                     //        zero if the primary job and all spawned jobs exit normally, or the
0578                                                                     //        first non-zero status returned by either primary or child jobs.
0579 #define PMIX_SPAWN_CHILD_SEP                "pmix.spchildsep"       // (bool) Treat the spawned job as independent from the parent - i.e, do not
0580                                                                     //        terminate the spawned job if the parent terminates.
0581 #define PMIX_FWD_ENVIRONMENT                "pmix.fwdenv"           // (bool) Forward the local environment to each spawned process
0582 #define PMIX_SPAWN_PTY                      "pmix.spawn.pty"        // (bool) Spawn a pseudo-terminal
0583 #define PMIX_PTY_TERMIO                     "pmix.pty.termio"       // (pmix_byte_object_t) Contents of a termio structure
0584 #define PMIX_PTY_WSIZE                      "pmix.pty.wsize"        // (pmix_byte_object_t) Contents of a window size structure
0585 
0586 
0587 /* query keys - value type shown is the type of the value that will be RETURNED by that key  */
0588 #define PMIX_QUERY_SUPPORTED_KEYS           "pmix.qry.keys"         // (char*) returns comma-delimited list of keys supported by the query
0589                                                                     //         function. NO QUALIFIERS
0590 #define PMIX_QUERY_NAMESPACES               "pmix.qry.ns"           // (char*) returns a comma-delimited list of active namespaces. NO QUALIFIERS
0591 #define PMIX_QUERY_NAMESPACE_INFO           "pmix.qry.nsinfo"       // (pmix_data_array_t*) returns an array of active nspace information - each
0592                                                                     //        element will contain an array including the namespace plus the
0593                                                                     //        command line of the application executing within it
0594                                                                     //        SUPPORTED QUALIFIERS: PMIX_NSPACE of specific nspace whose info
0595                                                                     //        is being requested
0596 #define PMIX_QUERY_JOB_STATUS               "pmix.qry.jst"          // (pmix_status_t) returns status of a specified currently executing job
0597                                                                     //         REQUIRES a PMIX_NSPACE qualifier indicating the nspace being queried
0598 #define PMIX_QUERY_QUEUE_LIST               "pmix.qry.qlst"         // (char*) request a comma-delimited list of scheduler queues. NO QUALIFIERS
0599 #define PMIX_QUERY_QUEUE_STATUS             "pmix.qry.qst"          // (pmix_data_array_t*) returns array where each element contains the name and
0600                                                                     //         status of a scheduler queue
0601                                                                     //        SUPPORTED QUALIFIERS: PMIX_ALLOC_QUEUE naming specific queue whose status
0602                                                                     //        is being requested
0603 #define PMIX_QUERY_PROC_TABLE               "pmix.qry.ptable"       // (pmix_data_array_t*) returns (pmix_data_array_t*) an array of pmix_proc_info_t
0604                                                                     //         REQUIRES a PMIX_NSPACE qualifier indicating the nspace being queried
0605 #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
0606                                                                     //         for procs in job on same node
0607                                                                     //         REQUIRES a PMIX_NSPACE qualifier indicating the nspace being queried
0608 #define PMIX_QUERY_AUTHORIZATIONS           "pmix.qry.auths"        // (pmix_data_array_t*) return operations tool is authorized to perform. The contents
0609                                                                     //         of the array elements have not yet been standardized. NO QUALIFIERS
0610 #define PMIX_QUERY_SPAWN_SUPPORT            "pmix.qry.spawn"        // (char*) return a comma-delimited list of supported spawn attributes. NO QUALIFIERS
0611 #define PMIX_QUERY_DEBUG_SUPPORT            "pmix.qry.debug"        // (char*) return a comma-delimited list of supported debug attributes. NO QUALIFIERS
0612 #define PMIX_QUERY_MEMORY_USAGE             "pmix.qry.mem"          // (pmix_data_array_t*) return info on memory usage for the procs indicated in the qualifiers
0613                                                                     //        SUPPORTED QUALIFIERS: PMIX_NSPACE/PMIX_RANK, or PMIX_PROCID of specific proc(s)
0614                                                                     //        whose info is being requested
0615 #define PMIX_QUERY_ALLOC_STATUS             "pmix.query.alloc"      // (char*) return a string reporting status of an allocation request
0616                                                                     //         REQUIRES a PMIX_ALLOC_REQUEST_ID qualifier indicating the allocation request
0617                                                                     //         being queried
0618 #define PMIX_QUERY_ALLOCATION               "pmix.query.allc"       // (pmix_data_array_t*) returns an array of pmix_info_t describing the nodes known to the
0619                                                                     //         server. Each array element will consist of the PMIX_NODE_INFO key containing
0620                                                                     //         a pmix_data_array_t of pmix_info_t - the first element of the array must be
0621                                                                     //         the hostname of that node, with additional info on the node in subsequent entries.
0622                                                                     //         SUPPORTED_QUALIFIER: a PMIX_ALLOC_ID qualifier indicating the specific
0623                                                                     //         allocation of interest
0624 #define PMIX_TIME_REMAINING                 "pmix.time.remaining"   // (uint32_t) returns number of seconds remaining in allocation
0625                                                                     //         for the specified nspace (defaults to allocation containing the caller)
0626                                                                     //         SUPPORTED QUALIFIERS: PMIX_NSPACE of the nspace whose info is being requested
0627 #define PMIX_QUERY_NUM_PSETS                "pmix.qry.psetnum"      // (size_t) returns the number of psets defined
0628                                                                     //          in the specified range (defaults to session)
0629                                                                     //         SUPPORTED QUALIFIERS: PMIX_RANGE whose info is being requested
0630 #define PMIX_QUERY_PSET_NAMES               "pmix.qry.psets"        // (char*) returns a comma-delimited list of the names of the
0631                                                                     //         psets defined in the specified range (defaults to session)
0632                                                                     //         SUPPORTED QUALIFIERS: PMIX_RANGE whose info is being requested
0633 #define PMIX_QUERY_PSET_MEMBERSHIP          "pmix.qry.pmems"        // (pmix_data_array_t*) Return an array of pmix_proc_t containing the members of
0634                                                                     //         the specified process set.
0635 #define PMIX_QUERY_NUM_GROUPS               "pmix.qry.pgrpnum"      // (size_t) Return the number of process groups defined in the specified range
0636                                                                     //         (defaults to session). OPTIONAL QUALIFERS: PMIX_RANGE.
0637 #define PMIX_QUERY_GROUP_NAMES              "pmix.qry.pgrp"         // (pmix_data_array_t*) Return a pmix_data_array_t containing an array of string
0638                                                                     //         names of the process groups defined in the specified range (defaults
0639                                                                     //         to session). OPTIONAL QUALIFERS: PMIX_RANGE
0640 #define PMIX_QUERY_GROUP_MEMBERSHIP         "pmix.qry.pgrpmems"     // (pmix_data_array_t*) Return a pmix_data_array_t of pmix_proc_t containing
0641                                                                     //         the members of the specified process group. REQUIRED QUALIFIERS:
0642                                                                     //         PMIX_GROUP_ID.
0643 #define PMIX_QUERY_ATTRIBUTE_SUPPORT        "pmix.qry.attrs"        // (pmix_data_array_t*) returns array of pmix_info_t where each element consists
0644                                                                     //         of a key containing the name of the function, and an array of pmix_regattr_t
0645                                                                     //         detailing the attribute support for that function
0646                                                                     //         SUPPORTED QUALIFIERS: PMIX_CLIENT_FUNCTIONS, PMIX_SERVER_FUNCTIONS,
0647                                                                     //         PMIX_TOOL_FUNCTIONS, and/or PMIX_HOST_FUNCTIONS
0648 #define PMIX_CLIENT_FUNCTIONS               "pmix.client.fns"       // (char*) returns a comma-delimited list of supported PMIx client functions. NO QUALIFIERS
0649 #define PMIX_SERVER_FUNCTIONS               "pmix.srvr.fns"         // (char*) returns a comma-delimited list of supported PMIx server functions. NO QUALIFIERS
0650 #define PMIX_TOOL_FUNCTIONS                 "pmix.tool.fns"         // (char*) returns a comma-delimited list of supported PMIx tool functions. NO QUALIFIERS
0651 #define PMIX_HOST_FUNCTIONS                 "pmix.host.fns"         // (char*) returns a comma-delimited list of PMIx functions supported by the host environment
0652 #define PMIX_QUERY_AVAIL_SERVERS            "pmix.qry.asrvrs"       // (pmix_data_array_t*) array of pmix_info_t, each element containing an array of
0653                                                                     //         pmix_info_t of available data for servers on this node
0654                                                                     //         to which the caller might be able to connect. NO QUALIFIERS
0655 #define PMIX_QUERY_QUALIFIERS               "pmix.qry.quals"        // (pmix_data_array_t*) Contains an array of qualifiers that were included in the
0656                                                                     //         query that produced the provided results. This attribute is solely for
0657                                                                     //         reporting purposes and cannot be used in PMIx_Get or other query
0658                                                                     //         operations
0659 #define PMIX_QUERY_RESULTS                  "pmix.qry.res"          // (pmix_data_array_t*) Contains an array of query results for a given pmix_query_t passed to the
0660                                                                     //         PMIx_Query_info APIs. If qualifiers were included in the query, then the first element
0661                                                                     //         of the array shall be the PMIX_QUERY_QUALIFIERS attribute containing those qualifiers.
0662                                                                     //         Each of the remaining elements of the array is a pmix_info_t containing the query key
0663                                                                     //         and the corresponding value returned by the query. This attribute is solely for
0664                                                                     //         reporting purposes and cannot be used in PMIx_Get or other query operations
0665 #define PMIX_QUERY_MIN_ALLOC_UNIT           "pmix.qry.minau"        // (pmix_data_array_t*) array of pmix_info_t identifying the resources
0666                                                                     //         composing the minimum allocatable unit for this system
0667 #define PMIX_QUERY_RES_BLOCKS               "pmix.qry.resblks"      // (pmix_data_array_t*) array of string names for currently defined
0668                                                                     //         resource blocks
0669 #define PMIX_QUERY_RES_BLOCK_DEF            "pmix.qry.resdef"       // (pmix_data_array_t*) given the name of a resource block as its qualifier,
0670                                                                     //         return an array of pmix_resource_unit_t describing the resources contained
0671                                                                     //         in the block
0672 #define PMIX_QUERY_DEVICES                  "pmix.qry.dev"          // (pmix_data_array_t*) Return an array of pmix_device_t containing the devices
0673                                                                     //         within the current topology that meet the specified query qualifications. This
0674                                                                     //         includes specifying return of all devices of a given type via the PMIX_DEVICE_TYPE
0675                                                                     //         attribute.
0676 #define PMIX_QUERY_AVAILABLE_SLOTS          "pmix.qry.aslots"       // (uint32_t) Number of slots currently available
0677                                                                     //         in the session. This is a snapshot in
0678                                                                     //         time as the number may have changed
0679                                                                     //         (e.g., if another job was submitted after
0680                                                                     //         the host generated its response). Request
0681                                                                     //         may optionally specify the session using
0682                                                                     //         the PMIX_SESSION_ID attribute - default
0683                                                                     //         is the session of the requestor
0684 #define PMIX_QUERY_RESOLVE_PEERS            "pmix.qry.peers"        // (pmix_data_array_t*) Return an array of pmix_proc_t containing the process IDs
0685                                                                     //         of procs from the given nspace that are executing on the specified node.
0686                                                                     //         Effectively asking the host respond to a PMIx_Resolve_peers request on the
0687                                                                     //         caller's behalf
0688 #define PMIX_QUERY_RESOLVE_NODE             "pmix.qry.node"         // (char*) Return a comma-delimited string of nodes where procs from the specified
0689                                                                     //         nspace have been placed (may or may not be executing at the time of request).
0690                                                                     //         Effectively asking the host respond to a PMIx_Resolve_node request on the
0691                                                                     //         caller's behalf
0692 #define PMIX_QUERY_PROC_RESOURCE_USAGE      "pmix.qry.pres"         // (pmix_proc_t*) Return the resource usage statistics for the specified process in a
0693                                                                     //         PMIX_PROC_RESOURCE_USAGE assembly. If a namespace is combined with
0694                                                                     //         PMIX_RANK_WILDCARD,then results for all processes in the given job shall be
0695                                                                     //         returned in a pmix_data_array_t, each element containing a
0696                                                                     //         PMIX_PROC_RESOURCE_USAGE assembly for one of the processes. OPTIONAL QUALIFIERS:
0697                                                                     //         PMIX_SESSION_ID to identify the session of the namespace whose statistics are being
0698                                                                     //         requested; PMIX_NODEID or PMIX_HOSTNAME to restrict a wildcard request to processes
0699                                                                     //         on a given node
0700 #define PMIX_QUERY_NODE_RESOURCE_USAGE      "pmix.qry.nres"         // (char*) Return the resource usage statistics for the specified node in a
0701                                                                     //         PMIX_NODE_RESOURCE_USAGE assembly. If no node is specified, then results for all
0702                                                                     //         nodes hosting processes with the job of the requestor will be returned in a
0703                                                                     //         pmix_data_array_t, each element containing a PMIX_NODE_RESOURCE_USAGE assembly for
0704                                                                     //         one of the nodes. OPTIONAL QUALIFIERS: PMIX_SESSION_ID to identify the session of
0705                                                                     //         the job whose node statistics are being requested; PMIX_NSPACE or PMIX_JOBID to
0706                                                                     //         identify the job whose node usage is being requested (if other than the job of
0707                                                                     //         the requestor)
0708 
0709 
0710 /* query qualifiers - these are used to provide information to narrow/modify the query. Value type shown is the type of data expected
0711  * to be provided with the key */
0712 #define PMIX_QUERY_REFRESH_CACHE            "pmix.qry.rfsh"         // (bool) retrieve updated information from server
0713                                                                     //        to update local cache
0714 #define PMIX_QUERY_LOCAL_ONLY               "pmix.qry.local"        // (bool) constrain the query to local information only
0715 #define PMIX_QUERY_REPORT_AVG               "pmix.qry.avg"          // (bool) report average values
0716 #define PMIX_QUERY_REPORT_MINMAX            "pmix.qry.minmax"       // (bool) report minimum and maximum value
0717 #define PMIX_CLIENT_ATTRIBUTES              "pmix.client.attrs"     // (char*) comma-delimited list of functions, including "all"
0718                                                                     //        when used in a query, indicates whether or not to include
0719                                                                     //        attributes supported by the PMIx client library
0720 #define PMIX_SERVER_ATTRIBUTES              "pmix.srvr.attrs"       // (char*) comma-delimited list of functions, including "all"
0721                                                                     //        when used in a query, indicates whether or not to include
0722                                                                     //        attributes supported by the PMIx server library
0723 #define PMIX_HOST_ATTRIBUTES                "pmix.host.attrs"       // (char*) comma-delimited list of functions, including "all"
0724                                                                     //        when used in a query, indicates whether or not to include
0725                                                                     //        attributes supported by the host environment
0726 #define PMIX_TOOL_ATTRIBUTES                "pmix.tool.attrs"       // (char*) comma-delimited list of functions, including "all"
0727                                                                     //        when used in a query, indicates whether or not to include
0728                                                                     //        attributes supported by the PMIx tool library
0729 #define PMIX_QUERY_SUPPORTED_QUALIFIERS     "pmix.qry.quals"        // (bool) return comma-delimited list of qualifiers supported by
0730                                                                     //        a query on the provided key, instead of actually performing
0731                                                                     //        the query on the key.
0732 #define PMIX_RESOURCE_BLOCK_NAME            "pmix.resblkname"       // (char*) Name of the resource block being queried about
0733 
0734 
0735 /* PMIx_Get information retrieval qualifiers */
0736 #define PMIX_SESSION_INFO                   "pmix.ssn.info"         // (bool) Return information about the specified session. If information
0737                                                                     //        about a session other than the one containing the requesting
0738                                                                     //        process is desired, then the attribute array must contain a
0739                                                                     //        PMIX_SESSION_ID attribute identifying the desired target.
0740 #define PMIX_JOB_INFO                       "pmix.job.info"         // (bool) Return information about the specified job or namespace. If
0741                                                                     //        information about a job or namespace other than the one containing
0742                                                                     //        the requesting process is desired, then the attribute array must
0743                                                                     //        contain a PMIX_JOBID or PMIX_NSPACE attribute identifying the
0744                                                                     //        desired target. Similarly, if information is requested about a
0745                                                                     //        job or namespace in a session other than the one containing the
0746                                                                     //        requesting process, then an attribute identifying the target
0747                                                                     //        session must be provided.
0748 #define PMIX_APP_INFO                       "pmix.app.info"         // (bool) Return information about the specified application. If information
0749                                                                     //        about an application other than the one containing the requesting
0750                                                                     //        process is desired, then the attribute array must contain a
0751                                                                     //        PMIX_APPNUM attribute identifying the desired target. Similarly,
0752                                                                     //        if information is requested about an application in a job or session
0753                                                                     //        other than the one containing the requesting process, then attributes
0754                                                                     //        identifying the target job and/or session must be provided.
0755 #define PMIX_NODE_INFO                      "pmix.node.info"        // (bool) Return information about the specified node. If information about a
0756                                                                     //        node other than the one containing the requesting process is desired,
0757                                                                     //        then the attribute array must contain either the PMIX_NODEID or
0758                                                                     //        PMIX_HOSTNAME attribute identifying the desired target.
0759 
0760 
0761 /* information storage attributes */
0762 #define PMIX_SESSION_INFO_ARRAY             "pmix.ssn.arr"          // (pmix_data_array_t*) Provide an array of pmix_info_t containing
0763                                                                     //        session-level information. The PMIX_SESSION_ID attribute is required
0764                                                                     //        to be included in the array.
0765 #define PMIX_JOB_INFO_ARRAY                 "pmix.job.arr"          // (pmix_data_array_t*) Provide an array of pmix_info_t containing job-level
0766                                                                     //        information. Information is registered one job (aka namespace) at a time
0767                                                                     //        via the PMIx_server_register_nspace API. Thus, there is no requirement that
0768                                                                     //        the array contain either the PMIX_NSPACE or PMIX_JOBID attributes, though
0769                                                                     //        either or both of them may be included.
0770 #define PMIX_APP_INFO_ARRAY                 "pmix.app.arr"          // (pmix_data_array_t*) Provide an array of pmix_info_t containing app-level
0771                                                                     //        information. The PMIX_NSPACE or PMIX_JOBID attributes of the job containing
0772                                                                     //        the application, plus its PMIX_APPNUM attribute, are required to be
0773                                                                     //        included in the array.
0774 #define PMIX_PROC_INFO_ARRAY                "pmix.pdata"            // (pmix_data_array_t*) Provide an array of pmix_info_t containing process-realm
0775                                                                     //        information. The PMIX_RANK and PMIX_NSPACE attributes, or the
0776                                                                     //        PMIX_PROCID attribute, are required to be included in the array when
0777                                                                     //        the array is not included as part of a call to
0778                                                                     //        PMIx_server_register_nspace - i.e., when the job containing the process
0779                                                                     //        is ambiguous. All three may be included if desired. When the array is
0780                                                                     //        included in some broader structure that identifies the job, then only
0781                                                                     //        the PMIX_RANK or the PMIX_PROCID attribute must be included (the others
0782                                                                     //        are optional).
0783 #define PMIX_NODE_INFO_ARRAY                "pmix.node.arr"         // (pmix_data_array_t*) Provide an array of pmix_info_t containing node-level
0784                                                                     //        information. At a minimum, either the PMIX_NODEID or PMIX_HOSTNAME
0785                                                                     //        attribute is required to be included in the array, though both may be
0786                                                                     //        included.
0787 #define PMIX_SERVER_INFO_ARRAY              "pmix.srv.arr"          // (pmix_data_array_t*) array of data on a given server, starting with its nspace
0788 
0789 
0790 /* log attributes */
0791 #define PMIX_LOG_SOURCE                     "pmix.log.source"       // (pmix_proc_t*) ID of source of the log request
0792 #define PMIX_LOG_STDERR                     "pmix.log.stderr"       // (char*) log string to stderr
0793 #define PMIX_LOG_STDOUT                     "pmix.log.stdout"       // (char*) log string to stdout
0794 #define PMIX_LOG_SYSLOG                     "pmix.log.syslog"       // (char*) log message to syslog - defaults to ERROR priority. Will log
0795                                                                     //         to global syslog if available, otherwise to local syslog
0796 #define PMIX_LOG_LOCAL_SYSLOG               "pmix.log.lsys"         // (char*) log msg to local syslog - defaults to ERROR priority
0797 #define PMIX_LOG_GLOBAL_SYSLOG              "pmix.log.gsys"         // (char*) forward data to system "master" and log msg to that syslog
0798 #define PMIX_LOG_SYSLOG_PRI                 "pmix.log.syspri"       // (int) syslog priority level
0799 
0800 #define PMIX_LOG_TIMESTAMP                  "pmix.log.tstmp"        // (time_t) timestamp for log report
0801 #define PMIX_LOG_GENERATE_TIMESTAMP         "pmix.log.gtstmp"       // (bool) generate timestamp for log
0802 #define PMIX_LOG_TAG_OUTPUT                 "pmix.log.tag"          // (bool) label the output stream with the channel name (e.g., "stdout")
0803 #define PMIX_LOG_TIMESTAMP_OUTPUT           "pmix.log.tsout"        // (bool) print timestamp in output string
0804 #define PMIX_LOG_XML_OUTPUT                 "pmix.log.xml"          // (bool) print the output stream in xml format
0805 #define PMIX_LOG_ONCE                       "pmix.log.once"         // (bool) only log this once with whichever channel can first support it
0806 #define PMIX_LOG_MSG                        "pmix.log.msg"          // (pmix_byte_object_t) message blob to be sent somewhere
0807 #define PMIX_LOG_KEY                        "pmix.log.key"          // (char*) key to a logging message
0808 #define PMIX_LOG_VAL                        "pmix.log.val"          // (char*) value to a logging message
0809 #define PMIX_LOG_AGG                        "pmix.log.agg"          // (bool) Whether to aggregate and prevent duplicate logging messages
0810                                                                     //        based on key value pairs.
0811 
0812 #define PMIX_LOG_EMAIL                      "pmix.log.email"        // (pmix_data_array_t*) log via email based on array of pmix_info_t
0813                                                                     //         containing directives
0814 #define PMIX_LOG_EMAIL_ADDR                 "pmix.log.emaddr"       // (char*) comma-delimited list of email addresses that are to recv msg
0815 #define PMIX_LOG_EMAIL_SENDER_ADDR          "pmix.log.emfaddr"      // (char*) return email address of sender
0816 #define PMIX_LOG_EMAIL_SUBJECT              "pmix.log.emsub"        // (char*) subject line for email
0817 #define PMIX_LOG_EMAIL_MSG                  "pmix.log.emmsg"        // (char*) msg to be included in email
0818 #define PMIX_LOG_EMAIL_SERVER               "pmix.log.esrvr"        // (char*) hostname (or IP addr) of estmp server
0819 #define PMIX_LOG_EMAIL_SRVR_PORT            "pmix.log.esrvrprt"     // (int32_t) port the email server is listening to
0820 
0821 #define PMIX_LOG_GLOBAL_DATASTORE           "pmix.log.gstore"       // (bool) log the provided data to a global datastore
0822 #define PMIX_LOG_JOB_RECORD                 "pmix.log.jrec"         // (bool) log the provided information to the RM's job record
0823 #define PMIX_LOG_PROC_TERMINATION           "pmix.logproc"          // (bool) Requests that the launcher log the PMIX_EVENT_PROC_TERMINATED event
0824                                                                     //        whenever a process either normally or abnormally terminates.
0825 #define PMIX_LOG_PROC_ABNORMAL_TERMINATION  "pmix.logabproc"        // (bool) Requests that the launcher log the PMIX_EVENT_PROC_TERMINATED event
0826                                                                     //        only when a process abnormally terminates.
0827 #define PMIX_LOG_JOB_EVENTS                 "pmix.log.jev"          // (bool) Requests that the launcher log the PMIX_EVENT_JOB_START,
0828                                                                     //        PMIX_LAUNCH_COMPLETE, and PMIX_EVENT_JOB_END events using PMIx_Log
0829 #define PMIX_LOG_COMPLETION                 "pmix.logcomp"          // (bool) Requests that the launcher log the PMIX_EVENT_JOB_END event
0830                                                                     //        for normal or abnormal termination of the spawned job using
0831                                                                     //        PMIx_Log. The event shall include the returned status code
0832                                                                     //        (PMIX_JOB_TERM_STATUS) for the corresponding job; the identity
0833                                                                     //        (PMIX_PROCID) and exit status (PMIX_EXIT_CODE) of the first failed
0834                                                                     //        process, if applicable; and a PMIX_EVENT_TIMESTAMP indicating the time
0835                                                                     //        the termination occurred.
0836 
0837 
0838 /* debugger attributes */
0839 #define PMIX_DEBUG_STOP_ON_EXEC             "pmix.dbg.exec"         // (varies) stop specified rank(s) on exec and notify ready-to-debug
0840                                                                     //        Can be any of three data types:
0841                                                                     //           (a) bool - true indicating all ranks, false indicating none
0842                                                                     //           (b) pmix_rank_t - the rank of one proc, or WILDCARD for all
0843                                                                     //           (c) a pmix_data_array_t if an array of individual processes
0844                                                                     //               are specified
0845 #define PMIX_DEBUG_STOP_IN_INIT             "pmix.dbg.init"         // (varies) stop specified rank(s) in PMIx_Init and notify ready-to-debug
0846                                                                     //        Can be any of three data types:
0847                                                                     //           (a) bool - true indicating all ranks, false indicating none
0848                                                                     //           (b) pmix_rank_t - the rank of one proc, or WILDCARD for all
0849                                                                     //           (c) a pmix_data_array_t if an array of individual processes
0850                                                                     //               are specified
0851 #define PMIX_DEBUG_STOP_IN_APP              "pmix.dbg.notify"       // (varies) direct specified ranks to stop at application-specific point and
0852                                                                     //        notify ready-to-debug. Can be any of three data types:
0853                                                                     //           (a) bool - true indicating all ranks, false indicating none
0854                                                                     //           (b) pmix_rank_t - the rank of one proc, or WILDCARD for all
0855                                                                     //           (c) a pmix_data_array_t if an array of individual processes
0856                                                                     //               are specified
0857 #define PMIX_BREAKPOINT                     "pmix.brkpnt"           // (char*) string ID of the breakpoint where the process(es) is(are) waiting
0858 #define PMIX_DEBUG_TARGET                   "pmix.dbg.tgt"          // (pmix_proc_t*) Identifier of proc(s) to be debugged
0859 #define PMIX_DEBUG_DAEMONS_PER_PROC         "pmix.dbg.dpproc"       // (uint16_t) Number of debugger daemons to be spawned per application
0860                                                                     //        process. The launcher is to pass the identifier of the namespace to
0861                                                                     //        be debugged by including the PMIX_DEBUG_TARGET attribute in the
0862                                                                     //        daemon's job-level information. The debugger daemons spawned on a
0863                                                                     //        given node are responsible for self-determining their specific
0864                                                                     //        target process(es) - e.g., by referencing their own PMIX_LOCAL_RANK
0865                                                                     //        in the daemon debugger job versus the corresponding PMIX_LOCAL_RANK
0866                                                                     //        of the target processes on the node.
0867 #define PMIX_DEBUG_DAEMONS_PER_NODE         "pmix.dbg.dpnd"         // (uint16_t) Number of debugger daemons to be spawned on each node where the
0868                                                                     //        target job is executing. The launcher is to pass the identifier of
0869                                                                     //        the namespace to be debugged by including the PMIX_DEBUG_TARGET
0870                                                                     //        attribute in the daemon's job-level information. The debugger
0871                                                                     //        daemons spawned on a given node are responsible for
0872                                                                     //        self-determining their specific target process(es) - e.g., by
0873                                                                     //        referencing their own PMIX_LOCAL_RANK in the daemon debugger job
0874                                                                     //        versus the corresponding PMIX_LOCAL_RANK of the target processes on
0875                                                                     //        the node.
0876 
0877 
0878 /* Resource Manager identification */
0879 #define PMIX_RM_NAME                        "pmix.rm.name"          // (char*) string name of the resource manager
0880 #define PMIX_RM_VERSION                     "pmix.rm.version"       // (char*) RM version string
0881 
0882 /* environmental variable operation attributes */
0883 #define PMIX_SET_ENVAR                      "pmix.envar.set"          // (pmix_envar_t*) set the envar to the given value,
0884                                                                       //                 overwriting any pre-existing one
0885 #define PMIX_ADD_ENVAR                      "pmix.envar.add"          // (pmix_envar_t*) add envar, but do not overwrite any existing one
0886 #define PMIX_UNSET_ENVAR                    "pmix.envar.unset"        // (char*) unset the envar, if present
0887 #define PMIX_PREPEND_ENVAR                  "pmix.envar.prepnd"       // (pmix_envar_t*) prepend the given value to the
0888                                                                       //                 specified envar using the separator
0889                                                                       //                 character, creating the envar if it doesn't already exist
0890 #define PMIX_APPEND_ENVAR                   "pmix.envar.appnd"        // (pmix_envar_t*) append the given value to the specified
0891                                                                       //                 envar using the separator character,
0892                                                                       //                 creating the envar if it doesn't already exist
0893 #define PMIX_FIRST_ENVAR                    "pmix.envar.first"        // (pmix_envar_t*) ensure the given value appears first in the
0894                                                                       //                 specified envar using the separator
0895                                                                       //                 character, creating the envar if it doesn't already exist
0896 
0897 /* attributes relating to allocations */
0898 #define PMIX_ALLOC_REQ_ID                   "pmix.alloc.reqid"      // (char*) User-provided string identifier for this allocation request
0899                                                                     //         which can later be used to query status of the request.
0900 #define PMIX_ALLOC_ID                       "pmix.alloc.id"         // (char*) A string identifier (provided by the host environment) for
0901                                                                     //         the resulting allocation which can later be used to reference
0902                                                                     //         the allocated resources in, for example, a call to PMIx_Spawn
0903 #define PMIX_ALLOC_NUM_NODES                "pmix.alloc.nnodes"     // (uint64_t) number of nodes
0904 #define PMIX_ALLOC_NODE_LIST                "pmix.alloc.nlist"      // (char*) regex of specific nodes
0905 #define PMIX_ALLOC_EXCLUDE                  "pmix.alloc.exclude"    // (char*) regex of nodes to exclude from scheduling consideration
0906 #define PMIX_ALLOC_NUM_CPUS                 "pmix.alloc.ncpus"      // (uint64_t) number of cpus
0907 #define PMIX_ALLOC_NUM_CPU_LIST             "pmix.alloc.ncpulist"   // (char*) regex of #cpus for each node
0908 #define PMIX_ALLOC_CPU_LIST                 "pmix.alloc.cpulist"    // (char*) regex of specific cpus indicating the cpus involved.
0909 #define PMIX_ALLOC_MEM_SIZE                 "pmix.alloc.msize"      // (float) number of Mbytes
0910 #define PMIX_ALLOC_FABRIC                   "pmix.alloc.net"        // (pmix_data_array_t*) Array of pmix_info_t describing
0911                                                                     //         fabric resource request. This must include at least:
0912                                                                     //           * PMIX_ALLOC_FABRIC_ID
0913                                                                     //           * PMIX_ALLOC_FABRIC_TYPE
0914                                                                     //           * PMIX_ALLOC_FABRIC_ENDPTS
0915                                                                     //         plus whatever other descriptors are desired
0916 #define PMIX_ALLOC_FABRIC_ID                "pmix.alloc.netid"      // (char*) key to be used when accessing this requested fabric allocation. The
0917                                                                     //         allocation will be returned/stored as a pmix_data_array_t of
0918                                                                     //         pmix_info_t indexed by this key and containing at least one
0919                                                                     //         entry with the same key and the allocated resource description.
0920                                                                     //         The type of the included value depends upon the fabric
0921                                                                     //         support. For example, a TCP allocation might consist of a
0922                                                                     //         comma-delimited string of socket ranges such as
0923                                                                     //         "32000-32100,33005,38123-38146". Additional entries will consist
0924                                                                     //         of any provided resource request directives, along with their
0925                                                                     //         assigned values. Examples include:
0926                                                                     //           * PMIX_ALLOC_FABRIC_TYPE - the type of resources provided
0927                                                                     //           * PMIX_ALLOC_FABRIC_PLANE - if applicable, what plane the
0928                                                                     //               resources were assigned from
0929                                                                     //           * PMIX_ALLOC_FABRIC_QOS - the assigned QoS
0930                                                                     //           * PMIX_ALLOC_BANDWIDTH - the allocated bandwidth
0931                                                                     //           * PMIX_ALLOC_FABRIC_SEC_KEY - a security key for the requested
0932                                                                     //               fabric allocation
0933                                                                     //         NOTE: the assigned values may differ from those requested,
0934                                                                     //         especially if the "required" flag was not set in the request
0935 #define PMIX_ALLOC_BANDWIDTH                "pmix.alloc.bw"         // (float) Mbits/sec
0936 #define PMIX_ALLOC_FABRIC_QOS               "pmix.alloc.netqos"     // (char*) quality of service level
0937 #define PMIX_ALLOC_TIME                     "pmix.alloc.time"       // (char*) time that the allocation shall remain valid. Time is specified in
0938                                                                     //         usual time format of months:days:hours:minutes:seconds, scanning
0939                                                                     //         from right to left (i.e., a value of "2" equates to 2 seconds)
0940 #define PMIX_ALLOC_FABRIC_TYPE              "pmix.alloc.nettype"    // (char*) type of desired transport (e.g., tcp, udp)
0941 #define PMIX_ALLOC_FABRIC_PLANE             "pmix.alloc.netplane"   // (char*) id string for the NIC (aka plane) to be used for this allocation
0942                                                                     //         (e.g., CIDR for Ethernet)
0943 #define PMIX_ALLOC_FABRIC_ENDPTS            "pmix.alloc.endpts"     // (size_t) number of endpoints to allocate per process
0944 #define PMIX_ALLOC_FABRIC_ENDPTS_NODE       "pmix.alloc.endpts.nd"  // (size_t) number of endpoints to allocate per node
0945 #define PMIX_ALLOC_FABRIC_SEC_KEY           "pmix.alloc.nsec"       // (pmix_byte_object_t) fabric security key
0946 #define PMIX_ALLOC_QUEUE                    "pmix.alloc.queue"      // (char*) name of queue being referenced
0947 #define PMIX_ALLOC_PREEMPTIBLE              "pmix.alloc.preempt"    // (bool) by default, all jobs in the resulting allocation are to be
0948                                                                     //        considered preemptible (overridable at per-job level)
0949 #define PMIX_ALLOC_LEND                     "pmix.alloc.lend"       // (char*) estimated time before the lent resources shall be available for
0950                                                                     //         return. Time is specified in usual time format of
0951                                                                     //         months:days:hours:minutes:seconds, scanning from right to left
0952                                                                     //         (i.e., a value of "2" equates to 2 seconds)
0953 #define PMIX_ALLOC_IMAGE                    "pmix.alloc.image"      // (char*) name of the image that the requested nodes are to have on them
0954 #define PMIX_ALLOC_WAIT_ALL_NODES           "pmix.alloc.waitall"    // (bool) whether or not to wait for all nodes to be scheduled before
0955                                                                     //        starting to initialize and release nodes for use
0956 #define PMIX_ALLOC_SHARE                    "pmix.alloc.share"      // (bool) Allow non-exclusive use of specified resources
0957 #define PMIX_ALLOC_NOSHELL                  "pmix.alloc.noshell"    // (bool) Immediately exit after allocating resources, without running a command.
0958 #define PMIX_ALLOC_DEPENDENCY               "pmix.alloc.depend"     // (char*) Defer the start of allocation until the specified dependencies have
0959                                                                     //         successfully completed.
0960 #define PMIX_ALLOC_BEGIN                    "pmix.alloc.begin"      // (char*) Direct the scheduler to defer allocation until the specified time. Time
0961                                                                     //         may be of the form HH:MM:SS to schedule the session to start at a specific
0962                                                                     //         time of day (seconds are optional). If that time is already past, the
0963                                                                     //         next day is assumed. You may also specify "midnight" or "noon", and you
0964                                                                     //         can have a time-of-day suffixed with AM or PM for running in the morning
0965                                                                     //         or the evening. You can also say what day the session should start by
0966                                                                     //         specifying a date of the form MMDDYY or MM/DD/YY YYYY-MM-DD. Combine date
0967                                                                     //         and time using the usual format YYYY-MM-DD[THH:MM[:SS]]. You can also give
0968                                                                     //         times like "now + count" time-units, where the time-units can be "seconds"
0969                                                                     //         (default), "minutes", "hours", days, or weeks, or you can ask that the
0970                                                                     //         allocation be made "today" or "tomorrow".
0971 #define PMIX_ALLOC_NOT_WAITING              "pmix.alloc.notwait"    // (bool) Requestor is not waiting for the allocation to be issued. When allocation
0972                                                                     //        is made, start the provided job - if one is not provided, then setup the
0973                                                                     //        allocated session and leave it idle. The requestor will discover the
0974                                                                     //        allocation by either monitoring for the "allocated" event or by querying
0975                                                                     //        the system
0976 
0977 #define PMIX_ALLOC_RES_BLOCK                "pmix.alloc.blk"        // (char*) name of the previously-defined resource block to be allocated
0978 #define PMIX_ALLOC_NUM_BLOCKS               "pmix.alloc.nblks"      // (uint64_t) number of specified resource blocks to allocate
0979 #define PMIX_ALLOC_MAU                      "pmix.alloc.mau"        // (pmix_data_array_t*) Minimum allocatable unit for the system. This attribute
0980                                                                     //         is used by the system scheduler to inform the system controller
0981                                                                     //         of the MAU so the information can be passed along. Alternatively,
0982                                                                     //         a host can pass the information into its PMIx server. Array consists
0983                                                                     //         of pmix_resource_unit_t structs.
0984 #define PMIX_ALLOC_CHILD_SEP                "pmix.alloc.sep"        // (bool) Treat the resulting allocation as independent from its parent - i.e.,
0985                                                                     //        do not terminate the allocation upon termination of the parent.
0986 #define PMIX_MEM_ALLOC_KIND                 "pmix.alloc.mkind"      // (char*) Comma-delimited list of memory kinds
0987                                                                     //         being allocated (e.g., system,mpi,rocm:device)
0988 #define PMIX_GPU_SUPPORT                    "pmix.gpu.support"      // (bool) Direct application to either enable (true) or
0989                                                                     //        disable (false) its internal library's GPU support
0990 
0991 
0992 /* job control attributes */
0993 #define PMIX_JOB_CTRL_ID                    "pmix.jctrl.id"         // (char*) provide a string identifier for this request
0994 #define PMIX_JOB_CTRL_PAUSE                 "pmix.jctrl.pause"      // (bool) pause the specified processes
0995 #define PMIX_JOB_CTRL_RESUME                "pmix.jctrl.resume"     // (bool) "un-pause" the specified processes
0996 #define PMIX_JOB_CTRL_CANCEL                "pmix.jctrl.cancel"     // (char*) cancel the specified request
0997                                                                     //         (NULL => cancel all requests from this requestor)
0998 #define PMIX_JOB_CTRL_KILL                  "pmix.jctrl.kill"       // (bool) forcibly terminate the specified processes and cleanup
0999 #define PMIX_JOB_CTRL_RESTART               "pmix.jctrl.restart"    // (char*) restart the specified processes using the given checkpoint ID
1000 #define PMIX_JOB_CTRL_CHECKPOINT            "pmix.jctrl.ckpt"       // (char*) checkpoint the specified processes and assign the given ID to it
1001 #define PMIX_JOB_CTRL_CHECKPOINT_EVENT      "pmix.jctrl.ckptev"     // (bool) use event notification to trigger process checkpoint
1002 #define PMIX_JOB_CTRL_CHECKPOINT_SIGNAL     "pmix.jctrl.ckptsig"    // (int) use the given signal to trigger process checkpoint
1003 #define PMIX_JOB_CTRL_CHECKPOINT_TIMEOUT    "pmix.jctrl.ckptsig"    // (int) time in seconds to wait for checkpoint to complete
1004 #define PMIX_JOB_CTRL_CHECKPOINT_METHOD     "pmix.jctrl.ckmethod"   // (pmix_data_array_t*) array of pmix_info_t declaring each
1005                                                                     //      method and value supported by this application
1006 #define PMIX_JOB_CTRL_SIGNAL                "pmix.jctrl.sig"        // (int) send given signal to specified processes
1007 #define PMIX_JOB_CTRL_PROVISION             "pmix.jctrl.pvn"        // (char*) regex identifying nodes that are to be provisioned
1008 #define PMIX_JOB_CTRL_PROVISION_IMAGE       "pmix.jctrl.pvnimg"     // (char*) name of the image that is to be provisioned
1009 #define PMIX_JOB_CTRL_PREEMPTIBLE           "pmix.jctrl.preempt"    // (bool) job can be pre-empted
1010 #define PMIX_JOB_CTRL_TERMINATE             "pmix.jctrl.term"       // (bool) politely terminate the specified procs
1011 #define PMIX_JOB_CTRL_DEFINE_PSET           "pmix.jctrl.defpset"    // (char*) Pset name to be assigned to the targets
1012 #define PMIX_REGISTER_CLEANUP               "pmix.reg.cleanup"      // (char*) comma-delimited list of files to
1013                                                                     //         be removed upon process termination
1014 #define PMIX_REGISTER_CLEANUP_DIR           "pmix.reg.cleanupdir"   // (char*) comma-delimited list of directories to
1015                                                                     //         be removed upon process termination
1016 #define PMIX_CLEANUP_RECURSIVE              "pmix.clnup.recurse"    // (bool) recursively cleanup all subdirectories under the
1017                                                                     //        specified one(s)
1018 #define PMIX_CLEANUP_EMPTY                  "pmix.clnup.empty"      // (bool) only remove empty subdirectories
1019 #define PMIX_CLEANUP_IGNORE                 "pmix.clnup.ignore"     // (char*) comma-delimited list of filenames that are not
1020                                                                     //         to be removed
1021 #define PMIX_CLEANUP_LEAVE_TOPDIR           "pmix.clnup.lvtop"      // (bool) when recursively cleaning subdirs, do not remove
1022                                                                     //        the top-level directory (the one given in the
1023                                                                     //        cleanup request)
1024 #define PMIX_JOB_CTRL_SEP                   "pmix.jctrl.sep"        // (bool) Separate the specified nspace from its parent - i.e., allow
1025                                                                     //        the two to independently terminate.
1026 
1027 
1028 /* session control attributes */
1029 #define PMIX_SESSION_CTRL_ID                "pmix.ssnctrl.id"       // (char*) provide a string identifier for this request
1030 
1031 /* session instantiation attributes - called by scheduler
1032  * Schedulers calling to create a session are required to provide:
1033  *  - the effective userID and groupID that the session should have
1034  *    when instantiated.
1035  *  - description of the resources that are to be included in the session
1036  *  - if applicable, the image that should be provisioned on nodes
1037  *    included in the session
1038  *  - an array of applications (if any) that are to be started in the
1039  *    session once instantiated
1040  */
1041 #define PMIX_SESSION_INSTANTIATE            "pmix.ssn.inst"         // (bool) Instantiate the specified session
1042 #define PMIX_SESSION_RESOURCES              "pmix.ssn.res"          // (pmix_data_array_t*) Array of pmix_info_t describing the
1043                                                                     //        resources to be included in the session. This can
1044                                                                     //        include a regex of node names, array of resource blocks,
1045                                                                     //        etc.
1046 #define PMIX_SESSION_JOB                    "pmix.ssn.job"          // (pmix_data_array_t*) Array of pmix_info_t describing the job info
1047                                                                     //        to be applied in conjunction with specified PMIX_SESSION_APP
1048                                                                     //        definitions. Error if given without a PMIX_SESSION_APP description.
1049 #define PMIX_SESSION_APP                    "pmix.ssn.app"          // (pmix_data_array_t*) Array of pmix_app_t to be executed in the assigned
1050                                                                     //        session upon session instantiation
1051 #define PMIX_SESSION_PROVISION_NODES        "pmix.ssn.pvnnds"       // (char*) regex identifying nodes that are to be provisioned
1052 #define PMIX_SESSION_PROVISION_IMAGE        "pmix.ssn.pvnimg"       // (char*) name of the image that is to be provisioned
1053 
1054 /* session operational attributes - called by scheduler */
1055 #define PMIX_SESSION_PAUSE                  "pmix.ssn.pause"        // (bool) pause all jobs in the specified session
1056 #define PMIX_SESSION_RESUME                 "pmix.ssn.resume"       // (bool) "un-pause" all jobs in the specified session
1057 #define PMIX_SESSION_TERMINATE              "pmix.ssn.terminate"    // (bool) terminate all jobs in the specified session and recover all
1058                                                                     //        resources included in the session.
1059 #define PMIX_SESSION_PREEMPT                "pmix.ssn.preempt"      // (bool) preempt indicated jobs (given in accompanying pmix_info_t via
1060                                                                     //        the PMIX_NSPACE attribute) in the specified session and recover
1061                                                                     //        all their resources. If no PMIX_NSPACE is specified, then preempt
1062                                                                     //        all jobs in the session.
1063 #define PMIX_SESSION_RESTORE                "pmix.ssn.restore"      // (bool) restore indicated jobs (given in accompanying pmix_info_t via
1064                                                                     //        the PMIX_NSPACE attribute) in the specified session, including
1065                                                                     //        all their resources. If no PMIX_NSPACE is specified, then restore
1066                                                                     //        all jobs in the session.
1067 #define PMIX_SESSION_SIGNAL                 "pmix.ssn.sig"          // (int) send given signal to all processes of every job in the session
1068 #define PMIX_SESSION_SEP                    "pmix.ssn.sep"          // (bool) Separate the specified session from its parent - i.e., allow
1069                                                                     //        the two to independently terminate.
1070 #define PMIX_SESSION_EXTEND                 "pmix.ssn.xtend"        // (bool) Extend the specified session either in terms of time or resources,
1071                                                                     //        based on additional provided attributes
1072 
1073 /* session operational attributes - called by RTE */
1074 #define PMIX_SESSION_COMPLETE               "pmix.ssn.complete"     // (bool) specified session has completed, all resources have been
1075                                                                     //        recovered and are available for scheduling. Must include
1076                                                                     //        pmix_info_t indicating returned status of any jobs
1077                                                                     //        executed in the session.
1078 
1079 
1080 /* monitoring attributes */
1081 #define PMIX_MONITOR_ID                     "pmix.monitor.id"       // (char*) provide a string identifier for this request
1082 #define PMIX_MONITOR_PROXY                  "pmix.monitor.proxy"    // (pmix_proc_t*) Process requesting monitoring information, if different
1083                                                                     //         from the process calling the API
1084 #define PMIX_MONITOR_CANCEL                 "pmix.monitor.cancel"   // (char*) identifier to be canceled (NULL = cancel all
1085                                                                     //         monitoring for this process)
1086 #define PMIX_MONITOR_APP_CONTROL            "pmix.monitor.appctrl"  // (bool) the application desires to control the response to
1087                                                                     //        a monitoring event
1088 #define PMIX_MONITOR_HEARTBEAT              "pmix.monitor.mbeat"    // (bool) register to have the server monitor the requestor for heartbeats
1089 #define PMIX_SEND_HEARTBEAT                 "pmix.monitor.beat"     // (bool) send heartbeat to local server
1090 #define PMIX_MONITOR_HEARTBEAT_TIME         "pmix.monitor.btime"    // (uint32_t) time in seconds before declaring heartbeat missed
1091 #define PMIX_MONITOR_HEARTBEAT_DROPS        "pmix.monitor.bdrop"    // (uint32_t) number of heartbeats that can be missed before
1092                                                                     //            generating the event
1093 #define PMIX_MONITOR_FILE                   "pmix.monitor.fmon"     // (char*) register to monitor file for signs of life
1094 #define PMIX_MONITOR_FILE_SIZE              "pmix.monitor.fsize"    // (bool) monitor size of given file is growing to determine app is running
1095 #define PMIX_MONITOR_FILE_ACCESS            "pmix.monitor.faccess"  // (char*) monitor time since last access of given file to determine app is running
1096 #define PMIX_MONITOR_FILE_MODIFY            "pmix.monitor.fmod"     // (char*) monitor time since last modified of given file to determine app is running
1097 #define PMIX_MONITOR_FILE_CHECK_TIME        "pmix.monitor.ftime"    // (uint32_t) time in seconds between checking file
1098 #define PMIX_MONITOR_FILE_DROPS             "pmix.monitor.fdrop"    // (uint32_t) number of file checks that can be missed before
1099                                                                     //            generating the event
1100 #define PMIX_MONITOR_RESOURCE_RATE          "pmix.monitor.resrate"  // (uint32_t) Monitor resource usage every N seconds, where N is the value provided
1101                                                                     //            by the attribute.
1102 #define PMIX_MONITOR_TARGET_PROCS           "pmix.monitor.tgtproc"  // (pmix_data_array_t*) Arrray of process IDs specifying the processes to be monitored.
1103                                                                     //            Can include a PMIX_RANK_WILDCARD to indicate that all processes from a given
1104                                                                     //            namespace are to be included. If omitted, then all processesin the session will
1105                                                                     //            be monitored. May be included multiple times to fully specify all processes to
1106                                                                     //            be included.
1107 #define PMIX_MONITOR_TARGET_PIDS            "pmix.monitor.tgtpid"   // (pmix_data_array_t*) Array of pmix_node_pid_t structures to be monitored. Can include a
1108                                                                     //            structure containing a hostname with a pid value of -1 to indicate all
1109                                                                     //            processes on that node are to be included. May be included multiple times to
1110                                                                     //            fully specify all processes to be included.
1111 #define PMIX_MONITOR_TARGET_NODES           "pmix.monitor.tgtnode"  // (pmix_data_array_t*) Array of string host names to be monitored
1112 #define PMIX_MONITOR_TARGET_NODEIDS         "pmix.monitor.tgtndids" // (pmix_data_array_t*) Array of uint32_t node IDs to be monitored
1113 #define PMIX_MONITOR_TARGET_DISKS           "pmix.monitor.tgtdks"   // (pmix_data_array_t*) Array of strings representing PMIX_DISK_IDs to be monitored
1114 #define PMIX_MONITOR_TARGET_NETS            "pmix.monitor.tgtnets"  // (pmix_data_array_t*) Array of strings representing PMIX_NETWORK_IDs to be monitored
1115 #define PMIX_MONITOR_PROC_RESOURCE_USAGE    "pmix.monitor.presuse"  // (pmix_data_array_t*) Monitor the resources specified in the provided array of pmix_info_t.
1116                                                                     //            If the provided array is NULL, then all resources shall be monitored. If no
1117                                                                     //            targets are provided in the associated directives array, then all processes in
1118                                                                     //            the session will be monitored.  Note that the values in the provided structures
1119                                                                     //            will be ignored (i.e., only the attribute keys are relevant) except where noted,
1120                                                                     //            and that the PMIX_PROC_SAMPLE_TIME will always be included in the returned data
1121                                                                     //            (there is no need to include it in the request)
1122 #define PMIX_MONITOR_NODE_RESOURCE_USAGE    "pmix.monitor.ndresuse" // (pmix_data_array_t*) Monitor the resources specified in the provided array of pmix_info_t.
1123                                                                     //            If the provided array is NULL, then all resources shall be monitored. If no
1124                                                                     //            targets are provided in the associated directives array, then all nodes in
1125                                                                     //            the session will be monitored.  Note that the values in the provided structures
1126                                                                     //            will be ignored (i.e., only the attribute keys are relevant) except where noted,
1127                                                                     //            and that the PMIX_NODE_SAMPLE_TIME will always be included in the returned data
1128                                                                     //            (there is no need to include it in the request)
1129 #define PMIX_MONITOR_DISK_RESOURCE_USAGE    "pmix.monitor.dkresuse" // (pmix_data_array_t*) Monitor the resources specified in the provided array of pmix_info_t.
1130                                                                     //            If the provided array is NULL, then all resources shall be monitored. If no
1131                                                                     //            PMIX_DISK_ID targets are provided in the associated directives array, then all
1132                                                                     //            disks on the local node (or on the specified target nodes, if given) will be monitored.
1133                                                                     //            Note that the values in the provided structures will be ignored (i.e., only the
1134                                                                     //            attribute keys are relevant) except where noted, and that the
1135                                                                     //            PMIX_DISK_SAMPLE_TIME will always be included in the returned data
1136                                                                     //            (there is no need to include it in the request)
1137 #define PMIX_MONITOR_NET_RESOURCE_USAGE     "pmix.monitor.netresuse" // (pmix_data_array_t*) Monitor the resources specified in the provided array of pmix_info_t.
1138                                                                     //            If the provided array is NULL, then all resources shall be monitored. If no
1139                                                                     //            PMIX_NETWORK_ID targets are provided in the associated directives array, then all
1140                                                                     //            networks on the local node (or on the specified target nodes, if given) will be monitored.
1141                                                                     //            Note that the values in the provided structures will be ignored (i.e., only the
1142                                                                     //            attribute keys are relevant) except where noted, and that the
1143                                                                     //            PMIX_NET_SAMPLE_TIME will always be included in the returned data
1144                                                                     //            (there is no need to include it in the request)
1145 #define PMIX_MONITOR_LOCAL_ONLY             "pmix.monitor.local"    // (bool) Restrict data collection to the local host, regardless of any provided targets
1146 /* resource usage attributes */
1147 #define PMIX_PROC_RESOURCE_USAGE            "pmix.proc.res"         // (pmix_data_array_t*) An array of pmix_info_t describing the resource usage
1148                                                                     //          of the specified process, with the first element containing the ID
1149                                                                     //          of the process (marked by the PMIX_PROCID key) whose usage is reported
1150                                                                     //          in the array. The list of included information may vary across
1151                                                                     //          implementations and OSs, depending upon availability and access
1152                                                                     //          restrictions. Except for the process ID as the first element, ordering
1153                                                                     //          of information in the array is arbitrary.
1154 #define PMIX_PROC_OS_STATE                  "pmix.proc.osstate"     // (char*) The state of the process as reported by the OS - for Linux, this is
1155                                                                     //         expressed as a single character
1156 #define PMIX_PROC_TIME                      "pmix.proc.time"        // (struct timeval) Cumulative CPU time
1157 #define PMIX_PROC_PERCENT_CPU               "pmix.proc.pcpu"        // (float) Percent cpu utilization by the process. Often, it is the CPU time used
1158                                                                     //         divided by the time the process has been running (cputime/realtime ratio),
1159                                                                     //         expressed as a percentage.
1160 #define PMIX_PROC_PRIORITY                  "pmix.proc.pri"         // (int32_t) Priority of the process. Higher number means higher priority
1161 #define PMIX_PROC_NUM_THREADS               "pmix.proc.nthr"        // (uint16_t) Number of threads operating in the process
1162 #define PMIX_PROC_PSS                       "pmix.proc.pss"         // (float) Proportional share size, the non-swapped physical memory, with
1163                                                                     //         shared memory proportionally accounted to all tasks mappint it (MBytes)
1164 #define PMIX_PROC_VSIZE                     "pmix.proc.vsize"       // (float) Virtual memory size of the process (MBytes)
1165 #define PMIX_PROC_RSS                       "pmix.proc.rss"         // (float) Resident set size, the non-swapped physical memory that a task
1166                                                                     //         has used (MBytes)
1167 #define PMIX_PROC_PEAK_VSIZE                "pmix.proc.pkvsize"     // (float) Peak virtual memory size of the process (MBytes)
1168 #define PMIX_PROC_CPU                       "pmix.proc.cpu"         // (uint16_t) Processor that process last executed on
1169 #define PMIX_PROC_SAMPLE_TIME               "pmix.proc.samptime"    // (time_t) Time when sample was taken
1170 
1171 #define PMIX_DISK_RESOURCE_USAGE            "pmix.disk.res"         // (pmix_data_array_t*) An array of pmix_info_t describing the resource usage of
1172                                                                     //          the specified disk, with the first element containing the string name
1173                                                                     //          of the disk (marked by the PMIX_DISK_ID key) whose usage is reported in
1174                                                                     //          the array. The list of included information may vary across implementations
1175                                                                     //          and OSs, depending upon availability and access restrictions. Except for
1176                                                                     //          the disk ID as the first element, ordering of information in the array
1177                                                                     //          is arbitrary.
1178 #define PMIX_DISK_ID                        "pmix.disk.id"          // (char*) String identifier of a disk
1179 #define PMIX_DISK_READ_COMPLETED            "pmix.disk.rdscomp"     // (uint64_t) Number of completed read operations
1180 #define PMIX_DISK_READ_MERGED               "pmix.disk.rdsmrgd"     // (uint64_t) Number of merged reads
1181 #define PMIX_DISK_READ_SECTORS              "pmix.disk.rdsct"       // (uint64_t) Number of sectors read
1182 #define PMIX_DISK_READ_MILLISEC             "pmix.disk.rdms"        // (uint64_t) Number of milliseconds spent reading the disk
1183 #define PMIX_DISK_WRITE_COMPLETED           "pmix.disk.wtscomp"     // (uint64_t) Number of completed write operations
1184 #define PMIX_DISK_WRITE_MERGED              "pmix.disk.wtsmrgd"     // (uint64_t) Number of merged writes
1185 #define PMIX_DISK_WRITE_SECTORS             "pmix.disk.wtsct"       // (uint64_t) Number of sectors written
1186 #define PMIX_DISK_WRITE_MILLISEC            "pmix.disk.wtms"        // (uint64_t) Number of milliseconds spent writing to the disk
1187 #define PMIX_DISK_IO_IN_PROGRESS            "pmix.disk.ios"         // (uint64_t) Number of disk IO operations in progress
1188 #define PMIX_DISK_IO_MILLISEC               "pmix.disk.ioms"        // (uint64_t) Number of milliseconds spent in IO operations
1189 #define PMIX_DISK_IO_WEIGHTED               "pmix.disk.iowght"      // (uint64_t) Number of IOs in progress times the number of milliseconds spent
1190                                                                     //            doing IO since last update of the field - indicator of backlog that
1191                                                                     //            may be accumulating
1192 #define PMIX_DISK_SAMPLE_TIME               "pmix.disk.samptime"    // (time_t) Time when sample was taken
1193 
1194 
1195 #define PMIX_NETWORK_RESOURCE_USAGE         "pmix.net.res"          // (pmix_data_array_t*) An array of pmix_info_t describing the resource usage of
1196                                                                     //          the specified network, with the first element containing the string name
1197                                                                     //          of the interface (marked by the PMIX_NETWORK_ID key) whose usage is reported in
1198                                                                     //          the array. The list of included information may vary across implementations
1199                                                                     //          and OSs, depending upon availability and access restrictions. Except for
1200                                                                     //          the network ID as the first element, ordering of information in the array
1201                                                                     //          is arbitrary.
1202 #define PMIX_NETWORK_ID                     "pmix.net.id"           // (char*) String identifier of a network interface
1203 #define PMIX_NET_RECVD_BYTES                "pmix.net.rcb"          // (uint64_t) Number of bytes received
1204 #define PMIX_NET_RECVD_PCKTS                "pmix.net.rcp"          // (uint64_t) Number of packets received
1205 #define PMIX_NET_RECVD_ERRS                 "pmix.net.rcerr"        // (uint64_t) Number of receive errors
1206 #define PMIX_NET_SENT_BYTES                 "pmix.net.sntb"         // (uint64_t) Number of bytes sent
1207 #define PMIX_NET_SENT_PCKTS                 "pmix.net.sntp"         // (uint64_t) Number of packets sent
1208 #define PMIX_NET_SENT_ERRS                  "pmix.net.snterr"       // (uint64_t) Number of send errors
1209 #define PMIX_NET_SAMPLE_TIME                "pmix.net.samptime"     // (time_t) Time when sample was taken
1210 
1211 
1212 #define PMIX_NODE_RESOURCE_USAGE            "pmix.node.res"         // (pmix_data_array_t*) An array of pmix_info_t describing the resource usage of
1213                                                                     //          the specified node, with the first element containing the ID of the node
1214                                                                     //          (marked by the PMIX_HOSTNAME or PMIX_NODEID key) whose usage is reported in
1215                                                                     //          the array. The list of included information may vary across implementations
1216                                                                     //          and OSs, depending upon availability and access restrictions. Except for
1217                                                                     //          the node ID as the first element, ordering of information in the array
1218                                                                     //          is arbitrary.
1219 #define PMIX_NODE_LOAD_AVG                  "pmix.node.la"          // (float) Load average of last minute
1220 #define PMIX_NODE_LOAD_AVG5                 "pmix.node.la5"         // (float) Load average of last five minutes
1221 #define PMIX_NODE_LOAD_AVG15                "pmix.node.la15"        // (float) Load average of last fifteen minutes
1222 #define PMIX_NODE_MEM_TOTAL                 "pmix.node.mtot"        // (float) Total usable RAM - i.e., physical RAM minus reserved bits and kernel
1223                                                                     //         binary code (MBytes)
1224 #define PMIX_NODE_MEM_FREE                  "pmix.node.mfree"       // (float) Total free RAM (MBytes)
1225 #define PMIX_NODE_MEM_BUFFERS               "pmix.node.mbuf"        // (float) Temporary storage for raw disk blocks (MBytes)
1226 #define PMIX_NODE_MEM_CACHED                "pmix.node.mcache"      // (float) In-memory cache for files read from disk (the pagecache) as well as tmpfs
1227                                                                     //         and shmem. Doesn't include PMIX_NODE_MEM_SWAP_CACHED. (MBytes)
1228 #define PMIX_NODE_MEM_SWAP_CACHED           "pmix.node.mswpc"       // (float) Memory that once was swapped out, is swapped back in but still also in the
1229                                                                     //         swapfile (MBytes)
1230 #define PMIX_NODE_SWAP_TOTAL                "pmix.node.mswpt"       // (float) Total amount of swap space available (MBytes)
1231 #define PMIX_NODE_MEM_SWAP_FREE             "pmix.node.mswpfree"    // (float) Memory which has been evicted from RA<M and is temporarily on the disk (MBytes)
1232 #define PMIX_NODE_MEM_MAPPED                "pmix.node.mmap"        // (float) Files which have been mmapped, such as libraries. Note that some kernel
1233                                                                     //         configurations might consider all pages part of a larger allocation (e.g., THP)
1234                                                                     //         as mapped, as soon as a single page is mapped (MBytes)
1235 #define PMIX_NODE_SAMPLE_TIME               "pmix.node.samptime"    // (time_t) Time when sample was taken
1236 
1237 
1238 /* security attributes */
1239 #define PMIX_CRED_TYPE                      "pmix.sec.ctype"        // (char*) when passed in PMIx_Get_credential, a prioritized,
1240                                                                     // comma-delimited list of desired credential types for use
1241                                                                     // in environments where multiple authentication mechanisms
1242                                                                     // may be available. When returned in a callback function, a
1243                                                                     // string identifier of the credential type
1244 #define PMIX_CRYPTO_KEY                     "pmix.sec.key"          // (pmix_byte_object_t) blob containing crypto key
1245 
1246 
1247 /* IO Forwarding Attributes */
1248 #define PMIX_IOF_CACHE_SIZE                 "pmix.iof.csize"        // (uint32_t) requested size of the server cache in bytes for each specified channel.
1249                                                                     //            By default, the server is allowed (but not required) to drop
1250                                                                     //            all bytes received beyond the max size
1251 #define PMIX_IOF_DROP_OLDEST                "pmix.iof.old"          // (bool) in an overflow situation, drop the oldest bytes to make room in the cache
1252 #define PMIX_IOF_DROP_NEWEST                "pmix.iof.new"          // (bool) in an overflow situation, drop any new bytes received until room becomes
1253                                                                     //        available in the cache (default)
1254 #define PMIX_IOF_BUFFERING_SIZE             "pmix.iof.bsize"        // (uint32_t) basically controls grouping of IO on the specified channel(s) to
1255                                                                     //            avoid being called every time a bit of IO arrives. The library
1256                                                                     //            will execute the callback whenever the specified number of bytes
1257                                                                     //            becomes available. Any remaining buffered data will be "flushed"
1258                                                                     //            upon call to deregister the respective channel
1259 #define PMIX_IOF_BUFFERING_TIME             "pmix.iof.btime"        // (uint32_t) max time in seconds to buffer IO before delivering it. Used in conjunction
1260                                                                     //            with buffering size, this prevents IO from being held indefinitely
1261                                                                     //            while waiting for another payload to arrive
1262 #define PMIX_IOF_COMPLETE                   "pmix.iof.cmp"          // (bool) indicates whether or not the specified IO channel has been closed
1263                                                                     //        by the source
1264 #define PMIX_IOF_PUSH_STDIN                 "pmix.iof.stdin"        // (bool) Used by a tool to request that the PMIx library collect
1265                                                                     //        the tool's stdin and forward it to the procs specified in
1266                                                                     //        the PMIx_IOF_push call
1267 #define PMIX_IOF_TAG_OUTPUT                 "pmix.iof.tag"          // (bool) Tag output with the [local jobid,rank] and channel it comes from
1268 #define PMIX_IOF_TAG_DETAILED_OUTPUT        "pmix.iof.tagdet"       // (bool) Tag output with the [local jobid,rank][hostname:pid] and channel it comes from
1269 #define PMIX_IOF_TAG_FULLNAME_OUTPUT        "pmix.iof.tagfull"      // (bool) Tag output with the [nspace,rank] and channel it comes from
1270 #define PMIX_IOF_RANK_OUTPUT                "pmix.iof.rank"         // (bool) Tag output with the rank it came from
1271 #define PMIX_IOF_TIMESTAMP_OUTPUT           "pmix.iof.ts"           // (bool) Timestamp output
1272 #define PMIX_IOF_MERGE_STDERR_STDOUT        "pmix.iof.mrg"          // (bool) merge stdout and stderr streams from application procs
1273 #define PMIX_IOF_XML_OUTPUT                 "pmix.iof.xml"          // (bool) Format output in XML
1274 #define PMIX_IOF_OUTPUT_TO_FILE             "pmix.iof.file"         // (char*) direct application output into files of form
1275                                                                     //         "<filename>.rank" with both stdout and stderr redirected into it
1276 #define PMIX_IOF_FILE_PATTERN               "pmix.iof.fpt"          // (bool) Specified output file is to be treated as a pattern and not
1277                                                                     //        automatically annotated by nspace, rank, or other parameters
1278 #define PMIX_IOF_OUTPUT_TO_DIRECTORY        "pmix.iof.dir"          // (char*) direct application output into files of form
1279                                                                     //         "<directory>/<jobid>/rank.<rank>/stdout[err]"
1280 #define PMIX_IOF_FILE_ONLY                  "pmix.iof.fonly"        // (bool) output only into designated files - do not also output
1281                                                                     //        a copy to stdout/stderr
1282 #define PMIX_IOF_COPY                       "pmix.iof.cpy"          // (bool) Requests that the host environment deliver a copy of the
1283                                                                     //        specified output stream(s) to the tool, letting the stream(s)
1284                                                                     //        continue to also be delivered to the default location. This
1285                                                                     //        allows the tool to tap into the output stream(s) without
1286                                                                     //        redirecting it from its current final destination.
1287 #define PMIX_IOF_REDIRECT                   "pmix.iof.redir"        // (bool) Requests that the host environment intercept the specified
1288                                                                     //        output stream(s) and deliver it to the requesting tool instead
1289                                                                     //        of its current final destination. This might be used, for
1290                                                                     //        example, during a debugging procedure to avoid injection of
1291                                                                     //        debugger-related output into the application's results file.
1292                                                                     //        The original output stream(s) destination is restored upon
1293                                                                     //        termination of the tool.
1294 #define PMIX_IOF_LOCAL_OUTPUT               "pmix.iof.local"        // (bool) Write output streams to local stdout/err
1295 #define PMIX_IOF_OUTPUT_RAW                 "pmix.iof.raw"          // (bool) Do not buffer output to be written as complete lines - output
1296                                                                     //        characters as the stream delivers them
1297 
1298 /* Attributes for controlling contents of application setup data */
1299 #define PMIX_SETUP_APP_ENVARS               "pmix.setup.env"        // (bool) harvest and include relevant envars
1300 #define PMIX_SETUP_APP_NONENVARS            "pmix.setup.nenv"       // (bool) include all non-envar data
1301 #define PMIX_SETUP_APP_ALL                  "pmix.setup.all"        // (bool) include all relevant data
1302 
1303 /* Attributes supporting the PMIx Groups APIs */
1304 #define PMIX_GROUP_ID                       "pmix.grp.id"           // (char*) user-provided group identifier
1305 #define PMIX_GROUP_LEADER                   "pmix.grp.ldr"          // (bool) this process is the leader of the group
1306 #define PMIX_GROUP_OPTIONAL                 "pmix.grp.opt"          // (bool) participation is optional - do not return an error if any of the
1307                                                                     //        specified processes terminate without having joined. The default
1308                                                                     //        is false
1309 #define PMIX_GROUP_NOTIFY_TERMINATION       "pmix.grp.notterm"      // (bool) notify remaining members when another member terminates without first
1310                                                                     //        leaving the group. The default is false
1311 #define PMIX_GROUP_FT_COLLECTIVE            "pmix.grp.ftcoll"       // (bool) adjust internal tracking for terminated processes. Default is false
1312 #define PMIX_GROUP_MEMBERSHIP               "pmix.grp.mbrs"         // (pmix_data_array_t*) array of group member ID's
1313 #define PMIX_GROUP_ASSIGN_CONTEXT_ID        "pmix.grp.actxid"       // (bool) request that the RM assign a unique numerical (size_t) ID to this group
1314 #define PMIX_GROUP_CONTEXT_ID               "pmix.grp.ctxid"        // (size_t) context ID assigned to group
1315 #define PMIX_GROUP_LOCAL_ONLY               "pmix.grp.lcl"          // (bool) group operation only involves local procs
1316 #define PMIX_GROUP_ENDPT_DATA               "pmix.grp.endpt"        // (pmix_byte_object_t) data collected to be shared during construction
1317 #define PMIX_GROUP_NAMES                    "pmix.pgrp.nm"          // (pmix_data_array_t*) Returns an array of string names of the process groups
1318                                                                     //        in which the given process is a member.
1319 #define PMIX_GROUP_INFO                     "pmix.grp.info"         // (pmix_data_array_t*) Array of pmix_info_t containing data that is to be
1320                                                                     //        shared across all members of a group during group construction. When
1321                                                                     //        passed to the host, the array must start with the process ID
1322                                                                     //        of the proc that provided it
1323 #define PMIX_GROUP_INFO_ARRAY               "pmix.grp.infoarray"    // (pmix_data_array_t*) Array of pmix_info_t, each containing a PMIX_GROUP_INFO array
1324 #define PMIX_GROUP_LOCAL_CID                "pmix.grp.lclid"        // (size_t) local context ID for the specified process member of a group
1325 #define PMIX_GROUP_ADD_MEMBERS              "pmix.grp.add"          // (pmix_data_array_t*) Array of pmix_proc_t identifying procs that are not
1326                                                                     //        included in the membership specified in the procs array passed to
1327                                                                     //        the PMIx_Group_construct[_nb] call, but are to be included in the
1328                                                                     //        final group. See PMIX_GROUP_BOOTSTRAP for description of this operation.
1329 #define PMIX_GROUP_BOOTSTRAP                "pmix.grp.btstrp"       // (size_t) Group construct call will not include all members as individual
1330                                                                     //        participants don't know the entire list. The provided number indicates
1331                                                                     //        the number of procs that will start the construction. Additional
1332                                                                     //        members will be provided via the PMIX_GROUP_ADD_MEMBERS attribute.
1333                                                                     //        Non-bootstrap participants will still call PMIx_Group_construct, but
1334                                                                     //        with a NULL for the procs parameter. This indicates that the caller
1335                                                                     //        wishes to be included via a group invite, and so the library will
1336                                                                     //        handle the necessary event registrations on behalf of the caller.
1337 #define PMIX_GROUP_JOB_INFO                 "pmix.grp.jinfo"        // (pmix_byte_object_t) Job-level info for group construction
1338 #define PMIX_GROUP_FINAL_MEMBERSHIP_ORDER   "pmix.grp.finord"       // (pmix_data_array_t*) Array of pmix_proc_t specifying the order of processes
1339                                                                     //        in the group membership. This can be specified by individual processes
1340                                                                     //        or by namespace (with a wildcard rank). If multiple participants
1341                                                                     //        provide this attribute, then the values must match - i.e., the
1342                                                                     //        desired final membership order must be identical.
1343 
1344 
1345 /* Storage-Related Attributes */
1346 #define PMIX_QUERY_STORAGE_LIST             "pmix.strg.list"       // (char*) return comma-delimited list of identifiers for all available storage systems
1347 #define PMIX_STORAGE_CAPACITY_LIMIT         "pmix.strg.cap"        // (uint64_t) return overall capacity (in Megabytes[base2]) of specified storage system
1348 #define PMIX_STORAGE_OBJECT_LIMIT           "pmix.strg.obj"        // (uint64_t) return overall limit on number of objects (e.g., inodes) of specified storage system
1349 
1350 #define PMIX_STORAGE_ID                     "pmix.strg.id"         // (char*) identifier of the storage system being referenced
1351 #define PMIX_STORAGE_PATH                   "pmix.strg.path"       // (char*) Mount point corresponding to a specified storage ID
1352 #define PMIX_STORAGE_TYPE                   "pmix.strg.type"       // (char*) Qualifier indicating the type of storage being referenced by a query
1353                                                                    //         (e.g., lustre, gpfs, online, fabric-attached, ...)
1354 #define PMIX_STORAGE_ACCESSIBILITY          "pmix.strg.access"     // (pmix_storage_accessibility_t) Accessibility level of the storage system
1355                                                                    //         (e.g., within same node, within same session)
1356 #define PMIX_STORAGE_ACCESS_TYPE            "pmix.strg.atype"      // (pmix_storage_access_type_t) Qualifier describing the type of storage access to return
1357                                                                    //       information for (e.g., for qualifying PMIX_STORAGE_BW_CUR, PMIX_STORAGE_IOPS_CUR,
1358                                                                    //       or PMIX_STORAGE_SUGGESTED_XFER_SIZE attributes)
1359 #define PMIX_STORAGE_BW_CUR                 "pmix.strg.bwcur"      // (double) Observed bandwidth (in bytes/sec) for storage system - provided as a
1360                                                                    //       recently observed bandwidth value, with the exact measurement interval
1361                                                                    //       depending on the storage system and/or PMIx library implementation
1362 #define PMIX_STORAGE_BW_MAX                 "pmix.strg.bwmax"      // (double) Maximum bandwidth (in bytes/sec) for storage system - provided as the
1363                                                                    //       theoretical maximum or the maximum observed bandwidth value
1364 #define PMIX_STORAGE_CAPACITY_USED          "pmix.strg.capuse"     // (double) Overall used capacity (in bytes) for the storage system
1365 #define PMIX_STORAGE_IOPS_CUR               "pmix.strg.iopscur"    // (double) Observed IOPS (in I/O operations per second) for storage system - provided
1366                                                                    //       as a recently observed IOPS value, with the exact measurement interval depending
1367                                                                    //       on the storage system and/or PMIx library implementation
1368 #define PMIX_STORAGE_IOPS_MAX               "pmix.strg.iopsmax"    // (double) Maximum IOPS (in I/O operations per second) for storage system - provided
1369                                                                    //       as the theoretical maximum or the maximum observed IOPS value
1370 #define PMIX_STORAGE_MEDIUM                 "pmix.strg.medium"     // (pmix_storage_medium_t) Types of storage mediums utilized by the storage system
1371                                                                    //       (e.g., SSDs, HDDs, tape)
1372 #define PMIX_STORAGE_MINIMAL_XFER_SIZE      "pmix.strg.minxfer"    // (double) Minimal transfer size (in bytes) for the storage system - this is the
1373                                                                    //       storage system's atomic unit of transfer (e.g., block size)
1374 #define PMIX_STORAGE_OBJECTS_USED           "pmix.strg.objuse"     // (uint64_t) Overall used number of objects (e.g., inodes) for the storage system
1375 #define PMIX_STORAGE_PERSISTENCE            "pmix.strg.persist"    // (pmix_storage_persistence_t) Persistence level of the storage system
1376                                                                    //       (e.g., sratch storage or archive storage)
1377 #define PMIX_STORAGE_SUGGESTED_XFER_SIZE    "pmix.strg.sxfer"      // (double) Suggested transfer size (in bytes) for the storage system
1378 #define PMIX_STORAGE_VERSION                "pmix.strg.ver"        // (char*) Version string for the storage system
1379 
1380 
1381 /* Fabric-related Attributes */
1382 #define PMIX_FABRIC_COST_MATRIX             "pmix.fab.cm"          // (pointer) Pointer to a two-dimensional array of point-to-point relative
1383                                                                    //           communication costs expressed as uint16_t values
1384 #define PMIX_FABRIC_GROUPS                  "pmix.fab.grps"        // (char*) A string delineating the group membership of nodes in the system,
1385                                                                    //         where each fabric group consists of the group number followed by
1386                                                                    //         a colon and a comma-delimited list of nodes in that group, with the
1387                                                                    //         groups delimited by semi-colons (e.g.,
1388                                                                    //         0:node000,node002,node004,node006;1:node001,node003,node005,node007)
1389 #define PMIX_FABRIC_VENDOR                  "pmix.fab.vndr"        // (char*) Name of fabric vendor (e.g., Amazon, Mellanox, HPE, Intel)
1390 #define PMIX_FABRIC_IDENTIFIER              "pmix.fab.id"          // (char*) An identifier for the fabric (e.g., MgmtEthernet, Slingshot-11,
1391                                                                    //         OmniPath-1)
1392 #define PMIX_FABRIC_INDEX                   "pmix.fab.idx"         // (size_t) The index of the fabric as returned in pmix_fabric_t
1393 #define PMIX_FABRIC_COORDINATES             "pmix.fab.coord"       // (pmix_data_array_t*) Array of pmix_geometry_t fabric coordinates for
1394                                                                    //          devices on the specified node. The array will contain the
1395                                                                    //          coordinates of all devices on the node, including values for
1396                                                                    //          all supported coordinate views. The information for devices
1397                                                                    //          on the local node shall be provided if the node is not
1398                                                                    //          specified in the request.
1399 #define PMIX_FABRIC_DEVICE_VENDORID         "pmix.fabdev.vendid"   // (char*) This is a vendor-provided identifier for the device or product.
1400 #define PMIX_FABRIC_NUM_DEVICES             "pmix.fab.nverts"      // (size_t) Total number of fabric devices in the system - corresponds to
1401                                                                    //          the number of rows or columns in the cost matrix
1402 #define PMIX_FABRIC_DIMS                    "pmix.fab.dims"        // (uint32_t) Number of dimensions in the specified fabric plane/view. If no
1403                                                                    //          plane is specified in a request, then the dimensions of all planes
1404                                                                    //          in the overall system will be returned as a pmix_data_array_t
1405                                                                    //          containing an array of uint32_t values. Default is to
1406                                                                    //          provide dimensions in logical view.
1407 
1408 #define PMIX_FABRIC_PLANE                   "pmix.fab.plane"       // (char*) ID string of a fabric plane (e.g., CIDR for Ethernet). When used as
1409                                                                    //          a modifier in a request for information, specifies the plane whose
1410                                                                    //          information is to be returned. When used directly as a key in a
1411                                                                    //          request, returns a pmix_data_array_t of string
1412                                                                    //          identifiers for all fabric planes in the overall system.
1413 
1414 #define PMIX_FABRIC_SWITCH                  "pmix.fab.switch"      // (char*) ID string of a fabric switch. When used as a modifier in a request
1415                                                                    //         for information, specifies the switch whose information is to be
1416                                                                    //         returned. When used directly as a key in a request, returns a
1417                                                                    //         pmix_data_array_t of string identifiers for all fabric switches in
1418                                                                    //         the overall system.
1419 
1420 #define PMIX_FABRIC_ENDPT                   "pmix.fab.endpt"       // (pmix_data_array_t*) Fabric endpoints for a specified process. As multiple
1421                                                                    //         endpoints may be assigned to a given process (e.g., in the case
1422                                                                    //         where multiple devices are associated with a package to which the
1423                                                                    //         process is bound), the returned values will be provided in a
1424                                                                    //         pmix_data_array_t of pmix_endpoint_t elements.
1425 
1426 #define PMIX_FABRIC_SHAPE                   "pmix.fab.shape"       // (pmix_data_array_t*) The size of each dimension in the specified fabric
1427                                                                    //         plane/view, returned in a pmix_data_array_t containing an array of
1428                                                                    //         uint32_t values. The size is defined as the number of elements
1429                                                                    //         present in that dimension - e.g., the number of devices in one
1430                                                                    //         dimension of a physical view of a fabric plane. If no plane is
1431                                                                    //         specified, then the shape of each plane in the overall system will
1432                                                                    //         be returned in a pmix_data_array_t array where each element is
1433                                                                    //         itself a two-element array containing the PMIX_FABRIC_PLANE
1434                                                                    //         followed by that plane's fabric shape. Default is to provide the
1435                                                                    //         shape in logical view.
1436 
1437 #define PMIX_FABRIC_SHAPE_STRING            "pmix.fab.shapestr"    // (char*) Network shape expressed as a string (e.g., "10x12x2"). If no plane
1438                                                                    //         is specified, then the shape of each plane in the overall system
1439                                                                    //         will be returned in a pmix_data_array_t array where
1440                                                                    //         each element is itself a two-element array containing the
1441                                                                    //         PMIX_FABRIC_PLANE followed by that plane's fabric shape string.
1442                                                                    //         Default is to provide the shape in logical view.
1443 
1444 #define PMIX_SWITCH_PEERS                   "pmix.speers"          // (char*) Peer ranks that share the same switch as the process specified in
1445                                                                    //         the call to PMIx_Get. Returns a pmix_data_array_t array of
1446                                                                    //         pmix_info_t results, each element containing the PMIX_SWITCH_PEERS
1447                                                                    //         key with a three-element pmix_data_array_t array of pmix_info_t
1448                                                                    //         containing the PMIX_FABRIC_DEVICE_ID of the local fabric device,
1449                                                                    //         the PMIX_FABRIC_SWITCH identifying the switch to which it is
1450                                                                    //         connected, and a comma-delimited string of peer ranks sharing the
1451                                                                    //         switch to which that device is connected.
1452 #define PMIX_FABRIC_DEVICE                  "pmix.fabdev"          // (pmix_data_array_t*) An array of pmix_info_t describing a particular
1453                                                                    //         fabric device. The first element in the array shall be the
1454                                                                    //         PMIX_FABRIC_DEVICE_ID of the device
1455 #define PMIX_FABRIC_DEVICES                 "pmix.fab.devs"        // (pmix_data_array_t*) Array of pmix_info_t containing information for all
1456                                                                    //         devices on the specified node. Each element of the array will contain
1457                                                                    //         a PMIX_FABRIC_DEVICE entry, which in turn will contain an array of
1458                                                                    //         information on a given device.
1459 #define PMIX_FABRIC_DEVICE_NAME             "pmix.fabdev.nm"       // (char*) The operating system name associated with the device. This may be
1460                                                                    //         a logical fabric interface name (e.g. eth0 or eno1) or an absolute
1461                                                                    //         filename.
1462 #define PMIX_FABRIC_DEVICE_INDEX            "pmix.fabdev.idx"      // (uint32_t) Index of the device within an associated communication cost
1463                                                                    //         matrix.
1464 
1465 #define PMIX_FABRIC_DEVICE_VENDOR           "pmix.fabdev.vndr"     // (char*) Indicates the name of the vendor that distributes the NIC.
1466 #define PMIX_FABRIC_DEVICE_BUS_TYPE         "pmix.fabdev.btyp"     // (char*) The type of bus to which the device is attached (e.g., "PCI",
1467                                                                    //         "GEN-Z").
1468 #define PMIX_FABRIC_DEVICE_DRIVER           "pmix.fabdev.driver"   // (char*) The name of the driver associated with the device
1469 #define PMIX_FABRIC_DEVICE_FIRMWARE         "pmix.fabdev.fmwr"     // (char*) The device's firmware version
1470 #define PMIX_FABRIC_DEVICE_ADDRESS          "pmix.fabdev.addr"     // (char*) The primary link-level address associated with the device, such as a
1471                                                                    //         MAC address. If multiple addresses are available, only one will be
1472                                                                    //         reported.
1473 #define PMIX_FABRIC_DEVICE_COORDINATES      "pmix.fab.coord"       // (pmix_geometry_t) The pmix_geometry_t fabric coordinates for the device, including
1474                                                                    //          values for all supported coordinate views.
1475 #define PMIX_FABRIC_DEVICE_MTU              "pmix.fabdev.mtu"      // (size_t) The maximum transfer unit of link level frames or packets,
1476                                                                    //          in bytes.
1477 #define PMIX_FABRIC_DEVICE_SPEED            "pmix.fabdev.speed"    // (size_t) The active link data rate, given in bits per second.
1478 #define PMIX_FABRIC_DEVICE_STATE            "pmix.fabdev.state"    // (pmix_link_state_t) The last available physical port state. Possible values
1479                                                                    //          are PMIX_LINK_STATE_UNKNOWN, PMIX_LINK_DOWN, and PMIX_LINK_UP, to
1480                                                                    //          indicate if the port state is unknown or not applicable (unknown),
1481                                                                    //          inactive (down), or active (up).
1482 #define PMIX_FABRIC_DEVICE_TYPE             "pmix.fabdev.type"     // (char*) Specifies the type of fabric interface currently active on the
1483                                                                    //         device, such as Ethernet or InfiniBand.
1484 #define PMIX_FABRIC_DEVICE_PCI_DEVID        "pmix.fabdev.pcidevid" // (char*) A node-level unique identifier for a PCI device. Provided only if the
1485                                                                    //         device is located on a \ac{PCI} bus. The identifier is constructed as
1486                                                                    //         a four-part tuple delimited by colons comprised of the \ac{PCI} 16-bit
1487                                                                    //         domain, 8-bit bus, 8-bit device, and 8-bit function IDs, each expressed
1488                                                                    //         in zero-extended hexadecimal form. Thus, an example identifier might be
1489                                                                    //         "abc1:0f:23:01". The combination of node identifier PMIX_HOSTNAME or
1490                                                                    //         PMIX_NODEID and PMIX_FABRIC_DEVICE_PCI_DEVID shall be unique within the
1491                                                                    //         system.
1492 
1493 
1494 /* Distance Attributes */
1495 #define PMIX_DEVICE_DISTANCES               "pmix.dev.dist"        // (pmix_data_array_t*) Return an array of pmix_device_distance_t containing the
1496                                                                    //         minimum and maximum distances of the given process location to all
1497                                                                    //         devices of the specified type on the local node.
1498 #define PMIX_DEVICE_TYPE                    "pmix.dev.type"        // (pmix_device_type_t) Bitmask specifying the type(s) of device(s) whose
1499                                                                    //         information is being requested. Only used as a directive/qualifier.
1500 #define PMIX_DEVICE_ID                      "pmix.dev.id"          // (char*) System-wide UUID or node-local OS name of a particular device.
1501 
1502 
1503 /* Descriptive Attributes */
1504 #define PMIX_MAX_VALUE                      "pmix.descr.maxval"    // (varies) Used in pmix_regattr_t to describe the maximum valid value
1505                                                                    //          for the associated attribute.
1506 #define PMIX_MIN_VALUE                      "pmix.descr.minval"    // (varies) Used in pmix_regattr_t to describe the minimum valid value
1507                                                                    //          for the associated attribute.
1508 #define PMIX_ENUM_VALUE                     "pmix.descr.enum"      // (char*) Used in pmix_regattr_t to describe accepted values for the
1509                                                                    //         associated attribute. Numerical values shall be presented in
1510                                                                    //         a form convertible to the attribute's declared data type.
1511                                                                    //         Named values (i.e., values defined by constant names via a
1512                                                                    //         typical C-language enum declaration) must be provided as
1513                                                                    //         their numerical equivalent.
1514 #define PMIX_QUERY_STABLE_ABI_VERSION       "pmix.qry.stabiver"    // (char*) The PMIx Standard Stable ABI version supported returned in the form of a comma separated list of "MAJOR.MINOR"
1515                                                                    //         This attribute can be used with PMIx_Query_info outside of the init/finalize region.
1516 #define PMIX_QUERY_PROVISIONAL_ABI_VERSION  "pmix.qry.prabiver"    // (char*) The PMIx Standard Provisional ABI version supported returned in the form of a comma separated "MAJOR.MINOR"
1517                                                                    //         This attribute can be used with PMIx_Query_info outside of the init/finalize region.
1518 
1519 #define PMIX_VERSION_NUMERIC                "pmix.vers.num"        // (uint32_t) Numeric representation of the version of the PMIx library
1520                                                                    //            being used
1521 
1522 
1523 /****    PROCESS STATE DEFINITIONS    ****/
1524 typedef uint8_t pmix_proc_state_t;
1525 #define PMIX_PROC_STATE_UNDEF                    0  /* undefined process state */
1526 #define PMIX_PROC_STATE_PREPPED                  1  /* process is ready to be launched */
1527 #define PMIX_PROC_STATE_LAUNCH_UNDERWAY          2  /* launch process underway */
1528 #define PMIX_PROC_STATE_RESTART                  3  /* the proc is ready for restart */
1529 #define PMIX_PROC_STATE_TERMINATE                4  /* process is marked for termination */
1530 #define PMIX_PROC_STATE_RUNNING                  5  /* daemon has locally fork'd process */
1531 #define PMIX_PROC_STATE_CONNECTED                6  /* proc connected to PMIx server */
1532 /*
1533 * Define a "boundary" so users can easily and quickly determine
1534 * if a proc is still running or not - any value less than
1535 * this one means that the proc has not terminated
1536 */
1537 #define PMIX_PROC_STATE_UNTERMINATED            15
1538 
1539 #define PMIX_PROC_STATE_TERMINATED              20  /* process has terminated and is no longer running */
1540 /* Define a boundary so users can easily and quickly determine
1541 * if a proc abnormally terminated - leave a little room
1542 * for future expansion
1543 */
1544 #define PMIX_PROC_STATE_ERROR                   50
1545 /* Define specific error code values */
1546 #define PMIX_PROC_STATE_KILLED_BY_CMD           (PMIX_PROC_STATE_ERROR +  1)  /* process was killed by cmd */
1547 #define PMIX_PROC_STATE_ABORTED                 (PMIX_PROC_STATE_ERROR +  2)  /* process aborted */
1548 #define PMIX_PROC_STATE_FAILED_TO_START         (PMIX_PROC_STATE_ERROR +  3)  /* process failed to start */
1549 #define PMIX_PROC_STATE_ABORTED_BY_SIG          (PMIX_PROC_STATE_ERROR +  4)  /* process aborted by signal */
1550 #define PMIX_PROC_STATE_TERM_WO_SYNC            (PMIX_PROC_STATE_ERROR +  5)  /* process exit'd w/o calling PMIx_Finalize */
1551 #define PMIX_PROC_STATE_COMM_FAILED             (PMIX_PROC_STATE_ERROR +  6)  /* process communication has failed */
1552 #define PMIX_PROC_STATE_SENSOR_BOUND_EXCEEDED   (PMIX_PROC_STATE_ERROR +  7)  /* process exceeded a sensor limit */
1553 #define PMIX_PROC_STATE_CALLED_ABORT            (PMIX_PROC_STATE_ERROR +  8)  /* process called "PMIx_Abort" */
1554 #define PMIX_PROC_STATE_HEARTBEAT_FAILED        (PMIX_PROC_STATE_ERROR +  9)  /* process failed to send heartbeat w/in time limit */
1555 #define PMIX_PROC_STATE_MIGRATING               (PMIX_PROC_STATE_ERROR + 10)  /* process failed and is waiting for resources before restarting */
1556 #define PMIX_PROC_STATE_CANNOT_RESTART          (PMIX_PROC_STATE_ERROR + 11)  /* process failed and cannot be restarted */
1557 #define PMIX_PROC_STATE_TERM_NON_ZERO           (PMIX_PROC_STATE_ERROR + 12)  /* process exited with a non-zero status, indicating abnormal */
1558 #define PMIX_PROC_STATE_FAILED_TO_LAUNCH        (PMIX_PROC_STATE_ERROR + 13)  /* unable to launch process */
1559 
1560 
1561 /****    JOB STATE DEFINITIONS    ****/
1562 typedef uint8_t pmix_job_state_t;
1563 #define PMIX_JOB_STATE_UNDEF                     0  // undefined process state
1564 #define PMIX_JOB_STATE_AWAITING_ALLOC            1  // Job is waiting for resources to be allocated to it
1565 #define PMIX_JOB_STATE_LAUNCH_UNDERWAY           2  // job launch underway
1566 #define PMIX_JOB_STATE_RUNNING                   3  // all procs have been spawned
1567 #define PMIX_JOB_STATE_SUSPENDED                 4  // job has been suspended
1568 #define PMIX_JOB_STATE_CONNECTED                 5  // all procs have connected to their PMIx server
1569 
1570 /*
1571 * Define a "boundary" so users can easily and quickly determine
1572 * if a job is still running or not - any value less than
1573 * this one means that the job has not terminated
1574 */
1575 #define PMIX_JOB_STATE_UNTERMINATED             15
1576 
1577 #define PMIX_JOB_STATE_TERMINATED               20  // job has terminated and is no longer running - typically will
1578                                                     // be accompanied by the job exit status in response to a query
1579 
1580 /* Define a boundary so users can easily and quickly determine
1581 * if a job abnormally terminated - leave a little room
1582 * for future expansion
1583 */
1584 #define PMIX_JOB_STATE_TERMINATED_WITH_ERROR    50  // job has terminated and is no longer running - typically will
1585                                                     // be accompanied by a job-related error code in response to a query
1586 
1587 
1588 /****    PMIX ERROR CONSTANTS    ****/
1589 /* PMIx errors are always negative, with 0 reserved for success */
1590 typedef int pmix_status_t;
1591 
1592 /* v1.x error values - must be fixed in place for backward
1593  * compatibility. Note that some number of these have been
1594  * deprecated and may not be returned by v2.x and above
1595  * clients or servers. However, they must always be
1596  * at least defined to ensure older codes will compile */
1597 #define PMIX_SUCCESS                                 0
1598 #define PMIX_ERROR                                  -1          // general error
1599 /* fault tolerance */
1600 #define PMIX_ERR_PROC_RESTART                       -4
1601 #define PMIX_ERR_PROC_CHECKPOINT                    -5
1602 #define PMIX_ERR_PROC_MIGRATE                       -6
1603 #define PMIX_ERR_EXISTS                             -11
1604 /* communication failures */
1605 #define PMIX_ERR_INVALID_CRED                       -12
1606 #define PMIX_ERR_WOULD_BLOCK                        -15
1607 #define PMIX_ERR_UNKNOWN_DATA_TYPE                  -16
1608 #define PMIX_ERR_TYPE_MISMATCH                      -18
1609 #define PMIX_ERR_UNPACK_INADEQUATE_SPACE            -19
1610 #define PMIX_ERR_UNPACK_FAILURE                     -20
1611 #define PMIX_ERR_PACK_FAILURE                       -21
1612 #define PMIX_ERR_NO_PERMISSIONS                     -23
1613 #define PMIX_ERR_TIMEOUT                            -24
1614 #define PMIX_ERR_UNREACH                            -25
1615 #define PMIX_ERR_BAD_PARAM                          -27
1616 #define PMIX_ERR_RESOURCE_BUSY                      -28
1617 #define PMIX_ERR_OUT_OF_RESOURCE                    -29
1618 #define PMIX_ERR_INIT                               -31
1619 #define PMIX_ERR_NOMEM                              -32
1620 #define PMIX_ERR_NOT_FOUND                          -46
1621 #define PMIX_ERR_NOT_SUPPORTED                      -47
1622 #define PMIX_ERR_PARAM_VALUE_NOT_SUPPORTED          -59
1623 #define PMIX_ERR_COMM_FAILURE                       -49
1624 #define PMIX_ERR_UNPACK_READ_PAST_END_OF_BUFFER     -50
1625 #define PMIX_ERR_CONFLICTING_CLEANUP_DIRECTIVES     -51
1626 #define PMIX_ERR_PARTIAL_SUCCESS                    -52
1627 #define PMIX_ERR_DUPLICATE_KEY                      -53
1628 #define PMIX_ERR_EMPTY                              -60
1629 #define PMIX_ERR_LOST_CONNECTION                    -61
1630 #define PMIX_ERR_EXISTS_OUTSIDE_SCOPE               -62
1631 #define PMIX_ERR_NOT_AVAILABLE                      -64
1632 
1633 /* Process set */
1634 #define PMIX_PROCESS_SET_DEFINE                     -55
1635 #define PMIX_PROCESS_SET_DELETE                     -56
1636 
1637 /* Debugger ops */
1638 #define PMIX_DEBUGGER_RELEASE                       -3      // replaced deprecated PMIX_ERR_DEBUGGER_RELEASE
1639 #define PMIX_READY_FOR_DEBUG                        -58     // accompanied by PMIX_BREAKPOINT indicating where proc is waiting
1640 
1641 /* query errors */
1642 #define PMIX_QUERY_PARTIAL_SUCCESS                  -104
1643 
1644 /* job control */
1645 #define PMIX_JCTRL_CHECKPOINT                       -106    // monitored by client to trigger checkpoint operation
1646 #define PMIX_JCTRL_CHECKPOINT_COMPLETE              -107    // sent by client and monitored by server to notify that requested
1647                                                             //     checkpoint operation has completed
1648 #define PMIX_JCTRL_PREEMPT_ALERT                    -108    // monitored by client to detect RM intends to preempt
1649 
1650 /* monitoring */
1651 #define PMIX_MONITOR_HEARTBEAT_ALERT                -109
1652 #define PMIX_MONITOR_FILE_ALERT                     -110
1653 #define PMIX_PROC_TERMINATED                        -111
1654 #define PMIX_MONITOR_RESUSAGE_UPDATE                -114
1655 
1656 /* operational */
1657 #define PMIX_ERR_EVENT_REGISTRATION                 -144
1658 #define PMIX_MODEL_DECLARED                         -147
1659 #define PMIX_MODEL_RESOURCES                        -151     // model resource usage has changed
1660 #define PMIX_OPENMP_PARALLEL_ENTERED                -152     // an OpenMP parallel region has been entered
1661 #define PMIX_OPENMP_PARALLEL_EXITED                 -153     // an OpenMP parallel region has completed
1662 #define PMIX_LAUNCHER_READY                         -155
1663 #define PMIX_OPERATION_IN_PROGRESS                  -156
1664 #define PMIX_OPERATION_SUCCEEDED                    -157
1665 #define PMIX_ERR_INVALID_OPERATION                  -158
1666 #define PMIX_GROUP_INVITED                          -159
1667 #define PMIX_GROUP_LEFT                             -160
1668 #define PMIX_GROUP_INVITE_ACCEPTED                  -161
1669 #define PMIX_GROUP_INVITE_DECLINED                  -162
1670 #define PMIX_GROUP_INVITE_FAILED                    -163
1671 #define PMIX_GROUP_MEMBERSHIP_UPDATE                -164
1672 #define PMIX_GROUP_CONSTRUCT_ABORT                  -165
1673 #define PMIX_GROUP_CONSTRUCT_COMPLETE               -166
1674 #define PMIX_GROUP_LEADER_SELECTED                  -167
1675 #define PMIX_GROUP_LEADER_FAILED                    -168
1676 #define PMIX_GROUP_CONTEXT_ID_ASSIGNED              -169
1677 #define PMIX_GROUP_MEMBER_FAILED                    -170
1678 #define PMIX_ERR_REPEAT_ATTR_REGISTRATION           -171
1679 #define PMIX_ERR_IOF_FAILURE                        -172
1680 #define PMIX_ERR_IOF_COMPLETE                       -173
1681 #define PMIX_LAUNCH_COMPLETE                        -174     // include nspace of the launched job with notification
1682 #define PMIX_FABRIC_UPDATED                         -175
1683 #define PMIX_FABRIC_UPDATE_PENDING                  -176
1684 #define PMIX_FABRIC_UPDATE_ENDPOINTS                -113
1685 
1686 /* job-related errors */
1687 #define PMIX_ERR_JOB_APP_NOT_EXECUTABLE             -177
1688 #define PMIX_ERR_JOB_NO_EXE_SPECIFIED               -178
1689 #define PMIX_ERR_JOB_FAILED_TO_MAP                  -179
1690 #define PMIX_ERR_JOB_CANCELED                       -180
1691 #define PMIX_ERR_JOB_FAILED_TO_LAUNCH               -181
1692 #define PMIX_ERR_JOB_ABORTED                        -182
1693 #define PMIX_ERR_JOB_KILLED_BY_CMD                  -183
1694 #define PMIX_ERR_JOB_ABORTED_BY_SIG                 -184
1695 #define PMIX_ERR_JOB_TERM_WO_SYNC                   -185
1696 #define PMIX_ERR_JOB_SENSOR_BOUND_EXCEEDED          -186
1697 #define PMIX_ERR_JOB_NON_ZERO_TERM                  -187
1698 #define PMIX_ERR_JOB_ALLOC_FAILED                   -188
1699 #define PMIX_ERR_JOB_ABORTED_BY_SYS_EVENT           -189
1700 #define PMIX_ERR_JOB_EXE_NOT_FOUND                  -190
1701 #define PMIX_ERR_JOB_WDIR_NOT_FOUND                 -233
1702 #define PMIX_ERR_JOB_INSUFFICIENT_RESOURCES         -234
1703 #define PMIX_ERR_JOB_SYS_OP_FAILED                  -235
1704 
1705 /* job/session-related non-error events */
1706 #define PMIX_EVENT_JOB_START                        -191
1707 #define PMIX_EVENT_JOB_END                          -145
1708 #define PMIX_EVENT_SESSION_START                    -192
1709 #define PMIX_EVENT_SESSION_END                      -193
1710 
1711 /* process-related events */
1712 #define PMIX_ERR_PROC_REQUESTED_ABORT               -8
1713 #define PMIX_ERR_PROC_TERM_WO_SYNC                  -200
1714 #define PMIX_EVENT_PROC_TERMINATED                  -201
1715 #define PMIX_ERR_PROC_KILLED_BY_CMD                 -400
1716 #define PMIX_ERR_PROC_FAILED_TO_START               -401
1717 #define PMIX_ERR_PROC_ABORTED_BY_SIG                -402
1718 #define PMIX_ERR_PROC_SENSOR_BOUND_EXCEEDED         -403
1719 #define PMIX_ERR_EXIT_NONZERO_TERM                  -404
1720 
1721 /* system failures */
1722 #define PMIX_EVENT_SYS_BASE                         -230
1723 #define PMIX_EVENT_NODE_DOWN                        -231
1724 #define PMIX_EVENT_NODE_OFFLINE                     -232
1725 #define PMIX_EVENT_SYS_OTHER                        -330
1726 
1727 
1728 /* define a macro for identifying system event values */
1729 #define PMIX_SYSTEM_EVENT(a)   \
1730     ((a) <= PMIX_EVENT_SYS_BASE && PMIX_EVENT_SYS_OTHER <= (a))
1731 
1732 /* used by event handlers */
1733 #define PMIX_EVENT_NO_ACTION_TAKEN                  -331
1734 #define PMIX_EVENT_PARTIAL_ACTION_TAKEN             -332
1735 #define PMIX_EVENT_ACTION_DEFERRED                  -333
1736 #define PMIX_EVENT_ACTION_COMPLETE                  -334
1737 
1738 /* conversion errors */
1739 #define PMIX_ERR_LOST_PRECISION                     -400
1740 #define PMIX_ERR_CHANGE_SIGN                        -401
1741 
1742 /* define a starting point for user-level defined error
1743  * constants - negative values larger than this are guaranteed
1744  * not to conflict with PMIx values. Definitions should always
1745  * be based on the PMIX_EXTERNAL_ERR_BASE constant and -not- a
1746  * specific value as the value of the constant may change */
1747 #define PMIX_EXTERNAL_ERR_BASE                      -3000
1748 
1749 /* define the results values for comparisons */
1750 typedef enum {
1751     PMIX_EQUAL,
1752     PMIX_VALUE1_GREATER,
1753     PMIX_VALUE2_GREATER,
1754     PMIX_VALUE_TYPE_DIFFERENT,
1755     PMIX_VALUE_INCOMPATIBLE_OBJECTS,
1756     PMIX_VALUE_COMPARISON_NOT_AVAIL
1757 } pmix_value_cmp_t;
1758 
1759 /****    PMIX DATA TYPES    ****/
1760 typedef uint16_t pmix_data_type_t;
1761 #define PMIX_UNDEF                       0
1762 #define PMIX_BOOL                        1  // converted to/from native true/false to uint8 for pack/unpack
1763 #define PMIX_BYTE                        2  // a byte of data
1764 #define PMIX_STRING                      3  // NULL-terminated string
1765 #define PMIX_SIZE                        4  // size_t
1766 #define PMIX_PID                         5  // OS-pid
1767 #define PMIX_INT                         6
1768 #define PMIX_INT8                        7
1769 #define PMIX_INT16                       8
1770 #define PMIX_INT32                       9
1771 #define PMIX_INT64                      10
1772 #define PMIX_UINT                       11
1773 #define PMIX_UINT8                      12
1774 #define PMIX_UINT16                     13
1775 #define PMIX_UINT32                     14
1776 #define PMIX_UINT64                     15
1777 #define PMIX_FLOAT                      16
1778 #define PMIX_DOUBLE                     17
1779 #define PMIX_TIMEVAL                    18
1780 #define PMIX_TIME                       19
1781 #define PMIX_STATUS                     20  // needs to be tracked separately from integer for those times
1782                                             // when we are embedded and it needs to be converted to the
1783                                             // host error definitions
1784 #define PMIX_VALUE                      21
1785 #define PMIX_PROC                       22
1786 #define PMIX_APP                        23
1787 #define PMIX_INFO                       24
1788 #define PMIX_PDATA                      25
1789 // Hole left by deprecation/removal of PMIX_BUFFER
1790 #define PMIX_BYTE_OBJECT                27
1791 #define PMIX_KVAL                       28
1792 // Hole left by deprecation/removal of PMIX_MODEX
1793 #define PMIX_PERSIST                    30
1794 #define PMIX_POINTER                    31
1795 #define PMIX_SCOPE                      32
1796 #define PMIX_DATA_RANGE                 33
1797 #define PMIX_COMMAND                    34
1798 #define PMIX_INFO_DIRECTIVES            35
1799 #define PMIX_DATA_TYPE                  36
1800 #define PMIX_PROC_STATE                 37
1801 #define PMIX_PROC_INFO                  38
1802 #define PMIX_DATA_ARRAY                 39
1803 #define PMIX_PROC_RANK                  40
1804 #define PMIX_QUERY                      41
1805 #define PMIX_COMPRESSED_STRING          42  // string compressed with zlib
1806 #define PMIX_ALLOC_DIRECTIVE            43
1807 // Hole left by deprecation/removal of PMIX_INFO_ARRAY
1808 #define PMIX_IOF_CHANNEL                45
1809 #define PMIX_ENVAR                      46
1810 #define PMIX_COORD                      47
1811 #define PMIX_REGATTR                    48
1812 #define PMIX_REGEX                      49
1813 #define PMIX_JOB_STATE                  50
1814 #define PMIX_LINK_STATE                 51
1815 #define PMIX_PROC_CPUSET                52
1816 #define PMIX_GEOMETRY                   53
1817 #define PMIX_DEVICE_DIST                54
1818 #define PMIX_ENDPOINT                   55
1819 #define PMIX_TOPO                       56
1820 #define PMIX_DEVTYPE                    57
1821 #define PMIX_LOCTYPE                    58
1822 #define PMIX_COMPRESSED_BYTE_OBJECT     59
1823 #define PMIX_PROC_NSPACE                60
1824 #define PMIX_DATA_BUFFER                65
1825 #define PMIX_STOR_MEDIUM                66
1826 #define PMIX_STOR_ACCESS                67
1827 #define PMIX_STOR_PERSIST               68
1828 #define PMIX_STOR_ACCESS_TYPE           69
1829 #define PMIX_DEVICE                     70
1830 #define PMIX_RESBLOCK_DIRECTIVE         71
1831 #define PMIX_RESOURCE_UNIT              72
1832 #define PMIX_NODE_PID                   73
1833 /********************/
1834 
1835 /* define a boundary for implementers so they can add their own data types */
1836 #define PMIX_DATA_TYPE_MAX     500
1837 
1838 
1839 /* define a scope for data "put" by PMIx per the following:
1840  *
1841  * PMI_LOCAL - the data is intended only for other application
1842  *             processes on the same node. Data marked in this way
1843  *             will not be included in data packages sent to remote requestors
1844  * PMI_REMOTE - the data is intended solely for applications processes on
1845  *              remote nodes. Data marked in this way will not be shared with
1846  *              other processes on the same node
1847  * PMI_GLOBAL - the data is to be shared with all other requesting processes,
1848  *              regardless of location
1849  */
1850 typedef uint8_t pmix_scope_t;
1851 #define PMIX_SCOPE_UNDEF    0
1852 #define PMIX_LOCAL          1   // share to procs also on this node
1853 #define PMIX_REMOTE         2   // share with procs not on this node
1854 #define PMIX_GLOBAL         3   // share with all procs (local + remote)
1855 #define PMIX_INTERNAL       4   // store data in the internal tables
1856 
1857 /* define a range for data "published" by PMIx
1858  */
1859 typedef uint8_t pmix_data_range_t;
1860 #define PMIX_RANGE_UNDEF        0
1861 #define PMIX_RANGE_RM           1   // data is intended for the host resource manager
1862 #define PMIX_RANGE_LOCAL        2   // available on local node only
1863 #define PMIX_RANGE_NAMESPACE    3   // data is available to procs in the same nspace only
1864 #define PMIX_RANGE_SESSION      4   // data available to all procs in session
1865 #define PMIX_RANGE_GLOBAL       5   // data available to all procs
1866 #define PMIX_RANGE_CUSTOM       6   // range is specified in a pmix_info_t
1867 #define PMIX_RANGE_PROC_LOCAL   7   // restrict range to the local proc
1868 #define PMIX_RANGE_INVALID   UINT8_MAX
1869 
1870 /* define a "persistence" policy for data published by clients */
1871 typedef uint8_t pmix_persistence_t;
1872 #define PMIX_PERSIST_INDEF          0   // retain until specifically deleted
1873 #define PMIX_PERSIST_FIRST_READ     1   // delete upon first access
1874 #define PMIX_PERSIST_PROC           2   // retain until publishing process terminates
1875 #define PMIX_PERSIST_APP            3   // retain until application terminates
1876 #define PMIX_PERSIST_SESSION        4   // retain until session/allocation terminates
1877 #define PMIX_PERSIST_INVALID   UINT8_MAX
1878 
1879 /* define a set of bit-mask flags for specifying behavior of
1880  * command directives via pmix_info_t arrays */
1881 typedef uint32_t pmix_info_directives_t;
1882 #define PMIX_INFO_REQD              0x00000001
1883 #define PMIX_INFO_ARRAY_END         0x00000002      // mark the end of an array created by PMIX_INFO_CREATE
1884 #define PMIX_INFO_REQD_PROCESSED    0x00000004      // reqd attribute has been processed
1885 #define PMIX_INFO_QUALIFIER         0x00000008      // info is a qualifier to the primary value
1886 #define PMIX_INFO_PERSISTENT        0x00000010      // do not release included value
1887 /* the top 16-bits are reserved for internal use by
1888  * implementers - these may be changed inside the
1889  * PMIx library */
1890 #define PMIX_INFO_DIR_RESERVED 0xffff0000
1891 
1892 /* define a set of directives for allocation requests */
1893 typedef uint8_t pmix_alloc_directive_t;
1894 #define PMIX_ALLOC_NEW          1   // new allocation is being requested. The resulting allocation will be
1895                                     // disjoint (i.e., not connected in a job sense) from the requesting allocation
1896 #define PMIX_ALLOC_EXTEND       2   // extend the existing allocation, either in time or as additional resources
1897 #define PMIX_ALLOC_RELEASE      3   // release part or all of the existing allocation. Attributes in the accompanying
1898                                     // pmix\_info\_t array may be used to specify "lending" of those resources
1899                                     // for some period of time.
1900 #define PMIX_ALLOC_REAQUIRE     4   // reacquire resources that were previously "lent" back to the scheduler
1901 #define PMIX_ALLOC_REQ_CANCEL   5   // Cancel the indicated allocation request
1902 
1903 /* define a value boundary beyond which implementers are free
1904  * to define their own directive values */
1905 #define PMIX_ALLOC_EXTERNAL     128
1906 
1907 /* define a set of directives for resource block requests */
1908 typedef uint8_t pmix_resource_block_directive_t;
1909 #define PMIX_RESOURCE_BLOCK_DEFINE  1   // define a new resource block
1910 #define PMIX_RESOURCE_BLOCK_EXTEND  2   // extend an existing block definition by adding the specified resources
1911                                         // to the block
1912 #define PMIX_RESOURCE_BLOCK_REMOVE  3   // remove the specified resources from the block definition
1913 #define PMIX_RESOURCE_BLOCK_DELETE  4   // delete the resource block definition
1914 
1915 /* define a value boundary beyond which implementers are free
1916  * to define their own directive values */
1917 #define PMIX_RESOURCE_BLOCK_EXTERNAL     128
1918 
1919 
1920 /* define a set of bit-mask flags for specifying IO
1921  * forwarding channels. These can be OR'd together
1922  * to reference multiple channels */
1923 typedef uint16_t pmix_iof_channel_t;
1924 #define PMIX_FWD_NO_CHANNELS        0x0000
1925 #define PMIX_FWD_STDIN_CHANNEL      0x0001
1926 #define PMIX_FWD_STDOUT_CHANNEL     0x0002
1927 #define PMIX_FWD_STDERR_CHANNEL     0x0004
1928 #define PMIX_FWD_STDDIAG_CHANNEL    0x0008
1929 #define PMIX_FWD_ALL_CHANNELS       0x00ff
1930 
1931 /* define values associated with PMIx_Group_join
1932  * to indicate accept and decline - this is
1933  * done for readability of user code */
1934 typedef enum {
1935     PMIX_GROUP_DECLINE,
1936     PMIX_GROUP_ACCEPT
1937 } pmix_group_opt_t;
1938 
1939 typedef enum {
1940     PMIX_GROUP_CONSTRUCT,
1941     PMIX_GROUP_DESTRUCT,
1942     PMIX_GROUP_NONE
1943 } pmix_group_operation_t;
1944 
1945 /* define storage medium values
1946  * The pmix_storage_medium_t is a uint64_t type that defines
1947  * a set of bit-mask flags for specifying different types of
1948  * storage mediums. These can be bitwise OR'd together to
1949  * accommodate storage systems that mix storage medium types. */
1950 typedef uint64_t pmix_storage_medium_t;
1951 #define PMIX_STORAGE_MEDIUM_UNKNOWN     0x0000000000000001
1952 #define PMIX_STORAGE_MEDIUM_TAPE        0x0000000000000002
1953 #define PMIX_STORAGE_MEDIUM_HDD         0x0000000000000004
1954 #define PMIX_STORAGE_MEDIUM_SSD         0x0000000000000008
1955 #define PMIX_STORAGE_MEDIUM_NVME        0x0000000000000010
1956 #define PMIX_STORAGE_MEDIUM_PMEM        0x0000000000000020
1957 #define PMIX_STORAGE_MEDIUM_RAM         0x0000000000000040
1958 
1959 /* define storage accessibility values
1960  * The pmix_storage_accessibility_t is a uint64_t type that
1961  * defines a set of bit-mask flags for specifying different
1962  * levels of storage accessibility (i.e,. from where a storage
1963  * system may be accessed). These can be bitwise OR'd together
1964  * to accommodate storage systems that are accessibile in
1965  * multiple ways. */
1966 typedef uint64_t pmix_storage_accessibility_t;
1967 #define PMIX_STORAGE_ACCESSIBILITY_NODE     0x0000000000000001
1968 #define PMIX_STORAGE_ACCESSIBILITY_SESSION  0x0000000000000002
1969 #define PMIX_STORAGE_ACCESSIBILITY_JOB      0x0000000000000004
1970 #define PMIX_STORAGE_ACCESSIBILITY_RACK     0x0000000000000008
1971 #define PMIX_STORAGE_ACCESSIBILITY_CLUSTER  0x0000000000000010
1972 #define PMIX_STORAGE_ACCESSIBILITY_REMOTE   0x0000000000000020
1973 
1974 /* define storage persistence values
1975  * The pmix_storage_persistence_t is a uint64_t type that defines
1976  * a set of bit-mask flags for specifying different levels of
1977  * persistence for a particular storage system. */
1978 typedef uint64_t pmix_storage_persistence_t;
1979 #define PMIX_STORAGE_PERSISTENCE_TEMPORARY  0x0000000000000001
1980 #define PMIX_STORAGE_PERSISTENCE_NODE       0x0000000000000002
1981 #define PMIX_STORAGE_PERSISTENCE_SESSION    0x0000000000000004
1982 #define PMIX_STORAGE_PERSISTENCE_JOB        0x0000000000000008
1983 #define PMIX_STORAGE_PERSISTENCE_SCRATCH    0x0000000000000010
1984 #define PMIX_STORAGE_PERSISTENCE_PROJECT    0x0000000000000020
1985 #define PMIX_STORAGE_PERSISTENCE_ARCHIVE    0x0000000000000040
1986 
1987 /* define storage access values
1988  * The pmix_storage_access_type_t is a uint16_t type that defines
1989  * a set of bit-mask flags for specifying different storage system
1990  * access types. */
1991 typedef uint16_t pmix_storage_access_type_t;
1992 #define PMIX_STORAGE_ACCESS_RD      0x0001
1993 #define PMIX_STORAGE_ACCESS_WR      0x0002
1994 #define PMIX_STORAGE_ACCESS_RDWR    0x0003
1995 
1996 
1997 /* define some "hooks" external libraries can use to
1998  * intercept memory allocation/release operations */
1999 static inline void* pmix_malloc(size_t n)
2000 {
2001     return malloc(n);
2002 }
2003 
2004 static inline void pmix_free(void *m)
2005 {
2006     free(m);
2007 }
2008 
2009 static inline void* pmix_calloc(size_t n, size_t m)
2010 {
2011     return calloc(n, m);
2012 }
2013 
2014 
2015 /**
2016  * Provide a safe version of strncpy that doesn't generate
2017  * a ton of spurious warnings. Note that not every environment
2018  * provides nice string functions, and we aren't concerned about
2019  * max performance here
2020  *
2021  * @param dest Destination string.
2022  * @param src Source string.
2023  * @param len Size of the dest array - 1
2024  *
2025  */
2026 static inline void pmix_strncpy(char *dest,
2027                                 const char *src,
2028                                 size_t len)
2029 {
2030     size_t i;
2031 
2032     /* use an algorithm that also protects against
2033      * non-NULL-terminated src strings */
2034     for (i=0; i < len; ++i, ++src, ++dest) {
2035         *dest = *src;
2036         if ('\0' == *src) {
2037             break;
2038         }
2039     }
2040     *dest = '\0';
2041 }
2042 
2043 static inline size_t pmix_keylen(const char *src)
2044 {
2045     size_t i, maxlen;
2046 
2047     if (NULL == src) {
2048         return 0;
2049     }
2050     maxlen = PMIX_MAX_KEYLEN + 1;
2051     /* use an algorithm that also protects against
2052      * non-NULL-terminated src strings */
2053     for (i=0; i < maxlen; ++i, ++src) {
2054         if ('\0' == *src) {
2055             break;
2056         }
2057     }
2058     return i;
2059 }
2060 
2061 static inline size_t pmix_nslen(const char *src)
2062 {
2063     size_t i, maxlen;
2064 
2065     if (NULL == src) {
2066         return 0;
2067     }
2068     maxlen = PMIX_MAX_NSLEN + 1;
2069     /* use an algorithm that also protects against
2070      * non-NULL-terminated src strings */
2071     for (i=0; i < maxlen; ++i, ++src) {
2072         if ('\0' == *src) {
2073             break;
2074         }
2075     }
2076     return i;
2077 }
2078 
2079 
2080 /****    PMIX COORD    ****/
2081 /* define coordinate system views */
2082 typedef uint8_t pmix_coord_view_t;
2083 #define PMIX_COORD_VIEW_UNDEF       0x00
2084 #define PMIX_COORD_LOGICAL_VIEW     0x01
2085 #define PMIX_COORD_PHYSICAL_VIEW    0x02
2086 
2087 /* define a structure for a proc's fabric coordinate */
2088 typedef struct pmix_coord {
2089     pmix_coord_view_t view;
2090     uint32_t *coord;
2091     size_t dims;
2092 } pmix_coord_t;
2093 
2094 #define PMIX_COORD_STATIC_INIT      \
2095 {                                   \
2096     .view = PMIX_COORD_VIEW_UNDEF,  \
2097     .coord = NULL,                  \
2098     .dims = 0                       \
2099 }
2100 
2101 
2102 /****    PMIX LINK STATES    ****/
2103 typedef uint8_t pmix_link_state_t;
2104 #define PMIX_LINK_STATE_UNKNOWN     0  // The port state is unknown or not applicable
2105 #define PMIX_LINK_DOWN              1  // The port is inactive.
2106 #define PMIX_LINK_UP                2  // The port is active.
2107 
2108 
2109 /****   PMIX CPUSET    ****/
2110 typedef struct{
2111     char *source;
2112     void *bitmap;
2113 } pmix_cpuset_t;
2114 
2115 #define PMIX_CPUSET_STATIC_INIT \
2116 {                               \
2117     .source = NULL,             \
2118     .bitmap = NULL              \
2119 }
2120 
2121 
2122 /****    PMIX BIND ENVELOPE    ****/
2123 typedef uint8_t pmix_bind_envelope_t;
2124 #define PMIX_CPUBIND_PROCESS    0
2125 #define PMIX_CPUBIND_THREAD     1
2126 
2127 
2128 /****    PMIX TOPOLOGY    ****/
2129 typedef struct {
2130     char *source;
2131     void *topology;
2132 } pmix_topology_t;
2133 
2134 #define PMIX_TOPOLOGY_STATIC_INIT   \
2135 {                                   \
2136     .source = NULL,                 \
2137     .topology = NULL                \
2138 }
2139 
2140 
2141 /**** PMIX RELATIVE LOCALITY    ****/
2142 typedef uint16_t pmix_locality_t;
2143 #define PMIX_LOCALITY_UNKNOWN           0x0000
2144 #define PMIX_LOCALITY_NONLOCAL          0x8000
2145 #define PMIX_LOCALITY_SHARE_HWTHREAD    0x0001
2146 #define PMIX_LOCALITY_SHARE_CORE        0x0002
2147 #define PMIX_LOCALITY_SHARE_L1CACHE     0x0004
2148 #define PMIX_LOCALITY_SHARE_L2CACHE     0x0008
2149 #define PMIX_LOCALITY_SHARE_L3CACHE     0x0010
2150 #define PMIX_LOCALITY_SHARE_PACKAGE     0x0020
2151 #define PMIX_LOCALITY_SHARE_NUMA        0x0040
2152 #define PMIX_LOCALITY_SHARE_NODE        0x4000
2153 
2154 
2155 /****    PMIX GEOMETRY     ****/
2156 typedef struct pmix_geometry {
2157     size_t fabric;
2158     char *uuid;
2159     char *osname;
2160     pmix_coord_t *coordinates;
2161     size_t ncoords;
2162 } pmix_geometry_t;
2163 
2164 #define PMIX_GEOMETRY_STATIC_INIT   \
2165 {                                   \
2166     .fabric = 0,                    \
2167     .uuid = NULL,                   \
2168     .osname = NULL,                 \
2169     .coordinates = NULL,            \
2170     .ncoords = 0                    \
2171 }
2172 
2173 
2174 /****    PMIX_DEVICE_TYPE    ****/
2175 typedef uint64_t pmix_device_type_t;
2176 #define PMIX_DEVTYPE_UNKNOWN        0x0000000000000000
2177 #define PMIX_DEVTYPE_BLOCK          0x0000000000000001
2178 #define PMIX_DEVTYPE_GPU            0x0000000000000002
2179 #define PMIX_DEVTYPE_NETWORK        0x0000000000000004
2180 #define PMIX_DEVTYPE_OPENFABRICS    0x0000000000000008
2181 #define PMIX_DEVTYPE_DMA            0x0000000000000010
2182 #define PMIX_DEVTYPE_COPROC         0x0000000000000020
2183 /* devices used by resource units */
2184 #define PMIX_DEVTYPE_MEMORY         0x0000000000000040
2185 #define PMIX_DEVTYPE_CORE           0x0000000000000080
2186 #define PMIX_DEVTYPE_HWT            0x0000000000000100
2187 #define PMIX_DEVTYPE_CPU            0x0000000000000200
2188 #define PMIX_DEVTYPE_NODE           0x0000000000000400
2189 
2190 /****    PMIX_DEVICE    ****/
2191 typedef struct pmix_device {
2192     char *uuid;
2193     char *osname;
2194     pmix_device_type_t type;
2195 } pmix_device_t;
2196 
2197 #define PMIX_DEVICE_STATIC_INIT         \
2198 {                                       \
2199     .uuid = NULL,                       \
2200     .osname = NULL,                     \
2201     .type = PMIX_DEVTYPE_UNKNOWN        \
2202 }
2203 
2204 
2205 /****    PMIX_RESOURCE_UNIT    ****/
2206 typedef struct pmix_resource_unit {
2207     pmix_device_type_t type;
2208     size_t count;
2209 } pmix_resource_unit_t;
2210 
2211 #define PMIX_RESOURCE_UNIT_STATIC_INIT  \
2212 {                                       \
2213     .type = PMIX_DEVTYPE_UNKNOWN,       \
2214     .count = 0                          \
2215 }
2216 
2217 
2218 /****    PMIX_DISTANCE     ****/
2219 typedef struct pmix_device_distance {
2220     char *uuid;
2221     char *osname;
2222     pmix_device_type_t type;
2223     uint16_t mindist;
2224     uint16_t maxdist;
2225 } pmix_device_distance_t;
2226 
2227 #define PMIX_DEVICE_DIST_STATIC_INIT    \
2228 {                                       \
2229     .uuid = NULL,                       \
2230     .osname = NULL,                     \
2231     .type = PMIX_DEVTYPE_UNKNOWN,       \
2232     .mindist = 0,                       \
2233     .maxdist = 0                        \
2234 }
2235 
2236 
2237 /****    PMIX NODE PID    ****/
2238 typedef struct pmix_node_pid {
2239     char *hostname;
2240     uint32_t nodeid;
2241     pid_t pid;
2242 } pmix_node_pid_t;
2243 
2244 #define PMIX_NODE_PID_STATIC_INIT   \
2245 {                                   \
2246     .hostname = NULL,               \
2247     .nodeid = UINT32_MAX,           \
2248     .pid = -1                       \
2249 }
2250 
2251 
2252 /****    PMIX BYTE OBJECT    ****/
2253 typedef struct pmix_byte_object {
2254     char *bytes;
2255     size_t size;
2256 } pmix_byte_object_t;
2257 
2258 #define PMIX_BYTE_OBJECT_STATIC_INIT    \
2259 {                                       \
2260     .bytes = NULL,                      \
2261     .size = 0                           \
2262 }
2263 
2264 
2265 /****    PMIX ENDPOINT    ****/
2266 typedef struct pmix_endpoint {
2267     char *uuid;
2268     char *osname;
2269     pmix_byte_object_t endpt;
2270 } pmix_endpoint_t;
2271 
2272 #define PMIX_ENDPOINT_STATIC_INIT           \
2273 {                                           \
2274     .uuid = NULL,                           \
2275     .osname = NULL,                         \
2276     .endpt = PMIX_BYTE_OBJECT_STATIC_INIT   \
2277 }
2278 
2279 
2280 /****    PMIX ENVAR STRUCT   ****/
2281 /* Provide a structure for specifying environment variable modifications
2282  * Standard environment variables (e.g., PATH, LD_LIBRARY_PATH, and LD_PRELOAD)
2283  * take multiple arguments separated by delimiters. Unfortunately, the delimiters
2284  * depend upon the variable itself - some use semi-colons, some colons, etc. Thus,
2285  * the operation requires not only the name of the variable to be modified and
2286  * the value to be inserted, but also the separator to be used when composing
2287  * the aggregate value
2288  */
2289 typedef struct {
2290     char *envar;
2291     char *value;
2292     char separator;
2293 } pmix_envar_t;
2294 
2295 #define PMIX_ENVAR_STATIC_INIT  \
2296 {                               \
2297     .envar = NULL,              \
2298     .value = NULL,              \
2299     .separator = '\0'           \
2300 }
2301 
2302 
2303 /****    PMIX DATA BUFFER    ****/
2304 typedef struct pmix_data_buffer {
2305     /** Start of my memory */
2306     char *base_ptr;
2307     /** Where the next data will be packed to (within the allocated
2308         memory starting at base_ptr) */
2309     char *pack_ptr;
2310     /** Where the next data will be unpacked from (within the
2311         allocated memory starting as base_ptr) */
2312     char *unpack_ptr;
2313     /** Number of bytes allocated (starting at base_ptr) */
2314     size_t bytes_allocated;
2315     /** Number of bytes used by the buffer (i.e., amount of data --
2316         including overhead -- packed in the buffer) */
2317     size_t bytes_used;
2318 } pmix_data_buffer_t;
2319 
2320 #define PMIX_DATA_BUFFER_STATIC_INIT    \
2321 {                                       \
2322     .base_ptr = NULL,                   \
2323     .pack_ptr = NULL,                   \
2324     .unpack_ptr = NULL,                 \
2325     .bytes_allocated = 0,               \
2326     .bytes_used = 0                     \
2327 }
2328 
2329 
2330 /****    PMIX PROC OBJECT    ****/
2331 typedef struct pmix_proc {
2332     pmix_nspace_t nspace;
2333     pmix_rank_t rank;
2334 } pmix_proc_t;
2335 
2336 #define PMIX_PROC_STATIC_INIT   \
2337 {                               \
2338     .nspace = {0},              \
2339     .rank = PMIX_RANK_UNDEF     \
2340 }
2341 
2342 
2343 /****    PMIX PROC INFO STRUCT    ****/
2344 typedef struct pmix_proc_info {
2345     pmix_proc_t proc;
2346     char *hostname;
2347     char *executable_name;
2348     pid_t pid;
2349     int exit_code;
2350     pmix_proc_state_t state;
2351 } pmix_proc_info_t;
2352 
2353 #define PMIX_PROC_INFO_STATIC_INIT  \
2354 {                                   \
2355     .proc = PMIX_PROC_STATIC_INIT,  \
2356     .hostname = NULL,               \
2357     .executable_name = NULL,        \
2358     .pid = 0,                       \
2359     .exit_code = 0,                 \
2360     .state = PMIX_PROC_STATE_UNDEF  \
2361 }
2362 
2363 
2364 
2365 /****    PMIX DATA ARRAY STRUCT    ****/
2366 
2367 typedef struct pmix_data_array {
2368     pmix_data_type_t type;
2369     size_t size;
2370     void *array;
2371 } pmix_data_array_t;
2372 
2373 #define PMIX_DATA_ARRAY_STATIC_INIT     \
2374 {                                       \
2375     .type = PMIX_UNDEF,                 \
2376     .size = 0,                          \
2377     .array = NULL                       \
2378 }
2379 
2380 /* we cannot forward-declare the pmix_regattr_t struct
2381  * as Cython doesn't know what to do with it. Thus, we
2382  * will utilize the void* entry of the pmix_value_t to
2383  * hold the pointer to pmix_regattr_t */
2384 
2385 /****    PMIX VALUE STRUCT    ****/
2386 
2387 /* NOTE: operations can supply a collection of values under
2388  * a single key by passing a pmix_value_t containing a
2389  * data array of type PMIX_INFO, with each array element
2390  * containing its own pmix_info_t object */
2391 
2392 typedef struct pmix_value {
2393     pmix_data_type_t type;
2394     union {
2395         bool flag;
2396         uint8_t byte;
2397         char *string;
2398         size_t size;
2399         pid_t pid;
2400         int integer;
2401         int8_t int8;
2402         int16_t int16;
2403         int32_t int32;
2404         int64_t int64;
2405         unsigned int uint;
2406         uint8_t uint8;
2407         uint16_t uint16;
2408         uint32_t uint32;
2409         uint64_t uint64;
2410         float fval;
2411         double dval;
2412         struct timeval tv;
2413         time_t time;
2414         pmix_status_t status;
2415         pmix_rank_t rank;
2416         pmix_nspace_t *nspace;
2417         pmix_proc_t *proc;
2418         pmix_byte_object_t bo;
2419         pmix_persistence_t persist;
2420         pmix_scope_t scope;
2421         pmix_data_range_t range;
2422         pmix_proc_state_t state;
2423         pmix_proc_info_t *pinfo;
2424         pmix_data_array_t *darray;
2425         void *ptr;
2426         pmix_alloc_directive_t adir;
2427         pmix_resource_block_directive_t rbdir;
2428         pmix_envar_t envar;
2429         pmix_coord_t *coord;
2430         pmix_link_state_t linkstate;
2431         pmix_job_state_t jstate;
2432         pmix_topology_t *topo;
2433         pmix_cpuset_t *cpuset;
2434         pmix_locality_t locality;
2435         pmix_geometry_t *geometry;
2436         pmix_device_type_t devtype;
2437         pmix_device_t *device;
2438         pmix_device_distance_t *devdist;
2439         pmix_endpoint_t *endpoint;
2440         pmix_data_buffer_t *dbuf;
2441         pmix_resource_unit_t *resunit;
2442         pmix_node_pid_t *nodepid;
2443     } data;
2444 } pmix_value_t;
2445 
2446 #define PMIX_VALUE_STATIC_INIT  \
2447 {                               \
2448     .type = PMIX_UNDEF,         \
2449     .data.ptr = NULL            \
2450 }
2451 
2452 /****    PMIX INFO STRUCT    ****/
2453 typedef struct pmix_info {
2454     pmix_key_t key;
2455     pmix_info_directives_t flags;   // bit-mask of flags
2456     pmix_value_t value;
2457 } pmix_info_t;
2458 
2459 #define PMIX_INFO_STATIC_INIT       \
2460 {                                   \
2461     .key = {0},                     \
2462     .flags = 0,                     \
2463     .value = PMIX_VALUE_STATIC_INIT \
2464 }
2465 
2466 
2467 typedef enum {
2468     PMIX_BOOL_TRUE,
2469     PMIX_BOOL_FALSE,
2470     PMIX_NON_BOOL
2471 } pmix_boolean_t;
2472 
2473 
2474 /****    PMIX LOOKUP RETURN STRUCT    ****/
2475 typedef struct pmix_pdata {
2476     pmix_proc_t proc;
2477     pmix_key_t key;
2478     pmix_value_t value;
2479 } pmix_pdata_t;
2480 
2481 #define PMIX_LOOKUP_STATIC_INIT     \
2482 {                                   \
2483     .proc = PMIX_PROC_STATIC_INIT,  \
2484     .key = {0},                     \
2485     .value = PMIX_VALUE_STATIC_INIT \
2486 }
2487 
2488 
2489 
2490 /****    PMIX APP STRUCT    ****/
2491 typedef struct pmix_app {
2492     char *cmd;
2493     char **argv;
2494     char **env;
2495     char *cwd;
2496     int maxprocs;
2497     pmix_info_t *info;
2498     size_t ninfo;
2499 } pmix_app_t;
2500 
2501 #define PMIX_APP_STATIC_INIT    \
2502 {                               \
2503     .cmd = NULL,                \
2504     .argv = NULL,               \
2505     .env = NULL,                \
2506     .cwd = NULL,                \
2507     .maxprocs = 0,              \
2508     .info = NULL,               \
2509     .ninfo = 0                  \
2510 }
2511 
2512 
2513 /****    PMIX QUERY STRUCT    ****/
2514 typedef struct pmix_query {
2515     char **keys;
2516     pmix_info_t *qualifiers;
2517     size_t nqual;
2518 } pmix_query_t;
2519 
2520 #define PMIX_QUERY_STATIC_INIT  \
2521 {                               \
2522     .keys = NULL,               \
2523     .qualifiers = NULL,         \
2524     .nqual = 0                  \
2525 }
2526 
2527 
2528 /****    ATTRIBUTE REGISTRATION STRUCT   ****/
2529 typedef struct pmix_regattr_t {
2530     char *name;
2531     pmix_key_t string;
2532     pmix_data_type_t type;
2533     char **description;
2534 } pmix_regattr_t;
2535 
2536 #define PMIX_REGATTR_STATIC_INIT    \
2537 {                                   \
2538     .name = NULL,                   \
2539     .string = {0},                  \
2540     .type = PMIX_UNDEF,             \
2541     .description = NULL             \
2542 }
2543 
2544 
2545 /****    FABRIC STRUCT    ****/
2546 /* Define a pmix_fabric_t struct for
2547  * interacting with fabric-related interfaces */
2548 typedef struct pmix_fabric_s {
2549     /* user-supplied name for this fabric */
2550     char *name;
2551     /* a PMIx-supplied index identifying this registration object */
2552     size_t index;
2553     /* array containing information (provided by the PMIx library)
2554      * about the fabric */
2555     pmix_info_t *info;
2556     size_t ninfo;
2557     /* object pointer for use by the PMIx library */
2558     void *module;
2559 } pmix_fabric_t;
2560 
2561 #define PMIX_FABRIC_STATIC_INIT \
2562 {                               \
2563     .name = NULL,               \
2564     .index = 0,                 \
2565     .info = NULL,               \
2566     .ninfo = 0,                 \
2567     .module = NULL              \
2568 }
2569 
2570 /* convenience macros to support pmix_fabric_t */
2571 #define PMIX_FABRIC_CONSTRUCT(x) \
2572     memset(x, 0, sizeof(pmix_fabric_t))
2573 
2574 typedef enum {
2575     PMIX_FABRIC_REQUEST_INFO,
2576     PMIX_FABRIC_UPDATE_INFO
2577 } pmix_fabric_operation_t;
2578 
2579 
2580 /****    CALLBACK FUNCTIONS FOR NON-BLOCKING OPERATIONS    ****/
2581 
2582 typedef void (*pmix_release_cbfunc_t)(void *cbdata);
2583 
2584 /* define a callback function that is solely used by servers, and
2585  * not clients, to return modex data in response to "fence" and "get"
2586  * operations. The returned blob contains the data collected from each
2587  * server participating in the operation.
2588  *
2589  * As the data is "owned" by the host server, provide a secondary
2590  * callback function to notify the host server that we are done
2591  * with the data so it can be released */
2592 typedef void (*pmix_modex_cbfunc_t)(pmix_status_t status,
2593                                     const char *data, size_t ndata,
2594                                     void *cbdata,
2595                                     pmix_release_cbfunc_t release_fn,
2596                                     void *release_cbdata);
2597 
2598 /* define a callback function for calls to PMIx_Spawn_nb - the function
2599  * will be called upon completion of the spawn command. The status
2600  * will indicate whether or not the spawn succeeded. The nspace
2601  * of the spawned processes will be returned, along with any provided
2602  * callback data. Note that the returned nspace value will be
2603  * released by the library upon return from the callback function, so
2604  * the receiver must copy it if it needs to be retained */
2605 typedef void (*pmix_spawn_cbfunc_t)(pmix_status_t status,
2606                                     pmix_nspace_t nspace, void *cbdata);
2607 
2608 /* define a callback for common operations that simply return
2609  * a status. Examples include the non-blocking versions of
2610  * Fence, Connect, and Disconnect */
2611 typedef void (*pmix_op_cbfunc_t)(pmix_status_t status, void *cbdata);
2612 
2613 /* define a callback function for calls to PMIx_Lookup_nb - the
2614  * function will be called upon completion of the command with the
2615  * status indicating the success of failure of the request. Any
2616  * retrieved data will be returned in an array of pmix_pdata_t structs.
2617  * The nspace/rank of the process that provided each data element is
2618  * also returned.
2619  *
2620  * Note that these structures will be released upon return from
2621  * the callback function, so the receiver must copy/protect the
2622  * data prior to returning if it needs to be retained */
2623 
2624 typedef void (*pmix_lookup_cbfunc_t)(pmix_status_t status,
2625                                      pmix_pdata_t data[], size_t ndata,
2626                                      void *cbdata);
2627 
2628 /* define a callback by which an event handler can notify the PMIx library
2629  * that it has completed its response to the notification. The handler
2630  * is _required_ to execute this callback so the library can determine
2631  * if additional handlers need to be called. The handler shall return
2632  * PMIX_SUCCESS if no further action is required. The return status
2633  * of each event handler and any returned pmix_info_t structures
2634  * will be added to the array of pmix_info_t passed to any subsequent
2635  * event handlers to help guide their operation.
2636  *
2637  * If non-NULL, the provided callback function will be called to allow
2638  * the event handler to release the provided info array.
2639  */
2640 typedef void (*pmix_event_notification_cbfunc_fn_t)(pmix_status_t status,
2641                                                     pmix_info_t *results, size_t nresults,
2642                                                     pmix_op_cbfunc_t cbfunc, void *thiscbdata,
2643                                                     void *notification_cbdata);
2644 
2645 /* define a callback function for the event handler. Upon receipt of an
2646  * event notification, PMIx will execute the specified notification
2647  * callback function, providing:
2648  *
2649  * evhdlr_registration_id - the returned registration number of
2650  *                          the event handler being called
2651  * status - the event that occurred
2652  * source - the nspace and rank of the process that generated
2653  *          the event. If the source is the resource manager,
2654  *          then the nspace will be empty and the rank will
2655  *          be PMIX_RANK_UNDEF
2656  * info - any additional info provided regarding the event.
2657  * ninfo - the number of info objects in the info array
2658  * results - any provided results from event handlers called
2659  *           prior to this one.
2660  * nresults - number of info objects in the results array
2661  * cbfunc - the function to be called upon completion of the handler
2662  * cbdata - pointer to be returned in the completion cbfunc
2663  *
2664  * Note that different resource managers may provide differing levels
2665  * of support for event notification to application processes. Thus, the
2666  * info array may be NULL or may contain detailed information of the event.
2667  * It is the responsibility of the application to parse any provided info array
2668  * for defined key-values if it so desires.
2669  *
2670  * Possible uses of the pmix_info_t object include:
2671  *
2672  * - for the RM to alert the process as to planned actions, such as
2673  *   to abort the session, in response to the reported event
2674  *
2675  * - provide a timeout for alternative action to occur, such as for
2676  *   the application to request an alternate response to the event
2677  *
2678  * For example, the RM might alert the application to the failure of
2679  * a node that resulted in termination of several processes, and indicate
2680  * that the overall session will be aborted unless the application
2681  * requests an alternative behavior in the next 5 seconds. The application
2682  * then has time to respond with a checkpoint request, or a request to
2683  * recover from the failure by obtaining replacement nodes and restarting
2684  * from some earlier checkpoint.
2685  *
2686  * Support for these options is left to the discretion of the host RM. Info
2687  * keys are included in the common definions above, but also may be augmented
2688  * on a per-RM basis.
2689  *
2690  * On the server side, the notification function is used to inform the host
2691  * server of a detected event in the PMIx subsystem and/or client
2692  */
2693 typedef void (*pmix_notification_fn_t)(size_t evhdlr_registration_id,
2694                                        pmix_status_t status,
2695                                        const pmix_proc_t *source,
2696                                        pmix_info_t info[], size_t ninfo,
2697                                        pmix_info_t *results, size_t nresults,
2698                                        pmix_event_notification_cbfunc_fn_t cbfunc,
2699                                        void *cbdata);
2700 
2701 /* define a callback function for calls to register handlers, e.g., event
2702  * notification and IOF requests
2703  *
2704  * status - PMIX_SUCCESS or an appropriate error constant
2705  *
2706  * refid - reference identifier assigned to the handler by PMIx,
2707  *         used to deregister the handler
2708  *
2709  * cbdata - object provided to the registration call
2710  */
2711 typedef void (*pmix_hdlr_reg_cbfunc_t)(pmix_status_t status,
2712                                        size_t refid,
2713                                        void *cbdata);
2714 /* retain the deprecated form */
2715 typedef void (*pmix_evhdlr_reg_cbfunc_t)(pmix_status_t status,
2716                                          size_t refid,
2717                                          void *cbdata);
2718 
2719 /* define a callback function for calls to PMIx_Get_nb. The status
2720  * indicates if the requested data was found or not - a pointer to the
2721  * pmix_value_t structure containing the found data is returned. The
2722  * pointer will be NULL if the requested data was not found. */
2723 typedef void (*pmix_value_cbfunc_t)(pmix_status_t status,
2724                                     pmix_value_t *kv, void *cbdata);
2725 
2726 /* define a callback function for calls to PMIx_Query. The status
2727  * indicates if requested data was found or not - an array of
2728  * pmix_info_t will contain the key/value pairs. */
2729 typedef void (*pmix_info_cbfunc_t)(pmix_status_t status,
2730                                    pmix_info_t *info, size_t ninfo,
2731                                    void *cbdata,
2732                                    pmix_release_cbfunc_t release_fn,
2733                                    void *release_cbdata);
2734 
2735 /* Define a callback function to return a requested security credential.
2736  * Returned values include:
2737  *
2738  * status - PMIX_SUCCESS if a credential could be assigned as requested, or
2739  *          else an appropriate error code indicating the problem
2740  *
2741  * credential - pointer to an allocated pmix_byte_object_t containing the
2742  *              credential (as a opaque blob) and its size. Ownership of
2743  *              the credential is transferred to the receiving function - thus,
2744  *              responsibility for releasing the memory lies outside the
2745  *              PMIx library.
2746  *
2747  * info - an array of pmix_info_t structures provided by the system to pass
2748  *        any additional information about the credential - e.g., the identity
2749  *        of the issuing agent. The info array is owned by the PMIx library
2750  *        and is not to be released or altered by the receiving party. Note that
2751  *        this array is not related to the pmix_info_t structures possibly
2752  *        provided in the call to PMIx_Get_credential.
2753  *
2754  *        Information provided by the issuing agent can subsequently be used
2755  *        by the application for a variety of purposes. Examples include:
2756  *            - checking identified authorizations to determine what
2757  *              requests/operations are feasible as a means to steering
2758  *              workflows
2759  *            - compare the credential type to that of the local SMS for
2760  *              compatibility
2761  *
2762  * ninfo - number of elements in the info array
2763  *
2764  * cbdata - the caller's provided void* object
2765  *
2766  * NOTE: the credential is opaque and therefore understandable only by
2767  *       a service compatible with the issuer.
2768  */
2769 typedef void (*pmix_credential_cbfunc_t)(pmix_status_t status,
2770                                          pmix_byte_object_t *credential,
2771                                          pmix_info_t info[], size_t ninfo,
2772                                          void *cbdata);
2773 
2774 
2775 /* Define a validation callback function to indicate if a provided
2776  * credential is valid, and any corresponding information regarding
2777  * authorizations and other security matters
2778  * Returned values include:
2779  *
2780  * status - PMIX_SUCCESS if the provided credential is valid. An appropriate
2781  *          error code indicating the issue if the credential is rejected.
2782  *
2783  * info - an array of pmix_info_t structures provided by the system to pass
2784  *        any additional information about the authentication - e.g., the
2785  *        effective userid and group id of the certificate holder, and any
2786  *        related authorizations. The info array is owned by the PMIx library
2787  *        and is not to be released or altered by the receiving party. Note that
2788  *        this array is not related to the pmix_info_t structures possibly
2789  *        provided in the call to PMIx_Validate_credential.
2790  *
2791  *        The precise contents of the array will depend on the host SMS and
2792  *        its associated security system. At the minimum, it is expected (but
2793  *        not required) that the array will contain entries for the PMIX_USERID
2794  *        and PMIX_GROUPID of the client described in the credential.
2795  *
2796  * ninfo - number of elements in the info array
2797  *
2798  * cbdata - the caller's provided void* object
2799  */
2800 typedef void (*pmix_validation_cbfunc_t)(pmix_status_t status,
2801                                          pmix_info_t info[], size_t ninfo,
2802                                          void *cbdata);
2803 
2804 /* Define a callback function to return device distance arrays
2805  */
2806 typedef void (*pmix_device_dist_cbfunc_t)(pmix_status_t status,
2807                                           pmix_device_distance_t *dist,
2808                                           size_t ndist,
2809                                           void *cbdata,
2810                                           pmix_release_cbfunc_t release_fn,
2811                                           void *release_cbdata);
2812 
2813 
2814 
2815 
2816 #include <pmix_deprecated.h>
2817 
2818 #if defined(c_plusplus) || defined(__cplusplus)
2819 }
2820 #endif
2821 
2822 #endif