Upgrade macos
This commit is contained in:
45
macx64/mpi/openmpi/include/evdns.h
Normal file
45
macx64/mpi/openmpi/include/evdns.h
Normal file
@@ -0,0 +1,45 @@
|
||||
/*
|
||||
* Copyright (c) 2000-2007 Niels Provos <provos@citi.umich.edu>
|
||||
* Copyright (c) 2007-2012 Niels Provos and Nick Mathewson
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* 3. The name of the author may not be used to endorse or promote products
|
||||
* derived from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
||||
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
||||
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
||||
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
#ifndef EVENT1_EVDNS_H_INCLUDED_
|
||||
#define EVENT1_EVDNS_H_INCLUDED_
|
||||
|
||||
/** @file evdns.h
|
||||
|
||||
A dns subsystem for Libevent.
|
||||
|
||||
The <evdns.h> header is deprecated in Libevent 2.0 and later; please
|
||||
use <event2/evdns.h> instead. Depending on what functionality you
|
||||
need, you may also want to include more of the other <event2/...>
|
||||
headers.
|
||||
*/
|
||||
|
||||
#include <event.h>
|
||||
#include <event2/dns.h>
|
||||
#include <event2/dns_compat.h>
|
||||
#include <event2/dns_struct.h>
|
||||
|
||||
#endif /* EVENT1_EVDNS_H_INCLUDED_ */
|
||||
83
macx64/mpi/openmpi/include/event.h
Normal file
83
macx64/mpi/openmpi/include/event.h
Normal file
@@ -0,0 +1,83 @@
|
||||
/*
|
||||
* Copyright (c) 2000-2007 Niels Provos <provos@citi.umich.edu>
|
||||
* Copyright (c) 2007-2012 Niels Provos and Nick Mathewson
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* 3. The name of the author may not be used to endorse or promote products
|
||||
* derived from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
||||
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
||||
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
||||
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
#ifndef EVENT1_EVENT_H_INCLUDED_
|
||||
#define EVENT1_EVENT_H_INCLUDED_
|
||||
|
||||
/** @file event.h
|
||||
|
||||
A library for writing event-driven network servers.
|
||||
|
||||
The <event.h> header is deprecated in Libevent 2.0 and later; please
|
||||
use <event2/event.h> instead. Depending on what functionality you
|
||||
need, you may also want to include more of the other event2/
|
||||
headers.
|
||||
*/
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#include <event2/event-config.h>
|
||||
#ifdef EVENT__HAVE_SYS_TYPES_H
|
||||
#include <sys/types.h>
|
||||
#endif
|
||||
#ifdef EVENT__HAVE_SYS_TIME_H
|
||||
#include <sys/time.h>
|
||||
#endif
|
||||
#ifdef EVENT__HAVE_STDINT_H
|
||||
#include <stdint.h>
|
||||
#endif
|
||||
#include <stdarg.h>
|
||||
|
||||
/* For int types. */
|
||||
#include <evutil.h>
|
||||
|
||||
#ifdef _WIN32
|
||||
#ifndef WIN32_LEAN_AND_MEAN
|
||||
#define WIN32_LEAN_AND_MEAN
|
||||
#endif
|
||||
#include <winsock2.h>
|
||||
#include <windows.h>
|
||||
#undef WIN32_LEAN_AND_MEAN
|
||||
#endif
|
||||
|
||||
#include <event2/event_struct.h>
|
||||
#include <event2/event.h>
|
||||
#include <event2/event_compat.h>
|
||||
#include <event2/buffer.h>
|
||||
#include <event2/buffer_compat.h>
|
||||
#include <event2/bufferevent.h>
|
||||
#include <event2/bufferevent_struct.h>
|
||||
#include <event2/bufferevent_compat.h>
|
||||
#include <event2/tag.h>
|
||||
#include <event2/tag_compat.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* EVENT1_EVENT_H_INCLUDED_ */
|
||||
1077
macx64/mpi/openmpi/include/event2/buffer.h
Normal file
1077
macx64/mpi/openmpi/include/event2/buffer.h
Normal file
File diff suppressed because it is too large
Load Diff
116
macx64/mpi/openmpi/include/event2/buffer_compat.h
Normal file
116
macx64/mpi/openmpi/include/event2/buffer_compat.h
Normal file
@@ -0,0 +1,116 @@
|
||||
/*
|
||||
* Copyright (c) 2007-2012 Niels Provos and Nick Mathewson
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* 3. The name of the author may not be used to endorse or promote products
|
||||
* derived from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
||||
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
||||
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
||||
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#ifndef EVENT2_BUFFER_COMPAT_H_INCLUDED_
|
||||
#define EVENT2_BUFFER_COMPAT_H_INCLUDED_
|
||||
|
||||
#include <event2/visibility.h>
|
||||
|
||||
/** @file event2/buffer_compat.h
|
||||
|
||||
Obsolete and deprecated versions of the functions in buffer.h: provided
|
||||
only for backward compatibility.
|
||||
*/
|
||||
|
||||
|
||||
/**
|
||||
Obsolete alias for evbuffer_readln(buffer, NULL, EVBUFFER_EOL_ANY).
|
||||
|
||||
@deprecated This function is deprecated because its behavior is not correct
|
||||
for almost any protocol, and also because it's wholly subsumed by
|
||||
evbuffer_readln().
|
||||
|
||||
@param buffer the evbuffer to read from
|
||||
@return pointer to a single line, or NULL if an error occurred
|
||||
|
||||
*/
|
||||
EVENT2_EXPORT_SYMBOL
|
||||
char *evbuffer_readline(struct evbuffer *buffer);
|
||||
|
||||
/** Type definition for a callback that is invoked whenever data is added or
|
||||
removed from an evbuffer.
|
||||
|
||||
An evbuffer may have one or more callbacks set at a time. The order
|
||||
in which they are executed is undefined.
|
||||
|
||||
A callback function may add more callbacks, or remove itself from the
|
||||
list of callbacks, or add or remove data from the buffer. It may not
|
||||
remove another callback from the list.
|
||||
|
||||
If a callback adds or removes data from the buffer or from another
|
||||
buffer, this can cause a recursive invocation of your callback or
|
||||
other callbacks. If you ask for an infinite loop, you might just get
|
||||
one: watch out!
|
||||
|
||||
@param buffer the buffer whose size has changed
|
||||
@param old_len the previous length of the buffer
|
||||
@param new_len the current length of the buffer
|
||||
@param arg a pointer to user data
|
||||
*/
|
||||
typedef void (*evbuffer_cb)(struct evbuffer *buffer, size_t old_len, size_t new_len, void *arg);
|
||||
|
||||
/**
|
||||
Replace all callbacks on an evbuffer with a single new callback, or
|
||||
remove them.
|
||||
|
||||
Subsequent calls to evbuffer_setcb() replace callbacks set by previous
|
||||
calls. Setting the callback to NULL removes any previously set callback.
|
||||
|
||||
@deprecated This function is deprecated because it clears all previous
|
||||
callbacks set on the evbuffer, which can cause confusing behavior if
|
||||
multiple parts of the code all want to add their own callbacks on a
|
||||
buffer. Instead, use evbuffer_add(), evbuffer_del(), and
|
||||
evbuffer_setflags() to manage your own evbuffer callbacks without
|
||||
interfering with callbacks set by others.
|
||||
|
||||
@param buffer the evbuffer to be monitored
|
||||
@param cb the callback function to invoke when the evbuffer is modified,
|
||||
or NULL to remove all callbacks.
|
||||
@param cbarg an argument to be provided to the callback function
|
||||
@return 0 if successful, or -1 on error
|
||||
*/
|
||||
EVENT2_EXPORT_SYMBOL
|
||||
int evbuffer_setcb(struct evbuffer *buffer, evbuffer_cb cb, void *cbarg);
|
||||
|
||||
|
||||
/**
|
||||
Find a string within an evbuffer.
|
||||
|
||||
@param buffer the evbuffer to be searched
|
||||
@param what the string to be searched for
|
||||
@param len the length of the search string
|
||||
@return a pointer to the beginning of the search string, or NULL if the search failed.
|
||||
*/
|
||||
EVENT2_EXPORT_SYMBOL
|
||||
unsigned char *evbuffer_find(struct evbuffer *buffer, const unsigned char *what, size_t len);
|
||||
|
||||
/** deprecated in favor of calling the functions directly */
|
||||
#define EVBUFFER_LENGTH(x) evbuffer_get_length(x)
|
||||
/** deprecated in favor of calling the functions directly */
|
||||
#define EVBUFFER_DATA(x) evbuffer_pullup((x), -1)
|
||||
|
||||
#endif
|
||||
|
||||
1024
macx64/mpi/openmpi/include/event2/bufferevent.h
Normal file
1024
macx64/mpi/openmpi/include/event2/bufferevent.h
Normal file
File diff suppressed because it is too large
Load Diff
104
macx64/mpi/openmpi/include/event2/bufferevent_compat.h
Normal file
104
macx64/mpi/openmpi/include/event2/bufferevent_compat.h
Normal file
@@ -0,0 +1,104 @@
|
||||
/*
|
||||
* Copyright (c) 2007-2012 Niels Provos, Nick Mathewson
|
||||
* Copyright (c) 2000-2007 Niels Provos <provos@citi.umich.edu>
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* 3. The name of the author may not be used to endorse or promote products
|
||||
* derived from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
||||
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
||||
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
||||
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
#ifndef EVENT2_BUFFEREVENT_COMPAT_H_INCLUDED_
|
||||
#define EVENT2_BUFFEREVENT_COMPAT_H_INCLUDED_
|
||||
|
||||
#include <event2/visibility.h>
|
||||
|
||||
#define evbuffercb bufferevent_data_cb
|
||||
#define everrorcb bufferevent_event_cb
|
||||
|
||||
/**
|
||||
Create a new bufferevent for an fd.
|
||||
|
||||
This function is deprecated. Use bufferevent_socket_new and
|
||||
bufferevent_set_callbacks instead.
|
||||
|
||||
Libevent provides an abstraction on top of the regular event callbacks.
|
||||
This abstraction is called a buffered event. A buffered event provides
|
||||
input and output buffers that get filled and drained automatically. The
|
||||
user of a buffered event no longer deals directly with the I/O, but
|
||||
instead is reading from input and writing to output buffers.
|
||||
|
||||
Once initialized, the bufferevent structure can be used repeatedly with
|
||||
bufferevent_enable() and bufferevent_disable().
|
||||
|
||||
When read enabled the bufferevent will try to read from the file descriptor
|
||||
and call the read callback. The write callback is executed whenever the
|
||||
output buffer is drained below the write low watermark, which is 0 by
|
||||
default.
|
||||
|
||||
If multiple bases are in use, bufferevent_base_set() must be called before
|
||||
enabling the bufferevent for the first time.
|
||||
|
||||
@deprecated This function is deprecated because it uses the current
|
||||
event base, and as such can be error prone for multithreaded programs.
|
||||
Use bufferevent_socket_new() instead.
|
||||
|
||||
@param fd the file descriptor from which data is read and written to.
|
||||
This file descriptor is not allowed to be a pipe(2).
|
||||
@param readcb callback to invoke when there is data to be read, or NULL if
|
||||
no callback is desired
|
||||
@param writecb callback to invoke when the file descriptor is ready for
|
||||
writing, or NULL if no callback is desired
|
||||
@param errorcb callback to invoke when there is an error on the file
|
||||
descriptor
|
||||
@param cbarg an argument that will be supplied to each of the callbacks
|
||||
(readcb, writecb, and errorcb)
|
||||
@return a pointer to a newly allocated bufferevent struct, or NULL if an
|
||||
error occurred
|
||||
@see bufferevent_base_set(), bufferevent_free()
|
||||
*/
|
||||
EVENT2_EXPORT_SYMBOL
|
||||
struct bufferevent *bufferevent_new(evutil_socket_t fd,
|
||||
evbuffercb readcb, evbuffercb writecb, everrorcb errorcb, void *cbarg);
|
||||
|
||||
|
||||
/**
|
||||
Set the read and write timeout for a buffered event.
|
||||
|
||||
@param bufev the bufferevent to be modified
|
||||
@param timeout_read the read timeout
|
||||
@param timeout_write the write timeout
|
||||
*/
|
||||
EVENT2_EXPORT_SYMBOL
|
||||
void bufferevent_settimeout(struct bufferevent *bufev,
|
||||
int timeout_read, int timeout_write);
|
||||
|
||||
#define EVBUFFER_READ BEV_EVENT_READING
|
||||
#define EVBUFFER_WRITE BEV_EVENT_WRITING
|
||||
#define EVBUFFER_EOF BEV_EVENT_EOF
|
||||
#define EVBUFFER_ERROR BEV_EVENT_ERROR
|
||||
#define EVBUFFER_TIMEOUT BEV_EVENT_TIMEOUT
|
||||
|
||||
/** macro for getting access to the input buffer of a bufferevent */
|
||||
#define EVBUFFER_INPUT(x) bufferevent_get_input(x)
|
||||
/** macro for getting access to the output buffer of a bufferevent */
|
||||
#define EVBUFFER_OUTPUT(x) bufferevent_get_output(x)
|
||||
|
||||
#endif
|
||||
116
macx64/mpi/openmpi/include/event2/bufferevent_struct.h
Normal file
116
macx64/mpi/openmpi/include/event2/bufferevent_struct.h
Normal file
@@ -0,0 +1,116 @@
|
||||
/*
|
||||
* Copyright (c) 2000-2007 Niels Provos <provos@citi.umich.edu>
|
||||
* Copyright (c) 2007-2012 Niels Provos and Nick Mathewson
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* 3. The name of the author may not be used to endorse or promote products
|
||||
* derived from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
||||
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
||||
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
||||
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
#ifndef EVENT2_BUFFEREVENT_STRUCT_H_INCLUDED_
|
||||
#define EVENT2_BUFFEREVENT_STRUCT_H_INCLUDED_
|
||||
|
||||
/** @file event2/bufferevent_struct.h
|
||||
|
||||
Data structures for bufferevents. Using these structures may hurt forward
|
||||
compatibility with later versions of Libevent: be careful!
|
||||
|
||||
@deprecated Use of bufferevent_struct.h is completely deprecated; these
|
||||
structures are only exposed for backward compatibility with programs
|
||||
written before Libevent 2.0 that used them.
|
||||
*/
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#include <event2/event-config.h>
|
||||
#ifdef EVENT__HAVE_SYS_TYPES_H
|
||||
#include <sys/types.h>
|
||||
#endif
|
||||
#ifdef EVENT__HAVE_SYS_TIME_H
|
||||
#include <sys/time.h>
|
||||
#endif
|
||||
|
||||
/* For int types. */
|
||||
#include <event2/util.h>
|
||||
/* For struct event */
|
||||
#include <event2/event_struct.h>
|
||||
|
||||
struct event_watermark {
|
||||
size_t low;
|
||||
size_t high;
|
||||
};
|
||||
|
||||
/**
|
||||
Shared implementation of a bufferevent.
|
||||
|
||||
This type is exposed only because it was exposed in previous versions,
|
||||
and some people's code may rely on manipulating it. Otherwise, you
|
||||
should really not rely on the layout, size, or contents of this structure:
|
||||
it is fairly volatile, and WILL change in future versions of the code.
|
||||
**/
|
||||
struct bufferevent {
|
||||
/** Event base for which this bufferevent was created. */
|
||||
struct event_base *ev_base;
|
||||
/** Pointer to a table of function pointers to set up how this
|
||||
bufferevent behaves. */
|
||||
const struct bufferevent_ops *be_ops;
|
||||
|
||||
/** A read event that triggers when a timeout has happened or a socket
|
||||
is ready to read data. Only used by some subtypes of
|
||||
bufferevent. */
|
||||
struct event ev_read;
|
||||
/** A write event that triggers when a timeout has happened or a socket
|
||||
is ready to write data. Only used by some subtypes of
|
||||
bufferevent. */
|
||||
struct event ev_write;
|
||||
|
||||
/** An input buffer. Only the bufferevent is allowed to add data to
|
||||
this buffer, though the user is allowed to drain it. */
|
||||
struct evbuffer *input;
|
||||
|
||||
/** An input buffer. Only the bufferevent is allowed to drain data
|
||||
from this buffer, though the user is allowed to add it. */
|
||||
struct evbuffer *output;
|
||||
|
||||
struct event_watermark wm_read;
|
||||
struct event_watermark wm_write;
|
||||
|
||||
bufferevent_data_cb readcb;
|
||||
bufferevent_data_cb writecb;
|
||||
/* This should be called 'eventcb', but renaming it would break
|
||||
* backward compatibility */
|
||||
bufferevent_event_cb errorcb;
|
||||
void *cbarg;
|
||||
|
||||
struct timeval timeout_read;
|
||||
struct timeval timeout_write;
|
||||
|
||||
/** Events that are currently enabled: currently EV_READ and EV_WRITE
|
||||
are supported. */
|
||||
short enabled;
|
||||
};
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* EVENT2_BUFFEREVENT_STRUCT_H_INCLUDED_ */
|
||||
751
macx64/mpi/openmpi/include/event2/dns.h
Normal file
751
macx64/mpi/openmpi/include/event2/dns.h
Normal file
@@ -0,0 +1,751 @@
|
||||
/*
|
||||
* Copyright (c) 2006-2007 Niels Provos <provos@citi.umich.edu>
|
||||
* Copyright (c) 2007-2012 Niels Provos and Nick Mathewson
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* 3. The name of the author may not be used to endorse or promote products
|
||||
* derived from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
||||
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
||||
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
||||
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
/*
|
||||
* The original DNS code is due to Adam Langley with heavy
|
||||
* modifications by Nick Mathewson. Adam put his DNS software in the
|
||||
* public domain. You can find his original copyright below. Please,
|
||||
* aware that the code as part of Libevent is governed by the 3-clause
|
||||
* BSD license above.
|
||||
*
|
||||
* This software is Public Domain. To view a copy of the public domain dedication,
|
||||
* visit http://creativecommons.org/licenses/publicdomain/ or send a letter to
|
||||
* Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA.
|
||||
*
|
||||
* I ask and expect, but do not require, that all derivative works contain an
|
||||
* attribution similar to:
|
||||
* Parts developed by Adam Langley <agl@imperialviolet.org>
|
||||
*
|
||||
* You may wish to replace the word "Parts" with something else depending on
|
||||
* the amount of original code.
|
||||
*
|
||||
* (Derivative works does not include programs which link against, run or include
|
||||
* the source verbatim in their source distributions)
|
||||
*/
|
||||
|
||||
/** @file event2/dns.h
|
||||
*
|
||||
* Welcome, gentle reader
|
||||
*
|
||||
* Async DNS lookups are really a whole lot harder than they should be,
|
||||
* mostly stemming from the fact that the libc resolver has never been
|
||||
* very good at them. Before you use this library you should see if libc
|
||||
* can do the job for you with the modern async call getaddrinfo_a
|
||||
* (see http://www.imperialviolet.org/page25.html#e498). Otherwise,
|
||||
* please continue.
|
||||
*
|
||||
* The library keeps track of the state of nameservers and will avoid
|
||||
* them when they go down. Otherwise it will round robin between them.
|
||||
*
|
||||
* Quick start guide:
|
||||
* #include "evdns.h"
|
||||
* void callback(int result, char type, int count, int ttl,
|
||||
* void *addresses, void *arg);
|
||||
* evdns_resolv_conf_parse(DNS_OPTIONS_ALL, "/etc/resolv.conf");
|
||||
* evdns_resolve("www.hostname.com", 0, callback, NULL);
|
||||
*
|
||||
* When the lookup is complete the callback function is called. The
|
||||
* first argument will be one of the DNS_ERR_* defines in evdns.h.
|
||||
* Hopefully it will be DNS_ERR_NONE, in which case type will be
|
||||
* DNS_IPv4_A, count will be the number of IP addresses, ttl is the time
|
||||
* which the data can be cached for (in seconds), addresses will point
|
||||
* to an array of uint32_t's and arg will be whatever you passed to
|
||||
* evdns_resolve.
|
||||
*
|
||||
* Searching:
|
||||
*
|
||||
* In order for this library to be a good replacement for glibc's resolver it
|
||||
* supports searching. This involves setting a list of default domains, in
|
||||
* which names will be queried for. The number of dots in the query name
|
||||
* determines the order in which this list is used.
|
||||
*
|
||||
* Searching appears to be a single lookup from the point of view of the API,
|
||||
* although many DNS queries may be generated from a single call to
|
||||
* evdns_resolve. Searching can also drastically slow down the resolution
|
||||
* of names.
|
||||
*
|
||||
* To disable searching:
|
||||
* 1. Never set it up. If you never call evdns_resolv_conf_parse or
|
||||
* evdns_search_add then no searching will occur.
|
||||
*
|
||||
* 2. If you do call evdns_resolv_conf_parse then don't pass
|
||||
* DNS_OPTION_SEARCH (or DNS_OPTIONS_ALL, which implies it).
|
||||
*
|
||||
* 3. When calling evdns_resolve, pass the DNS_QUERY_NO_SEARCH flag.
|
||||
*
|
||||
* The order of searches depends on the number of dots in the name. If the
|
||||
* number is greater than the ndots setting then the names is first tried
|
||||
* globally. Otherwise each search domain is appended in turn.
|
||||
*
|
||||
* The ndots setting can either be set from a resolv.conf, or by calling
|
||||
* evdns_search_ndots_set.
|
||||
*
|
||||
* For example, with ndots set to 1 (the default) and a search domain list of
|
||||
* ["myhome.net"]:
|
||||
* Query: www
|
||||
* Order: www.myhome.net, www.
|
||||
*
|
||||
* Query: www.abc
|
||||
* Order: www.abc., www.abc.myhome.net
|
||||
*
|
||||
* Internals:
|
||||
*
|
||||
* Requests are kept in two queues. The first is the inflight queue. In
|
||||
* this queue requests have an allocated transaction id and nameserver.
|
||||
* They will soon be transmitted if they haven't already been.
|
||||
*
|
||||
* The second is the waiting queue. The size of the inflight ring is
|
||||
* limited and all other requests wait in waiting queue for space. This
|
||||
* bounds the number of concurrent requests so that we don't flood the
|
||||
* nameserver. Several algorithms require a full walk of the inflight
|
||||
* queue and so bounding its size keeps thing going nicely under huge
|
||||
* (many thousands of requests) loads.
|
||||
*
|
||||
* If a nameserver loses too many requests it is considered down and we
|
||||
* try not to use it. After a while we send a probe to that nameserver
|
||||
* (a lookup for google.com) and, if it replies, we consider it working
|
||||
* again. If the nameserver fails a probe we wait longer to try again
|
||||
* with the next probe.
|
||||
*/
|
||||
|
||||
#ifndef EVENT2_DNS_H_INCLUDED_
|
||||
#define EVENT2_DNS_H_INCLUDED_
|
||||
|
||||
#include <event2/visibility.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/* For integer types. */
|
||||
#include <event2/util.h>
|
||||
|
||||
/** Error codes 0-5 are as described in RFC 1035. */
|
||||
#define DNS_ERR_NONE 0
|
||||
/** The name server was unable to interpret the query */
|
||||
#define DNS_ERR_FORMAT 1
|
||||
/** The name server was unable to process this query due to a problem with the
|
||||
* name server */
|
||||
#define DNS_ERR_SERVERFAILED 2
|
||||
/** The domain name does not exist */
|
||||
#define DNS_ERR_NOTEXIST 3
|
||||
/** The name server does not support the requested kind of query */
|
||||
#define DNS_ERR_NOTIMPL 4
|
||||
/** The name server refuses to reform the specified operation for policy
|
||||
* reasons */
|
||||
#define DNS_ERR_REFUSED 5
|
||||
/** The reply was truncated or ill-formatted */
|
||||
#define DNS_ERR_TRUNCATED 65
|
||||
/** An unknown error occurred */
|
||||
#define DNS_ERR_UNKNOWN 66
|
||||
/** Communication with the server timed out */
|
||||
#define DNS_ERR_TIMEOUT 67
|
||||
/** The request was canceled because the DNS subsystem was shut down. */
|
||||
#define DNS_ERR_SHUTDOWN 68
|
||||
/** The request was canceled via a call to evdns_cancel_request */
|
||||
#define DNS_ERR_CANCEL 69
|
||||
/** There were no answers and no error condition in the DNS packet.
|
||||
* This can happen when you ask for an address that exists, but a record
|
||||
* type that doesn't. */
|
||||
#define DNS_ERR_NODATA 70
|
||||
|
||||
#define DNS_IPv4_A 1
|
||||
#define DNS_PTR 2
|
||||
#define DNS_IPv6_AAAA 3
|
||||
|
||||
#define DNS_QUERY_NO_SEARCH 1
|
||||
|
||||
/* Allow searching */
|
||||
#define DNS_OPTION_SEARCH 1
|
||||
/* Parse "nameserver" and add default if no such section */
|
||||
#define DNS_OPTION_NAMESERVERS 2
|
||||
/* Parse additional options like:
|
||||
* - timeout:
|
||||
* - getaddrinfo-allow-skew:
|
||||
* - max-timeouts:
|
||||
* - max-inflight:
|
||||
* - attempts:
|
||||
* - randomize-case:
|
||||
* - initial-probe-timeout:
|
||||
*/
|
||||
#define DNS_OPTION_MISC 4
|
||||
/* Load hosts file (i.e. "/etc/hosts") */
|
||||
#define DNS_OPTION_HOSTSFILE 8
|
||||
/**
|
||||
* All above:
|
||||
* - DNS_OPTION_SEARCH
|
||||
* - DNS_OPTION_NAMESERVERS
|
||||
* - DNS_OPTION_MISC
|
||||
* - DNS_OPTION_HOSTSFILE
|
||||
*/
|
||||
#define DNS_OPTIONS_ALL ( \
|
||||
DNS_OPTION_SEARCH | \
|
||||
DNS_OPTION_NAMESERVERS | \
|
||||
DNS_OPTION_MISC | \
|
||||
DNS_OPTION_HOSTSFILE | \
|
||||
0 \
|
||||
)
|
||||
/* Do not "default" nameserver (i.e. "127.0.0.1:53") if there is no nameservers
|
||||
* in resolv.conf, (iff DNS_OPTION_NAMESERVERS is set) */
|
||||
#define DNS_OPTION_NAMESERVERS_NO_DEFAULT 16
|
||||
|
||||
/* Obsolete name for DNS_QUERY_NO_SEARCH */
|
||||
#define DNS_NO_SEARCH DNS_QUERY_NO_SEARCH
|
||||
|
||||
/**
|
||||
* The callback that contains the results from a lookup.
|
||||
* - result is one of the DNS_ERR_* values (DNS_ERR_NONE for success)
|
||||
* - type is either DNS_IPv4_A or DNS_PTR or DNS_IPv6_AAAA
|
||||
* - count contains the number of addresses of form type
|
||||
* - ttl is the number of seconds the resolution may be cached for.
|
||||
* - addresses needs to be cast according to type. It will be an array of
|
||||
* 4-byte sequences for ipv4, or an array of 16-byte sequences for ipv6,
|
||||
* or a nul-terminated string for PTR.
|
||||
*/
|
||||
typedef void (*evdns_callback_type) (int result, char type, int count, int ttl, void *addresses, void *arg);
|
||||
|
||||
struct evdns_base;
|
||||
struct event_base;
|
||||
|
||||
/** Flag for evdns_base_new: process resolv.conf. */
|
||||
#define EVDNS_BASE_INITIALIZE_NAMESERVERS 1
|
||||
/** Flag for evdns_base_new: Do not prevent the libevent event loop from
|
||||
* exiting when we have no active dns requests. */
|
||||
#define EVDNS_BASE_DISABLE_WHEN_INACTIVE 0x8000
|
||||
/** Flag for evdns_base_new: If EVDNS_BASE_INITIALIZE_NAMESERVERS isset, do not
|
||||
* add default nameserver if there are no nameservers in resolv.conf
|
||||
* @see DNS_OPTION_NAMESERVERS_NO_DEFAULT */
|
||||
#define EVDNS_BASE_NAMESERVERS_NO_DEFAULT 0x10000
|
||||
|
||||
/**
|
||||
Initialize the asynchronous DNS library.
|
||||
|
||||
This function initializes support for non-blocking name resolution by
|
||||
calling evdns_resolv_conf_parse() on UNIX and
|
||||
evdns_config_windows_nameservers() on Windows.
|
||||
|
||||
@param event_base the event base to associate the dns client with
|
||||
@param flags any of EVDNS_BASE_INITIALIZE_NAMESERVERS|
|
||||
EVDNS_BASE_DISABLE_WHEN_INACTIVE|EVDNS_BASE_NAMESERVERS_NO_DEFAULT
|
||||
@return evdns_base object if successful, or NULL if an error occurred.
|
||||
@see evdns_base_free()
|
||||
*/
|
||||
EVENT2_EXPORT_SYMBOL
|
||||
struct evdns_base * evdns_base_new(struct event_base *event_base, int initialize_nameservers);
|
||||
|
||||
|
||||
/**
|
||||
Shut down the asynchronous DNS resolver and terminate all active requests.
|
||||
|
||||
If the 'fail_requests' option is enabled, all active requests will return
|
||||
an empty result with the error flag set to DNS_ERR_SHUTDOWN. Otherwise,
|
||||
the requests will be silently discarded.
|
||||
|
||||
@param evdns_base the evdns base to free
|
||||
@param fail_requests if zero, active requests will be aborted; if non-zero,
|
||||
active requests will return DNS_ERR_SHUTDOWN.
|
||||
@see evdns_base_new()
|
||||
*/
|
||||
EVENT2_EXPORT_SYMBOL
|
||||
void evdns_base_free(struct evdns_base *base, int fail_requests);
|
||||
|
||||
/**
|
||||
Remove all hosts entries that have been loaded into the event_base via
|
||||
evdns_base_load_hosts or via event_base_resolv_conf_parse.
|
||||
|
||||
@param evdns_base the evdns base to remove outdated host addresses from
|
||||
*/
|
||||
EVENT2_EXPORT_SYMBOL
|
||||
void evdns_base_clear_host_addresses(struct evdns_base *base);
|
||||
|
||||
/**
|
||||
Convert a DNS error code to a string.
|
||||
|
||||
@param err the DNS error code
|
||||
@return a string containing an explanation of the error code
|
||||
*/
|
||||
EVENT2_EXPORT_SYMBOL
|
||||
const char *evdns_err_to_string(int err);
|
||||
|
||||
|
||||
/**
|
||||
Add a nameserver.
|
||||
|
||||
The address should be an IPv4 address in network byte order.
|
||||
The type of address is chosen so that it matches in_addr.s_addr.
|
||||
|
||||
@param base the evdns_base to which to add the name server
|
||||
@param address an IP address in network byte order
|
||||
@return 0 if successful, or -1 if an error occurred
|
||||
@see evdns_base_nameserver_ip_add()
|
||||
*/
|
||||
EVENT2_EXPORT_SYMBOL
|
||||
int evdns_base_nameserver_add(struct evdns_base *base,
|
||||
unsigned long int address);
|
||||
|
||||
/**
|
||||
Get the number of configured nameservers.
|
||||
|
||||
This returns the number of configured nameservers (not necessarily the
|
||||
number of running nameservers). This is useful for double-checking
|
||||
whether our calls to the various nameserver configuration functions
|
||||
have been successful.
|
||||
|
||||
@param base the evdns_base to which to apply this operation
|
||||
@return the number of configured nameservers
|
||||
@see evdns_base_nameserver_add()
|
||||
*/
|
||||
EVENT2_EXPORT_SYMBOL
|
||||
int evdns_base_count_nameservers(struct evdns_base *base);
|
||||
|
||||
/**
|
||||
Remove all configured nameservers, and suspend all pending resolves.
|
||||
|
||||
Resolves will not necessarily be re-attempted until evdns_base_resume() is called.
|
||||
|
||||
@param base the evdns_base to which to apply this operation
|
||||
@return 0 if successful, or -1 if an error occurred
|
||||
@see evdns_base_resume()
|
||||
*/
|
||||
EVENT2_EXPORT_SYMBOL
|
||||
int evdns_base_clear_nameservers_and_suspend(struct evdns_base *base);
|
||||
|
||||
|
||||
/**
|
||||
Resume normal operation and continue any suspended resolve requests.
|
||||
|
||||
Re-attempt resolves left in limbo after an earlier call to
|
||||
evdns_base_clear_nameservers_and_suspend().
|
||||
|
||||
@param base the evdns_base to which to apply this operation
|
||||
@return 0 if successful, or -1 if an error occurred
|
||||
@see evdns_base_clear_nameservers_and_suspend()
|
||||
*/
|
||||
EVENT2_EXPORT_SYMBOL
|
||||
int evdns_base_resume(struct evdns_base *base);
|
||||
|
||||
/**
|
||||
Add a nameserver by string address.
|
||||
|
||||
This function parses a n IPv4 or IPv6 address from a string and adds it as a
|
||||
nameserver. It supports the following formats:
|
||||
- [IPv6Address]:port
|
||||
- [IPv6Address]
|
||||
- IPv6Address
|
||||
- IPv4Address:port
|
||||
- IPv4Address
|
||||
|
||||
If no port is specified, it defaults to 53.
|
||||
|
||||
@param base the evdns_base to which to apply this operation
|
||||
@return 0 if successful, or -1 if an error occurred
|
||||
@see evdns_base_nameserver_add()
|
||||
*/
|
||||
EVENT2_EXPORT_SYMBOL
|
||||
int evdns_base_nameserver_ip_add(struct evdns_base *base,
|
||||
const char *ip_as_string);
|
||||
|
||||
/**
|
||||
Add a nameserver by sockaddr.
|
||||
**/
|
||||
EVENT2_EXPORT_SYMBOL
|
||||
int
|
||||
evdns_base_nameserver_sockaddr_add(struct evdns_base *base,
|
||||
const struct sockaddr *sa, ev_socklen_t len, unsigned flags);
|
||||
|
||||
struct evdns_request;
|
||||
|
||||
/**
|
||||
Lookup an A record for a given name.
|
||||
|
||||
@param base the evdns_base to which to apply this operation
|
||||
@param name a DNS hostname
|
||||
@param flags either 0, or DNS_QUERY_NO_SEARCH to disable searching for this query.
|
||||
@param callback a callback function to invoke when the request is completed
|
||||
@param ptr an argument to pass to the callback function
|
||||
@return an evdns_request object if successful, or NULL if an error occurred.
|
||||
@see evdns_resolve_ipv6(), evdns_resolve_reverse(), evdns_resolve_reverse_ipv6(), evdns_cancel_request()
|
||||
*/
|
||||
EVENT2_EXPORT_SYMBOL
|
||||
struct evdns_request *evdns_base_resolve_ipv4(struct evdns_base *base, const char *name, int flags, evdns_callback_type callback, void *ptr);
|
||||
|
||||
/**
|
||||
Lookup an AAAA record for a given name.
|
||||
|
||||
@param base the evdns_base to which to apply this operation
|
||||
@param name a DNS hostname
|
||||
@param flags either 0, or DNS_QUERY_NO_SEARCH to disable searching for this query.
|
||||
@param callback a callback function to invoke when the request is completed
|
||||
@param ptr an argument to pass to the callback function
|
||||
@return an evdns_request object if successful, or NULL if an error occurred.
|
||||
@see evdns_resolve_ipv4(), evdns_resolve_reverse(), evdns_resolve_reverse_ipv6(), evdns_cancel_request()
|
||||
*/
|
||||
EVENT2_EXPORT_SYMBOL
|
||||
struct evdns_request *evdns_base_resolve_ipv6(struct evdns_base *base, const char *name, int flags, evdns_callback_type callback, void *ptr);
|
||||
|
||||
struct in_addr;
|
||||
struct in6_addr;
|
||||
|
||||
/**
|
||||
Lookup a PTR record for a given IP address.
|
||||
|
||||
@param base the evdns_base to which to apply this operation
|
||||
@param in an IPv4 address
|
||||
@param flags either 0, or DNS_QUERY_NO_SEARCH to disable searching for this query.
|
||||
@param callback a callback function to invoke when the request is completed
|
||||
@param ptr an argument to pass to the callback function
|
||||
@return an evdns_request object if successful, or NULL if an error occurred.
|
||||
@see evdns_resolve_reverse_ipv6(), evdns_cancel_request()
|
||||
*/
|
||||
EVENT2_EXPORT_SYMBOL
|
||||
struct evdns_request *evdns_base_resolve_reverse(struct evdns_base *base, const struct in_addr *in, int flags, evdns_callback_type callback, void *ptr);
|
||||
|
||||
|
||||
/**
|
||||
Lookup a PTR record for a given IPv6 address.
|
||||
|
||||
@param base the evdns_base to which to apply this operation
|
||||
@param in an IPv6 address
|
||||
@param flags either 0, or DNS_QUERY_NO_SEARCH to disable searching for this query.
|
||||
@param callback a callback function to invoke when the request is completed
|
||||
@param ptr an argument to pass to the callback function
|
||||
@return an evdns_request object if successful, or NULL if an error occurred.
|
||||
@see evdns_resolve_reverse_ipv6(), evdns_cancel_request()
|
||||
*/
|
||||
EVENT2_EXPORT_SYMBOL
|
||||
struct evdns_request *evdns_base_resolve_reverse_ipv6(struct evdns_base *base, const struct in6_addr *in, int flags, evdns_callback_type callback, void *ptr);
|
||||
|
||||
/**
|
||||
Cancels a pending DNS resolution request.
|
||||
|
||||
@param base the evdns_base that was used to make the request
|
||||
@param req the evdns_request that was returned by calling a resolve function
|
||||
@see evdns_base_resolve_ipv4(), evdns_base_resolve_ipv6, evdns_base_resolve_reverse
|
||||
*/
|
||||
EVENT2_EXPORT_SYMBOL
|
||||
void evdns_cancel_request(struct evdns_base *base, struct evdns_request *req);
|
||||
|
||||
/**
|
||||
Set the value of a configuration option.
|
||||
|
||||
The currently available configuration options are:
|
||||
|
||||
ndots, timeout, max-timeouts, max-inflight, attempts, randomize-case,
|
||||
bind-to, initial-probe-timeout, getaddrinfo-allow-skew,
|
||||
so-rcvbuf, so-sndbuf.
|
||||
|
||||
In versions before Libevent 2.0.3-alpha, the option name needed to end with
|
||||
a colon.
|
||||
|
||||
@param base the evdns_base to which to apply this operation
|
||||
@param option the name of the configuration option to be modified
|
||||
@param val the value to be set
|
||||
@return 0 if successful, or -1 if an error occurred
|
||||
*/
|
||||
EVENT2_EXPORT_SYMBOL
|
||||
int evdns_base_set_option(struct evdns_base *base, const char *option, const char *val);
|
||||
|
||||
|
||||
/**
|
||||
Parse a resolv.conf file.
|
||||
|
||||
The 'flags' parameter determines what information is parsed from the
|
||||
resolv.conf file. See the man page for resolv.conf for the format of this
|
||||
file.
|
||||
|
||||
The following directives are not parsed from the file: sortlist, rotate,
|
||||
no-check-names, inet6, debug.
|
||||
|
||||
If this function encounters an error, the possible return values are: 1 =
|
||||
failed to open file, 2 = failed to stat file, 3 = file too large, 4 = out of
|
||||
memory, 5 = short read from file, 6 = no nameservers listed in the file
|
||||
|
||||
@param base the evdns_base to which to apply this operation
|
||||
@param flags any of DNS_OPTION_NAMESERVERS|DNS_OPTION_SEARCH|DNS_OPTION_MISC|
|
||||
DNS_OPTION_HOSTSFILE|DNS_OPTIONS_ALL|DNS_OPTION_NAMESERVERS_NO_DEFAULT
|
||||
@param filename the path to the resolv.conf file
|
||||
@return 0 if successful, or various positive error codes if an error
|
||||
occurred (see above)
|
||||
@see resolv.conf(3), evdns_config_windows_nameservers()
|
||||
*/
|
||||
EVENT2_EXPORT_SYMBOL
|
||||
int evdns_base_resolv_conf_parse(struct evdns_base *base, int flags, const char *const filename);
|
||||
|
||||
/**
|
||||
Load an /etc/hosts-style file from 'hosts_fname' into 'base'.
|
||||
|
||||
If hosts_fname is NULL, add minimal entries for localhost, and nothing
|
||||
else.
|
||||
|
||||
Note that only evdns_getaddrinfo uses the /etc/hosts entries.
|
||||
|
||||
This function does not replace previously loaded hosts entries; to do that,
|
||||
call evdns_base_clear_host_addresses first.
|
||||
|
||||
Return 0 on success, negative on failure.
|
||||
*/
|
||||
EVENT2_EXPORT_SYMBOL
|
||||
int evdns_base_load_hosts(struct evdns_base *base, const char *hosts_fname);
|
||||
|
||||
#if defined(EVENT_IN_DOXYGEN_) || defined(_WIN32)
|
||||
/**
|
||||
Obtain nameserver information using the Windows API.
|
||||
|
||||
Attempt to configure a set of nameservers based on platform settings on
|
||||
a win32 host. Preferentially tries to use GetNetworkParams; if that fails,
|
||||
looks in the registry.
|
||||
|
||||
@return 0 if successful, or -1 if an error occurred
|
||||
@see evdns_resolv_conf_parse()
|
||||
*/
|
||||
EVENT2_EXPORT_SYMBOL
|
||||
int evdns_base_config_windows_nameservers(struct evdns_base *);
|
||||
#define EVDNS_BASE_CONFIG_WINDOWS_NAMESERVERS_IMPLEMENTED
|
||||
#endif
|
||||
|
||||
|
||||
/**
|
||||
Clear the list of search domains.
|
||||
*/
|
||||
EVENT2_EXPORT_SYMBOL
|
||||
void evdns_base_search_clear(struct evdns_base *base);
|
||||
|
||||
|
||||
/**
|
||||
Add a domain to the list of search domains
|
||||
|
||||
@param domain the domain to be added to the search list
|
||||
*/
|
||||
EVENT2_EXPORT_SYMBOL
|
||||
void evdns_base_search_add(struct evdns_base *base, const char *domain);
|
||||
|
||||
|
||||
/**
|
||||
Set the 'ndots' parameter for searches.
|
||||
|
||||
Sets the number of dots which, when found in a name, causes
|
||||
the first query to be without any search domain.
|
||||
|
||||
@param ndots the new ndots parameter
|
||||
*/
|
||||
EVENT2_EXPORT_SYMBOL
|
||||
void evdns_base_search_ndots_set(struct evdns_base *base, const int ndots);
|
||||
|
||||
/**
|
||||
A callback that is invoked when a log message is generated
|
||||
|
||||
@param is_warning indicates if the log message is a 'warning'
|
||||
@param msg the content of the log message
|
||||
*/
|
||||
typedef void (*evdns_debug_log_fn_type)(int is_warning, const char *msg);
|
||||
|
||||
|
||||
/**
|
||||
Set the callback function to handle DNS log messages. If this
|
||||
callback is not set, evdns log messages are handled with the regular
|
||||
Libevent logging system.
|
||||
|
||||
@param fn the callback to be invoked when a log message is generated
|
||||
*/
|
||||
EVENT2_EXPORT_SYMBOL
|
||||
void evdns_set_log_fn(evdns_debug_log_fn_type fn);
|
||||
|
||||
/**
|
||||
Set a callback that will be invoked to generate transaction IDs. By
|
||||
default, we pick transaction IDs based on the current clock time, which
|
||||
is bad for security.
|
||||
|
||||
@param fn the new callback, or NULL to use the default.
|
||||
|
||||
NOTE: This function has no effect in Libevent 2.0.4-alpha and later,
|
||||
since Libevent now provides its own secure RNG.
|
||||
*/
|
||||
EVENT2_EXPORT_SYMBOL
|
||||
void evdns_set_transaction_id_fn(ev_uint16_t (*fn)(void));
|
||||
|
||||
/**
|
||||
Set a callback used to generate random bytes. By default, we use
|
||||
the same function as passed to evdns_set_transaction_id_fn to generate
|
||||
bytes two at a time. If a function is provided here, it's also used
|
||||
to generate transaction IDs.
|
||||
|
||||
NOTE: This function has no effect in Libevent 2.0.4-alpha and later,
|
||||
since Libevent now provides its own secure RNG.
|
||||
*/
|
||||
EVENT2_EXPORT_SYMBOL
|
||||
void evdns_set_random_bytes_fn(void (*fn)(char *, size_t));
|
||||
|
||||
/*
|
||||
* Functions used to implement a DNS server.
|
||||
*/
|
||||
|
||||
struct evdns_server_request;
|
||||
struct evdns_server_question;
|
||||
|
||||
/**
|
||||
A callback to implement a DNS server. The callback function receives a DNS
|
||||
request. It should then optionally add a number of answers to the reply
|
||||
using the evdns_server_request_add_*_reply functions, before calling either
|
||||
evdns_server_request_respond to send the reply back, or
|
||||
evdns_server_request_drop to decline to answer the request.
|
||||
|
||||
@param req A newly received request
|
||||
@param user_data A pointer that was passed to
|
||||
evdns_add_server_port_with_base().
|
||||
*/
|
||||
typedef void (*evdns_request_callback_fn_type)(struct evdns_server_request *, void *);
|
||||
#define EVDNS_ANSWER_SECTION 0
|
||||
#define EVDNS_AUTHORITY_SECTION 1
|
||||
#define EVDNS_ADDITIONAL_SECTION 2
|
||||
|
||||
#define EVDNS_TYPE_A 1
|
||||
#define EVDNS_TYPE_NS 2
|
||||
#define EVDNS_TYPE_CNAME 5
|
||||
#define EVDNS_TYPE_SOA 6
|
||||
#define EVDNS_TYPE_PTR 12
|
||||
#define EVDNS_TYPE_MX 15
|
||||
#define EVDNS_TYPE_TXT 16
|
||||
#define EVDNS_TYPE_AAAA 28
|
||||
|
||||
#define EVDNS_QTYPE_AXFR 252
|
||||
#define EVDNS_QTYPE_ALL 255
|
||||
|
||||
#define EVDNS_CLASS_INET 1
|
||||
|
||||
/* flags that can be set in answers; as part of the err parameter */
|
||||
#define EVDNS_FLAGS_AA 0x400
|
||||
#define EVDNS_FLAGS_RD 0x080
|
||||
|
||||
/** Create a new DNS server port.
|
||||
|
||||
@param base The event base to handle events for the server port.
|
||||
@param socket A UDP socket to accept DNS requests.
|
||||
@param flags Always 0 for now.
|
||||
@param callback A function to invoke whenever we get a DNS request
|
||||
on the socket.
|
||||
@param user_data Data to pass to the callback.
|
||||
@return an evdns_server_port structure for this server port or NULL if
|
||||
an error occurred.
|
||||
*/
|
||||
EVENT2_EXPORT_SYMBOL
|
||||
struct evdns_server_port *evdns_add_server_port_with_base(struct event_base *base, evutil_socket_t socket, int flags, evdns_request_callback_fn_type callback, void *user_data);
|
||||
/** Close down a DNS server port, and free associated structures. */
|
||||
EVENT2_EXPORT_SYMBOL
|
||||
void evdns_close_server_port(struct evdns_server_port *port);
|
||||
|
||||
/** Sets some flags in a reply we're building.
|
||||
Allows setting of the AA or RD flags
|
||||
*/
|
||||
EVENT2_EXPORT_SYMBOL
|
||||
void evdns_server_request_set_flags(struct evdns_server_request *req, int flags);
|
||||
|
||||
/* Functions to add an answer to an in-progress DNS reply.
|
||||
*/
|
||||
EVENT2_EXPORT_SYMBOL
|
||||
int evdns_server_request_add_reply(struct evdns_server_request *req, int section, const char *name, int type, int dns_class, int ttl, int datalen, int is_name, const char *data);
|
||||
EVENT2_EXPORT_SYMBOL
|
||||
int evdns_server_request_add_a_reply(struct evdns_server_request *req, const char *name, int n, const void *addrs, int ttl);
|
||||
EVENT2_EXPORT_SYMBOL
|
||||
int evdns_server_request_add_aaaa_reply(struct evdns_server_request *req, const char *name, int n, const void *addrs, int ttl);
|
||||
EVENT2_EXPORT_SYMBOL
|
||||
int evdns_server_request_add_ptr_reply(struct evdns_server_request *req, struct in_addr *in, const char *inaddr_name, const char *hostname, int ttl);
|
||||
EVENT2_EXPORT_SYMBOL
|
||||
int evdns_server_request_add_cname_reply(struct evdns_server_request *req, const char *name, const char *cname, int ttl);
|
||||
|
||||
/**
|
||||
Send back a response to a DNS request, and free the request structure.
|
||||
*/
|
||||
EVENT2_EXPORT_SYMBOL
|
||||
int evdns_server_request_respond(struct evdns_server_request *req, int err);
|
||||
/**
|
||||
Free a DNS request without sending back a reply.
|
||||
*/
|
||||
EVENT2_EXPORT_SYMBOL
|
||||
int evdns_server_request_drop(struct evdns_server_request *req);
|
||||
struct sockaddr;
|
||||
/**
|
||||
Get the address that made a DNS request.
|
||||
*/
|
||||
EVENT2_EXPORT_SYMBOL
|
||||
int evdns_server_request_get_requesting_addr(struct evdns_server_request *req, struct sockaddr *sa, int addr_len);
|
||||
|
||||
/** Callback for evdns_getaddrinfo. */
|
||||
typedef void (*evdns_getaddrinfo_cb)(int result, struct evutil_addrinfo *res, void *arg);
|
||||
|
||||
struct evdns_base;
|
||||
struct evdns_getaddrinfo_request;
|
||||
/** Make a non-blocking getaddrinfo request using the dns_base in 'dns_base'.
|
||||
*
|
||||
* If we can answer the request immediately (with an error or not!), then we
|
||||
* invoke cb immediately and return NULL. Otherwise we return
|
||||
* an evdns_getaddrinfo_request and invoke cb later.
|
||||
*
|
||||
* When the callback is invoked, we pass as its first argument the error code
|
||||
* that getaddrinfo would return (or 0 for no error). As its second argument,
|
||||
* we pass the evutil_addrinfo structures we found (or NULL on error). We
|
||||
* pass 'arg' as the third argument.
|
||||
*
|
||||
* Limitations:
|
||||
*
|
||||
* - The AI_V4MAPPED and AI_ALL flags are not currently implemented.
|
||||
* - For ai_socktype, we only handle SOCKTYPE_STREAM, SOCKTYPE_UDP, and 0.
|
||||
* - For ai_protocol, we only handle IPPROTO_TCP, IPPROTO_UDP, and 0.
|
||||
*/
|
||||
EVENT2_EXPORT_SYMBOL
|
||||
struct evdns_getaddrinfo_request *evdns_getaddrinfo(
|
||||
struct evdns_base *dns_base,
|
||||
const char *nodename, const char *servname,
|
||||
const struct evutil_addrinfo *hints_in,
|
||||
evdns_getaddrinfo_cb cb, void *arg);
|
||||
|
||||
/* Cancel an in-progress evdns_getaddrinfo. This MUST NOT be called after the
|
||||
* getaddrinfo's callback has been invoked. The resolves will be canceled,
|
||||
* and the callback will be invoked with the error EVUTIL_EAI_CANCEL. */
|
||||
EVENT2_EXPORT_SYMBOL
|
||||
void evdns_getaddrinfo_cancel(struct evdns_getaddrinfo_request *req);
|
||||
|
||||
/**
|
||||
Retrieve the address of the 'idx'th configured nameserver.
|
||||
|
||||
@param base The evdns_base to examine.
|
||||
@param idx The index of the nameserver to get the address of.
|
||||
@param sa A location to receive the server's address.
|
||||
@param len The number of bytes available at sa.
|
||||
|
||||
@return the number of bytes written into sa on success. On failure, returns
|
||||
-1 if idx is greater than the number of configured nameservers, or a
|
||||
value greater than 'len' if len was not high enough.
|
||||
*/
|
||||
EVENT2_EXPORT_SYMBOL
|
||||
int evdns_base_get_nameserver_addr(struct evdns_base *base, int idx,
|
||||
struct sockaddr *sa, ev_socklen_t len);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* !EVENT2_DNS_H_INCLUDED_ */
|
||||
358
macx64/mpi/openmpi/include/event2/dns_compat.h
Normal file
358
macx64/mpi/openmpi/include/event2/dns_compat.h
Normal file
@@ -0,0 +1,358 @@
|
||||
/*
|
||||
* Copyright (c) 2006-2007 Niels Provos <provos@citi.umich.edu>
|
||||
* Copyright (c) 2007-2012 Niels Provos and Nick Mathewson
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* 3. The name of the author may not be used to endorse or promote products
|
||||
* derived from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
||||
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
||||
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
||||
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
#ifndef EVENT2_DNS_COMPAT_H_INCLUDED_
|
||||
#define EVENT2_DNS_COMPAT_H_INCLUDED_
|
||||
|
||||
/** @file event2/dns_compat.h
|
||||
|
||||
Potentially non-threadsafe versions of the functions in dns.h: provided
|
||||
only for backwards compatibility.
|
||||
|
||||
|
||||
*/
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#include <event2/event-config.h>
|
||||
#ifdef EVENT__HAVE_SYS_TYPES_H
|
||||
#include <sys/types.h>
|
||||
#endif
|
||||
#ifdef EVENT__HAVE_SYS_TIME_H
|
||||
#include <sys/time.h>
|
||||
#endif
|
||||
|
||||
/* For int types. */
|
||||
#include <event2/util.h>
|
||||
#include <event2/visibility.h>
|
||||
|
||||
/**
|
||||
Initialize the asynchronous DNS library.
|
||||
|
||||
This function initializes support for non-blocking name resolution by
|
||||
calling evdns_resolv_conf_parse() on UNIX and
|
||||
evdns_config_windows_nameservers() on Windows.
|
||||
|
||||
@deprecated This function is deprecated because it always uses the current
|
||||
event base, and is easily confused by multiple calls to event_init(), and
|
||||
so is not safe for multithreaded use. Additionally, it allocates a global
|
||||
structure that only one thread can use. The replacement is
|
||||
evdns_base_new().
|
||||
|
||||
@return 0 if successful, or -1 if an error occurred
|
||||
@see evdns_shutdown()
|
||||
*/
|
||||
EVENT2_EXPORT_SYMBOL
|
||||
int evdns_init(void);
|
||||
|
||||
struct evdns_base;
|
||||
/**
|
||||
Return the global evdns_base created by event_init() and used by the other
|
||||
deprecated functions.
|
||||
|
||||
@deprecated This function is deprecated because use of the global
|
||||
evdns_base is error-prone.
|
||||
*/
|
||||
EVENT2_EXPORT_SYMBOL
|
||||
struct evdns_base *evdns_get_global_base(void);
|
||||
|
||||
/**
|
||||
Shut down the asynchronous DNS resolver and terminate all active requests.
|
||||
|
||||
If the 'fail_requests' option is enabled, all active requests will return
|
||||
an empty result with the error flag set to DNS_ERR_SHUTDOWN. Otherwise,
|
||||
the requests will be silently discarded.
|
||||
|
||||
@deprecated This function is deprecated because it does not allow the
|
||||
caller to specify which evdns_base it applies to. The recommended
|
||||
function is evdns_base_shutdown().
|
||||
|
||||
@param fail_requests if zero, active requests will be aborted; if non-zero,
|
||||
active requests will return DNS_ERR_SHUTDOWN.
|
||||
@see evdns_init()
|
||||
*/
|
||||
EVENT2_EXPORT_SYMBOL
|
||||
void evdns_shutdown(int fail_requests);
|
||||
|
||||
/**
|
||||
Add a nameserver.
|
||||
|
||||
The address should be an IPv4 address in network byte order.
|
||||
The type of address is chosen so that it matches in_addr.s_addr.
|
||||
|
||||
@deprecated This function is deprecated because it does not allow the
|
||||
caller to specify which evdns_base it applies to. The recommended
|
||||
function is evdns_base_nameserver_add().
|
||||
|
||||
@param address an IP address in network byte order
|
||||
@return 0 if successful, or -1 if an error occurred
|
||||
@see evdns_nameserver_ip_add()
|
||||
*/
|
||||
EVENT2_EXPORT_SYMBOL
|
||||
int evdns_nameserver_add(unsigned long int address);
|
||||
|
||||
/**
|
||||
Get the number of configured nameservers.
|
||||
|
||||
This returns the number of configured nameservers (not necessarily the
|
||||
number of running nameservers). This is useful for double-checking
|
||||
whether our calls to the various nameserver configuration functions
|
||||
have been successful.
|
||||
|
||||
@deprecated This function is deprecated because it does not allow the
|
||||
caller to specify which evdns_base it applies to. The recommended
|
||||
function is evdns_base_count_nameservers().
|
||||
|
||||
@return the number of configured nameservers
|
||||
@see evdns_nameserver_add()
|
||||
*/
|
||||
EVENT2_EXPORT_SYMBOL
|
||||
int evdns_count_nameservers(void);
|
||||
|
||||
/**
|
||||
Remove all configured nameservers, and suspend all pending resolves.
|
||||
|
||||
Resolves will not necessarily be re-attempted until evdns_resume() is called.
|
||||
|
||||
@deprecated This function is deprecated because it does not allow the
|
||||
caller to specify which evdns_base it applies to. The recommended
|
||||
function is evdns_base_clear_nameservers_and_suspend().
|
||||
|
||||
@return 0 if successful, or -1 if an error occurred
|
||||
@see evdns_resume()
|
||||
*/
|
||||
EVENT2_EXPORT_SYMBOL
|
||||
int evdns_clear_nameservers_and_suspend(void);
|
||||
|
||||
/**
|
||||
Resume normal operation and continue any suspended resolve requests.
|
||||
|
||||
Re-attempt resolves left in limbo after an earlier call to
|
||||
evdns_clear_nameservers_and_suspend().
|
||||
|
||||
@deprecated This function is deprecated because it does not allow the
|
||||
caller to specify which evdns_base it applies to. The recommended
|
||||
function is evdns_base_resume().
|
||||
|
||||
@return 0 if successful, or -1 if an error occurred
|
||||
@see evdns_clear_nameservers_and_suspend()
|
||||
*/
|
||||
EVENT2_EXPORT_SYMBOL
|
||||
int evdns_resume(void);
|
||||
|
||||
/**
|
||||
Add a nameserver.
|
||||
|
||||
This wraps the evdns_nameserver_add() function by parsing a string as an IP
|
||||
address and adds it as a nameserver.
|
||||
|
||||
@deprecated This function is deprecated because it does not allow the
|
||||
caller to specify which evdns_base it applies to. The recommended
|
||||
function is evdns_base_nameserver_ip_add().
|
||||
|
||||
@return 0 if successful, or -1 if an error occurred
|
||||
@see evdns_nameserver_add()
|
||||
*/
|
||||
EVENT2_EXPORT_SYMBOL
|
||||
int evdns_nameserver_ip_add(const char *ip_as_string);
|
||||
|
||||
/**
|
||||
Lookup an A record for a given name.
|
||||
|
||||
@deprecated This function is deprecated because it does not allow the
|
||||
caller to specify which evdns_base it applies to. The recommended
|
||||
function is evdns_base_resolve_ipv4().
|
||||
|
||||
@param name a DNS hostname
|
||||
@param flags either 0, or DNS_QUERY_NO_SEARCH to disable searching for this query.
|
||||
@param callback a callback function to invoke when the request is completed
|
||||
@param ptr an argument to pass to the callback function
|
||||
@return 0 if successful, or -1 if an error occurred
|
||||
@see evdns_resolve_ipv6(), evdns_resolve_reverse(), evdns_resolve_reverse_ipv6()
|
||||
*/
|
||||
EVENT2_EXPORT_SYMBOL
|
||||
int evdns_resolve_ipv4(const char *name, int flags, evdns_callback_type callback, void *ptr);
|
||||
|
||||
/**
|
||||
Lookup an AAAA record for a given name.
|
||||
|
||||
@param name a DNS hostname
|
||||
@param flags either 0, or DNS_QUERY_NO_SEARCH to disable searching for this query.
|
||||
@param callback a callback function to invoke when the request is completed
|
||||
@param ptr an argument to pass to the callback function
|
||||
@return 0 if successful, or -1 if an error occurred
|
||||
@see evdns_resolve_ipv4(), evdns_resolve_reverse(), evdns_resolve_reverse_ipv6()
|
||||
*/
|
||||
EVENT2_EXPORT_SYMBOL
|
||||
int evdns_resolve_ipv6(const char *name, int flags, evdns_callback_type callback, void *ptr);
|
||||
|
||||
struct in_addr;
|
||||
struct in6_addr;
|
||||
|
||||
/**
|
||||
Lookup a PTR record for a given IP address.
|
||||
|
||||
@deprecated This function is deprecated because it does not allow the
|
||||
caller to specify which evdns_base it applies to. The recommended
|
||||
function is evdns_base_resolve_reverse().
|
||||
|
||||
@param in an IPv4 address
|
||||
@param flags either 0, or DNS_QUERY_NO_SEARCH to disable searching for this query.
|
||||
@param callback a callback function to invoke when the request is completed
|
||||
@param ptr an argument to pass to the callback function
|
||||
@return 0 if successful, or -1 if an error occurred
|
||||
@see evdns_resolve_reverse_ipv6()
|
||||
*/
|
||||
EVENT2_EXPORT_SYMBOL
|
||||
int evdns_resolve_reverse(const struct in_addr *in, int flags, evdns_callback_type callback, void *ptr);
|
||||
|
||||
/**
|
||||
Lookup a PTR record for a given IPv6 address.
|
||||
|
||||
@deprecated This function is deprecated because it does not allow the
|
||||
caller to specify which evdns_base it applies to. The recommended
|
||||
function is evdns_base_resolve_reverse_ipv6().
|
||||
|
||||
@param in an IPv6 address
|
||||
@param flags either 0, or DNS_QUERY_NO_SEARCH to disable searching for this query.
|
||||
@param callback a callback function to invoke when the request is completed
|
||||
@param ptr an argument to pass to the callback function
|
||||
@return 0 if successful, or -1 if an error occurred
|
||||
@see evdns_resolve_reverse_ipv6()
|
||||
*/
|
||||
EVENT2_EXPORT_SYMBOL
|
||||
int evdns_resolve_reverse_ipv6(const struct in6_addr *in, int flags, evdns_callback_type callback, void *ptr);
|
||||
|
||||
/**
|
||||
Set the value of a configuration option.
|
||||
|
||||
The currently available configuration options are:
|
||||
|
||||
ndots, timeout, max-timeouts, max-inflight, and attempts
|
||||
|
||||
@deprecated This function is deprecated because it does not allow the
|
||||
caller to specify which evdns_base it applies to. The recommended
|
||||
function is evdns_base_set_option().
|
||||
|
||||
@param option the name of the configuration option to be modified
|
||||
@param val the value to be set
|
||||
@param flags Ignored.
|
||||
@return 0 if successful, or -1 if an error occurred
|
||||
*/
|
||||
EVENT2_EXPORT_SYMBOL
|
||||
int evdns_set_option(const char *option, const char *val, int flags);
|
||||
|
||||
/**
|
||||
Parse a resolv.conf file.
|
||||
|
||||
The 'flags' parameter determines what information is parsed from the
|
||||
resolv.conf file. See the man page for resolv.conf for the format of this
|
||||
file.
|
||||
|
||||
The following directives are not parsed from the file: sortlist, rotate,
|
||||
no-check-names, inet6, debug.
|
||||
|
||||
If this function encounters an error, the possible return values are: 1 =
|
||||
failed to open file, 2 = failed to stat file, 3 = file too large, 4 = out of
|
||||
memory, 5 = short read from file, 6 = no nameservers listed in the file
|
||||
|
||||
@deprecated This function is deprecated because it does not allow the
|
||||
caller to specify which evdns_base it applies to. The recommended
|
||||
function is evdns_base_resolv_conf_parse().
|
||||
|
||||
@param flags any of DNS_OPTION_NAMESERVERS|DNS_OPTION_SEARCH|DNS_OPTION_MISC|
|
||||
DNS_OPTIONS_ALL
|
||||
@param filename the path to the resolv.conf file
|
||||
@return 0 if successful, or various positive error codes if an error
|
||||
occurred (see above)
|
||||
@see resolv.conf(3), evdns_config_windows_nameservers()
|
||||
*/
|
||||
EVENT2_EXPORT_SYMBOL
|
||||
int evdns_resolv_conf_parse(int flags, const char *const filename);
|
||||
|
||||
/**
|
||||
Clear the list of search domains.
|
||||
|
||||
@deprecated This function is deprecated because it does not allow the
|
||||
caller to specify which evdns_base it applies to. The recommended
|
||||
function is evdns_base_search_clear().
|
||||
*/
|
||||
EVENT2_EXPORT_SYMBOL
|
||||
void evdns_search_clear(void);
|
||||
|
||||
/**
|
||||
Add a domain to the list of search domains
|
||||
|
||||
@deprecated This function is deprecated because it does not allow the
|
||||
caller to specify which evdns_base it applies to. The recommended
|
||||
function is evdns_base_search_add().
|
||||
|
||||
@param domain the domain to be added to the search list
|
||||
*/
|
||||
EVENT2_EXPORT_SYMBOL
|
||||
void evdns_search_add(const char *domain);
|
||||
|
||||
/**
|
||||
Set the 'ndots' parameter for searches.
|
||||
|
||||
Sets the number of dots which, when found in a name, causes
|
||||
the first query to be without any search domain.
|
||||
|
||||
@deprecated This function is deprecated because it does not allow the
|
||||
caller to specify which evdns_base it applies to. The recommended
|
||||
function is evdns_base_search_ndots_set().
|
||||
|
||||
@param ndots the new ndots parameter
|
||||
*/
|
||||
EVENT2_EXPORT_SYMBOL
|
||||
void evdns_search_ndots_set(const int ndots);
|
||||
|
||||
/**
|
||||
As evdns_server_new_with_base.
|
||||
|
||||
@deprecated This function is deprecated because it does not allow the
|
||||
caller to specify which even_base it uses. The recommended
|
||||
function is evdns_add_server_port_with_base().
|
||||
|
||||
*/
|
||||
EVENT2_EXPORT_SYMBOL
|
||||
struct evdns_server_port *
|
||||
evdns_add_server_port(evutil_socket_t socket, int flags,
|
||||
evdns_request_callback_fn_type callback, void *user_data);
|
||||
|
||||
#ifdef _WIN32
|
||||
EVENT2_EXPORT_SYMBOL
|
||||
int evdns_config_windows_nameservers(void);
|
||||
#define EVDNS_CONFIG_WINDOWS_NAMESERVERS_IMPLEMENTED
|
||||
#endif
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* EVENT2_EVENT_COMPAT_H_INCLUDED_ */
|
||||
80
macx64/mpi/openmpi/include/event2/dns_struct.h
Normal file
80
macx64/mpi/openmpi/include/event2/dns_struct.h
Normal file
@@ -0,0 +1,80 @@
|
||||
/*
|
||||
* Copyright (c) 2000-2007 Niels Provos <provos@citi.umich.edu>
|
||||
* Copyright (c) 2007-2012 Niels Provos and Nick Mathewson
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* 3. The name of the author may not be used to endorse or promote products
|
||||
* derived from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
||||
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
||||
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
||||
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
#ifndef EVENT2_DNS_STRUCT_H_INCLUDED_
|
||||
#define EVENT2_DNS_STRUCT_H_INCLUDED_
|
||||
|
||||
/** @file event2/dns_struct.h
|
||||
|
||||
Data structures for dns. Using these structures may hurt forward
|
||||
compatibility with later versions of Libevent: be careful!
|
||||
|
||||
*/
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#include <event2/event-config.h>
|
||||
#ifdef EVENT__HAVE_SYS_TYPES_H
|
||||
#include <sys/types.h>
|
||||
#endif
|
||||
#ifdef EVENT__HAVE_SYS_TIME_H
|
||||
#include <sys/time.h>
|
||||
#endif
|
||||
|
||||
/* For int types. */
|
||||
#include <event2/util.h>
|
||||
|
||||
/*
|
||||
* Structures used to implement a DNS server.
|
||||
*/
|
||||
|
||||
struct evdns_server_request {
|
||||
int flags;
|
||||
int nquestions;
|
||||
struct evdns_server_question **questions;
|
||||
};
|
||||
struct evdns_server_question {
|
||||
int type;
|
||||
#ifdef __cplusplus
|
||||
int dns_question_class;
|
||||
#else
|
||||
/* You should refer to this field as "dns_question_class". The
|
||||
* name "class" works in C for backward compatibility, and will be
|
||||
* removed in a future version. (1.5 or later). */
|
||||
int class;
|
||||
#define dns_question_class class
|
||||
#endif
|
||||
char name[1];
|
||||
};
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* EVENT2_DNS_STRUCT_H_INCLUDED_ */
|
||||
|
||||
640
macx64/mpi/openmpi/include/event2/event-config.h
Normal file
640
macx64/mpi/openmpi/include/event2/event-config.h
Normal file
@@ -0,0 +1,640 @@
|
||||
/* event2/event-config.h
|
||||
*
|
||||
* This file was generated by autoconf when libevent was built, and post-
|
||||
* processed by Libevent so that its macros would have a uniform prefix.
|
||||
*
|
||||
* DO NOT EDIT THIS FILE.
|
||||
*
|
||||
* Do not rely on macros in this file existing in later versions.
|
||||
*/
|
||||
|
||||
#ifndef EVENT2_EVENT_CONFIG_H_INCLUDED_
|
||||
#define EVENT2_EVENT_CONFIG_H_INCLUDED_
|
||||
|
||||
/* config.h. Generated from config.h.in by configure. */
|
||||
/* config.h.in. Generated from configure.ac by autoheader. */
|
||||
|
||||
/* Define if libevent should build without support for a debug mode */
|
||||
/* #undef EVENT__DISABLE_DEBUG_MODE */
|
||||
|
||||
/* Define if libevent should not allow replacing the mm functions */
|
||||
/* #undef EVENT__DISABLE_MM_REPLACEMENT */
|
||||
|
||||
/* Define if libevent should not be compiled with thread support */
|
||||
/* #undef EVENT__DISABLE_THREAD_SUPPORT */
|
||||
|
||||
/* Define to 1 if you have the 'accept4' function. */
|
||||
/* #undef EVENT__HAVE_ACCEPT4 */
|
||||
|
||||
/* Define to 1 if you have the <afunix.h> header file. */
|
||||
/* #undef EVENT__HAVE_AFUNIX_H */
|
||||
|
||||
/* Define to 1 if you have the 'arc4random' function. */
|
||||
#define EVENT__HAVE_ARC4RANDOM 1
|
||||
|
||||
/* Define to 1 if you have the 'arc4random_addrandom' function. */
|
||||
#define EVENT__HAVE_ARC4RANDOM_ADDRANDOM 1
|
||||
|
||||
/* Define to 1 if you have the 'arc4random_buf' function. */
|
||||
#define EVENT__HAVE_ARC4RANDOM_BUF 1
|
||||
|
||||
/* Define to 1 if you have the <arpa/inet.h> header file. */
|
||||
#define EVENT__HAVE_ARPA_INET_H 1
|
||||
|
||||
/* Define to 1 if you have the 'clock_gettime' function. */
|
||||
#define EVENT__HAVE_CLOCK_GETTIME 1
|
||||
|
||||
/* Define to 1 if you have the declaration of 'CTL_KERN', and to 0 if you
|
||||
don't. */
|
||||
#define EVENT__HAVE_DECL_CTL_KERN 1
|
||||
|
||||
/* Define to 1 if you have the declaration of 'KERN_ARND', and to 0 if you
|
||||
don't. */
|
||||
#define EVENT__HAVE_DECL_KERN_ARND 0
|
||||
|
||||
/* Define if /dev/poll is available */
|
||||
/* #undef EVENT__HAVE_DEVPOLL */
|
||||
|
||||
/* Define to 1 if you have the <dlfcn.h> header file. */
|
||||
#define EVENT__HAVE_DLFCN_H 1
|
||||
|
||||
/* Define if your system supports the epoll system calls */
|
||||
/* #undef EVENT__HAVE_EPOLL */
|
||||
|
||||
/* Define to 1 if you have the 'epoll_create1' function. */
|
||||
/* #undef EVENT__HAVE_EPOLL_CREATE1 */
|
||||
|
||||
/* Define to 1 if you have the 'epoll_ctl' function. */
|
||||
/* #undef EVENT__HAVE_EPOLL_CTL */
|
||||
|
||||
/* Define to 1 if you have the <errno.h> header file. */
|
||||
#define EVENT__HAVE_ERRNO_H 1
|
||||
|
||||
/* Define to 1 if you have the 'eventfd' function. */
|
||||
/* #undef EVENT__HAVE_EVENTFD */
|
||||
|
||||
/* Define if your system supports event ports */
|
||||
/* #undef EVENT__HAVE_EVENT_PORTS */
|
||||
|
||||
/* Define to 1 if you have the 'fcntl' function. */
|
||||
#define EVENT__HAVE_FCNTL 1
|
||||
|
||||
/* Define to 1 if you have the <fcntl.h> header file. */
|
||||
#define EVENT__HAVE_FCNTL_H 1
|
||||
|
||||
/* Define to 1 if the system has the type 'fd_mask'. */
|
||||
#define EVENT__HAVE_FD_MASK 1
|
||||
|
||||
/* Do we have getaddrinfo()? */
|
||||
#define EVENT__HAVE_GETADDRINFO 1
|
||||
|
||||
/* Define to 1 if you have the 'getegid' function. */
|
||||
#define EVENT__HAVE_GETEGID 1
|
||||
|
||||
/* Define to 1 if you have the 'geteuid' function. */
|
||||
#define EVENT__HAVE_GETEUID 1
|
||||
|
||||
/* Define this if you have any gethostbyname_r() */
|
||||
/* #undef EVENT__HAVE_GETHOSTBYNAME_R */
|
||||
|
||||
/* Define this if gethostbyname_r takes 3 arguments */
|
||||
/* #undef EVENT__HAVE_GETHOSTBYNAME_R_3_ARG */
|
||||
|
||||
/* Define this if gethostbyname_r takes 5 arguments */
|
||||
/* #undef EVENT__HAVE_GETHOSTBYNAME_R_5_ARG */
|
||||
|
||||
/* Define this if gethostbyname_r takes 6 arguments */
|
||||
/* #undef EVENT__HAVE_GETHOSTBYNAME_R_6_ARG */
|
||||
|
||||
/* Define to 1 if you have the 'getifaddrs' function. */
|
||||
#define EVENT__HAVE_GETIFADDRS 1
|
||||
|
||||
/* Define to 1 if you have the 'getnameinfo' function. */
|
||||
#define EVENT__HAVE_GETNAMEINFO 1
|
||||
|
||||
/* Define to 1 if you have the 'getprotobynumber' function. */
|
||||
#define EVENT__HAVE_GETPROTOBYNUMBER 1
|
||||
|
||||
/* Define to 1 if you have the 'getrandom' function. */
|
||||
/* #undef EVENT__HAVE_GETRANDOM */
|
||||
|
||||
/* Define to 1 if you have the 'getservbyname' function. */
|
||||
#define EVENT__HAVE_GETSERVBYNAME 1
|
||||
|
||||
/* Define to 1 if you have the 'gettimeofday' function. */
|
||||
#define EVENT__HAVE_GETTIMEOFDAY 1
|
||||
|
||||
/* Define to 1 if you have the <ifaddrs.h> header file. */
|
||||
#define EVENT__HAVE_IFADDRS_H 1
|
||||
|
||||
/* Define to 1 if you have the 'inet_ntop' function. */
|
||||
#define EVENT__HAVE_INET_NTOP 1
|
||||
|
||||
/* Define to 1 if you have the 'inet_pton' function. */
|
||||
#define EVENT__HAVE_INET_PTON 1
|
||||
|
||||
/* Define to 1 if you have the <inttypes.h> header file. */
|
||||
#define EVENT__HAVE_INTTYPES_H 1
|
||||
|
||||
/* Define to 1 if you have the 'issetugid' function. */
|
||||
#define EVENT__HAVE_ISSETUGID 1
|
||||
|
||||
/* Define to 1 if you have the 'kqueue' function. */
|
||||
#define EVENT__HAVE_KQUEUE 1
|
||||
|
||||
/* Define to 1 if you have the 'ws2_32' library (-lws2_32). */
|
||||
/* #undef EVENT__HAVE_LIBWS2_32 */
|
||||
|
||||
/* Define if the system has zlib */
|
||||
#define EVENT__HAVE_LIBZ 1
|
||||
|
||||
/* Define to 1 if you have the 'mach_absolute_time' function. */
|
||||
#define EVENT__HAVE_MACH_ABSOLUTE_TIME 1
|
||||
|
||||
/* Define to 1 if you have the <mach/mach.h> header file. */
|
||||
#define EVENT__HAVE_MACH_MACH_H 1
|
||||
|
||||
/* Define to 1 if you have the <mach/mach_time.h> header file. */
|
||||
#define EVENT__HAVE_MACH_MACH_TIME_H 1
|
||||
|
||||
/* Define to 1 if you have the <minix/config.h> header file. */
|
||||
/* #undef EVENT__HAVE_MINIX_CONFIG_H */
|
||||
|
||||
/* Define to 1 if you have the 'mmap' function. */
|
||||
#define EVENT__HAVE_MMAP 1
|
||||
|
||||
/* Define to 1 if you have the 'nanosleep' function. */
|
||||
#define EVENT__HAVE_NANOSLEEP 1
|
||||
|
||||
/* Define to 1 if you have the <netdb.h> header file. */
|
||||
#define EVENT__HAVE_NETDB_H 1
|
||||
|
||||
/* Define to 1 if you have the <netinet/in6.h> header file. */
|
||||
/* #undef EVENT__HAVE_NETINET_IN6_H */
|
||||
|
||||
/* Define to 1 if you have the <netinet/in.h> header file. */
|
||||
#define EVENT__HAVE_NETINET_IN_H 1
|
||||
|
||||
/* Define to 1 if you have the <netinet/tcp.h> header file. */
|
||||
#define EVENT__HAVE_NETINET_TCP_H 1
|
||||
|
||||
/* Define if the system has openssl */
|
||||
/* #undef EVENT__HAVE_OPENSSL */
|
||||
|
||||
/* Define to 1 if you have the <openssl/ssl.h> header file. */
|
||||
/* #undef EVENT__HAVE_OPENSSL_SSL_H */
|
||||
|
||||
/* Define to 1 if you have the 'pipe' function. */
|
||||
#define EVENT__HAVE_PIPE 1
|
||||
|
||||
/* Define to 1 if you have the 'pipe2' function. */
|
||||
/* #undef EVENT__HAVE_PIPE2 */
|
||||
|
||||
/* Define to 1 if you have the 'poll' function. */
|
||||
#define EVENT__HAVE_POLL 1
|
||||
|
||||
/* Define to 1 if you have the <poll.h> header file. */
|
||||
#define EVENT__HAVE_POLL_H 1
|
||||
|
||||
/* Define to 1 if you have the 'port_create' function. */
|
||||
/* #undef EVENT__HAVE_PORT_CREATE */
|
||||
|
||||
/* Define to 1 if you have the <port.h> header file. */
|
||||
/* #undef EVENT__HAVE_PORT_H */
|
||||
|
||||
/* Define if you have POSIX threads libraries and header files. */
|
||||
/* #undef EVENT__HAVE_PTHREAD */
|
||||
|
||||
/* Define if we have pthreads on this system */
|
||||
#define EVENT__HAVE_PTHREADS 1
|
||||
|
||||
/* Define to 1 if you have the 'putenv' function. */
|
||||
#define EVENT__HAVE_PUTENV 1
|
||||
|
||||
/* Define to 1 if the system has the type 'sa_family_t'. */
|
||||
#define EVENT__HAVE_SA_FAMILY_T 1
|
||||
|
||||
/* Define to 1 if you have the 'select' function. */
|
||||
#define EVENT__HAVE_SELECT 1
|
||||
|
||||
/* Define to 1 if you have the 'sendfile' function. */
|
||||
#define EVENT__HAVE_SENDFILE 1
|
||||
|
||||
/* Define to 1 if you have the 'setenv' function. */
|
||||
#define EVENT__HAVE_SETENV 1
|
||||
|
||||
/* Define if F_SETFD is defined in <fcntl.h> */
|
||||
#define EVENT__HAVE_SETFD 1
|
||||
|
||||
/* Define to 1 if you have the 'setrlimit' function. */
|
||||
#define EVENT__HAVE_SETRLIMIT 1
|
||||
|
||||
/* Define to 1 if you have the 'sigaction' function. */
|
||||
#define EVENT__HAVE_SIGACTION 1
|
||||
|
||||
/* Define to 1 if you have the 'signal' function. */
|
||||
#define EVENT__HAVE_SIGNAL 1
|
||||
|
||||
/* Define to 1 if you have the 'splice' function. */
|
||||
/* #undef EVENT__HAVE_SPLICE */
|
||||
|
||||
/* Define to 1 if you have the <stdarg.h> header file. */
|
||||
#define EVENT__HAVE_STDARG_H 1
|
||||
|
||||
/* Define to 1 if you have the <stddef.h> header file. */
|
||||
#define EVENT__HAVE_STDDEF_H 1
|
||||
|
||||
/* Define to 1 if you have the <stdint.h> header file. */
|
||||
#define EVENT__HAVE_STDINT_H 1
|
||||
|
||||
/* Define to 1 if you have the <stdio.h> header file. */
|
||||
#define EVENT__HAVE_STDIO_H 1
|
||||
|
||||
/* Define to 1 if you have the <stdlib.h> header file. */
|
||||
#define EVENT__HAVE_STDLIB_H 1
|
||||
|
||||
/* Define to 1 if you have the <strings.h> header file. */
|
||||
#define EVENT__HAVE_STRINGS_H 1
|
||||
|
||||
/* Define to 1 if you have the <string.h> header file. */
|
||||
#define EVENT__HAVE_STRING_H 1
|
||||
|
||||
/* Define to 1 if you have the 'strlcpy' function. */
|
||||
#define EVENT__HAVE_STRLCPY 1
|
||||
|
||||
/* Define to 1 if you have the 'strsep' function. */
|
||||
#define EVENT__HAVE_STRSEP 1
|
||||
|
||||
/* Define to 1 if you have the 'strtok_r' function. */
|
||||
#define EVENT__HAVE_STRTOK_R 1
|
||||
|
||||
/* Define to 1 if you have the 'strtoll' function. */
|
||||
#define EVENT__HAVE_STRTOLL 1
|
||||
|
||||
/* Define to 1 if the system has the type 'struct addrinfo'. */
|
||||
#define EVENT__HAVE_STRUCT_ADDRINFO 1
|
||||
|
||||
/* Define to 1 if the system has the type 'struct in6_addr'. */
|
||||
#define EVENT__HAVE_STRUCT_IN6_ADDR 1
|
||||
|
||||
/* Define to 1 if 's6_addr16' is a member of 'struct in6_addr'. */
|
||||
/* #undef EVENT__HAVE_STRUCT_IN6_ADDR_S6_ADDR16 */
|
||||
|
||||
/* Define to 1 if 's6_addr32' is a member of 'struct in6_addr'. */
|
||||
/* #undef EVENT__HAVE_STRUCT_IN6_ADDR_S6_ADDR32 */
|
||||
|
||||
/* Define to 1 if the system has the type 'struct linger'. */
|
||||
#define EVENT__HAVE_STRUCT_LINGER 1
|
||||
|
||||
/* Define to 1 if the system has the type 'struct sockaddr_in6'. */
|
||||
#define EVENT__HAVE_STRUCT_SOCKADDR_IN6 1
|
||||
|
||||
/* Define to 1 if 'sin6_len' is a member of 'struct sockaddr_in6'. */
|
||||
#define EVENT__HAVE_STRUCT_SOCKADDR_IN6_SIN6_LEN 1
|
||||
|
||||
/* Define to 1 if 'sin_len' is a member of 'struct sockaddr_in'. */
|
||||
#define EVENT__HAVE_STRUCT_SOCKADDR_IN_SIN_LEN 1
|
||||
|
||||
/* Define to 1 if the system has the type 'struct sockaddr_storage'. */
|
||||
#define EVENT__HAVE_STRUCT_SOCKADDR_STORAGE 1
|
||||
|
||||
/* Define to 1 if 'ss_family' is a member of 'struct sockaddr_storage'. */
|
||||
#define EVENT__HAVE_STRUCT_SOCKADDR_STORAGE_SS_FAMILY 1
|
||||
|
||||
/* Define to 1 if '__ss_family' is a member of 'struct sockaddr_storage'. */
|
||||
/* #undef EVENT__HAVE_STRUCT_SOCKADDR_STORAGE___SS_FAMILY */
|
||||
|
||||
/* Define to 1 if the system has the type 'struct sockaddr_un'. */
|
||||
#define EVENT__HAVE_STRUCT_SOCKADDR_UN 1
|
||||
|
||||
/* Define to 1 if you have the 'sysctl' function. */
|
||||
#define EVENT__HAVE_SYSCTL 1
|
||||
|
||||
/* Define to 1 if you have the <sys/devpoll.h> header file. */
|
||||
/* #undef EVENT__HAVE_SYS_DEVPOLL_H */
|
||||
|
||||
/* Define to 1 if you have the <sys/epoll.h> header file. */
|
||||
/* #undef EVENT__HAVE_SYS_EPOLL_H */
|
||||
|
||||
/* Define to 1 if you have the <sys/eventfd.h> header file. */
|
||||
/* #undef EVENT__HAVE_SYS_EVENTFD_H */
|
||||
|
||||
/* Define to 1 if you have the <sys/event.h> header file. */
|
||||
#define EVENT__HAVE_SYS_EVENT_H 1
|
||||
|
||||
/* Define to 1 if you have the <sys/ioctl.h> header file. */
|
||||
#define EVENT__HAVE_SYS_IOCTL_H 1
|
||||
|
||||
/* Define to 1 if you have the <sys/mman.h> header file. */
|
||||
#define EVENT__HAVE_SYS_MMAN_H 1
|
||||
|
||||
/* Define to 1 if you have the <sys/param.h> header file. */
|
||||
#define EVENT__HAVE_SYS_PARAM_H 1
|
||||
|
||||
/* Define to 1 if you have the <sys/queue.h> header file. */
|
||||
#define EVENT__HAVE_SYS_QUEUE_H 1
|
||||
|
||||
/* Define to 1 if you have the <sys/random.h> header file. */
|
||||
#define EVENT__HAVE_SYS_RANDOM_H 1
|
||||
|
||||
/* Define to 1 if you have the <sys/resource.h> header file. */
|
||||
#define EVENT__HAVE_SYS_RESOURCE_H 1
|
||||
|
||||
/* Define to 1 if you have the <sys/select.h> header file. */
|
||||
#define EVENT__HAVE_SYS_SELECT_H 1
|
||||
|
||||
/* Define to 1 if you have the <sys/sendfile.h> header file. */
|
||||
/* #undef EVENT__HAVE_SYS_SENDFILE_H */
|
||||
|
||||
/* Define to 1 if you have the <sys/socket.h> header file. */
|
||||
#define EVENT__HAVE_SYS_SOCKET_H 1
|
||||
|
||||
/* Define to 1 if you have the <sys/stat.h> header file. */
|
||||
#define EVENT__HAVE_SYS_STAT_H 1
|
||||
|
||||
/* Define to 1 if you have the <sys/sysctl.h> header file. */
|
||||
#define EVENT__HAVE_SYS_SYSCTL_H 1
|
||||
|
||||
/* Define to 1 if you have the <sys/timerfd.h> header file. */
|
||||
/* #undef EVENT__HAVE_SYS_TIMERFD_H */
|
||||
|
||||
/* Define to 1 if you have the <sys/time.h> header file. */
|
||||
#define EVENT__HAVE_SYS_TIME_H 1
|
||||
|
||||
/* Define to 1 if you have the <sys/types.h> header file. */
|
||||
#define EVENT__HAVE_SYS_TYPES_H 1
|
||||
|
||||
/* Define to 1 if you have the <sys/uio.h> header file. */
|
||||
#define EVENT__HAVE_SYS_UIO_H 1
|
||||
|
||||
/* Define to 1 if you have the <sys/un.h> header file. */
|
||||
#define EVENT__HAVE_SYS_UN_H 1
|
||||
|
||||
/* Define to 1 if you have the <sys/wait.h> header file. */
|
||||
#define EVENT__HAVE_SYS_WAIT_H 1
|
||||
|
||||
/* Define if TAILQ_FOREACH is defined in <sys/queue.h> */
|
||||
#define EVENT__HAVE_TAILQFOREACH 1
|
||||
|
||||
/* Define if timeradd is defined in <sys/time.h> */
|
||||
#define EVENT__HAVE_TIMERADD 1
|
||||
|
||||
/* Define if timerclear is defined in <sys/time.h> */
|
||||
#define EVENT__HAVE_TIMERCLEAR 1
|
||||
|
||||
/* Define if timercmp is defined in <sys/time.h> */
|
||||
#define EVENT__HAVE_TIMERCMP 1
|
||||
|
||||
/* Define to 1 if you have the 'timerfd_create' function. */
|
||||
/* #undef EVENT__HAVE_TIMERFD_CREATE */
|
||||
|
||||
/* Define if timerisset is defined in <sys/time.h> */
|
||||
#define EVENT__HAVE_TIMERISSET 1
|
||||
|
||||
/* Define to 1 if the system has the type 'uint16_t'. */
|
||||
#define EVENT__HAVE_UINT16_T 1
|
||||
|
||||
/* Define to 1 if the system has the type 'uint32_t'. */
|
||||
#define EVENT__HAVE_UINT32_T 1
|
||||
|
||||
/* Define to 1 if the system has the type 'uint64_t'. */
|
||||
#define EVENT__HAVE_UINT64_T 1
|
||||
|
||||
/* Define to 1 if the system has the type 'uint8_t'. */
|
||||
#define EVENT__HAVE_UINT8_T 1
|
||||
|
||||
/* Define to 1 if the system has the type 'uintptr_t'. */
|
||||
#define EVENT__HAVE_UINTPTR_T 1
|
||||
|
||||
/* Define to 1 if you have the 'umask' function. */
|
||||
#define EVENT__HAVE_UMASK 1
|
||||
|
||||
/* Define to 1 if you have the <unistd.h> header file. */
|
||||
#define EVENT__HAVE_UNISTD_H 1
|
||||
|
||||
/* Define to 1 if you have the 'unsetenv' function. */
|
||||
#define EVENT__HAVE_UNSETENV 1
|
||||
|
||||
/* Define to 1 if you have the 'usleep' function. */
|
||||
#define EVENT__HAVE_USLEEP 1
|
||||
|
||||
/* Define to 1 if you have the 'vasprintf' function. */
|
||||
#define EVENT__HAVE_VASPRINTF 1
|
||||
|
||||
/* Define to 1 if you have the <wchar.h> header file. */
|
||||
#define EVENT__HAVE_WCHAR_H 1
|
||||
|
||||
/* Define if kqueue works correctly with pipes */
|
||||
#define EVENT__HAVE_WORKING_KQUEUE 1
|
||||
|
||||
/* Define to 1 if you have the <zlib.h> header file. */
|
||||
#define EVENT__HAVE_ZLIB_H 1
|
||||
|
||||
/* Define to 1 if you have the '_gmtime64' function. */
|
||||
/* #undef EVENT__HAVE__GMTIME64 */
|
||||
|
||||
/* Define to 1 if you have the '_gmtime64_s' function. */
|
||||
/* #undef EVENT__HAVE__GMTIME64_S */
|
||||
|
||||
/* Define to 1 if compiler have __FUNCTION__ */
|
||||
#define EVENT__HAVE___FUNCTION__ 1
|
||||
|
||||
/* Define to 1 if compiler have __func__ */
|
||||
#define EVENT__HAVE___func__ 1
|
||||
|
||||
/* Define to the sub-directory where libtool stores uninstalled libraries. */
|
||||
#define EVENT__LT_OBJDIR ".libs/"
|
||||
|
||||
/* Numeric representation of the version */
|
||||
#define EVENT__NUMERIC_VERSION 0x02010c00
|
||||
|
||||
/* Name of package */
|
||||
#define EVENT__PACKAGE "libevent"
|
||||
|
||||
/* Define to the address where bug reports for this package should be sent. */
|
||||
#define EVENT__PACKAGE_BUGREPORT ""
|
||||
|
||||
/* Define to the full name of this package. */
|
||||
#define EVENT__PACKAGE_NAME "libevent"
|
||||
|
||||
/* Define to the full name and version of this package. */
|
||||
#define EVENT__PACKAGE_STRING "libevent 2.1.12-stable-ompi"
|
||||
|
||||
/* Define to the one symbol short name of this package. */
|
||||
#define EVENT__PACKAGE_TARNAME "libevent"
|
||||
|
||||
/* Define to the home page for this package. */
|
||||
#define EVENT__PACKAGE_URL ""
|
||||
|
||||
/* Define to the version of this package. */
|
||||
#define EVENT__PACKAGE_VERSION "2.1.12-stable-ompi"
|
||||
|
||||
/* Define to necessary symbol if this constant uses a non-standard name on
|
||||
your system. */
|
||||
/* #undef EVENT__PTHREAD_CREATE_JOINABLE */
|
||||
|
||||
/* The size of 'int', as computed by sizeof. */
|
||||
#define EVENT__SIZEOF_INT 4
|
||||
|
||||
/* The size of 'long', as computed by sizeof. */
|
||||
#define EVENT__SIZEOF_LONG 8
|
||||
|
||||
/* The size of 'long long', as computed by sizeof. */
|
||||
#define EVENT__SIZEOF_LONG_LONG 8
|
||||
|
||||
/* The size of 'off_t', as computed by sizeof. */
|
||||
#define EVENT__SIZEOF_OFF_T 8
|
||||
|
||||
/* The size of 'pthread_t', as computed by sizeof. */
|
||||
#define EVENT__SIZEOF_PTHREAD_T 8
|
||||
|
||||
/* The size of 'short', as computed by sizeof. */
|
||||
#define EVENT__SIZEOF_SHORT 2
|
||||
|
||||
/* The size of 'size_t', as computed by sizeof. */
|
||||
#define EVENT__SIZEOF_SIZE_T 8
|
||||
|
||||
/* The size of 'time_t', as computed by sizeof. */
|
||||
#define EVENT__SIZEOF_TIME_T 8
|
||||
|
||||
/* The size of 'void *', as computed by sizeof. */
|
||||
#define EVENT__SIZEOF_VOID_P 8
|
||||
|
||||
/* Define to 1 if all of the C89 standard headers exist (not just the ones
|
||||
required in a freestanding environment). This macro is provided for
|
||||
backward compatibility; new code need not use it. */
|
||||
#define EVENT__STDC_HEADERS 1
|
||||
|
||||
/* Define to 1 if you can safely include both <sys/time.h> and <time.h>. This
|
||||
macro is obsolete. */
|
||||
#define EVENT__TIME_WITH_SYS_TIME 1
|
||||
|
||||
/* Enable extensions on AIX, Interix, z/OS. */
|
||||
#ifndef _ALL_SOURCE
|
||||
# define _ALL_SOURCE 1
|
||||
#endif
|
||||
/* Enable general extensions on macOS. */
|
||||
#ifndef _DARWIN_C_SOURCE
|
||||
# define _DARWIN_C_SOURCE 1
|
||||
#endif
|
||||
/* Enable general extensions on Solaris. */
|
||||
#ifndef __EXTENSIONS__
|
||||
# define __EXTENSIONS__ 1
|
||||
#endif
|
||||
/* Enable GNU extensions on systems that have them. */
|
||||
#ifndef _GNU_SOURCE
|
||||
# define _GNU_SOURCE 1
|
||||
#endif
|
||||
/* Enable X/Open compliant socket functions that do not require linking
|
||||
with -lxnet on HP-UX 11.11. */
|
||||
#ifndef _HPUX_ALT_XOPEN_SOCKET_API
|
||||
# define _HPUX_ALT_XOPEN_SOCKET_API 1
|
||||
#endif
|
||||
/* Identify the host operating system as Minix.
|
||||
This macro does not affect the system headers' behavior.
|
||||
A future release of Autoconf may stop defining this macro. */
|
||||
#ifndef _MINIX
|
||||
/* # undef _MINIX */
|
||||
#endif
|
||||
/* Enable general extensions on NetBSD.
|
||||
Enable NetBSD compatibility extensions on Minix. */
|
||||
#ifndef _NETBSD_SOURCE
|
||||
# define _NETBSD_SOURCE 1
|
||||
#endif
|
||||
/* Enable OpenBSD compatibility extensions on NetBSD.
|
||||
Oddly enough, this does nothing on OpenBSD. */
|
||||
#ifndef _OPENBSD_SOURCE
|
||||
# define _OPENBSD_SOURCE 1
|
||||
#endif
|
||||
/* Define to 1 if needed for POSIX-compatible behavior. */
|
||||
#ifndef _POSIX_SOURCE
|
||||
/* # undef _POSIX_SOURCE */
|
||||
#endif
|
||||
/* Define to 2 if needed for POSIX-compatible behavior. */
|
||||
#ifndef _POSIX_1_SOURCE
|
||||
/* # undef _POSIX_1_SOURCE */
|
||||
#endif
|
||||
/* Enable POSIX-compatible threading on Solaris. */
|
||||
#ifndef _POSIX_PTHREAD_SEMANTICS
|
||||
# define _POSIX_PTHREAD_SEMANTICS 1
|
||||
#endif
|
||||
/* Enable extensions specified by ISO/IEC TS 18661-5:2014. */
|
||||
#ifndef __STDC_WANT_IEC_60559_ATTRIBS_EXT__
|
||||
# define __STDC_WANT_IEC_60559_ATTRIBS_EXT__ 1
|
||||
#endif
|
||||
/* Enable extensions specified by ISO/IEC TS 18661-1:2014. */
|
||||
#ifndef __STDC_WANT_IEC_60559_BFP_EXT__
|
||||
# define __STDC_WANT_IEC_60559_BFP_EXT__ 1
|
||||
#endif
|
||||
/* Enable extensions specified by ISO/IEC TS 18661-2:2015. */
|
||||
#ifndef __STDC_WANT_IEC_60559_DFP_EXT__
|
||||
# define __STDC_WANT_IEC_60559_DFP_EXT__ 1
|
||||
#endif
|
||||
/* Enable extensions specified by C23 Annex F. */
|
||||
#ifndef __STDC_WANT_IEC_60559_EXT__
|
||||
# define __STDC_WANT_IEC_60559_EXT__ 1
|
||||
#endif
|
||||
/* Enable extensions specified by ISO/IEC TS 18661-4:2015. */
|
||||
#ifndef __STDC_WANT_IEC_60559_FUNCS_EXT__
|
||||
# define __STDC_WANT_IEC_60559_FUNCS_EXT__ 1
|
||||
#endif
|
||||
/* Enable extensions specified by C23 Annex H and ISO/IEC TS 18661-3:2015. */
|
||||
#ifndef __STDC_WANT_IEC_60559_TYPES_EXT__
|
||||
# define __STDC_WANT_IEC_60559_TYPES_EXT__ 1
|
||||
#endif
|
||||
/* Enable extensions specified by ISO/IEC TR 24731-2:2010. */
|
||||
#ifndef __STDC_WANT_LIB_EXT2__
|
||||
# define __STDC_WANT_LIB_EXT2__ 1
|
||||
#endif
|
||||
/* Enable extensions specified by ISO/IEC 24747:2009. */
|
||||
#ifndef __STDC_WANT_MATH_SPEC_FUNCS__
|
||||
# define __STDC_WANT_MATH_SPEC_FUNCS__ 1
|
||||
#endif
|
||||
/* Enable extensions on HP NonStop. */
|
||||
#ifndef _TANDEM_SOURCE
|
||||
# define _TANDEM_SOURCE 1
|
||||
#endif
|
||||
/* Enable X/Open extensions. Define to 500 only if necessary
|
||||
to make mbstate_t available. */
|
||||
#ifndef _XOPEN_SOURCE
|
||||
/* # undef _XOPEN_SOURCE */
|
||||
#endif
|
||||
|
||||
|
||||
/* Version number of package */
|
||||
#define EVENT__VERSION "2.1.12-stable-ompi"
|
||||
|
||||
/* Number of bits in a file offset, on hosts where this is settable. */
|
||||
/* #undef _FILE_OFFSET_BITS */
|
||||
|
||||
/* Define to 1 on platforms where this makes off_t a 64-bit type. */
|
||||
/* #undef _LARGE_FILES */
|
||||
|
||||
/* Number of bits in time_t, on hosts where this is settable. */
|
||||
/* #undef _TIME_BITS */
|
||||
|
||||
/* Define to 1 on platforms where this makes time_t a 64-bit type. */
|
||||
/* #undef __MINGW_USE_VC2005_COMPAT */
|
||||
|
||||
/* Define to empty if 'const' does not conform to ANSI C. */
|
||||
/* #undef const */
|
||||
|
||||
/* Define to '__inline__' or '__inline' if that's what the C compiler
|
||||
calls it, or to nothing if 'inline' is not supported under any name. */
|
||||
#ifndef __cplusplus
|
||||
/* #undef inline */
|
||||
#endif
|
||||
|
||||
/* Define as a signed integer type capable of holding a process identifier. */
|
||||
/* #undef pid_t */
|
||||
|
||||
/* Define as 'unsigned int' if <stddef.h> doesn't define. */
|
||||
/* #undef size_t */
|
||||
|
||||
/* Define to unsigned int if you dont have it */
|
||||
/* #undef socklen_t */
|
||||
|
||||
/* Define to 'int' if <sys/types.h> does not define. */
|
||||
/* #undef ssize_t */
|
||||
|
||||
#endif /* event2/event-config.h */
|
||||
1672
macx64/mpi/openmpi/include/event2/event.h
Normal file
1672
macx64/mpi/openmpi/include/event2/event.h
Normal file
File diff suppressed because it is too large
Load Diff
230
macx64/mpi/openmpi/include/event2/event_compat.h
Normal file
230
macx64/mpi/openmpi/include/event2/event_compat.h
Normal file
@@ -0,0 +1,230 @@
|
||||
/*
|
||||
* Copyright (c) 2000-2007 Niels Provos <provos@citi.umich.edu>
|
||||
* Copyright (c) 2007-2012 Niels Provos and Nick Mathewson
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* 3. The name of the author may not be used to endorse or promote products
|
||||
* derived from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
||||
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
||||
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
||||
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
#ifndef EVENT2_EVENT_COMPAT_H_INCLUDED_
|
||||
#define EVENT2_EVENT_COMPAT_H_INCLUDED_
|
||||
|
||||
/** @file event2/event_compat.h
|
||||
|
||||
Potentially non-threadsafe versions of the functions in event.h: provided
|
||||
only for backwards compatibility.
|
||||
|
||||
In the oldest versions of Libevent, event_base was not a first-class
|
||||
structure. Instead, there was a single event base that every function
|
||||
manipulated. Later, when separate event bases were added, the old functions
|
||||
that didn't take an event_base argument needed to work by manipulating the
|
||||
"current" event base. This could lead to thread-safety issues, and obscure,
|
||||
hard-to-diagnose bugs.
|
||||
|
||||
@deprecated All functions in this file are by definition deprecated.
|
||||
*/
|
||||
#include <event2/visibility.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#include <event2/event-config.h>
|
||||
#ifdef EVENT__HAVE_SYS_TYPES_H
|
||||
#include <sys/types.h>
|
||||
#endif
|
||||
#ifdef EVENT__HAVE_SYS_TIME_H
|
||||
#include <sys/time.h>
|
||||
#endif
|
||||
|
||||
/* For int types. */
|
||||
#include <event2/util.h>
|
||||
|
||||
/**
|
||||
Initialize the event API.
|
||||
|
||||
The event API needs to be initialized with event_init() before it can be
|
||||
used. Sets the global current base that gets used for events that have no
|
||||
base associated with them.
|
||||
|
||||
@deprecated This function is deprecated because it replaces the "current"
|
||||
event_base, and is totally unsafe for multithreaded use. The replacement
|
||||
is event_base_new().
|
||||
|
||||
@see event_base_set(), event_base_new()
|
||||
*/
|
||||
EVENT2_EXPORT_SYMBOL
|
||||
struct event_base *event_init(void);
|
||||
|
||||
/**
|
||||
Loop to process events.
|
||||
|
||||
Like event_base_dispatch(), but uses the "current" base.
|
||||
|
||||
@deprecated This function is deprecated because it is easily confused by
|
||||
multiple calls to event_init(), and because it is not safe for
|
||||
multithreaded use. The replacement is event_base_dispatch().
|
||||
|
||||
@see event_base_dispatch(), event_init()
|
||||
*/
|
||||
EVENT2_EXPORT_SYMBOL
|
||||
int event_dispatch(void);
|
||||
|
||||
/**
|
||||
Handle events.
|
||||
|
||||
This function behaves like event_base_loop(), but uses the "current" base
|
||||
|
||||
@deprecated This function is deprecated because it uses the event base from
|
||||
the last call to event_init, and is therefore not safe for multithreaded
|
||||
use. The replacement is event_base_loop().
|
||||
|
||||
@see event_base_loop(), event_init()
|
||||
*/
|
||||
EVENT2_EXPORT_SYMBOL
|
||||
int event_loop(int);
|
||||
|
||||
|
||||
/**
|
||||
Exit the event loop after the specified time.
|
||||
|
||||
This function behaves like event_base_loopexit(), except that it uses the
|
||||
"current" base.
|
||||
|
||||
@deprecated This function is deprecated because it uses the event base from
|
||||
the last call to event_init, and is therefore not safe for multithreaded
|
||||
use. The replacement is event_base_loopexit().
|
||||
|
||||
@see event_init, event_base_loopexit()
|
||||
*/
|
||||
EVENT2_EXPORT_SYMBOL
|
||||
int event_loopexit(const struct timeval *);
|
||||
|
||||
|
||||
/**
|
||||
Abort the active event_loop() immediately.
|
||||
|
||||
This function behaves like event_base_loopbreakt(), except that it uses the
|
||||
"current" base.
|
||||
|
||||
@deprecated This function is deprecated because it uses the event base from
|
||||
the last call to event_init, and is therefore not safe for multithreaded
|
||||
use. The replacement is event_base_loopbreak().
|
||||
|
||||
@see event_base_loopbreak(), event_init()
|
||||
*/
|
||||
EVENT2_EXPORT_SYMBOL
|
||||
int event_loopbreak(void);
|
||||
|
||||
/**
|
||||
Schedule a one-time event to occur.
|
||||
|
||||
@deprecated This function is obsolete, and has been replaced by
|
||||
event_base_once(). Its use is deprecated because it relies on the
|
||||
"current" base configured by event_init().
|
||||
|
||||
@see event_base_once()
|
||||
*/
|
||||
EVENT2_EXPORT_SYMBOL
|
||||
int event_once(evutil_socket_t , short,
|
||||
void (*)(evutil_socket_t, short, void *), void *, const struct timeval *);
|
||||
|
||||
|
||||
/**
|
||||
Get the kernel event notification mechanism used by Libevent.
|
||||
|
||||
@deprecated This function is obsolete, and has been replaced by
|
||||
event_base_get_method(). Its use is deprecated because it relies on the
|
||||
"current" base configured by event_init().
|
||||
|
||||
@see event_base_get_method()
|
||||
*/
|
||||
EVENT2_EXPORT_SYMBOL
|
||||
const char *event_get_method(void);
|
||||
|
||||
|
||||
/**
|
||||
Set the number of different event priorities.
|
||||
|
||||
@deprecated This function is deprecated because it is easily confused by
|
||||
multiple calls to event_init(), and because it is not safe for
|
||||
multithreaded use. The replacement is event_base_priority_init().
|
||||
|
||||
@see event_base_priority_init()
|
||||
*/
|
||||
EVENT2_EXPORT_SYMBOL
|
||||
int event_priority_init(int);
|
||||
|
||||
/**
|
||||
Prepare an event structure to be added.
|
||||
|
||||
@deprecated event_set() is not recommended for new code, because it requires
|
||||
a subsequent call to event_base_set() to be safe under most circumstances.
|
||||
Use event_assign() or event_new() instead.
|
||||
*/
|
||||
EVENT2_EXPORT_SYMBOL
|
||||
void event_set(struct event *, evutil_socket_t, short, void (*)(evutil_socket_t, short, void *), void *);
|
||||
|
||||
#define evtimer_set(ev, cb, arg) event_set((ev), -1, 0, (cb), (arg))
|
||||
#define evsignal_set(ev, x, cb, arg) \
|
||||
event_set((ev), (x), EV_SIGNAL|EV_PERSIST, (cb), (arg))
|
||||
|
||||
|
||||
/**
|
||||
@name timeout_* macros
|
||||
|
||||
@deprecated These macros are deprecated because their naming is inconsistent
|
||||
with the rest of Libevent. Use the evtimer_* macros instead.
|
||||
@{
|
||||
*/
|
||||
#define timeout_add(ev, tv) event_add((ev), (tv))
|
||||
#define timeout_set(ev, cb, arg) event_set((ev), -1, 0, (cb), (arg))
|
||||
#define timeout_del(ev) event_del(ev)
|
||||
#define timeout_pending(ev, tv) event_pending((ev), EV_TIMEOUT, (tv))
|
||||
#define timeout_initialized(ev) event_initialized(ev)
|
||||
/**@}*/
|
||||
|
||||
/**
|
||||
@name signal_* macros
|
||||
|
||||
@deprecated These macros are deprecated because their naming is inconsistent
|
||||
with the rest of Libevent. Use the evsignal_* macros instead.
|
||||
@{
|
||||
*/
|
||||
#define signal_add(ev, tv) event_add((ev), (tv))
|
||||
#define signal_set(ev, x, cb, arg) \
|
||||
event_set((ev), (x), EV_SIGNAL|EV_PERSIST, (cb), (arg))
|
||||
#define signal_del(ev) event_del(ev)
|
||||
#define signal_pending(ev, tv) event_pending((ev), EV_SIGNAL, (tv))
|
||||
#define signal_initialized(ev) event_initialized(ev)
|
||||
/**@}*/
|
||||
|
||||
#ifndef EVENT_FD
|
||||
/* These macros are obsolete; use event_get_fd and event_get_signal instead. */
|
||||
#define EVENT_FD(ev) ((int)event_get_fd(ev))
|
||||
#define EVENT_SIGNAL(ev) event_get_signal(ev)
|
||||
#endif
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* EVENT2_EVENT_COMPAT_H_INCLUDED_ */
|
||||
180
macx64/mpi/openmpi/include/event2/event_struct.h
Normal file
180
macx64/mpi/openmpi/include/event2/event_struct.h
Normal file
@@ -0,0 +1,180 @@
|
||||
/*
|
||||
* Copyright (c) 2000-2007 Niels Provos <provos@citi.umich.edu>
|
||||
* Copyright (c) 2007-2012 Niels Provos and Nick Mathewson
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* 3. The name of the author may not be used to endorse or promote products
|
||||
* derived from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
||||
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
||||
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
||||
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
#ifndef EVENT2_EVENT_STRUCT_H_INCLUDED_
|
||||
#define EVENT2_EVENT_STRUCT_H_INCLUDED_
|
||||
|
||||
/** @file event2/event_struct.h
|
||||
|
||||
Structures used by event.h. Using these structures directly WILL harm
|
||||
forward compatibility: be careful.
|
||||
|
||||
No field declared in this file should be used directly in user code. Except
|
||||
for historical reasons, these fields would not be exposed at all.
|
||||
*/
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#include <event2/event-config.h>
|
||||
#ifdef EVENT__HAVE_SYS_TYPES_H
|
||||
#include <sys/types.h>
|
||||
#endif
|
||||
#ifdef EVENT__HAVE_SYS_TIME_H
|
||||
#include <sys/time.h>
|
||||
#endif
|
||||
|
||||
/* For int types. */
|
||||
#include <event2/util.h>
|
||||
|
||||
/* For evkeyvalq */
|
||||
#include <event2/keyvalq_struct.h>
|
||||
|
||||
#define EVLIST_TIMEOUT 0x01
|
||||
#define EVLIST_INSERTED 0x02
|
||||
#define EVLIST_SIGNAL 0x04
|
||||
#define EVLIST_ACTIVE 0x08
|
||||
#define EVLIST_INTERNAL 0x10
|
||||
#define EVLIST_ACTIVE_LATER 0x20
|
||||
#define EVLIST_FINALIZING 0x40
|
||||
#define EVLIST_INIT 0x80
|
||||
|
||||
#define EVLIST_ALL 0xff
|
||||
|
||||
/* Fix so that people don't have to run with <sys/queue.h> */
|
||||
#ifndef TAILQ_ENTRY
|
||||
#define EVENT_DEFINED_TQENTRY_
|
||||
#define TAILQ_ENTRY(type) \
|
||||
struct { \
|
||||
struct type *tqe_next; /* next element */ \
|
||||
struct type **tqe_prev; /* address of previous next element */ \
|
||||
}
|
||||
#endif /* !TAILQ_ENTRY */
|
||||
|
||||
#ifndef TAILQ_HEAD
|
||||
#define EVENT_DEFINED_TQHEAD_
|
||||
#define TAILQ_HEAD(name, type) \
|
||||
struct name { \
|
||||
struct type *tqh_first; \
|
||||
struct type **tqh_last; \
|
||||
}
|
||||
#endif
|
||||
|
||||
/* Fix so that people don't have to run with <sys/queue.h> */
|
||||
#ifndef LIST_ENTRY
|
||||
#define EVENT_DEFINED_LISTENTRY_
|
||||
#define LIST_ENTRY(type) \
|
||||
struct { \
|
||||
struct type *le_next; /* next element */ \
|
||||
struct type **le_prev; /* address of previous next element */ \
|
||||
}
|
||||
#endif /* !LIST_ENTRY */
|
||||
|
||||
#ifndef LIST_HEAD
|
||||
#define EVENT_DEFINED_LISTHEAD_
|
||||
#define LIST_HEAD(name, type) \
|
||||
struct name { \
|
||||
struct type *lh_first; /* first element */ \
|
||||
}
|
||||
#endif /* !LIST_HEAD */
|
||||
|
||||
struct event;
|
||||
|
||||
struct event_callback {
|
||||
TAILQ_ENTRY(event_callback) evcb_active_next;
|
||||
short evcb_flags;
|
||||
ev_uint8_t evcb_pri; /* smaller numbers are higher priority */
|
||||
ev_uint8_t evcb_closure;
|
||||
/* allows us to adopt for different types of events */
|
||||
union {
|
||||
void (*evcb_callback)(evutil_socket_t, short, void *);
|
||||
void (*evcb_selfcb)(struct event_callback *, void *);
|
||||
void (*evcb_evfinalize)(struct event *, void *);
|
||||
void (*evcb_cbfinalize)(struct event_callback *, void *);
|
||||
} evcb_cb_union;
|
||||
void *evcb_arg;
|
||||
};
|
||||
|
||||
struct event_base;
|
||||
struct event {
|
||||
struct event_callback ev_evcallback;
|
||||
|
||||
/* for managing timeouts */
|
||||
union {
|
||||
TAILQ_ENTRY(event) ev_next_with_common_timeout;
|
||||
int min_heap_idx;
|
||||
} ev_timeout_pos;
|
||||
evutil_socket_t ev_fd;
|
||||
|
||||
struct event_base *ev_base;
|
||||
|
||||
union {
|
||||
/* used for io events */
|
||||
struct {
|
||||
LIST_ENTRY (event) ev_io_next;
|
||||
struct timeval ev_timeout;
|
||||
} ev_io;
|
||||
|
||||
/* used by signal events */
|
||||
struct {
|
||||
LIST_ENTRY (event) ev_signal_next;
|
||||
short ev_ncalls;
|
||||
/* Allows deletes in callback */
|
||||
short *ev_pncalls;
|
||||
} ev_signal;
|
||||
} ev_;
|
||||
|
||||
short ev_events;
|
||||
short ev_res; /* result passed to event callback */
|
||||
struct timeval ev_timeout;
|
||||
};
|
||||
|
||||
TAILQ_HEAD (event_list, event);
|
||||
|
||||
#ifdef EVENT_DEFINED_TQENTRY_
|
||||
#undef TAILQ_ENTRY
|
||||
#endif
|
||||
|
||||
#ifdef EVENT_DEFINED_TQHEAD_
|
||||
#undef TAILQ_HEAD
|
||||
#endif
|
||||
|
||||
LIST_HEAD (event_dlist, event);
|
||||
|
||||
#ifdef EVENT_DEFINED_LISTENTRY_
|
||||
#undef LIST_ENTRY
|
||||
#endif
|
||||
|
||||
#ifdef EVENT_DEFINED_LISTHEAD_
|
||||
#undef LIST_HEAD
|
||||
#endif
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* EVENT2_EVENT_STRUCT_H_INCLUDED_ */
|
||||
1192
macx64/mpi/openmpi/include/event2/http.h
Normal file
1192
macx64/mpi/openmpi/include/event2/http.h
Normal file
File diff suppressed because it is too large
Load Diff
94
macx64/mpi/openmpi/include/event2/http_compat.h
Normal file
94
macx64/mpi/openmpi/include/event2/http_compat.h
Normal file
@@ -0,0 +1,94 @@
|
||||
/*
|
||||
* Copyright (c) 2000-2007 Niels Provos <provos@citi.umich.edu>
|
||||
* Copyright (c) 2007-2012 Niels Provos and Nick Mathewson
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* 3. The name of the author may not be used to endorse or promote products
|
||||
* derived from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
||||
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
||||
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
||||
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
#ifndef EVENT2_HTTP_COMPAT_H_INCLUDED_
|
||||
#define EVENT2_HTTP_COMPAT_H_INCLUDED_
|
||||
|
||||
/** @file event2/http_compat.h
|
||||
|
||||
Potentially non-threadsafe versions of the functions in http.h: provided
|
||||
only for backwards compatibility.
|
||||
|
||||
*/
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#include <event2/event-config.h>
|
||||
#ifdef EVENT__HAVE_SYS_TYPES_H
|
||||
#include <sys/types.h>
|
||||
#endif
|
||||
#ifdef EVENT__HAVE_SYS_TIME_H
|
||||
#include <sys/time.h>
|
||||
#endif
|
||||
|
||||
/* For int types. */
|
||||
#include <event2/util.h>
|
||||
|
||||
/**
|
||||
* Start an HTTP server on the specified address and port
|
||||
*
|
||||
* @deprecated It does not allow an event base to be specified
|
||||
*
|
||||
* @param address the address to which the HTTP server should be bound
|
||||
* @param port the port number on which the HTTP server should listen
|
||||
* @return a pointer to a newly initialized evhttp server structure
|
||||
* or NULL on error
|
||||
*/
|
||||
EVENT2_EXPORT_SYMBOL
|
||||
struct evhttp *evhttp_start(const char *address, ev_uint16_t port);
|
||||
|
||||
/**
|
||||
* A connection object that can be used to for making HTTP requests. The
|
||||
* connection object tries to establish the connection when it is given an
|
||||
* http request object.
|
||||
*
|
||||
* @deprecated It does not allow an event base to be specified
|
||||
*/
|
||||
EVENT2_EXPORT_SYMBOL
|
||||
struct evhttp_connection *evhttp_connection_new(
|
||||
const char *address, ev_uint16_t port);
|
||||
|
||||
/**
|
||||
* Associates an event base with the connection - can only be called
|
||||
* on a freshly created connection object that has not been used yet.
|
||||
*
|
||||
* @deprecated XXXX Why?
|
||||
*/
|
||||
EVENT2_EXPORT_SYMBOL
|
||||
void evhttp_connection_set_base(struct evhttp_connection *evcon,
|
||||
struct event_base *base);
|
||||
|
||||
|
||||
/** Returns the request URI */
|
||||
#define evhttp_request_uri evhttp_request_get_uri
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* EVENT2_EVENT_COMPAT_H_INCLUDED_ */
|
||||
152
macx64/mpi/openmpi/include/event2/http_struct.h
Normal file
152
macx64/mpi/openmpi/include/event2/http_struct.h
Normal file
@@ -0,0 +1,152 @@
|
||||
/*
|
||||
* Copyright (c) 2000-2007 Niels Provos <provos@citi.umich.edu>
|
||||
* Copyright (c) 2007-2012 Niels Provos and Nick Mathewson
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* 3. The name of the author may not be used to endorse or promote products
|
||||
* derived from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
||||
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
||||
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
||||
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
#ifndef EVENT2_HTTP_STRUCT_H_INCLUDED_
|
||||
#define EVENT2_HTTP_STRUCT_H_INCLUDED_
|
||||
|
||||
/** @file event2/http_struct.h
|
||||
|
||||
Data structures for http. Using these structures may hurt forward
|
||||
compatibility with later versions of Libevent: be careful!
|
||||
|
||||
*/
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#include <event2/event-config.h>
|
||||
#ifdef EVENT__HAVE_SYS_TYPES_H
|
||||
#include <sys/types.h>
|
||||
#endif
|
||||
#ifdef EVENT__HAVE_SYS_TIME_H
|
||||
#include <sys/time.h>
|
||||
#endif
|
||||
|
||||
/* For int types. */
|
||||
#include <event2/util.h>
|
||||
|
||||
/**
|
||||
* the request structure that a server receives.
|
||||
* WARNING: expect this structure to change. I will try to provide
|
||||
* reasonable accessors.
|
||||
*/
|
||||
struct evhttp_request {
|
||||
#if defined(TAILQ_ENTRY)
|
||||
TAILQ_ENTRY(evhttp_request) next;
|
||||
#else
|
||||
struct {
|
||||
struct evhttp_request *tqe_next;
|
||||
struct evhttp_request **tqe_prev;
|
||||
} next;
|
||||
#endif
|
||||
|
||||
/* the connection object that this request belongs to */
|
||||
struct evhttp_connection *evcon;
|
||||
int flags;
|
||||
/** The request obj owns the evhttp connection and needs to free it */
|
||||
#define EVHTTP_REQ_OWN_CONNECTION 0x0001
|
||||
/** Request was made via a proxy */
|
||||
#define EVHTTP_PROXY_REQUEST 0x0002
|
||||
/** The request object is owned by the user; the user must free it */
|
||||
#define EVHTTP_USER_OWNED 0x0004
|
||||
/** The request will be used again upstack; freeing must be deferred */
|
||||
#define EVHTTP_REQ_DEFER_FREE 0x0008
|
||||
/** The request should be freed upstack */
|
||||
#define EVHTTP_REQ_NEEDS_FREE 0x0010
|
||||
|
||||
struct evkeyvalq *input_headers;
|
||||
struct evkeyvalq *output_headers;
|
||||
|
||||
/* address of the remote host and the port connection came from */
|
||||
char *remote_host;
|
||||
ev_uint16_t remote_port;
|
||||
|
||||
/* cache of the hostname for evhttp_request_get_host */
|
||||
char *host_cache;
|
||||
|
||||
enum evhttp_request_kind kind;
|
||||
enum evhttp_cmd_type type;
|
||||
|
||||
size_t headers_size;
|
||||
size_t body_size;
|
||||
|
||||
char *uri; /* uri after HTTP request was parsed */
|
||||
struct evhttp_uri *uri_elems; /* uri elements */
|
||||
|
||||
char major; /* HTTP Major number */
|
||||
char minor; /* HTTP Minor number */
|
||||
|
||||
int response_code; /* HTTP Response code */
|
||||
char *response_code_line; /* Readable response */
|
||||
|
||||
struct evbuffer *input_buffer; /* read data */
|
||||
ev_int64_t ntoread;
|
||||
unsigned chunked:1, /* a chunked request */
|
||||
userdone:1; /* the user has sent all data */
|
||||
|
||||
struct evbuffer *output_buffer; /* outgoing post or data */
|
||||
|
||||
/* Callback */
|
||||
void (*cb)(struct evhttp_request *, void *);
|
||||
void *cb_arg;
|
||||
|
||||
/*
|
||||
* Chunked data callback - call for each completed chunk if
|
||||
* specified. If not specified, all the data is delivered via
|
||||
* the regular callback.
|
||||
*/
|
||||
void (*chunk_cb)(struct evhttp_request *, void *);
|
||||
|
||||
/*
|
||||
* Callback added for forked-daapd so they can collect ICY
|
||||
* (shoutcast) metadata from the http header. If return
|
||||
* int is negative the connection will be closed.
|
||||
*/
|
||||
int (*header_cb)(struct evhttp_request *, void *);
|
||||
|
||||
/*
|
||||
* Error callback - called when error is occured.
|
||||
* @see evhttp_request_error for error types.
|
||||
*
|
||||
* @see evhttp_request_set_error_cb()
|
||||
*/
|
||||
void (*error_cb)(enum evhttp_request_error, void *);
|
||||
|
||||
/*
|
||||
* Send complete callback - called when the request is actually
|
||||
* sent and completed.
|
||||
*/
|
||||
void (*on_complete_cb)(struct evhttp_request *, void *);
|
||||
void *on_complete_cb_arg;
|
||||
};
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* EVENT2_HTTP_STRUCT_H_INCLUDED_ */
|
||||
|
||||
80
macx64/mpi/openmpi/include/event2/keyvalq_struct.h
Normal file
80
macx64/mpi/openmpi/include/event2/keyvalq_struct.h
Normal file
@@ -0,0 +1,80 @@
|
||||
/*
|
||||
* Copyright (c) 2000-2007 Niels Provos <provos@citi.umich.edu>
|
||||
* Copyright (c) 2007-2012 Niels Provos and Nick Mathewson
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* 3. The name of the author may not be used to endorse or promote products
|
||||
* derived from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
||||
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
||||
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
||||
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
#ifndef EVENT2_KEYVALQ_STRUCT_H_INCLUDED_
|
||||
#define EVENT2_KEYVALQ_STRUCT_H_INCLUDED_
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/* Fix so that people don't have to run with <sys/queue.h> */
|
||||
/* XXXX This code is duplicated with event_struct.h */
|
||||
#ifndef TAILQ_ENTRY
|
||||
#define EVENT_DEFINED_TQENTRY_
|
||||
#define TAILQ_ENTRY(type) \
|
||||
struct { \
|
||||
struct type *tqe_next; /* next element */ \
|
||||
struct type **tqe_prev; /* address of previous next element */ \
|
||||
}
|
||||
#endif /* !TAILQ_ENTRY */
|
||||
|
||||
#ifndef TAILQ_HEAD
|
||||
#define EVENT_DEFINED_TQHEAD_
|
||||
#define TAILQ_HEAD(name, type) \
|
||||
struct name { \
|
||||
struct type *tqh_first; \
|
||||
struct type **tqh_last; \
|
||||
}
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Key-Value pairs. Can be used for HTTP headers but also for
|
||||
* query argument parsing.
|
||||
*/
|
||||
struct evkeyval {
|
||||
TAILQ_ENTRY(evkeyval) next;
|
||||
|
||||
char *key;
|
||||
char *value;
|
||||
};
|
||||
|
||||
TAILQ_HEAD (evkeyvalq, evkeyval);
|
||||
|
||||
/* XXXX This code is duplicated with event_struct.h */
|
||||
#ifdef EVENT_DEFINED_TQENTRY_
|
||||
#undef TAILQ_ENTRY
|
||||
#endif
|
||||
|
||||
#ifdef EVENT_DEFINED_TQHEAD_
|
||||
#undef TAILQ_HEAD
|
||||
#endif
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
192
macx64/mpi/openmpi/include/event2/listener.h
Normal file
192
macx64/mpi/openmpi/include/event2/listener.h
Normal file
@@ -0,0 +1,192 @@
|
||||
/*
|
||||
* Copyright (c) 2000-2007 Niels Provos <provos@citi.umich.edu>
|
||||
* Copyright (c) 2007-2012 Niels Provos and Nick Mathewson
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* 3. The name of the author may not be used to endorse or promote products
|
||||
* derived from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
||||
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
||||
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
||||
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
#ifndef EVENT2_LISTENER_H_INCLUDED_
|
||||
#define EVENT2_LISTENER_H_INCLUDED_
|
||||
|
||||
#include <event2/visibility.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#include <event2/event.h>
|
||||
|
||||
struct sockaddr;
|
||||
struct evconnlistener;
|
||||
|
||||
/**
|
||||
A callback that we invoke when a listener has a new connection.
|
||||
|
||||
@param listener The evconnlistener
|
||||
@param fd The new file descriptor
|
||||
@param addr The source address of the connection
|
||||
@param socklen The length of addr
|
||||
@param user_arg the pointer passed to evconnlistener_new()
|
||||
*/
|
||||
typedef void (*evconnlistener_cb)(struct evconnlistener *, evutil_socket_t, struct sockaddr *, int socklen, void *);
|
||||
|
||||
/**
|
||||
A callback that we invoke when a listener encounters a non-retriable error.
|
||||
|
||||
@param listener The evconnlistener
|
||||
@param user_arg the pointer passed to evconnlistener_new()
|
||||
*/
|
||||
typedef void (*evconnlistener_errorcb)(struct evconnlistener *, void *);
|
||||
|
||||
/** Flag: Indicates that we should not make incoming sockets nonblocking
|
||||
* before passing them to the callback. */
|
||||
#define LEV_OPT_LEAVE_SOCKETS_BLOCKING (1u<<0)
|
||||
/** Flag: Indicates that freeing the listener should close the underlying
|
||||
* socket. */
|
||||
#define LEV_OPT_CLOSE_ON_FREE (1u<<1)
|
||||
/** Flag: Indicates that we should set the close-on-exec flag, if possible */
|
||||
#define LEV_OPT_CLOSE_ON_EXEC (1u<<2)
|
||||
/** Flag: Indicates that we should disable the timeout (if any) between when
|
||||
* this socket is closed and when we can listen again on the same port. */
|
||||
#define LEV_OPT_REUSEABLE (1u<<3)
|
||||
/** Flag: Indicates that the listener should be locked so it's safe to use
|
||||
* from multiple threadcs at once. */
|
||||
#define LEV_OPT_THREADSAFE (1u<<4)
|
||||
/** Flag: Indicates that the listener should be created in disabled
|
||||
* state. Use evconnlistener_enable() to enable it later. */
|
||||
#define LEV_OPT_DISABLED (1u<<5)
|
||||
/** Flag: Indicates that the listener should defer accept() until data is
|
||||
* available, if possible. Ignored on platforms that do not support this.
|
||||
*
|
||||
* This option can help performance for protocols where the client transmits
|
||||
* immediately after connecting. Do not use this option if your protocol
|
||||
* _doesn't_ start out with the client transmitting data, since in that case
|
||||
* this option will sometimes cause the kernel to never tell you about the
|
||||
* connection.
|
||||
*
|
||||
* This option is only supported by evconnlistener_new_bind(): it can't
|
||||
* work with evconnlistener_new_fd(), since the listener needs to be told
|
||||
* to use the option before it is actually bound.
|
||||
*/
|
||||
#define LEV_OPT_DEFERRED_ACCEPT (1u<<6)
|
||||
/** Flag: Indicates that we ask to allow multiple servers (processes or
|
||||
* threads) to bind to the same port if they each set the option.
|
||||
*
|
||||
* SO_REUSEPORT is what most people would expect SO_REUSEADDR to be, however
|
||||
* SO_REUSEPORT does not imply SO_REUSEADDR.
|
||||
*
|
||||
* This is only available on Linux and kernel 3.9+
|
||||
*/
|
||||
#define LEV_OPT_REUSEABLE_PORT (1u<<7)
|
||||
/** Flag: Indicates that the listener wants to work only in IPv6 socket.
|
||||
*
|
||||
* According to RFC3493 and most Linux distributions, default value is to
|
||||
* work in IPv4-mapped mode. If there is a requirement to bind same port
|
||||
* on same ip addresses but different handlers for both IPv4 and IPv6,
|
||||
* it is required to set IPV6_V6ONLY socket option to be sure that the
|
||||
* code works as expected without affected by bindv6only sysctl setting in
|
||||
* system.
|
||||
*
|
||||
* This socket option also supported by Windows.
|
||||
*/
|
||||
#define LEV_OPT_BIND_IPV6ONLY (1u<<8)
|
||||
|
||||
/**
|
||||
Allocate a new evconnlistener object to listen for incoming TCP connections
|
||||
on a given file descriptor.
|
||||
|
||||
@param base The event base to associate the listener with.
|
||||
@param cb A callback to be invoked when a new connection arrives. If the
|
||||
callback is NULL, the listener will be treated as disabled until the
|
||||
callback is set.
|
||||
@param ptr A user-supplied pointer to give to the callback.
|
||||
@param flags Any number of LEV_OPT_* flags
|
||||
@param backlog Passed to the listen() call to determine the length of the
|
||||
acceptable connection backlog. Set to -1 for a reasonable default.
|
||||
Set to 0 if the socket is already listening.
|
||||
@param fd The file descriptor to listen on. It must be a nonblocking
|
||||
file descriptor, and it should already be bound to an appropriate
|
||||
port and address.
|
||||
*/
|
||||
EVENT2_EXPORT_SYMBOL
|
||||
struct evconnlistener *evconnlistener_new(struct event_base *base,
|
||||
evconnlistener_cb cb, void *ptr, unsigned flags, int backlog,
|
||||
evutil_socket_t fd);
|
||||
/**
|
||||
Allocate a new evconnlistener object to listen for incoming TCP connections
|
||||
on a given address.
|
||||
|
||||
@param base The event base to associate the listener with.
|
||||
@param cb A callback to be invoked when a new connection arrives. If the
|
||||
callback is NULL, the listener will be treated as disabled until the
|
||||
callback is set.
|
||||
@param ptr A user-supplied pointer to give to the callback.
|
||||
@param flags Any number of LEV_OPT_* flags
|
||||
@param backlog Passed to the listen() call to determine the length of the
|
||||
acceptable connection backlog. Set to -1 for a reasonable default.
|
||||
@param addr The address to listen for connections on.
|
||||
@param socklen The length of the address.
|
||||
*/
|
||||
EVENT2_EXPORT_SYMBOL
|
||||
struct evconnlistener *evconnlistener_new_bind(struct event_base *base,
|
||||
evconnlistener_cb cb, void *ptr, unsigned flags, int backlog,
|
||||
const struct sockaddr *sa, int socklen);
|
||||
/**
|
||||
Disable and deallocate an evconnlistener.
|
||||
*/
|
||||
EVENT2_EXPORT_SYMBOL
|
||||
void evconnlistener_free(struct evconnlistener *lev);
|
||||
/**
|
||||
Re-enable an evconnlistener that has been disabled.
|
||||
*/
|
||||
EVENT2_EXPORT_SYMBOL
|
||||
int evconnlistener_enable(struct evconnlistener *lev);
|
||||
/**
|
||||
Stop listening for connections on an evconnlistener.
|
||||
*/
|
||||
EVENT2_EXPORT_SYMBOL
|
||||
int evconnlistener_disable(struct evconnlistener *lev);
|
||||
|
||||
/** Return an evconnlistener's associated event_base. */
|
||||
EVENT2_EXPORT_SYMBOL
|
||||
struct event_base *evconnlistener_get_base(struct evconnlistener *lev);
|
||||
|
||||
/** Return the socket that an evconnlistner is listening on. */
|
||||
EVENT2_EXPORT_SYMBOL
|
||||
evutil_socket_t evconnlistener_get_fd(struct evconnlistener *lev);
|
||||
|
||||
/** Change the callback on the listener to cb and its user_data to arg.
|
||||
*/
|
||||
EVENT2_EXPORT_SYMBOL
|
||||
void evconnlistener_set_cb(struct evconnlistener *lev,
|
||||
evconnlistener_cb cb, void *arg);
|
||||
|
||||
/** Set an evconnlistener's error callback. */
|
||||
EVENT2_EXPORT_SYMBOL
|
||||
void evconnlistener_set_error_cb(struct evconnlistener *lev,
|
||||
evconnlistener_errorcb errorcb);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
626
macx64/mpi/openmpi/include/event2/rpc.h
Normal file
626
macx64/mpi/openmpi/include/event2/rpc.h
Normal file
@@ -0,0 +1,626 @@
|
||||
/*
|
||||
* Copyright (c) 2006-2007 Niels Provos <provos@citi.umich.edu>
|
||||
* Copyright (c) 2007-2012 Niels Provos and Nick Mathewson
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* 3. The name of the author may not be used to endorse or promote products
|
||||
* derived from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
||||
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
||||
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
||||
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
#ifndef EVENT2_RPC_H_INCLUDED_
|
||||
#define EVENT2_RPC_H_INCLUDED_
|
||||
|
||||
/* For int types. */
|
||||
#include <event2/util.h>
|
||||
#include <event2/visibility.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/** @file rpc.h
|
||||
*
|
||||
* This header files provides basic support for an RPC server and client.
|
||||
*
|
||||
* To support RPCs in a server, every supported RPC command needs to be
|
||||
* defined and registered.
|
||||
*
|
||||
* EVRPC_HEADER(SendCommand, Request, Reply);
|
||||
*
|
||||
* SendCommand is the name of the RPC command.
|
||||
* Request is the name of a structure generated by event_rpcgen.py.
|
||||
* It contains all parameters relating to the SendCommand RPC. The
|
||||
* server needs to fill in the Reply structure.
|
||||
* Reply is the name of a structure generated by event_rpcgen.py. It
|
||||
* contains the answer to the RPC.
|
||||
*
|
||||
* To register an RPC with an HTTP server, you need to first create an RPC
|
||||
* base with:
|
||||
*
|
||||
* struct evrpc_base *base = evrpc_init(http);
|
||||
*
|
||||
* A specific RPC can then be registered with
|
||||
*
|
||||
* EVRPC_REGISTER(base, SendCommand, Request, Reply, FunctionCB, arg);
|
||||
*
|
||||
* when the server receives an appropriately formatted RPC, the user callback
|
||||
* is invoked. The callback needs to fill in the reply structure.
|
||||
*
|
||||
* void FunctionCB(EVRPC_STRUCT(SendCommand)* rpc, void *arg);
|
||||
*
|
||||
* To send the reply, call EVRPC_REQUEST_DONE(rpc);
|
||||
*
|
||||
* See the regression test for an example.
|
||||
*/
|
||||
|
||||
/**
|
||||
Determines if the member has been set in the message
|
||||
|
||||
@param msg the message to inspect
|
||||
@param member the member variable to test for presences
|
||||
@return 1 if it's present or 0 otherwise.
|
||||
*/
|
||||
#define EVTAG_HAS(msg, member) \
|
||||
((msg)->member##_set == 1)
|
||||
|
||||
#ifndef EVENT2_RPC_COMPAT_H_INCLUDED_
|
||||
|
||||
/**
|
||||
Assigns a value to the member in the message.
|
||||
|
||||
@param msg the message to which to assign a value
|
||||
@param member the name of the member variable
|
||||
@param value the value to assign
|
||||
*/
|
||||
#define EVTAG_ASSIGN(msg, member, value) \
|
||||
(*(msg)->base->member##_assign)((msg), (value))
|
||||
/**
|
||||
Assigns a value to the member in the message.
|
||||
|
||||
@param msg the message to which to assign a value
|
||||
@param member the name of the member variable
|
||||
@param value the value to assign
|
||||
@param len the length of the value
|
||||
*/
|
||||
#define EVTAG_ASSIGN_WITH_LEN(msg, member, value, len) \
|
||||
(*(msg)->base->member##_assign)((msg), (value), (len))
|
||||
/**
|
||||
Returns the value for a member.
|
||||
|
||||
@param msg the message from which to get the value
|
||||
@param member the name of the member variable
|
||||
@param pvalue a pointer to the variable to hold the value
|
||||
@return 0 on success, -1 otherwise.
|
||||
*/
|
||||
#define EVTAG_GET(msg, member, pvalue) \
|
||||
(*(msg)->base->member##_get)((msg), (pvalue))
|
||||
/**
|
||||
Returns the value for a member.
|
||||
|
||||
@param msg the message from which to get the value
|
||||
@param member the name of the member variable
|
||||
@param pvalue a pointer to the variable to hold the value
|
||||
@param plen a pointer to the length of the value
|
||||
@return 0 on success, -1 otherwise.
|
||||
*/
|
||||
#define EVTAG_GET_WITH_LEN(msg, member, pvalue, plen) \
|
||||
(*(msg)->base->member##_get)((msg), (pvalue), (plen))
|
||||
|
||||
#endif /* EVENT2_RPC_COMPAT_H_INCLUDED_ */
|
||||
|
||||
/**
|
||||
Adds a value to an array.
|
||||
*/
|
||||
#define EVTAG_ARRAY_ADD_VALUE(msg, member, value) \
|
||||
(*(msg)->base->member##_add)((msg), (value))
|
||||
/**
|
||||
Allocates a new entry in the array and returns it.
|
||||
*/
|
||||
#define EVTAG_ARRAY_ADD(msg, member) \
|
||||
(*(msg)->base->member##_add)(msg)
|
||||
/**
|
||||
Gets a variable at the specified offset from the array.
|
||||
*/
|
||||
#define EVTAG_ARRAY_GET(msg, member, offset, pvalue) \
|
||||
(*(msg)->base->member##_get)((msg), (offset), (pvalue))
|
||||
/**
|
||||
Returns the number of entries in the array.
|
||||
*/
|
||||
#define EVTAG_ARRAY_LEN(msg, member) ((msg)->member##_length)
|
||||
|
||||
|
||||
struct evbuffer;
|
||||
struct event_base;
|
||||
struct evrpc_req_generic;
|
||||
struct evrpc_request_wrapper;
|
||||
struct evrpc;
|
||||
|
||||
/** The type of a specific RPC Message
|
||||
*
|
||||
* @param rpcname the name of the RPC message
|
||||
*/
|
||||
#define EVRPC_STRUCT(rpcname) struct evrpc_req__##rpcname
|
||||
|
||||
struct evhttp_request;
|
||||
struct evrpc_status;
|
||||
struct evrpc_hook_meta;
|
||||
|
||||
/** Creates the definitions and prototypes for an RPC
|
||||
*
|
||||
* You need to use EVRPC_HEADER to create structures and function prototypes
|
||||
* needed by the server and client implementation. The structures have to be
|
||||
* defined in an .rpc file and converted to source code via event_rpcgen.py
|
||||
*
|
||||
* @param rpcname the name of the RPC
|
||||
* @param reqstruct the name of the RPC request structure
|
||||
* @param replystruct the name of the RPC reply structure
|
||||
* @see EVRPC_GENERATE()
|
||||
*/
|
||||
#define EVRPC_HEADER(rpcname, reqstruct, rplystruct) \
|
||||
EVRPC_STRUCT(rpcname) { \
|
||||
struct evrpc_hook_meta *hook_meta; \
|
||||
struct reqstruct* request; \
|
||||
struct rplystruct* reply; \
|
||||
struct evrpc* rpc; \
|
||||
struct evhttp_request* http_req; \
|
||||
struct evbuffer* rpc_data; \
|
||||
}; \
|
||||
EVENT2_EXPORT_SYMBOL \
|
||||
int evrpc_send_request_##rpcname(struct evrpc_pool *, \
|
||||
struct reqstruct *, struct rplystruct *, \
|
||||
void (*)(struct evrpc_status *, \
|
||||
struct reqstruct *, struct rplystruct *, void *cbarg), \
|
||||
void *);
|
||||
|
||||
struct evrpc_pool;
|
||||
|
||||
/** use EVRPC_GENERATE instead */
|
||||
EVENT2_EXPORT_SYMBOL
|
||||
struct evrpc_request_wrapper *evrpc_make_request_ctx(
|
||||
struct evrpc_pool *pool, void *request, void *reply,
|
||||
const char *rpcname,
|
||||
void (*req_marshal)(struct evbuffer*, void *),
|
||||
void (*rpl_clear)(void *),
|
||||
int (*rpl_unmarshal)(void *, struct evbuffer *),
|
||||
void (*cb)(struct evrpc_status *, void *, void *, void *),
|
||||
void *cbarg);
|
||||
|
||||
/** Creates a context structure that contains rpc specific information.
|
||||
*
|
||||
* EVRPC_MAKE_CTX is used to populate a RPC specific context that
|
||||
* contains information about marshaling the RPC data types.
|
||||
*
|
||||
* @param rpcname the name of the RPC
|
||||
* @param reqstruct the name of the RPC request structure
|
||||
* @param replystruct the name of the RPC reply structure
|
||||
* @param pool the evrpc_pool over which to make the request
|
||||
* @param request a pointer to the RPC request structure object
|
||||
* @param reply a pointer to the RPC reply structure object
|
||||
* @param cb the callback function to call when the RPC has completed
|
||||
* @param cbarg the argument to supply to the callback
|
||||
*/
|
||||
#define EVRPC_MAKE_CTX(rpcname, reqstruct, rplystruct, \
|
||||
pool, request, reply, cb, cbarg) \
|
||||
evrpc_make_request_ctx(pool, request, reply, \
|
||||
#rpcname, \
|
||||
(void (*)(struct evbuffer *, void *))reqstruct##_marshal, \
|
||||
(void (*)(void *))rplystruct##_clear, \
|
||||
(int (*)(void *, struct evbuffer *))rplystruct##_unmarshal, \
|
||||
(void (*)(struct evrpc_status *, void *, void *, void *))cb, \
|
||||
cbarg)
|
||||
|
||||
/** Generates the code for receiving and sending an RPC message
|
||||
*
|
||||
* EVRPC_GENERATE is used to create the code corresponding to sending
|
||||
* and receiving a particular RPC message
|
||||
*
|
||||
* @param rpcname the name of the RPC
|
||||
* @param reqstruct the name of the RPC request structure
|
||||
* @param replystruct the name of the RPC reply structure
|
||||
* @see EVRPC_HEADER()
|
||||
*/
|
||||
#define EVRPC_GENERATE(rpcname, reqstruct, rplystruct) \
|
||||
int evrpc_send_request_##rpcname(struct evrpc_pool *pool, \
|
||||
struct reqstruct *request, struct rplystruct *reply, \
|
||||
void (*cb)(struct evrpc_status *, \
|
||||
struct reqstruct *, struct rplystruct *, void *cbarg), \
|
||||
void *cbarg) { \
|
||||
return evrpc_send_request_generic(pool, request, reply, \
|
||||
(void (*)(struct evrpc_status *, void *, void *, void *))cb, \
|
||||
cbarg, \
|
||||
#rpcname, \
|
||||
(void (*)(struct evbuffer *, void *))reqstruct##_marshal, \
|
||||
(void (*)(void *))rplystruct##_clear, \
|
||||
(int (*)(void *, struct evbuffer *))rplystruct##_unmarshal); \
|
||||
}
|
||||
|
||||
/** Provides access to the HTTP request object underlying an RPC
|
||||
*
|
||||
* Access to the underlying http object; can be used to look at headers or
|
||||
* for getting the remote ip address
|
||||
*
|
||||
* @param rpc_req the rpc request structure provided to the server callback
|
||||
* @return an struct evhttp_request object that can be inspected for
|
||||
* HTTP headers or sender information.
|
||||
*/
|
||||
#define EVRPC_REQUEST_HTTP(rpc_req) (rpc_req)->http_req
|
||||
|
||||
/** completes the server response to an rpc request */
|
||||
EVENT2_EXPORT_SYMBOL
|
||||
void evrpc_request_done(struct evrpc_req_generic *req);
|
||||
|
||||
/** accessors for request and reply */
|
||||
EVENT2_EXPORT_SYMBOL
|
||||
void *evrpc_get_request(struct evrpc_req_generic *req);
|
||||
EVENT2_EXPORT_SYMBOL
|
||||
void *evrpc_get_reply(struct evrpc_req_generic *req);
|
||||
|
||||
/** Creates the reply to an RPC request
|
||||
*
|
||||
* EVRPC_REQUEST_DONE is used to answer a request; the reply is expected
|
||||
* to have been filled in. The request and reply pointers become invalid
|
||||
* after this call has finished.
|
||||
*
|
||||
* @param rpc_req the rpc request structure provided to the server callback
|
||||
*/
|
||||
#define EVRPC_REQUEST_DONE(rpc_req) do { \
|
||||
struct evrpc_req_generic *req_ = (struct evrpc_req_generic *)(rpc_req); \
|
||||
evrpc_request_done(req_); \
|
||||
} while (0)
|
||||
|
||||
|
||||
struct evrpc_base;
|
||||
struct evhttp;
|
||||
|
||||
/* functions to start up the rpc system */
|
||||
|
||||
/** Creates a new rpc base from which RPC requests can be received
|
||||
*
|
||||
* @param server a pointer to an existing HTTP server
|
||||
* @return a newly allocated evrpc_base struct or NULL if an error occurred
|
||||
* @see evrpc_free()
|
||||
*/
|
||||
EVENT2_EXPORT_SYMBOL
|
||||
struct evrpc_base *evrpc_init(struct evhttp *server);
|
||||
|
||||
/**
|
||||
* Frees the evrpc base
|
||||
*
|
||||
* For now, you are responsible for making sure that no rpcs are ongoing.
|
||||
*
|
||||
* @param base the evrpc_base object to be freed
|
||||
* @see evrpc_init
|
||||
*/
|
||||
EVENT2_EXPORT_SYMBOL
|
||||
void evrpc_free(struct evrpc_base *base);
|
||||
|
||||
/** register RPCs with the HTTP Server
|
||||
*
|
||||
* registers a new RPC with the HTTP server, each RPC needs to have
|
||||
* a unique name under which it can be identified.
|
||||
*
|
||||
* @param base the evrpc_base structure in which the RPC should be
|
||||
* registered.
|
||||
* @param name the name of the RPC
|
||||
* @param request the name of the RPC request structure
|
||||
* @param reply the name of the RPC reply structure
|
||||
* @param callback the callback that should be invoked when the RPC
|
||||
* is received. The callback has the following prototype
|
||||
* void (*callback)(EVRPC_STRUCT(Message)* rpc, void *arg)
|
||||
* @param cbarg an additional parameter that can be passed to the callback.
|
||||
* The parameter can be used to carry around state.
|
||||
*/
|
||||
#define EVRPC_REGISTER(base, name, request, reply, callback, cbarg) \
|
||||
evrpc_register_generic(base, #name, \
|
||||
(void (*)(struct evrpc_req_generic *, void *))callback, cbarg, \
|
||||
(void *(*)(void *))request##_new_with_arg, NULL, \
|
||||
(void (*)(void *))request##_free, \
|
||||
(int (*)(void *, struct evbuffer *))request##_unmarshal, \
|
||||
(void *(*)(void *))reply##_new_with_arg, NULL, \
|
||||
(void (*)(void *))reply##_free, \
|
||||
(int (*)(void *))reply##_complete, \
|
||||
(void (*)(struct evbuffer *, void *))reply##_marshal)
|
||||
|
||||
/**
|
||||
Low level function for registering an RPC with a server.
|
||||
|
||||
Use EVRPC_REGISTER() instead.
|
||||
|
||||
@see EVRPC_REGISTER()
|
||||
*/
|
||||
EVENT2_EXPORT_SYMBOL
|
||||
int evrpc_register_rpc(struct evrpc_base *, struct evrpc *,
|
||||
void (*)(struct evrpc_req_generic*, void *), void *);
|
||||
|
||||
/**
|
||||
* Unregisters an already registered RPC
|
||||
*
|
||||
* @param base the evrpc_base object from which to unregister an RPC
|
||||
* @param name the name of the rpc to unregister
|
||||
* @return -1 on error or 0 when successful.
|
||||
* @see EVRPC_REGISTER()
|
||||
*/
|
||||
#define EVRPC_UNREGISTER(base, name) evrpc_unregister_rpc((base), #name)
|
||||
|
||||
EVENT2_EXPORT_SYMBOL
|
||||
int evrpc_unregister_rpc(struct evrpc_base *base, const char *name);
|
||||
|
||||
/*
|
||||
* Client-side RPC support
|
||||
*/
|
||||
|
||||
struct evhttp_connection;
|
||||
struct evrpc_status;
|
||||
|
||||
/** launches an RPC and sends it to the server
|
||||
*
|
||||
* EVRPC_MAKE_REQUEST() is used by the client to send an RPC to the server.
|
||||
*
|
||||
* @param name the name of the RPC
|
||||
* @param pool the evrpc_pool that contains the connection objects over which
|
||||
* the request should be sent.
|
||||
* @param request a pointer to the RPC request structure - it contains the
|
||||
* data to be sent to the server.
|
||||
* @param reply a pointer to the RPC reply structure. It is going to be filled
|
||||
* if the request was answered successfully
|
||||
* @param cb the callback to invoke when the RPC request has been answered
|
||||
* @param cbarg an additional argument to be passed to the client
|
||||
* @return 0 on success, -1 on failure
|
||||
*/
|
||||
#define EVRPC_MAKE_REQUEST(name, pool, request, reply, cb, cbarg) \
|
||||
evrpc_send_request_##name((pool), (request), (reply), (cb), (cbarg))
|
||||
|
||||
/**
|
||||
Makes an RPC request based on the provided context.
|
||||
|
||||
This is a low-level function and should not be used directly
|
||||
unless a custom context object is provided. Use EVRPC_MAKE_REQUEST()
|
||||
instead.
|
||||
|
||||
@param ctx a context from EVRPC_MAKE_CTX()
|
||||
@returns 0 on success, -1 otherwise.
|
||||
@see EVRPC_MAKE_REQUEST(), EVRPC_MAKE_CTX()
|
||||
*/
|
||||
EVENT2_EXPORT_SYMBOL
|
||||
int evrpc_make_request(struct evrpc_request_wrapper *ctx);
|
||||
|
||||
/** creates an rpc connection pool
|
||||
*
|
||||
* a pool has a number of connections associated with it.
|
||||
* rpc requests are always made via a pool.
|
||||
*
|
||||
* @param base a pointer to an struct event_based object; can be left NULL
|
||||
* in singled-threaded applications
|
||||
* @return a newly allocated struct evrpc_pool object or NULL if an error
|
||||
* occurred
|
||||
* @see evrpc_pool_free()
|
||||
*/
|
||||
EVENT2_EXPORT_SYMBOL
|
||||
struct evrpc_pool *evrpc_pool_new(struct event_base *base);
|
||||
/** frees an rpc connection pool
|
||||
*
|
||||
* @param pool a pointer to an evrpc_pool allocated via evrpc_pool_new()
|
||||
* @see evrpc_pool_new()
|
||||
*/
|
||||
EVENT2_EXPORT_SYMBOL
|
||||
void evrpc_pool_free(struct evrpc_pool *pool);
|
||||
|
||||
/**
|
||||
* Adds a connection over which rpc can be dispatched to the pool.
|
||||
*
|
||||
* The connection object must have been newly created.
|
||||
*
|
||||
* @param pool the pool to which to add the connection
|
||||
* @param evcon the connection to add to the pool.
|
||||
*/
|
||||
EVENT2_EXPORT_SYMBOL
|
||||
void evrpc_pool_add_connection(struct evrpc_pool *pool,
|
||||
struct evhttp_connection *evcon);
|
||||
|
||||
/**
|
||||
* Removes a connection from the pool.
|
||||
*
|
||||
* The connection object must have been newly created.
|
||||
*
|
||||
* @param pool the pool from which to remove the connection
|
||||
* @param evcon the connection to remove from the pool.
|
||||
*/
|
||||
EVENT2_EXPORT_SYMBOL
|
||||
void evrpc_pool_remove_connection(struct evrpc_pool *pool,
|
||||
struct evhttp_connection *evcon);
|
||||
|
||||
/**
|
||||
* Sets the timeout in secs after which a request has to complete. The
|
||||
* RPC is completely aborted if it does not complete by then. Setting
|
||||
* the timeout to 0 means that it never timeouts and can be used to
|
||||
* implement callback type RPCs.
|
||||
*
|
||||
* Any connection already in the pool will be updated with the new
|
||||
* timeout. Connections added to the pool after set_timeout has be
|
||||
* called receive the pool timeout only if no timeout has been set
|
||||
* for the connection itself.
|
||||
*
|
||||
* @param pool a pointer to a struct evrpc_pool object
|
||||
* @param timeout_in_secs the number of seconds after which a request should
|
||||
* timeout and a failure be returned to the callback.
|
||||
*/
|
||||
EVENT2_EXPORT_SYMBOL
|
||||
void evrpc_pool_set_timeout(struct evrpc_pool *pool, int timeout_in_secs);
|
||||
|
||||
/**
|
||||
* Hooks for changing the input and output of RPCs; this can be used to
|
||||
* implement compression, authentication, encryption, ...
|
||||
*/
|
||||
|
||||
enum EVRPC_HOOK_TYPE {
|
||||
EVRPC_INPUT, /**< apply the function to an input hook */
|
||||
EVRPC_OUTPUT /**< apply the function to an output hook */
|
||||
};
|
||||
|
||||
#ifndef _WIN32
|
||||
/** Deprecated alias for EVRPC_INPUT. Not available on windows, where it
|
||||
* conflicts with platform headers. */
|
||||
#define INPUT EVRPC_INPUT
|
||||
/** Deprecated alias for EVRPC_OUTPUT. Not available on windows, where it
|
||||
* conflicts with platform headers. */
|
||||
#define OUTPUT EVRPC_OUTPUT
|
||||
#endif
|
||||
|
||||
/**
|
||||
* Return value from hook processing functions
|
||||
*/
|
||||
|
||||
enum EVRPC_HOOK_RESULT {
|
||||
EVRPC_TERMINATE = -1, /**< indicates the rpc should be terminated */
|
||||
EVRPC_CONTINUE = 0, /**< continue processing the rpc */
|
||||
EVRPC_PAUSE = 1 /**< pause processing request until resumed */
|
||||
};
|
||||
|
||||
/** adds a processing hook to either an rpc base or rpc pool
|
||||
*
|
||||
* If a hook returns TERMINATE, the processing is aborted. On CONTINUE,
|
||||
* the request is immediately processed after the hook returns. If the
|
||||
* hook returns PAUSE, request processing stops until evrpc_resume_request()
|
||||
* has been called.
|
||||
*
|
||||
* The add functions return handles that can be used for removing hooks.
|
||||
*
|
||||
* @param vbase a pointer to either struct evrpc_base or struct evrpc_pool
|
||||
* @param hook_type either INPUT or OUTPUT
|
||||
* @param cb the callback to call when the hook is activated
|
||||
* @param cb_arg an additional argument for the callback
|
||||
* @return a handle to the hook so it can be removed later
|
||||
* @see evrpc_remove_hook()
|
||||
*/
|
||||
EVENT2_EXPORT_SYMBOL
|
||||
void *evrpc_add_hook(void *vbase,
|
||||
enum EVRPC_HOOK_TYPE hook_type,
|
||||
int (*cb)(void *, struct evhttp_request *, struct evbuffer *, void *),
|
||||
void *cb_arg);
|
||||
|
||||
/** removes a previously added hook
|
||||
*
|
||||
* @param vbase a pointer to either struct evrpc_base or struct evrpc_pool
|
||||
* @param hook_type either INPUT or OUTPUT
|
||||
* @param handle a handle returned by evrpc_add_hook()
|
||||
* @return 1 on success or 0 on failure
|
||||
* @see evrpc_add_hook()
|
||||
*/
|
||||
EVENT2_EXPORT_SYMBOL
|
||||
int evrpc_remove_hook(void *vbase,
|
||||
enum EVRPC_HOOK_TYPE hook_type,
|
||||
void *handle);
|
||||
|
||||
/** resume a paused request
|
||||
*
|
||||
* @param vbase a pointer to either struct evrpc_base or struct evrpc_pool
|
||||
* @param ctx the context pointer provided to the original hook call
|
||||
*/
|
||||
EVENT2_EXPORT_SYMBOL
|
||||
int evrpc_resume_request(void *vbase, void *ctx, enum EVRPC_HOOK_RESULT res);
|
||||
|
||||
/** adds meta data to request
|
||||
*
|
||||
* evrpc_hook_add_meta() allows hooks to add meta data to a request. for
|
||||
* a client request, the meta data can be inserted by an outgoing request hook
|
||||
* and retrieved by the incoming request hook.
|
||||
*
|
||||
* @param ctx the context provided to the hook call
|
||||
* @param key a NUL-terminated c-string
|
||||
* @param data the data to be associated with the key
|
||||
* @param data_size the size of the data
|
||||
*/
|
||||
EVENT2_EXPORT_SYMBOL
|
||||
void evrpc_hook_add_meta(void *ctx, const char *key,
|
||||
const void *data, size_t data_size);
|
||||
|
||||
/** retrieves meta data previously associated
|
||||
*
|
||||
* evrpc_hook_find_meta() can be used to retrieve meta data associated to a
|
||||
* request by a previous hook.
|
||||
* @param ctx the context provided to the hook call
|
||||
* @param key a NUL-terminated c-string
|
||||
* @param data pointer to a data pointer that will contain the retrieved data
|
||||
* @param data_size pointer to the size of the data
|
||||
* @return 0 on success or -1 on failure
|
||||
*/
|
||||
EVENT2_EXPORT_SYMBOL
|
||||
int evrpc_hook_find_meta(void *ctx, const char *key,
|
||||
void **data, size_t *data_size);
|
||||
|
||||
/**
|
||||
* returns the connection object associated with the request
|
||||
*
|
||||
* @param ctx the context provided to the hook call
|
||||
* @return a pointer to the evhttp_connection object or NULL if an error
|
||||
* occurred
|
||||
*/
|
||||
EVENT2_EXPORT_SYMBOL
|
||||
struct evhttp_connection *evrpc_hook_get_connection(void *ctx);
|
||||
|
||||
/**
|
||||
Function for sending a generic RPC request.
|
||||
|
||||
Do not call this function directly, use EVRPC_MAKE_REQUEST() instead.
|
||||
|
||||
@see EVRPC_MAKE_REQUEST()
|
||||
*/
|
||||
EVENT2_EXPORT_SYMBOL
|
||||
int evrpc_send_request_generic(struct evrpc_pool *pool,
|
||||
void *request, void *reply,
|
||||
void (*cb)(struct evrpc_status *, void *, void *, void *),
|
||||
void *cb_arg,
|
||||
const char *rpcname,
|
||||
void (*req_marshal)(struct evbuffer *, void *),
|
||||
void (*rpl_clear)(void *),
|
||||
int (*rpl_unmarshal)(void *, struct evbuffer *));
|
||||
|
||||
/**
|
||||
Function for registering a generic RPC with the RPC base.
|
||||
|
||||
Do not call this function directly, use EVRPC_REGISTER() instead.
|
||||
|
||||
@see EVRPC_REGISTER()
|
||||
*/
|
||||
EVENT2_EXPORT_SYMBOL
|
||||
int evrpc_register_generic(struct evrpc_base *base, const char *name,
|
||||
void (*callback)(struct evrpc_req_generic *, void *), void *cbarg,
|
||||
void *(*req_new)(void *), void *req_new_arg, void (*req_free)(void *),
|
||||
int (*req_unmarshal)(void *, struct evbuffer *),
|
||||
void *(*rpl_new)(void *), void *rpl_new_arg, void (*rpl_free)(void *),
|
||||
int (*rpl_complete)(void *),
|
||||
void (*rpl_marshal)(struct evbuffer *, void *));
|
||||
|
||||
/** accessors for obscure and undocumented functionality */
|
||||
EVENT2_EXPORT_SYMBOL
|
||||
struct evrpc_pool* evrpc_request_get_pool(struct evrpc_request_wrapper *ctx);
|
||||
EVENT2_EXPORT_SYMBOL
|
||||
void evrpc_request_set_pool(struct evrpc_request_wrapper *ctx,
|
||||
struct evrpc_pool *pool);
|
||||
EVENT2_EXPORT_SYMBOL
|
||||
void evrpc_request_set_cb(struct evrpc_request_wrapper *ctx,
|
||||
void (*cb)(struct evrpc_status*, void *request, void *reply, void *arg),
|
||||
void *cb_arg);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* EVENT2_RPC_H_INCLUDED_ */
|
||||
61
macx64/mpi/openmpi/include/event2/rpc_compat.h
Normal file
61
macx64/mpi/openmpi/include/event2/rpc_compat.h
Normal file
@@ -0,0 +1,61 @@
|
||||
/*
|
||||
* Copyright (c) 2006-2007 Niels Provos <provos@citi.umich.edu>
|
||||
* Copyright (c) 2007-2012 Niels Provos and Nick Mathewson
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* 3. The name of the author may not be used to endorse or promote products
|
||||
* derived from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
||||
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
||||
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
||||
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
#ifndef EVENT2_RPC_COMPAT_H_INCLUDED_
|
||||
#define EVENT2_RPC_COMPAT_H_INCLUDED_
|
||||
|
||||
/** @file event2/rpc_compat.h
|
||||
|
||||
Deprecated versions of the functions in rpc.h: provided only for
|
||||
backwards compatibility.
|
||||
|
||||
*/
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/** backwards compatible accessors that work only with gcc */
|
||||
#if defined(__GNUC__) && !defined(__STRICT_ANSI__)
|
||||
|
||||
#undef EVTAG_ASSIGN
|
||||
#undef EVTAG_GET
|
||||
#undef EVTAG_ADD
|
||||
|
||||
#define EVTAG_ASSIGN(msg, member, args...) \
|
||||
(*(msg)->base->member##_assign)(msg, ## args)
|
||||
#define EVTAG_GET(msg, member, args...) \
|
||||
(*(msg)->base->member##_get)(msg, ## args)
|
||||
#define EVTAG_ADD(msg, member, args...) \
|
||||
(*(msg)->base->member##_add)(msg, ## args)
|
||||
#endif
|
||||
#define EVTAG_LEN(msg, member) ((msg)->member##_length)
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* EVENT2_EVENT_COMPAT_H_INCLUDED_ */
|
||||
114
macx64/mpi/openmpi/include/event2/rpc_struct.h
Normal file
114
macx64/mpi/openmpi/include/event2/rpc_struct.h
Normal file
@@ -0,0 +1,114 @@
|
||||
/*
|
||||
* Copyright (c) 2006-2007 Niels Provos <provos@citi.umich.edu>
|
||||
* Copyright (c) 2007-2012 Niels Provos and Nick Mathewson
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* 3. The name of the author may not be used to endorse or promote products
|
||||
* derived from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
||||
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
||||
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
||||
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
#ifndef EVENT2_RPC_STRUCT_H_INCLUDED_
|
||||
#define EVENT2_RPC_STRUCT_H_INCLUDED_
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/** @file event2/rpc_struct.h
|
||||
|
||||
Structures used by rpc.h. Using these structures directly may harm
|
||||
forward compatibility: be careful!
|
||||
|
||||
*/
|
||||
|
||||
/* Fix so that people don't have to run with <sys/queue.h> */
|
||||
#ifndef TAILQ_ENTRY
|
||||
#define EVENT_DEFINED_TQENTRY_
|
||||
#define TAILQ_ENTRY(type) \
|
||||
struct { \
|
||||
struct type *tqe_next; /* next element */ \
|
||||
struct type **tqe_prev; /* address of previous next element */ \
|
||||
}
|
||||
#endif /* !TAILQ_ENTRY */
|
||||
|
||||
/**
|
||||
* provides information about the completed RPC request.
|
||||
*/
|
||||
struct evrpc_status {
|
||||
#define EVRPC_STATUS_ERR_NONE 0
|
||||
#define EVRPC_STATUS_ERR_TIMEOUT 1
|
||||
#define EVRPC_STATUS_ERR_BADPAYLOAD 2
|
||||
#define EVRPC_STATUS_ERR_UNSTARTED 3
|
||||
#define EVRPC_STATUS_ERR_HOOKABORTED 4
|
||||
int error;
|
||||
|
||||
/* for looking at headers or other information */
|
||||
struct evhttp_request *http_req;
|
||||
};
|
||||
|
||||
/* the structure below needs to be synchronized with evrpc_req_generic */
|
||||
|
||||
/* Encapsulates a request */
|
||||
struct evrpc {
|
||||
TAILQ_ENTRY(evrpc) next;
|
||||
|
||||
/* the URI at which the request handler lives */
|
||||
const char* uri;
|
||||
|
||||
/* creates a new request structure */
|
||||
void *(*request_new)(void *);
|
||||
void *request_new_arg;
|
||||
|
||||
/* frees the request structure */
|
||||
void (*request_free)(void *);
|
||||
|
||||
/* unmarshals the buffer into the proper request structure */
|
||||
int (*request_unmarshal)(void *, struct evbuffer *);
|
||||
|
||||
/* creates a new reply structure */
|
||||
void *(*reply_new)(void *);
|
||||
void *reply_new_arg;
|
||||
|
||||
/* frees the reply structure */
|
||||
void (*reply_free)(void *);
|
||||
|
||||
/* verifies that the reply is valid */
|
||||
int (*reply_complete)(void *);
|
||||
|
||||
/* marshals the reply into a buffer */
|
||||
void (*reply_marshal)(struct evbuffer*, void *);
|
||||
|
||||
/* the callback invoked for each received rpc */
|
||||
void (*cb)(struct evrpc_req_generic *, void *);
|
||||
void *cb_arg;
|
||||
|
||||
/* reference for further configuration */
|
||||
struct evrpc_base *base;
|
||||
};
|
||||
|
||||
#ifdef EVENT_DEFINED_TQENTRY_
|
||||
#undef TAILQ_ENTRY
|
||||
#endif
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* EVENT2_RPC_STRUCT_H_INCLUDED_ */
|
||||
146
macx64/mpi/openmpi/include/event2/tag.h
Normal file
146
macx64/mpi/openmpi/include/event2/tag.h
Normal file
@@ -0,0 +1,146 @@
|
||||
/*
|
||||
* Copyright (c) 2000-2007 Niels Provos <provos@citi.umich.edu>
|
||||
* Copyright (c) 2007-2012 Niels Provos and Nick Mathewson
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* 3. The name of the author may not be used to endorse or promote products
|
||||
* derived from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
||||
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
||||
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
||||
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
#ifndef EVENT2_TAG_H_INCLUDED_
|
||||
#define EVENT2_TAG_H_INCLUDED_
|
||||
|
||||
/** @file event2/tag.h
|
||||
|
||||
Helper functions for reading and writing tagged data onto buffers.
|
||||
|
||||
*/
|
||||
|
||||
#include <event2/visibility.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#include <event2/event-config.h>
|
||||
#ifdef EVENT__HAVE_SYS_TYPES_H
|
||||
#include <sys/types.h>
|
||||
#endif
|
||||
#ifdef EVENT__HAVE_SYS_TIME_H
|
||||
#include <sys/time.h>
|
||||
#endif
|
||||
|
||||
/* For int types. */
|
||||
#include <event2/util.h>
|
||||
|
||||
struct evbuffer;
|
||||
|
||||
/*
|
||||
* Marshaling tagged data - We assume that all tags are inserted in their
|
||||
* numeric order - so that unknown tags will always be higher than the
|
||||
* known ones - and we can just ignore the end of an event buffer.
|
||||
*/
|
||||
|
||||
EVENT2_EXPORT_SYMBOL
|
||||
void evtag_init(void);
|
||||
|
||||
/**
|
||||
Unmarshals the header and returns the length of the payload
|
||||
|
||||
@param evbuf the buffer from which to unmarshal data
|
||||
@param ptag a pointer in which the tag id is being stored
|
||||
@returns -1 on failure or the number of bytes in the remaining payload.
|
||||
*/
|
||||
EVENT2_EXPORT_SYMBOL
|
||||
int evtag_unmarshal_header(struct evbuffer *evbuf, ev_uint32_t *ptag);
|
||||
|
||||
EVENT2_EXPORT_SYMBOL
|
||||
void evtag_marshal(struct evbuffer *evbuf, ev_uint32_t tag, const void *data,
|
||||
ev_uint32_t len);
|
||||
EVENT2_EXPORT_SYMBOL
|
||||
void evtag_marshal_buffer(struct evbuffer *evbuf, ev_uint32_t tag,
|
||||
struct evbuffer *data);
|
||||
|
||||
/**
|
||||
Encode an integer and store it in an evbuffer.
|
||||
|
||||
We encode integers by nybbles; the first nibble contains the number
|
||||
of significant nibbles - 1; this allows us to encode up to 64-bit
|
||||
integers. This function is byte-order independent.
|
||||
|
||||
@param evbuf evbuffer to store the encoded number
|
||||
@param number a 32-bit integer
|
||||
*/
|
||||
EVENT2_EXPORT_SYMBOL
|
||||
void evtag_encode_int(struct evbuffer *evbuf, ev_uint32_t number);
|
||||
EVENT2_EXPORT_SYMBOL
|
||||
void evtag_encode_int64(struct evbuffer *evbuf, ev_uint64_t number);
|
||||
|
||||
EVENT2_EXPORT_SYMBOL
|
||||
void evtag_marshal_int(struct evbuffer *evbuf, ev_uint32_t tag,
|
||||
ev_uint32_t integer);
|
||||
EVENT2_EXPORT_SYMBOL
|
||||
void evtag_marshal_int64(struct evbuffer *evbuf, ev_uint32_t tag,
|
||||
ev_uint64_t integer);
|
||||
|
||||
EVENT2_EXPORT_SYMBOL
|
||||
void evtag_marshal_string(struct evbuffer *buf, ev_uint32_t tag,
|
||||
const char *string);
|
||||
|
||||
EVENT2_EXPORT_SYMBOL
|
||||
void evtag_marshal_timeval(struct evbuffer *evbuf, ev_uint32_t tag,
|
||||
struct timeval *tv);
|
||||
|
||||
EVENT2_EXPORT_SYMBOL
|
||||
int evtag_unmarshal(struct evbuffer *src, ev_uint32_t *ptag,
|
||||
struct evbuffer *dst);
|
||||
EVENT2_EXPORT_SYMBOL
|
||||
int evtag_peek(struct evbuffer *evbuf, ev_uint32_t *ptag);
|
||||
EVENT2_EXPORT_SYMBOL
|
||||
int evtag_peek_length(struct evbuffer *evbuf, ev_uint32_t *plength);
|
||||
EVENT2_EXPORT_SYMBOL
|
||||
int evtag_payload_length(struct evbuffer *evbuf, ev_uint32_t *plength);
|
||||
EVENT2_EXPORT_SYMBOL
|
||||
int evtag_consume(struct evbuffer *evbuf);
|
||||
|
||||
EVENT2_EXPORT_SYMBOL
|
||||
int evtag_unmarshal_int(struct evbuffer *evbuf, ev_uint32_t need_tag,
|
||||
ev_uint32_t *pinteger);
|
||||
EVENT2_EXPORT_SYMBOL
|
||||
int evtag_unmarshal_int64(struct evbuffer *evbuf, ev_uint32_t need_tag,
|
||||
ev_uint64_t *pinteger);
|
||||
|
||||
EVENT2_EXPORT_SYMBOL
|
||||
int evtag_unmarshal_fixed(struct evbuffer *src, ev_uint32_t need_tag,
|
||||
void *data, size_t len);
|
||||
|
||||
EVENT2_EXPORT_SYMBOL
|
||||
int evtag_unmarshal_string(struct evbuffer *evbuf, ev_uint32_t need_tag,
|
||||
char **pstring);
|
||||
|
||||
EVENT2_EXPORT_SYMBOL
|
||||
int evtag_unmarshal_timeval(struct evbuffer *evbuf, ev_uint32_t need_tag,
|
||||
struct timeval *ptv);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* EVENT2_TAG_H_INCLUDED_ */
|
||||
49
macx64/mpi/openmpi/include/event2/tag_compat.h
Normal file
49
macx64/mpi/openmpi/include/event2/tag_compat.h
Normal file
@@ -0,0 +1,49 @@
|
||||
/*
|
||||
* Copyright (c) 2000-2007 Niels Provos <provos@citi.umich.edu>
|
||||
* Copyright (c) 2007-2012 Niels Provos and Nick Mathewson
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* 3. The name of the author may not be used to endorse or promote products
|
||||
* derived from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
||||
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
||||
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
||||
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
#ifndef EVENT2_TAG_COMPAT_H_INCLUDED_
|
||||
#define EVENT2_TAG_COMPAT_H_INCLUDED_
|
||||
|
||||
/** @file event2/tag_compat.h
|
||||
|
||||
Obsolete/deprecated functions from tag.h; provided only for backwards
|
||||
compatibility.
|
||||
*/
|
||||
|
||||
/**
|
||||
@name Misnamed functions
|
||||
|
||||
@deprecated These macros are deprecated because their names don't follow
|
||||
Libevent's naming conventions. Use evtag_encode_int and
|
||||
evtag_encode_int64 instead.
|
||||
|
||||
@{
|
||||
*/
|
||||
#define encode_int(evbuf, number) evtag_encode_int((evbuf), (number))
|
||||
#define encode_int64(evbuf, number) evtag_encode_int64((evbuf), (number))
|
||||
/**@}*/
|
||||
|
||||
#endif /* EVENT2_TAG_H_INCLUDED_ */
|
||||
253
macx64/mpi/openmpi/include/event2/thread.h
Normal file
253
macx64/mpi/openmpi/include/event2/thread.h
Normal file
@@ -0,0 +1,253 @@
|
||||
/*
|
||||
* Copyright (c) 2008-2012 Niels Provos and Nick Mathewson
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* 3. The name of the author may not be used to endorse or promote products
|
||||
* derived from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
||||
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
||||
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
||||
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
#ifndef EVENT2_THREAD_H_INCLUDED_
|
||||
#define EVENT2_THREAD_H_INCLUDED_
|
||||
|
||||
/** @file event2/thread.h
|
||||
|
||||
Functions for multi-threaded applications using Libevent.
|
||||
|
||||
When using a multi-threaded application in which multiple threads
|
||||
add and delete events from a single event base, Libevent needs to
|
||||
lock its data structures.
|
||||
|
||||
Like the memory-management function hooks, all of the threading functions
|
||||
_must_ be set up before an event_base is created if you want the base to
|
||||
use them.
|
||||
|
||||
Most programs will either be using Windows threads or Posix threads. You
|
||||
can configure Libevent to use one of these event_use_windows_threads() or
|
||||
event_use_pthreads() respectively. If you're using another threading
|
||||
library, you'll need to configure threading functions manually using
|
||||
evthread_set_lock_callbacks() and evthread_set_condition_callbacks().
|
||||
|
||||
*/
|
||||
|
||||
#include <event2/visibility.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#include <event2/event-config.h>
|
||||
|
||||
/**
|
||||
@name Flags passed to lock functions
|
||||
|
||||
@{
|
||||
*/
|
||||
/** A flag passed to a locking callback when the lock was allocated as a
|
||||
* read-write lock, and we want to acquire or release the lock for writing. */
|
||||
#define EVTHREAD_WRITE 0x04
|
||||
/** A flag passed to a locking callback when the lock was allocated as a
|
||||
* read-write lock, and we want to acquire or release the lock for reading. */
|
||||
#define EVTHREAD_READ 0x08
|
||||
/** A flag passed to a locking callback when we don't want to block waiting
|
||||
* for the lock; if we can't get the lock immediately, we will instead
|
||||
* return nonzero from the locking callback. */
|
||||
#define EVTHREAD_TRY 0x10
|
||||
/**@}*/
|
||||
|
||||
#if !defined(EVENT__DISABLE_THREAD_SUPPORT) || defined(EVENT_IN_DOXYGEN_)
|
||||
|
||||
#define EVTHREAD_LOCK_API_VERSION 1
|
||||
|
||||
/**
|
||||
@name Types of locks
|
||||
|
||||
@{*/
|
||||
/** A recursive lock is one that can be acquired multiple times at once by the
|
||||
* same thread. No other process can allocate the lock until the thread that
|
||||
* has been holding it has unlocked it as many times as it locked it. */
|
||||
#define EVTHREAD_LOCKTYPE_RECURSIVE 1
|
||||
/* A read-write lock is one that allows multiple simultaneous readers, but
|
||||
* where any one writer excludes all other writers and readers. */
|
||||
#define EVTHREAD_LOCKTYPE_READWRITE 2
|
||||
/**@}*/
|
||||
|
||||
/** This structure describes the interface a threading library uses for
|
||||
* locking. It's used to tell evthread_set_lock_callbacks() how to use
|
||||
* locking on this platform.
|
||||
*/
|
||||
struct evthread_lock_callbacks {
|
||||
/** The current version of the locking API. Set this to
|
||||
* EVTHREAD_LOCK_API_VERSION */
|
||||
int lock_api_version;
|
||||
/** Which kinds of locks does this version of the locking API
|
||||
* support? A bitfield of EVTHREAD_LOCKTYPE_RECURSIVE and
|
||||
* EVTHREAD_LOCKTYPE_READWRITE.
|
||||
*
|
||||
* (Note that RECURSIVE locks are currently mandatory, and
|
||||
* READWRITE locks are not currently used.)
|
||||
**/
|
||||
unsigned supported_locktypes;
|
||||
/** Function to allocate and initialize new lock of type 'locktype'.
|
||||
* Returns NULL on failure. */
|
||||
void *(*alloc)(unsigned locktype);
|
||||
/** Funtion to release all storage held in 'lock', which was created
|
||||
* with type 'locktype'. */
|
||||
void (*free)(void *lock, unsigned locktype);
|
||||
/** Acquire an already-allocated lock at 'lock' with mode 'mode'.
|
||||
* Returns 0 on success, and nonzero on failure. */
|
||||
int (*lock)(unsigned mode, void *lock);
|
||||
/** Release a lock at 'lock' using mode 'mode'. Returns 0 on success,
|
||||
* and nonzero on failure. */
|
||||
int (*unlock)(unsigned mode, void *lock);
|
||||
};
|
||||
|
||||
/** Sets a group of functions that Libevent should use for locking.
|
||||
* For full information on the required callback API, see the
|
||||
* documentation for the individual members of evthread_lock_callbacks.
|
||||
*
|
||||
* Note that if you're using Windows or the Pthreads threading library, you
|
||||
* probably shouldn't call this function; instead, use
|
||||
* evthread_use_windows_threads() or evthread_use_posix_threads() if you can.
|
||||
*/
|
||||
EVENT2_EXPORT_SYMBOL
|
||||
int evthread_set_lock_callbacks(const struct evthread_lock_callbacks *);
|
||||
|
||||
#define EVTHREAD_CONDITION_API_VERSION 1
|
||||
|
||||
struct timeval;
|
||||
|
||||
/** This structure describes the interface a threading library uses for
|
||||
* condition variables. It's used to tell evthread_set_condition_callbacks
|
||||
* how to use locking on this platform.
|
||||
*/
|
||||
struct evthread_condition_callbacks {
|
||||
/** The current version of the conditions API. Set this to
|
||||
* EVTHREAD_CONDITION_API_VERSION */
|
||||
int condition_api_version;
|
||||
/** Function to allocate and initialize a new condition variable.
|
||||
* Returns the condition variable on success, and NULL on failure.
|
||||
* The 'condtype' argument will be 0 with this API version.
|
||||
*/
|
||||
void *(*alloc_condition)(unsigned condtype);
|
||||
/** Function to free a condition variable. */
|
||||
void (*free_condition)(void *cond);
|
||||
/** Function to signal a condition variable. If 'broadcast' is 1, all
|
||||
* threads waiting on 'cond' should be woken; otherwise, only on one
|
||||
* thread is worken. Should return 0 on success, -1 on failure.
|
||||
* This function will only be called while holding the associated
|
||||
* lock for the condition.
|
||||
*/
|
||||
int (*signal_condition)(void *cond, int broadcast);
|
||||
/** Function to wait for a condition variable. The lock 'lock'
|
||||
* will be held when this function is called; should be released
|
||||
* while waiting for the condition to be come signalled, and
|
||||
* should be held again when this function returns.
|
||||
* If timeout is provided, it is interval of seconds to wait for
|
||||
* the event to become signalled; if it is NULL, the function
|
||||
* should wait indefinitely.
|
||||
*
|
||||
* The function should return -1 on error; 0 if the condition
|
||||
* was signalled, or 1 on a timeout. */
|
||||
int (*wait_condition)(void *cond, void *lock,
|
||||
const struct timeval *timeout);
|
||||
};
|
||||
|
||||
/** Sets a group of functions that Libevent should use for condition variables.
|
||||
* For full information on the required callback API, see the
|
||||
* documentation for the individual members of evthread_condition_callbacks.
|
||||
*
|
||||
* Note that if you're using Windows or the Pthreads threading library, you
|
||||
* probably shouldn't call this function; instead, use
|
||||
* evthread_use_windows_threads() or evthread_use_pthreads() if you can.
|
||||
*/
|
||||
EVENT2_EXPORT_SYMBOL
|
||||
int evthread_set_condition_callbacks(
|
||||
const struct evthread_condition_callbacks *);
|
||||
|
||||
/**
|
||||
Sets the function for determining the thread id.
|
||||
|
||||
@param base the event base for which to set the id function
|
||||
@param id_fn the identify function Libevent should invoke to
|
||||
determine the identity of a thread.
|
||||
*/
|
||||
EVENT2_EXPORT_SYMBOL
|
||||
void evthread_set_id_callback(
|
||||
unsigned long (*id_fn)(void));
|
||||
|
||||
#if (defined(_WIN32) && !defined(EVENT__DISABLE_THREAD_SUPPORT)) || defined(EVENT_IN_DOXYGEN_)
|
||||
/** Sets up Libevent for use with Windows builtin locking and thread ID
|
||||
functions. Unavailable if Libevent is not built for Windows.
|
||||
|
||||
@return 0 on success, -1 on failure. */
|
||||
EVENT2_EXPORT_SYMBOL
|
||||
int evthread_use_windows_threads(void);
|
||||
/**
|
||||
Defined if Libevent was built with support for evthread_use_windows_threads()
|
||||
*/
|
||||
#define EVTHREAD_USE_WINDOWS_THREADS_IMPLEMENTED 1
|
||||
#endif
|
||||
|
||||
#if defined(EVENT__HAVE_PTHREADS) || defined(EVENT_IN_DOXYGEN_)
|
||||
/** Sets up Libevent for use with Pthreads locking and thread ID functions.
|
||||
Unavailable if Libevent is not build for use with pthreads. Requires
|
||||
libraries to link against Libevent_pthreads as well as Libevent.
|
||||
|
||||
@return 0 on success, -1 on failure. */
|
||||
EVENT2_EXPORT_SYMBOL
|
||||
int evthread_use_pthreads(void);
|
||||
/** Defined if Libevent was built with support for evthread_use_pthreads() */
|
||||
#define EVTHREAD_USE_PTHREADS_IMPLEMENTED 1
|
||||
|
||||
#endif
|
||||
|
||||
/** Enable debugging wrappers around the current lock callbacks. If Libevent
|
||||
* makes one of several common locking errors, exit with an assertion failure.
|
||||
*
|
||||
* If you're going to call this function, you must do so before any locks are
|
||||
* allocated.
|
||||
**/
|
||||
EVENT2_EXPORT_SYMBOL
|
||||
void evthread_enable_lock_debugging(void);
|
||||
|
||||
/* Old (misspelled) version: This is deprecated; use
|
||||
* evthread_enable_log_debugging instead. */
|
||||
EVENT2_EXPORT_SYMBOL
|
||||
void evthread_enable_lock_debuging(void);
|
||||
|
||||
#endif /* EVENT__DISABLE_THREAD_SUPPORT */
|
||||
|
||||
struct event_base;
|
||||
/** Make sure it's safe to tell an event base to wake up from another thread
|
||||
or a signal handler.
|
||||
|
||||
You shouldn't need to call this by hand; configuring the base with thread
|
||||
support should be necessary and sufficient.
|
||||
|
||||
@return 0 on success, -1 on failure.
|
||||
*/
|
||||
EVENT2_EXPORT_SYMBOL
|
||||
int evthread_make_base_notifiable(struct event_base *base);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* EVENT2_THREAD_H_INCLUDED_ */
|
||||
888
macx64/mpi/openmpi/include/event2/util.h
Normal file
888
macx64/mpi/openmpi/include/event2/util.h
Normal file
@@ -0,0 +1,888 @@
|
||||
/*
|
||||
* Copyright (c) 2007-2012 Niels Provos and Nick Mathewson
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* 3. The name of the author may not be used to endorse or promote products
|
||||
* derived from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
||||
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
||||
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
||||
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
#ifndef EVENT2_UTIL_H_INCLUDED_
|
||||
#define EVENT2_UTIL_H_INCLUDED_
|
||||
|
||||
/** @file event2/util.h
|
||||
|
||||
Common convenience functions for cross-platform portability and
|
||||
related socket manipulations.
|
||||
|
||||
*/
|
||||
#include <event2/visibility.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#include <event2/event-config.h>
|
||||
#ifdef EVENT__HAVE_SYS_TIME_H
|
||||
#include <sys/time.h>
|
||||
#endif
|
||||
#ifdef EVENT__HAVE_STDINT_H
|
||||
#include <stdint.h>
|
||||
#elif defined(EVENT__HAVE_INTTYPES_H)
|
||||
#include <inttypes.h>
|
||||
#endif
|
||||
#ifdef EVENT__HAVE_SYS_TYPES_H
|
||||
#include <sys/types.h>
|
||||
#endif
|
||||
#ifdef EVENT__HAVE_STDDEF_H
|
||||
#include <stddef.h>
|
||||
#endif
|
||||
#ifdef _MSC_VER
|
||||
#include <BaseTsd.h>
|
||||
#endif
|
||||
#include <stdarg.h>
|
||||
#ifdef EVENT__HAVE_NETDB_H
|
||||
#include <netdb.h>
|
||||
#endif
|
||||
|
||||
#ifdef _WIN32
|
||||
#include <winsock2.h>
|
||||
#ifdef EVENT__HAVE_GETADDRINFO
|
||||
/* for EAI_* definitions. */
|
||||
#include <ws2tcpip.h>
|
||||
#endif
|
||||
#else
|
||||
#ifdef EVENT__HAVE_ERRNO_H
|
||||
#include <errno.h>
|
||||
#endif
|
||||
#include <sys/socket.h>
|
||||
#endif
|
||||
|
||||
#include <time.h>
|
||||
|
||||
/* Some openbsd autoconf versions get the name of this macro wrong. */
|
||||
#if defined(EVENT__SIZEOF_VOID__) && !defined(EVENT__SIZEOF_VOID_P)
|
||||
#define EVENT__SIZEOF_VOID_P EVENT__SIZEOF_VOID__
|
||||
#endif
|
||||
|
||||
/**
|
||||
* @name Standard integer types.
|
||||
*
|
||||
* Integer type definitions for types that are supposed to be defined in the
|
||||
* C99-specified stdint.h. Shamefully, some platforms do not include
|
||||
* stdint.h, so we need to replace it. (If you are on a platform like this,
|
||||
* your C headers are now over 10 years out of date. You should bug them to
|
||||
* do something about this.)
|
||||
*
|
||||
* We define:
|
||||
*
|
||||
* <dl>
|
||||
* <dt>ev_uint64_t, ev_uint32_t, ev_uint16_t, ev_uint8_t</dt>
|
||||
* <dd>unsigned integer types of exactly 64, 32, 16, and 8 bits
|
||||
* respectively.</dd>
|
||||
* <dt>ev_int64_t, ev_int32_t, ev_int16_t, ev_int8_t</dt>
|
||||
* <dd>signed integer types of exactly 64, 32, 16, and 8 bits
|
||||
* respectively.</dd>
|
||||
* <dt>ev_uintptr_t, ev_intptr_t</dt>
|
||||
* <dd>unsigned/signed integers large enough
|
||||
* to hold a pointer without loss of bits.</dd>
|
||||
* <dt>ev_ssize_t</dt>
|
||||
* <dd>A signed type of the same size as size_t</dd>
|
||||
* <dt>ev_off_t</dt>
|
||||
* <dd>A signed type typically used to represent offsets within a
|
||||
* (potentially large) file</dd>
|
||||
*
|
||||
* @{
|
||||
*/
|
||||
#ifdef EVENT__HAVE_UINT64_T
|
||||
#define ev_uint64_t uint64_t
|
||||
#define ev_int64_t int64_t
|
||||
#elif defined(_WIN32)
|
||||
#define ev_uint64_t unsigned __int64
|
||||
#define ev_int64_t signed __int64
|
||||
#elif EVENT__SIZEOF_LONG_LONG == 8
|
||||
#define ev_uint64_t unsigned long long
|
||||
#define ev_int64_t long long
|
||||
#elif EVENT__SIZEOF_LONG == 8
|
||||
#define ev_uint64_t unsigned long
|
||||
#define ev_int64_t long
|
||||
#elif defined(EVENT_IN_DOXYGEN_)
|
||||
#define ev_uint64_t ...
|
||||
#define ev_int64_t ...
|
||||
#else
|
||||
#error "No way to define ev_uint64_t"
|
||||
#endif
|
||||
|
||||
#ifdef EVENT__HAVE_UINT32_T
|
||||
#define ev_uint32_t uint32_t
|
||||
#define ev_int32_t int32_t
|
||||
#elif defined(_WIN32)
|
||||
#define ev_uint32_t unsigned int
|
||||
#define ev_int32_t signed int
|
||||
#elif EVENT__SIZEOF_LONG == 4
|
||||
#define ev_uint32_t unsigned long
|
||||
#define ev_int32_t signed long
|
||||
#elif EVENT__SIZEOF_INT == 4
|
||||
#define ev_uint32_t unsigned int
|
||||
#define ev_int32_t signed int
|
||||
#elif defined(EVENT_IN_DOXYGEN_)
|
||||
#define ev_uint32_t ...
|
||||
#define ev_int32_t ...
|
||||
#else
|
||||
#error "No way to define ev_uint32_t"
|
||||
#endif
|
||||
|
||||
#ifdef EVENT__HAVE_UINT16_T
|
||||
#define ev_uint16_t uint16_t
|
||||
#define ev_int16_t int16_t
|
||||
#elif defined(_WIN32)
|
||||
#define ev_uint16_t unsigned short
|
||||
#define ev_int16_t signed short
|
||||
#elif EVENT__SIZEOF_INT == 2
|
||||
#define ev_uint16_t unsigned int
|
||||
#define ev_int16_t signed int
|
||||
#elif EVENT__SIZEOF_SHORT == 2
|
||||
#define ev_uint16_t unsigned short
|
||||
#define ev_int16_t signed short
|
||||
#elif defined(EVENT_IN_DOXYGEN_)
|
||||
#define ev_uint16_t ...
|
||||
#define ev_int16_t ...
|
||||
#else
|
||||
#error "No way to define ev_uint16_t"
|
||||
#endif
|
||||
|
||||
#ifdef EVENT__HAVE_UINT8_T
|
||||
#define ev_uint8_t uint8_t
|
||||
#define ev_int8_t int8_t
|
||||
#elif defined(EVENT_IN_DOXYGEN_)
|
||||
#define ev_uint8_t ...
|
||||
#define ev_int8_t ...
|
||||
#else
|
||||
#define ev_uint8_t unsigned char
|
||||
#define ev_int8_t signed char
|
||||
#endif
|
||||
|
||||
#ifdef EVENT__HAVE_UINTPTR_T
|
||||
#define ev_uintptr_t uintptr_t
|
||||
#define ev_intptr_t intptr_t
|
||||
#elif EVENT__SIZEOF_VOID_P <= 4
|
||||
#define ev_uintptr_t ev_uint32_t
|
||||
#define ev_intptr_t ev_int32_t
|
||||
#elif EVENT__SIZEOF_VOID_P <= 8
|
||||
#define ev_uintptr_t ev_uint64_t
|
||||
#define ev_intptr_t ev_int64_t
|
||||
#elif defined(EVENT_IN_DOXYGEN_)
|
||||
#define ev_uintptr_t ...
|
||||
#define ev_intptr_t ...
|
||||
#else
|
||||
#error "No way to define ev_uintptr_t"
|
||||
#endif
|
||||
|
||||
#ifdef EVENT__ssize_t
|
||||
#define ev_ssize_t EVENT__ssize_t
|
||||
#else
|
||||
#define ev_ssize_t ssize_t
|
||||
#endif
|
||||
|
||||
/* Note that we define ev_off_t based on the compile-time size of off_t that
|
||||
* we used to build Libevent, and not based on the current size of off_t.
|
||||
* (For example, we don't define ev_off_t to off_t.). We do this because
|
||||
* some systems let you build your software with different off_t sizes
|
||||
* at runtime, and so putting in any dependency on off_t would risk API
|
||||
* mismatch.
|
||||
*/
|
||||
#ifdef _WIN32
|
||||
#define ev_off_t ev_int64_t
|
||||
#elif EVENT__SIZEOF_OFF_T == 8
|
||||
#define ev_off_t ev_int64_t
|
||||
#elif EVENT__SIZEOF_OFF_T == 4
|
||||
#define ev_off_t ev_int32_t
|
||||
#elif defined(EVENT_IN_DOXYGEN_)
|
||||
#define ev_off_t ...
|
||||
#else
|
||||
#define ev_off_t off_t
|
||||
#endif
|
||||
/**@}*/
|
||||
|
||||
/* Limits for integer types.
|
||||
|
||||
We're making two assumptions here:
|
||||
- The compiler does constant folding properly.
|
||||
- The platform does signed arithmetic in two's complement.
|
||||
*/
|
||||
|
||||
/**
|
||||
@name Limits for integer types
|
||||
|
||||
These macros hold the largest or smallest values possible for the
|
||||
ev_[u]int*_t types.
|
||||
|
||||
@{
|
||||
*/
|
||||
#ifndef EVENT__HAVE_STDINT_H
|
||||
#define EV_UINT64_MAX ((((ev_uint64_t)0xffffffffUL) << 32) | 0xffffffffUL)
|
||||
#define EV_INT64_MAX ((((ev_int64_t) 0x7fffffffL) << 32) | 0xffffffffL)
|
||||
#define EV_INT64_MIN ((-EV_INT64_MAX) - 1)
|
||||
#define EV_UINT32_MAX ((ev_uint32_t)0xffffffffUL)
|
||||
#define EV_INT32_MAX ((ev_int32_t) 0x7fffffffL)
|
||||
#define EV_INT32_MIN ((-EV_INT32_MAX) - 1)
|
||||
#define EV_UINT16_MAX ((ev_uint16_t)0xffffUL)
|
||||
#define EV_INT16_MAX ((ev_int16_t) 0x7fffL)
|
||||
#define EV_INT16_MIN ((-EV_INT16_MAX) - 1)
|
||||
#define EV_UINT8_MAX 255
|
||||
#define EV_INT8_MAX 127
|
||||
#define EV_INT8_MIN ((-EV_INT8_MAX) - 1)
|
||||
#else
|
||||
#define EV_UINT64_MAX UINT64_MAX
|
||||
#define EV_INT64_MAX INT64_MAX
|
||||
#define EV_INT64_MIN INT64_MIN
|
||||
#define EV_UINT32_MAX UINT32_MAX
|
||||
#define EV_INT32_MAX INT32_MAX
|
||||
#define EV_INT32_MIN INT32_MIN
|
||||
#define EV_UINT16_MAX UINT16_MAX
|
||||
#define EV_INT16_MIN INT16_MIN
|
||||
#define EV_INT16_MAX INT16_MAX
|
||||
#define EV_UINT8_MAX UINT8_MAX
|
||||
#define EV_INT8_MAX INT8_MAX
|
||||
#define EV_INT8_MIN INT8_MIN
|
||||
/** @} */
|
||||
#endif
|
||||
|
||||
|
||||
/**
|
||||
@name Limits for SIZE_T and SSIZE_T
|
||||
|
||||
@{
|
||||
*/
|
||||
#if EVENT__SIZEOF_SIZE_T == 8
|
||||
#define EV_SIZE_MAX EV_UINT64_MAX
|
||||
#define EV_SSIZE_MAX EV_INT64_MAX
|
||||
#elif EVENT__SIZEOF_SIZE_T == 4
|
||||
#define EV_SIZE_MAX EV_UINT32_MAX
|
||||
#define EV_SSIZE_MAX EV_INT32_MAX
|
||||
#elif defined(EVENT_IN_DOXYGEN_)
|
||||
#define EV_SIZE_MAX ...
|
||||
#define EV_SSIZE_MAX ...
|
||||
#else
|
||||
#error "No way to define SIZE_MAX"
|
||||
#endif
|
||||
|
||||
#define EV_SSIZE_MIN ((-EV_SSIZE_MAX) - 1)
|
||||
/**@}*/
|
||||
|
||||
#ifdef _WIN32
|
||||
#define ev_socklen_t int
|
||||
#elif defined(EVENT__socklen_t)
|
||||
#define ev_socklen_t EVENT__socklen_t
|
||||
#else
|
||||
#define ev_socklen_t socklen_t
|
||||
#endif
|
||||
|
||||
#ifdef EVENT__HAVE_STRUCT_SOCKADDR_STORAGE___SS_FAMILY
|
||||
#if !defined(EVENT__HAVE_STRUCT_SOCKADDR_STORAGE_SS_FAMILY) \
|
||||
&& !defined(ss_family)
|
||||
#define ss_family __ss_family
|
||||
#endif
|
||||
#endif
|
||||
|
||||
/**
|
||||
* A type wide enough to hold the output of "socket()" or "accept()". On
|
||||
* Windows, this is an intptr_t; elsewhere, it is an int. */
|
||||
#ifdef _WIN32
|
||||
#define evutil_socket_t intptr_t
|
||||
#else
|
||||
#define evutil_socket_t int
|
||||
#endif
|
||||
|
||||
/**
|
||||
* Structure to hold information about a monotonic timer
|
||||
*
|
||||
* Use this with evutil_configure_monotonic_time() and
|
||||
* evutil_gettime_monotonic().
|
||||
*
|
||||
* This is an opaque structure; you can allocate one using
|
||||
* evutil_monotonic_timer_new().
|
||||
*
|
||||
* @see evutil_monotonic_timer_new(), evutil_monotonic_timer_free(),
|
||||
* evutil_configure_monotonic_time(), evutil_gettime_monotonic()
|
||||
*/
|
||||
struct evutil_monotonic_timer
|
||||
#ifdef EVENT_IN_DOXYGEN_
|
||||
{/*Empty body so that doxygen will generate documentation here.*/}
|
||||
#endif
|
||||
;
|
||||
|
||||
#define EV_MONOT_PRECISE 1
|
||||
#define EV_MONOT_FALLBACK 2
|
||||
|
||||
/** Format a date string using RFC 1123 format (used in HTTP).
|
||||
* If `tm` is NULL, current system's time will be used.
|
||||
* The number of characters written will be returned.
|
||||
* One should check if the return value is smaller than `datelen` to check if
|
||||
* the result is truncated or not.
|
||||
*/
|
||||
EVENT2_EXPORT_SYMBOL int
|
||||
evutil_date_rfc1123(char *date, const size_t datelen, const struct tm *tm);
|
||||
|
||||
/** Allocate a new struct evutil_monotonic_timer for use with the
|
||||
* evutil_configure_monotonic_time() and evutil_gettime_monotonic()
|
||||
* functions. You must configure the timer with
|
||||
* evutil_configure_monotonic_time() before using it.
|
||||
*/
|
||||
EVENT2_EXPORT_SYMBOL
|
||||
struct evutil_monotonic_timer * evutil_monotonic_timer_new(void);
|
||||
|
||||
/** Free a struct evutil_monotonic_timer that was allocated using
|
||||
* evutil_monotonic_timer_new().
|
||||
*/
|
||||
EVENT2_EXPORT_SYMBOL
|
||||
void evutil_monotonic_timer_free(struct evutil_monotonic_timer *timer);
|
||||
|
||||
/** Set up a struct evutil_monotonic_timer; flags can include
|
||||
* EV_MONOT_PRECISE and EV_MONOT_FALLBACK.
|
||||
*/
|
||||
EVENT2_EXPORT_SYMBOL
|
||||
int evutil_configure_monotonic_time(struct evutil_monotonic_timer *timer,
|
||||
int flags);
|
||||
|
||||
/** Query the current monotonic time from a struct evutil_monotonic_timer
|
||||
* previously configured with evutil_configure_monotonic_time(). Monotonic
|
||||
* time is guaranteed never to run in reverse, but is not necessarily epoch-
|
||||
* based, or relative to any other definite point. Use it to make reliable
|
||||
* measurements of elapsed time between events even when the system time
|
||||
* may be changed.
|
||||
*
|
||||
* It is not safe to use this funtion on the same timer from multiple
|
||||
* threads.
|
||||
*/
|
||||
EVENT2_EXPORT_SYMBOL
|
||||
int evutil_gettime_monotonic(struct evutil_monotonic_timer *timer,
|
||||
struct timeval *tp);
|
||||
|
||||
/** Create two new sockets that are connected to each other.
|
||||
|
||||
On Unix, this simply calls socketpair(). On Windows, it uses the
|
||||
loopback network interface on 127.0.0.1, and only
|
||||
AF_INET,SOCK_STREAM are supported.
|
||||
|
||||
(This may fail on some Windows hosts where firewall software has cleverly
|
||||
decided to keep 127.0.0.1 from talking to itself.)
|
||||
|
||||
Parameters and return values are as for socketpair()
|
||||
*/
|
||||
EVENT2_EXPORT_SYMBOL
|
||||
int evutil_socketpair(int d, int type, int protocol, evutil_socket_t sv[2]);
|
||||
/** Do platform-specific operations as needed to make a socket nonblocking.
|
||||
|
||||
@param sock The socket to make nonblocking
|
||||
@return 0 on success, -1 on failure
|
||||
*/
|
||||
EVENT2_EXPORT_SYMBOL
|
||||
int evutil_make_socket_nonblocking(evutil_socket_t sock);
|
||||
|
||||
/** Do platform-specific operations to make a listener socket reusable.
|
||||
|
||||
Specifically, we want to make sure that another program will be able
|
||||
to bind this address right after we've closed the listener.
|
||||
|
||||
This differs from Windows's interpretation of "reusable", which
|
||||
allows multiple listeners to bind the same address at the same time.
|
||||
|
||||
@param sock The socket to make reusable
|
||||
@return 0 on success, -1 on failure
|
||||
*/
|
||||
EVENT2_EXPORT_SYMBOL
|
||||
int evutil_make_listen_socket_reuseable(evutil_socket_t sock);
|
||||
|
||||
/** Do platform-specific operations to make a listener port reusable.
|
||||
|
||||
Specifically, we want to make sure that multiple programs which also
|
||||
set the same socket option will be able to bind, listen at the same time.
|
||||
|
||||
This is a feature available only to Linux 3.9+
|
||||
|
||||
@param sock The socket to make reusable
|
||||
@return 0 on success, -1 on failure
|
||||
*/
|
||||
EVENT2_EXPORT_SYMBOL
|
||||
int evutil_make_listen_socket_reuseable_port(evutil_socket_t sock);
|
||||
|
||||
/** Set ipv6 only bind socket option to make listener work only in ipv6 sockets.
|
||||
|
||||
According to RFC3493 and most Linux distributions, default value for the
|
||||
sockets is to work in IPv4-mapped mode. In IPv4-mapped mode, it is not possible
|
||||
to bind same port from different IPv4 and IPv6 handlers.
|
||||
|
||||
@param sock The socket to make in ipv6only working mode
|
||||
@return 0 on success, -1 on failure
|
||||
*/
|
||||
EVENT2_EXPORT_SYMBOL
|
||||
int evutil_make_listen_socket_ipv6only(evutil_socket_t sock);
|
||||
|
||||
/** Do platform-specific operations as needed to close a socket upon a
|
||||
successful execution of one of the exec*() functions.
|
||||
|
||||
@param sock The socket to be closed
|
||||
@return 0 on success, -1 on failure
|
||||
*/
|
||||
EVENT2_EXPORT_SYMBOL
|
||||
int evutil_make_socket_closeonexec(evutil_socket_t sock);
|
||||
|
||||
/** Do the platform-specific call needed to close a socket returned from
|
||||
socket() or accept().
|
||||
|
||||
@param sock The socket to be closed
|
||||
@return 0 on success (whether the operation is supported or not),
|
||||
-1 on failure
|
||||
*/
|
||||
EVENT2_EXPORT_SYMBOL
|
||||
int evutil_closesocket(evutil_socket_t sock);
|
||||
#define EVUTIL_CLOSESOCKET(s) evutil_closesocket(s)
|
||||
|
||||
/** Do platform-specific operations, if possible, to make a tcp listener
|
||||
* socket defer accept()s until there is data to read.
|
||||
*
|
||||
* Not all platforms support this. You don't want to do this for every
|
||||
* listener socket: only the ones that implement a protocol where the
|
||||
* client transmits before the server needs to respond.
|
||||
*
|
||||
* @param sock The listening socket to to make deferred
|
||||
* @return 0 on success (whether the operation is supported or not),
|
||||
* -1 on failure
|
||||
*/
|
||||
EVENT2_EXPORT_SYMBOL
|
||||
int evutil_make_tcp_listen_socket_deferred(evutil_socket_t sock);
|
||||
|
||||
#ifdef _WIN32
|
||||
/** Return the most recent socket error. Not idempotent on all platforms. */
|
||||
#define EVUTIL_SOCKET_ERROR() WSAGetLastError()
|
||||
/** Replace the most recent socket error with errcode */
|
||||
#define EVUTIL_SET_SOCKET_ERROR(errcode) \
|
||||
do { WSASetLastError(errcode); } while (0)
|
||||
/** Return the most recent socket error to occur on sock. */
|
||||
EVENT2_EXPORT_SYMBOL
|
||||
int evutil_socket_geterror(evutil_socket_t sock);
|
||||
/** Convert a socket error to a string. */
|
||||
EVENT2_EXPORT_SYMBOL
|
||||
const char *evutil_socket_error_to_string(int errcode);
|
||||
#define EVUTIL_INVALID_SOCKET INVALID_SOCKET
|
||||
#elif defined(EVENT_IN_DOXYGEN_)
|
||||
/**
|
||||
@name Socket error functions
|
||||
|
||||
These functions are needed for making programs compatible between
|
||||
Windows and Unix-like platforms.
|
||||
|
||||
You see, Winsock handles socket errors differently from the rest of
|
||||
the world. Elsewhere, a socket error is like any other error and is
|
||||
stored in errno. But winsock functions require you to retrieve the
|
||||
error with a special function, and don't let you use strerror for
|
||||
the error codes. And handling EWOULDBLOCK is ... different.
|
||||
|
||||
@{
|
||||
*/
|
||||
/** Return the most recent socket error. Not idempotent on all platforms. */
|
||||
#define EVUTIL_SOCKET_ERROR() ...
|
||||
/** Replace the most recent socket error with errcode */
|
||||
#define EVUTIL_SET_SOCKET_ERROR(errcode) ...
|
||||
/** Return the most recent socket error to occur on sock. */
|
||||
#define evutil_socket_geterror(sock) ...
|
||||
/** Convert a socket error to a string. */
|
||||
#define evutil_socket_error_to_string(errcode) ...
|
||||
#define EVUTIL_INVALID_SOCKET -1
|
||||
/**@}*/
|
||||
#else /** !EVENT_IN_DOXYGEN_ && !_WIN32 */
|
||||
#define EVUTIL_SOCKET_ERROR() (errno)
|
||||
#define EVUTIL_SET_SOCKET_ERROR(errcode) \
|
||||
do { errno = (errcode); } while (0)
|
||||
#define evutil_socket_geterror(sock) (errno)
|
||||
#define evutil_socket_error_to_string(errcode) (strerror(errcode))
|
||||
#define EVUTIL_INVALID_SOCKET -1
|
||||
#endif /** !_WIN32 */
|
||||
|
||||
|
||||
/**
|
||||
* @name Manipulation macros for struct timeval.
|
||||
*
|
||||
* We define replacements
|
||||
* for timeradd, timersub, timerclear, timercmp, and timerisset.
|
||||
*
|
||||
* @{
|
||||
*/
|
||||
#ifdef EVENT__HAVE_TIMERADD
|
||||
#define evutil_timeradd(tvp, uvp, vvp) timeradd((tvp), (uvp), (vvp))
|
||||
#define evutil_timersub(tvp, uvp, vvp) timersub((tvp), (uvp), (vvp))
|
||||
#else
|
||||
#define evutil_timeradd(tvp, uvp, vvp) \
|
||||
do { \
|
||||
(vvp)->tv_sec = (tvp)->tv_sec + (uvp)->tv_sec; \
|
||||
(vvp)->tv_usec = (tvp)->tv_usec + (uvp)->tv_usec; \
|
||||
if ((vvp)->tv_usec >= 1000000) { \
|
||||
(vvp)->tv_sec++; \
|
||||
(vvp)->tv_usec -= 1000000; \
|
||||
} \
|
||||
} while (0)
|
||||
#define evutil_timersub(tvp, uvp, vvp) \
|
||||
do { \
|
||||
(vvp)->tv_sec = (tvp)->tv_sec - (uvp)->tv_sec; \
|
||||
(vvp)->tv_usec = (tvp)->tv_usec - (uvp)->tv_usec; \
|
||||
if ((vvp)->tv_usec < 0) { \
|
||||
(vvp)->tv_sec--; \
|
||||
(vvp)->tv_usec += 1000000; \
|
||||
} \
|
||||
} while (0)
|
||||
#endif /* !EVENT__HAVE_TIMERADD */
|
||||
|
||||
#ifdef EVENT__HAVE_TIMERCLEAR
|
||||
#define evutil_timerclear(tvp) timerclear(tvp)
|
||||
#else
|
||||
#define evutil_timerclear(tvp) (tvp)->tv_sec = (tvp)->tv_usec = 0
|
||||
#endif
|
||||
/**@}*/
|
||||
|
||||
/** Return true iff the tvp is related to uvp according to the relational
|
||||
* operator cmp. Recognized values for cmp are ==, <=, <, >=, and >. */
|
||||
#define evutil_timercmp(tvp, uvp, cmp) \
|
||||
(((tvp)->tv_sec == (uvp)->tv_sec) ? \
|
||||
((tvp)->tv_usec cmp (uvp)->tv_usec) : \
|
||||
((tvp)->tv_sec cmp (uvp)->tv_sec))
|
||||
|
||||
#ifdef EVENT__HAVE_TIMERISSET
|
||||
#define evutil_timerisset(tvp) timerisset(tvp)
|
||||
#else
|
||||
#define evutil_timerisset(tvp) ((tvp)->tv_sec || (tvp)->tv_usec)
|
||||
#endif
|
||||
|
||||
/** Replacement for offsetof on platforms that don't define it. */
|
||||
#ifdef offsetof
|
||||
#define evutil_offsetof(type, field) offsetof(type, field)
|
||||
#else
|
||||
#define evutil_offsetof(type, field) ((off_t)(&((type *)0)->field))
|
||||
#endif
|
||||
|
||||
/* big-int related functions */
|
||||
/** Parse a 64-bit value from a string. Arguments are as for strtol. */
|
||||
EVENT2_EXPORT_SYMBOL
|
||||
ev_int64_t evutil_strtoll(const char *s, char **endptr, int base);
|
||||
|
||||
/** Replacement for gettimeofday on platforms that lack it. */
|
||||
#ifdef EVENT__HAVE_GETTIMEOFDAY
|
||||
#define evutil_gettimeofday(tv, tz) gettimeofday((tv), (tz))
|
||||
#else
|
||||
struct timezone;
|
||||
EVENT2_EXPORT_SYMBOL
|
||||
int evutil_gettimeofday(struct timeval *tv, struct timezone *tz);
|
||||
#endif
|
||||
|
||||
/** Replacement for snprintf to get consistent behavior on platforms for
|
||||
which the return value of snprintf does not conform to C99.
|
||||
*/
|
||||
EVENT2_EXPORT_SYMBOL
|
||||
int evutil_snprintf(char *buf, size_t buflen, const char *format, ...)
|
||||
#ifdef __GNUC__
|
||||
__attribute__((format(printf, 3, 4)))
|
||||
#endif
|
||||
;
|
||||
/** Replacement for vsnprintf to get consistent behavior on platforms for
|
||||
which the return value of snprintf does not conform to C99.
|
||||
*/
|
||||
EVENT2_EXPORT_SYMBOL
|
||||
int evutil_vsnprintf(char *buf, size_t buflen, const char *format, va_list ap)
|
||||
#ifdef __GNUC__
|
||||
__attribute__((format(printf, 3, 0)))
|
||||
#endif
|
||||
;
|
||||
|
||||
/** Replacement for inet_ntop for platforms which lack it. */
|
||||
EVENT2_EXPORT_SYMBOL
|
||||
const char *evutil_inet_ntop(int af, const void *src, char *dst, size_t len);
|
||||
/** Variation of inet_pton that also parses IPv6 scopes. Public for
|
||||
unit tests. No reason to call this directly.
|
||||
*/
|
||||
EVENT2_EXPORT_SYMBOL
|
||||
int evutil_inet_pton_scope(int af, const char *src, void *dst,
|
||||
unsigned *indexp);
|
||||
/** Replacement for inet_pton for platforms which lack it. */
|
||||
EVENT2_EXPORT_SYMBOL
|
||||
int evutil_inet_pton(int af, const char *src, void *dst);
|
||||
struct sockaddr;
|
||||
|
||||
/** Parse an IPv4 or IPv6 address, with optional port, from a string.
|
||||
|
||||
Recognized formats are:
|
||||
- [IPv6Address]:port
|
||||
- [IPv6Address]
|
||||
- IPv6Address
|
||||
- IPv4Address:port
|
||||
- IPv4Address
|
||||
|
||||
If no port is specified, the port in the output is set to 0.
|
||||
|
||||
@param str The string to parse.
|
||||
@param out A struct sockaddr to hold the result. This should probably be
|
||||
a struct sockaddr_storage.
|
||||
@param outlen A pointer to the number of bytes that that 'out' can safely
|
||||
hold. Set to the number of bytes used in 'out' on success.
|
||||
@return -1 if the address is not well-formed, if the port is out of range,
|
||||
or if out is not large enough to hold the result. Otherwise returns
|
||||
0 on success.
|
||||
*/
|
||||
EVENT2_EXPORT_SYMBOL
|
||||
int evutil_parse_sockaddr_port(const char *str, struct sockaddr *out, int *outlen);
|
||||
|
||||
/** Compare two sockaddrs; return 0 if they are equal, or less than 0 if sa1
|
||||
* preceeds sa2, or greater than 0 if sa1 follows sa2. If include_port is
|
||||
* true, consider the port as well as the address. Only implemented for
|
||||
* AF_INET and AF_INET6 addresses. The ordering is not guaranteed to remain
|
||||
* the same between Libevent versions. */
|
||||
EVENT2_EXPORT_SYMBOL
|
||||
int evutil_sockaddr_cmp(const struct sockaddr *sa1, const struct sockaddr *sa2,
|
||||
int include_port);
|
||||
|
||||
/** As strcasecmp, but always compares the characters in locale-independent
|
||||
ASCII. That's useful if you're handling data in ASCII-based protocols.
|
||||
*/
|
||||
EVENT2_EXPORT_SYMBOL
|
||||
int evutil_ascii_strcasecmp(const char *str1, const char *str2);
|
||||
/** As strncasecmp, but always compares the characters in locale-independent
|
||||
ASCII. That's useful if you're handling data in ASCII-based protocols.
|
||||
*/
|
||||
EVENT2_EXPORT_SYMBOL
|
||||
int evutil_ascii_strncasecmp(const char *str1, const char *str2, size_t n);
|
||||
|
||||
/* Here we define evutil_addrinfo to the native addrinfo type, or redefine it
|
||||
* if this system has no getaddrinfo(). */
|
||||
#ifdef EVENT__HAVE_STRUCT_ADDRINFO
|
||||
#define evutil_addrinfo addrinfo
|
||||
#else
|
||||
/** A definition of struct addrinfo for systems that lack it.
|
||||
|
||||
(This is just an alias for struct addrinfo if the system defines
|
||||
struct addrinfo.)
|
||||
*/
|
||||
struct evutil_addrinfo {
|
||||
int ai_flags; /* AI_PASSIVE, AI_CANONNAME, AI_NUMERICHOST */
|
||||
int ai_family; /* PF_xxx */
|
||||
int ai_socktype; /* SOCK_xxx */
|
||||
int ai_protocol; /* 0 or IPPROTO_xxx for IPv4 and IPv6 */
|
||||
size_t ai_addrlen; /* length of ai_addr */
|
||||
char *ai_canonname; /* canonical name for nodename */
|
||||
struct sockaddr *ai_addr; /* binary address */
|
||||
struct evutil_addrinfo *ai_next; /* next structure in linked list */
|
||||
};
|
||||
#endif
|
||||
/** @name evutil_getaddrinfo() error codes
|
||||
|
||||
These values are possible error codes for evutil_getaddrinfo() and
|
||||
related functions.
|
||||
|
||||
@{
|
||||
*/
|
||||
#if defined(EAI_ADDRFAMILY) && defined(EVENT__HAVE_GETADDRINFO)
|
||||
#define EVUTIL_EAI_ADDRFAMILY EAI_ADDRFAMILY
|
||||
#else
|
||||
#define EVUTIL_EAI_ADDRFAMILY -901
|
||||
#endif
|
||||
#if defined(EAI_AGAIN) && defined(EVENT__HAVE_GETADDRINFO)
|
||||
#define EVUTIL_EAI_AGAIN EAI_AGAIN
|
||||
#else
|
||||
#define EVUTIL_EAI_AGAIN -902
|
||||
#endif
|
||||
#if defined(EAI_BADFLAGS) && defined(EVENT__HAVE_GETADDRINFO)
|
||||
#define EVUTIL_EAI_BADFLAGS EAI_BADFLAGS
|
||||
#else
|
||||
#define EVUTIL_EAI_BADFLAGS -903
|
||||
#endif
|
||||
#if defined(EAI_FAIL) && defined(EVENT__HAVE_GETADDRINFO)
|
||||
#define EVUTIL_EAI_FAIL EAI_FAIL
|
||||
#else
|
||||
#define EVUTIL_EAI_FAIL -904
|
||||
#endif
|
||||
#if defined(EAI_FAMILY) && defined(EVENT__HAVE_GETADDRINFO)
|
||||
#define EVUTIL_EAI_FAMILY EAI_FAMILY
|
||||
#else
|
||||
#define EVUTIL_EAI_FAMILY -905
|
||||
#endif
|
||||
#if defined(EAI_MEMORY) && defined(EVENT__HAVE_GETADDRINFO)
|
||||
#define EVUTIL_EAI_MEMORY EAI_MEMORY
|
||||
#else
|
||||
#define EVUTIL_EAI_MEMORY -906
|
||||
#endif
|
||||
/* This test is a bit complicated, since some MS SDKs decide to
|
||||
* remove NODATA or redefine it to be the same as NONAME, in a
|
||||
* fun interpretation of RFC 2553 and RFC 3493. */
|
||||
#if defined(EAI_NODATA) && defined(EVENT__HAVE_GETADDRINFO) && (!defined(EAI_NONAME) || EAI_NODATA != EAI_NONAME)
|
||||
#define EVUTIL_EAI_NODATA EAI_NODATA
|
||||
#else
|
||||
#define EVUTIL_EAI_NODATA -907
|
||||
#endif
|
||||
#if defined(EAI_NONAME) && defined(EVENT__HAVE_GETADDRINFO)
|
||||
#define EVUTIL_EAI_NONAME EAI_NONAME
|
||||
#else
|
||||
#define EVUTIL_EAI_NONAME -908
|
||||
#endif
|
||||
#if defined(EAI_SERVICE) && defined(EVENT__HAVE_GETADDRINFO)
|
||||
#define EVUTIL_EAI_SERVICE EAI_SERVICE
|
||||
#else
|
||||
#define EVUTIL_EAI_SERVICE -909
|
||||
#endif
|
||||
#if defined(EAI_SOCKTYPE) && defined(EVENT__HAVE_GETADDRINFO)
|
||||
#define EVUTIL_EAI_SOCKTYPE EAI_SOCKTYPE
|
||||
#else
|
||||
#define EVUTIL_EAI_SOCKTYPE -910
|
||||
#endif
|
||||
#if defined(EAI_SYSTEM) && defined(EVENT__HAVE_GETADDRINFO)
|
||||
#define EVUTIL_EAI_SYSTEM EAI_SYSTEM
|
||||
#else
|
||||
#define EVUTIL_EAI_SYSTEM -911
|
||||
#endif
|
||||
|
||||
#define EVUTIL_EAI_CANCEL -90001
|
||||
|
||||
#if defined(AI_PASSIVE) && defined(EVENT__HAVE_GETADDRINFO)
|
||||
#define EVUTIL_AI_PASSIVE AI_PASSIVE
|
||||
#else
|
||||
#define EVUTIL_AI_PASSIVE 0x1000
|
||||
#endif
|
||||
#if defined(AI_CANONNAME) && defined(EVENT__HAVE_GETADDRINFO)
|
||||
#define EVUTIL_AI_CANONNAME AI_CANONNAME
|
||||
#else
|
||||
#define EVUTIL_AI_CANONNAME 0x2000
|
||||
#endif
|
||||
#if defined(AI_NUMERICHOST) && defined(EVENT__HAVE_GETADDRINFO)
|
||||
#define EVUTIL_AI_NUMERICHOST AI_NUMERICHOST
|
||||
#else
|
||||
#define EVUTIL_AI_NUMERICHOST 0x4000
|
||||
#endif
|
||||
#if defined(AI_NUMERICSERV) && defined(EVENT__HAVE_GETADDRINFO)
|
||||
#define EVUTIL_AI_NUMERICSERV AI_NUMERICSERV
|
||||
#else
|
||||
#define EVUTIL_AI_NUMERICSERV 0x8000
|
||||
#endif
|
||||
#if defined(AI_V4MAPPED) && defined(EVENT__HAVE_GETADDRINFO)
|
||||
#define EVUTIL_AI_V4MAPPED AI_V4MAPPED
|
||||
#else
|
||||
#define EVUTIL_AI_V4MAPPED 0x10000
|
||||
#endif
|
||||
#if defined(AI_ALL) && defined(EVENT__HAVE_GETADDRINFO)
|
||||
#define EVUTIL_AI_ALL AI_ALL
|
||||
#else
|
||||
#define EVUTIL_AI_ALL 0x20000
|
||||
#endif
|
||||
#if defined(AI_ADDRCONFIG) && defined(EVENT__HAVE_GETADDRINFO)
|
||||
#define EVUTIL_AI_ADDRCONFIG AI_ADDRCONFIG
|
||||
#else
|
||||
#define EVUTIL_AI_ADDRCONFIG 0x40000
|
||||
#endif
|
||||
/**@}*/
|
||||
|
||||
struct evutil_addrinfo;
|
||||
/**
|
||||
* This function clones getaddrinfo for systems that don't have it. For full
|
||||
* details, see RFC 3493, section 6.1.
|
||||
*
|
||||
* Limitations:
|
||||
* - When the system has no getaddrinfo, we fall back to gethostbyname_r or
|
||||
* gethostbyname, with their attendant issues.
|
||||
* - The AI_V4MAPPED and AI_ALL flags are not currently implemented.
|
||||
*
|
||||
* For a nonblocking variant, see evdns_getaddrinfo.
|
||||
*/
|
||||
EVENT2_EXPORT_SYMBOL
|
||||
int evutil_getaddrinfo(const char *nodename, const char *servname,
|
||||
const struct evutil_addrinfo *hints_in, struct evutil_addrinfo **res);
|
||||
|
||||
/** Release storage allocated by evutil_getaddrinfo or evdns_getaddrinfo. */
|
||||
EVENT2_EXPORT_SYMBOL
|
||||
void evutil_freeaddrinfo(struct evutil_addrinfo *ai);
|
||||
|
||||
EVENT2_EXPORT_SYMBOL
|
||||
const char *evutil_gai_strerror(int err);
|
||||
|
||||
/** Generate n bytes of secure pseudorandom data, and store them in buf.
|
||||
*
|
||||
* Current versions of Libevent use an ARC4-based random number generator,
|
||||
* seeded using the platform's entropy source (/dev/urandom on Unix-like
|
||||
* systems; CryptGenRandom on Windows). This is not actually as secure as it
|
||||
* should be: ARC4 is a pretty lousy cipher, and the current implementation
|
||||
* provides only rudimentary prediction- and backtracking-resistance. Don't
|
||||
* use this for serious cryptographic applications.
|
||||
*/
|
||||
EVENT2_EXPORT_SYMBOL
|
||||
void evutil_secure_rng_get_bytes(void *buf, size_t n);
|
||||
|
||||
/**
|
||||
* Seed the secure random number generator if needed, and return 0 on
|
||||
* success or -1 on failure.
|
||||
*
|
||||
* It is okay to call this function more than once; it will still return
|
||||
* 0 if the RNG has been successfully seeded and -1 if it can't be
|
||||
* seeded.
|
||||
*
|
||||
* Ordinarily you don't need to call this function from your own code;
|
||||
* Libevent will seed the RNG itself the first time it needs good random
|
||||
* numbers. You only need to call it if (a) you want to double-check
|
||||
* that one of the seeding methods did succeed, or (b) you plan to drop
|
||||
* the capability to seed (by chrooting, or dropping capabilities, or
|
||||
* whatever), and you want to make sure that seeding happens before your
|
||||
* program loses the ability to do it.
|
||||
*/
|
||||
EVENT2_EXPORT_SYMBOL
|
||||
int evutil_secure_rng_init(void);
|
||||
|
||||
/**
|
||||
* Set a filename to use in place of /dev/urandom for seeding the secure
|
||||
* PRNG. Return 0 on success, -1 on failure.
|
||||
*
|
||||
* Call this function BEFORE calling any other initialization or RNG
|
||||
* functions.
|
||||
*
|
||||
* (This string will _NOT_ be copied internally. Do not free it while any
|
||||
* user of the secure RNG might be running. Don't pass anything other than a
|
||||
* real /dev/...random device file here, or you might lose security.)
|
||||
*
|
||||
* This API is unstable, and might change in a future libevent version.
|
||||
*/
|
||||
EVENT2_EXPORT_SYMBOL
|
||||
int evutil_secure_rng_set_urandom_device_file(char *fname);
|
||||
|
||||
#if !defined(EVENT__HAVE_ARC4RANDOM) || defined(EVENT__HAVE_ARC4RANDOM_ADDRANDOM)
|
||||
/** Seed the random number generator with extra random bytes.
|
||||
|
||||
You should almost never need to call this function; it should be
|
||||
sufficient to invoke evutil_secure_rng_init(), or let Libevent take
|
||||
care of calling evutil_secure_rng_init() on its own.
|
||||
|
||||
If you call this function as a _replacement_ for the regular
|
||||
entropy sources, then you need to be sure that your input
|
||||
contains a fairly large amount of strong entropy. Doing so is
|
||||
notoriously hard: most people who try get it wrong. Watch out!
|
||||
|
||||
@param dat a buffer full of a strong source of random numbers
|
||||
@param datlen the number of bytes to read from datlen
|
||||
*/
|
||||
EVENT2_EXPORT_SYMBOL
|
||||
void evutil_secure_rng_add_bytes(const char *dat, size_t datlen);
|
||||
#endif
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* EVENT1_EVUTIL_H_INCLUDED_ */
|
||||
67
macx64/mpi/openmpi/include/event2/visibility.h
Normal file
67
macx64/mpi/openmpi/include/event2/visibility.h
Normal file
@@ -0,0 +1,67 @@
|
||||
/* -*- Mode: C; tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*- */
|
||||
/*
|
||||
* Copyright (c) 2007-2012 Niels Provos and Nick Mathewson
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* 3. The name of the author may not be used to endorse or promote products
|
||||
* derived from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
||||
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
||||
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
||||
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
#ifndef EVENT2_VISIBILITY_H_INCLUDED_
|
||||
#define EVENT2_VISIBILITY_H_INCLUDED_
|
||||
|
||||
#include <event2/event-config.h>
|
||||
|
||||
#if defined(event_shared_EXPORTS) || \
|
||||
defined(event_extra_shared_EXPORTS) || \
|
||||
defined(event_core_shared_EXPORTS) || \
|
||||
defined(event_pthreads_shared_EXPORTS) || \
|
||||
defined(event_openssl_shared_EXPORTS)
|
||||
|
||||
# if defined (__SUNPRO_C) && (__SUNPRO_C >= 0x550)
|
||||
# define EVENT2_EXPORT_SYMBOL __global
|
||||
# elif defined __GNUC__
|
||||
# define EVENT2_EXPORT_SYMBOL __attribute__ ((visibility("default")))
|
||||
# elif defined(_MSC_VER)
|
||||
# define EVENT2_EXPORT_SYMBOL __declspec(dllexport)
|
||||
# else
|
||||
# define EVENT2_EXPORT_SYMBOL /* unknown compiler */
|
||||
# endif
|
||||
|
||||
#else /* event_*_EXPORTS */
|
||||
|
||||
# define EVENT2_EXPORT_SYMBOL
|
||||
|
||||
#endif /* event_*_EXPORTS */
|
||||
|
||||
/** We need to dllimport event_debug_logging_mask_ into event_extra */
|
||||
#if defined(_MSC_VER)
|
||||
# if defined(event_core_shared_EXPORTS) /** from core export */
|
||||
# define EVENT2_CORE_EXPORT_SYMBOL __declspec(dllexport)
|
||||
# elif defined(event_extra_shared_EXPORTS) || /** from extra import */ \
|
||||
defined(EVENT_VISIBILITY_WANT_DLLIMPORT)
|
||||
# define EVENT2_CORE_EXPORT_SYMBOL __declspec(dllimport)
|
||||
# endif
|
||||
#endif /* _MSC_VER */
|
||||
#if !defined(EVENT2_CORE_EXPORT_SYMBOL)
|
||||
# define EVENT2_CORE_EXPORT_SYMBOL EVENT2_EXPORT_SYMBOL
|
||||
#endif
|
||||
|
||||
#endif /* EVENT2_VISIBILITY_H_INCLUDED_ */
|
||||
45
macx64/mpi/openmpi/include/evhttp.h
Normal file
45
macx64/mpi/openmpi/include/evhttp.h
Normal file
@@ -0,0 +1,45 @@
|
||||
/*
|
||||
* Copyright 2000-2007 Niels Provos <provos@citi.umich.edu>
|
||||
* Copyright 2007-2012 Niels Provos and Nick Mathewson
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* 3. The name of the author may not be used to endorse or promote products
|
||||
* derived from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
||||
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
||||
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
||||
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
#ifndef EVENT1_EVHTTP_H_INCLUDED_
|
||||
#define EVENT1_EVHTTP_H_INCLUDED_
|
||||
|
||||
/** @file evhttp.h
|
||||
|
||||
An http implementation subsystem for Libevent.
|
||||
|
||||
The <evhttp.h> header is deprecated in Libevent 2.0 and later; please
|
||||
use <event2/http.h> instead. Depending on what functionality you
|
||||
need, you may also want to include more of the other <event2/...>
|
||||
headers.
|
||||
*/
|
||||
|
||||
#include <event.h>
|
||||
#include <event2/http.h>
|
||||
#include <event2/http_struct.h>
|
||||
#include <event2/http_compat.h>
|
||||
|
||||
#endif /* EVENT1_EVHTTP_H_INCLUDED_ */
|
||||
45
macx64/mpi/openmpi/include/evrpc.h
Normal file
45
macx64/mpi/openmpi/include/evrpc.h
Normal file
@@ -0,0 +1,45 @@
|
||||
/*
|
||||
* Copyright (c) 2000-2007 Niels Provos <provos@citi.umich.edu>
|
||||
* Copyright (c) 2007-2012 Niels Provos and Nick Mathewson
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* 3. The name of the author may not be used to endorse or promote products
|
||||
* derived from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
||||
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
||||
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
||||
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
#ifndef EVENT1_EVRPC_H_INCLUDED_
|
||||
#define EVENT1_EVRPC_H_INCLUDED_
|
||||
|
||||
/** @file evrpc.h
|
||||
|
||||
An RPC system for Libevent.
|
||||
|
||||
The <evrpc.h> header is deprecated in Libevent 2.0 and later; please
|
||||
use <event2/rpc.h> instead. Depending on what functionality you
|
||||
need, you may also want to include more of the other <event2/...>
|
||||
headers.
|
||||
*/
|
||||
|
||||
#include <event.h>
|
||||
#include <event2/rpc.h>
|
||||
#include <event2/rpc_struct.h>
|
||||
#include <event2/rpc_compat.h>
|
||||
|
||||
#endif /* EVENT1_EVRPC_H_INCLUDED_ */
|
||||
39
macx64/mpi/openmpi/include/evutil.h
Normal file
39
macx64/mpi/openmpi/include/evutil.h
Normal file
@@ -0,0 +1,39 @@
|
||||
/*
|
||||
* Copyright (c) 2007-2012 Niels Provos and Nick Mathewson
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* 3. The name of the author may not be used to endorse or promote products
|
||||
* derived from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
||||
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
||||
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
||||
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
#ifndef EVENT1_EVUTIL_H_INCLUDED_
|
||||
#define EVENT1_EVUTIL_H_INCLUDED_
|
||||
|
||||
/** @file evutil.h
|
||||
|
||||
Utility and compatibility functions for Libevent.
|
||||
|
||||
The <evutil.h> header is deprecated in Libevent 2.0 and later; please
|
||||
use <event2/util.h> instead.
|
||||
*/
|
||||
|
||||
#include <event2/util.h>
|
||||
|
||||
#endif /* EVENT1_EVUTIL_H_INCLUDED_ */
|
||||
2578
macx64/mpi/openmpi/include/hwloc.h
Normal file
2578
macx64/mpi/openmpi/include/hwloc.h
Normal file
File diff suppressed because it is too large
Load Diff
242
macx64/mpi/openmpi/include/hwloc/autogen/config.h
Normal file
242
macx64/mpi/openmpi/include/hwloc/autogen/config.h
Normal file
@@ -0,0 +1,242 @@
|
||||
/* include/hwloc/autogen/config.h. Generated from config.h.in by configure. */
|
||||
/* -*- c -*-
|
||||
* Copyright © 2009 CNRS
|
||||
* Copyright © 2009-2022 Inria. All rights reserved.
|
||||
* Copyright © 2009-2012 Université Bordeaux
|
||||
* Copyright © 2009-2011 Cisco Systems, Inc. All rights reserved.
|
||||
* See COPYING in top-level directory.
|
||||
*/
|
||||
|
||||
/* The configuration file */
|
||||
|
||||
#ifndef HWLOC_CONFIG_H
|
||||
#define HWLOC_CONFIG_H
|
||||
|
||||
#define HWLOC_VERSION "2.7.1"
|
||||
#define HWLOC_VERSION_MAJOR 2
|
||||
#define HWLOC_VERSION_MINOR 7
|
||||
#define HWLOC_VERSION_RELEASE 1
|
||||
#define HWLOC_VERSION_GREEK ""
|
||||
|
||||
/* #undef HWLOC_PCI_COMPONENT_BUILTIN */
|
||||
#define HWLOC_OPENCL_COMPONENT_BUILTIN 1
|
||||
/* #undef HWLOC_CUDA_COMPONENT_BUILTIN */
|
||||
/* #undef HWLOC_NVML_COMPONENT_BUILTIN */
|
||||
/* #undef HWLOC_RSMI_COMPONENT_BUILTIN */
|
||||
/* #undef HWLOC_LEVELZERO_COMPONENT_BUILTIN */
|
||||
/* #undef HWLOC_GL_COMPONENT_BUILTIN */
|
||||
/* #undef HWLOC_XML_LIBXML_COMPONENT_BUILTIN */
|
||||
|
||||
#if (__GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 95))
|
||||
# define __hwloc_restrict __restrict
|
||||
#else
|
||||
# if __STDC_VERSION__ >= 199901L
|
||||
# define __hwloc_restrict restrict
|
||||
# else
|
||||
# define __hwloc_restrict
|
||||
# endif
|
||||
#endif
|
||||
|
||||
/* Note that if we're compiling C++, then just use the "inline"
|
||||
keyword, since it's part of C++ */
|
||||
#if defined(c_plusplus) || defined(__cplusplus)
|
||||
# define __hwloc_inline inline
|
||||
#elif defined(_MSC_VER) || defined(__HP_cc)
|
||||
# define __hwloc_inline __inline
|
||||
#else
|
||||
# define __hwloc_inline __inline__
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Note: this is public. We can not assume anything from the compiler used
|
||||
* by the application and thus the HWLOC_HAVE_* macros below are not
|
||||
* fetched from the autoconf result here. We only automatically use a few
|
||||
* well-known easy cases.
|
||||
*/
|
||||
|
||||
/* Some handy constants to make the logic below a little more readable */
|
||||
#if defined(__cplusplus) && \
|
||||
(__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR >= 4))
|
||||
#define GXX_ABOVE_3_4 1
|
||||
#else
|
||||
#define GXX_ABOVE_3_4 0
|
||||
#endif
|
||||
|
||||
#if !defined(__cplusplus) && \
|
||||
(__GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 95))
|
||||
#define GCC_ABOVE_2_95 1
|
||||
#else
|
||||
#define GCC_ABOVE_2_95 0
|
||||
#endif
|
||||
|
||||
#if !defined(__cplusplus) && \
|
||||
(__GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 96))
|
||||
#define GCC_ABOVE_2_96 1
|
||||
#else
|
||||
#define GCC_ABOVE_2_96 0
|
||||
#endif
|
||||
|
||||
#if !defined(__cplusplus) && \
|
||||
(__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 3))
|
||||
#define GCC_ABOVE_3_3 1
|
||||
#else
|
||||
#define GCC_ABOVE_3_3 0
|
||||
#endif
|
||||
|
||||
#if !defined(__cplusplus) && \
|
||||
(__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4))
|
||||
#define GCC_ABOVE_3_4 1
|
||||
#else
|
||||
#define GCC_ABOVE_3_4 0
|
||||
#endif
|
||||
|
||||
/* Maybe before gcc 2.95 too */
|
||||
#ifdef HWLOC_HAVE_ATTRIBUTE_UNUSED
|
||||
#define __HWLOC_HAVE_ATTRIBUTE_UNUSED HWLOC_HAVE_ATTRIBUTE_UNUSED
|
||||
#elif defined(__GNUC__)
|
||||
# define __HWLOC_HAVE_ATTRIBUTE_UNUSED (GXX_ABOVE_3_4 || GCC_ABOVE_2_95)
|
||||
#else
|
||||
# define __HWLOC_HAVE_ATTRIBUTE_UNUSED 0
|
||||
#endif
|
||||
#if __HWLOC_HAVE_ATTRIBUTE_UNUSED
|
||||
# define __hwloc_attribute_unused __attribute__((__unused__))
|
||||
#else
|
||||
# define __hwloc_attribute_unused
|
||||
#endif
|
||||
|
||||
#ifdef HWLOC_HAVE_ATTRIBUTE_MALLOC
|
||||
#define __HWLOC_HAVE_ATTRIBUTE_MALLOC HWLOC_HAVE_ATTRIBUTE_MALLOC
|
||||
#elif defined(__GNUC__)
|
||||
# define __HWLOC_HAVE_ATTRIBUTE_MALLOC (GXX_ABOVE_3_4 || GCC_ABOVE_2_96)
|
||||
#else
|
||||
# define __HWLOC_HAVE_ATTRIBUTE_MALLOC 0
|
||||
#endif
|
||||
#if __HWLOC_HAVE_ATTRIBUTE_MALLOC
|
||||
# define __hwloc_attribute_malloc __attribute__((__malloc__))
|
||||
#else
|
||||
# define __hwloc_attribute_malloc
|
||||
#endif
|
||||
|
||||
#ifdef HWLOC_HAVE_ATTRIBUTE_CONST
|
||||
#define __HWLOC_HAVE_ATTRIBUTE_CONST HWLOC_HAVE_ATTRIBUTE_CONST
|
||||
#elif defined(__GNUC__)
|
||||
# define __HWLOC_HAVE_ATTRIBUTE_CONST (GXX_ABOVE_3_4 || GCC_ABOVE_2_95)
|
||||
#else
|
||||
# define __HWLOC_HAVE_ATTRIBUTE_CONST 0
|
||||
#endif
|
||||
#if __HWLOC_HAVE_ATTRIBUTE_CONST
|
||||
# define __hwloc_attribute_const __attribute__((__const__))
|
||||
#else
|
||||
# define __hwloc_attribute_const
|
||||
#endif
|
||||
|
||||
#ifdef HWLOC_HAVE_ATTRIBUTE_PURE
|
||||
#define __HWLOC_HAVE_ATTRIBUTE_PURE HWLOC_HAVE_ATTRIBUTE_PURE
|
||||
#elif defined(__GNUC__)
|
||||
# define __HWLOC_HAVE_ATTRIBUTE_PURE (GXX_ABOVE_3_4 || GCC_ABOVE_2_96)
|
||||
#else
|
||||
# define __HWLOC_HAVE_ATTRIBUTE_PURE 0
|
||||
#endif
|
||||
#if __HWLOC_HAVE_ATTRIBUTE_PURE
|
||||
# define __hwloc_attribute_pure __attribute__((__pure__))
|
||||
#else
|
||||
# define __hwloc_attribute_pure
|
||||
#endif
|
||||
|
||||
#ifndef __hwloc_attribute_deprecated /* allow the user to disable these warnings by defining this macro to nothing */
|
||||
#ifdef HWLOC_HAVE_ATTRIBUTE_DEPRECATED
|
||||
#define __HWLOC_HAVE_ATTRIBUTE_DEPRECATED HWLOC_HAVE_ATTRIBUTE_DEPRECATED
|
||||
#elif defined(__GNUC__)
|
||||
# define __HWLOC_HAVE_ATTRIBUTE_DEPRECATED (GXX_ABOVE_3_4 || GCC_ABOVE_3_3)
|
||||
#else
|
||||
# define __HWLOC_HAVE_ATTRIBUTE_DEPRECATED 0
|
||||
#endif
|
||||
#if __HWLOC_HAVE_ATTRIBUTE_DEPRECATED
|
||||
# define __hwloc_attribute_deprecated __attribute__((__deprecated__))
|
||||
#else
|
||||
# define __hwloc_attribute_deprecated
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifdef HWLOC_HAVE_ATTRIBUTE_MAY_ALIAS
|
||||
#define __HWLOC_HAVE_ATTRIBUTE_MAY_ALIAS HWLOC_HAVE_ATTRIBUTE_MAY_ALIAS
|
||||
#elif defined(__GNUC__)
|
||||
# define __HWLOC_HAVE_ATTRIBUTE_MAY_ALIAS (GXX_ABOVE_3_4 || GCC_ABOVE_3_3)
|
||||
#else
|
||||
# define __HWLOC_HAVE_ATTRIBUTE_MAY_ALIAS 0
|
||||
#endif
|
||||
#if __HWLOC_HAVE_ATTRIBUTE_MAY_ALIAS
|
||||
# define __hwloc_attribute_may_alias __attribute__((__may_alias__))
|
||||
#else
|
||||
# define __hwloc_attribute_may_alias
|
||||
#endif
|
||||
|
||||
#ifdef HWLOC_HAVE_ATTRIBUTE_WARN_UNUSED_RESULT
|
||||
#define __HWLOC_HAVE_ATTRIBUTE_WARN_UNUSED_RESULT HWLOC_HAVE_ATTRIBUTE_WARN_UNUSED_RESULT
|
||||
#elif defined(__GNUC__)
|
||||
# define __HWLOC_HAVE_ATTRIBUTE_WARN_UNUSED_RESULT (GXX_ABOVE_3_4 || GCC_ABOVE_3_4)
|
||||
#else
|
||||
# define __HWLOC_HAVE_ATTRIBUTE_WARN_UNUSED_RESULT 0
|
||||
#endif
|
||||
#if __HWLOC_HAVE_ATTRIBUTE_WARN_UNUSED_RESULT
|
||||
# define __hwloc_attribute_warn_unused_result __attribute__((__warn_unused_result__))
|
||||
#else
|
||||
# define __hwloc_attribute_warn_unused_result
|
||||
#endif
|
||||
|
||||
#ifdef HWLOC_C_HAVE_VISIBILITY
|
||||
# if HWLOC_C_HAVE_VISIBILITY
|
||||
# define HWLOC_DECLSPEC __attribute__((__visibility__("default")))
|
||||
# else
|
||||
# define HWLOC_DECLSPEC
|
||||
# endif
|
||||
#else
|
||||
# define HWLOC_DECLSPEC
|
||||
#endif
|
||||
|
||||
/* Defined to 1 on Linux */
|
||||
/* #undef HWLOC_LINUX_SYS */
|
||||
|
||||
/* Defined to 1 if the CPU_SET macro works */
|
||||
/* #undef HWLOC_HAVE_CPU_SET */
|
||||
|
||||
/* Defined to 1 if you have the `windows.h' header. */
|
||||
/* #undef HWLOC_HAVE_WINDOWS_H */
|
||||
#define hwloc_pid_t pid_t
|
||||
#define hwloc_thread_t pthread_t
|
||||
|
||||
#ifdef HWLOC_HAVE_WINDOWS_H
|
||||
|
||||
# include <windows.h>
|
||||
typedef DWORDLONG hwloc_uint64_t;
|
||||
|
||||
#else /* HWLOC_HAVE_WINDOWS_H */
|
||||
|
||||
# ifdef hwloc_thread_t
|
||||
# include <pthread.h>
|
||||
# endif /* hwloc_thread_t */
|
||||
|
||||
/* Defined to 1 if you have the <stdint.h> header file. */
|
||||
# define HWLOC_HAVE_STDINT_H 1
|
||||
|
||||
# include <unistd.h>
|
||||
# ifdef HWLOC_HAVE_STDINT_H
|
||||
# include <stdint.h>
|
||||
# endif
|
||||
typedef uint64_t hwloc_uint64_t;
|
||||
|
||||
#endif /* HWLOC_HAVE_WINDOWS_H */
|
||||
|
||||
/* Define to 1 if --enable-32bits-pci-domain is called. */
|
||||
/* #undef HWLOC_HAVE_32BITS_PCI_DOMAIN */
|
||||
|
||||
/* Whether we need to re-define all the hwloc public symbols or not */
|
||||
#define HWLOC_SYM_TRANSFORM 0
|
||||
|
||||
/* The hwloc symbol prefix */
|
||||
#define HWLOC_SYM_PREFIX hwloc_
|
||||
|
||||
/* The hwloc symbol prefix in all caps */
|
||||
#define HWLOC_SYM_PREFIX_CAPS HWLOC_
|
||||
|
||||
#endif /* HWLOC_CONFIG_H */
|
||||
494
macx64/mpi/openmpi/include/hwloc/bitmap.h
Normal file
494
macx64/mpi/openmpi/include/hwloc/bitmap.h
Normal file
@@ -0,0 +1,494 @@
|
||||
/*
|
||||
* Copyright © 2009 CNRS
|
||||
* Copyright © 2009-2020 Inria. All rights reserved.
|
||||
* Copyright © 2009-2012 Université Bordeaux
|
||||
* Copyright © 2009-2011 Cisco Systems, Inc. All rights reserved.
|
||||
* See COPYING in top-level directory.
|
||||
*/
|
||||
|
||||
/** \file
|
||||
* \brief The bitmap API, for use in hwloc itself.
|
||||
*/
|
||||
|
||||
#ifndef HWLOC_BITMAP_H
|
||||
#define HWLOC_BITMAP_H
|
||||
|
||||
#include "hwloc/autogen/config.h"
|
||||
|
||||
#include <assert.h>
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
|
||||
/** \defgroup hwlocality_bitmap The bitmap API
|
||||
*
|
||||
* The ::hwloc_bitmap_t type represents a set of integers (positive or null).
|
||||
* A bitmap may be of infinite size (all bits are set after some point).
|
||||
* A bitmap may even be full if all bits are set.
|
||||
*
|
||||
* Bitmaps are used by hwloc for sets of OS processors
|
||||
* (which may actually be hardware threads) as by ::hwloc_cpuset_t
|
||||
* (a typedef for ::hwloc_bitmap_t), or sets of NUMA memory nodes
|
||||
* as ::hwloc_nodeset_t (also a typedef for ::hwloc_bitmap_t).
|
||||
* Those are used for cpuset and nodeset fields in the ::hwloc_obj structure,
|
||||
* see \ref hwlocality_object_sets.
|
||||
*
|
||||
* <em>Both CPU and node sets are always indexed by OS physical number.</em>
|
||||
* However users should usually not build CPU and node sets manually
|
||||
* (e.g. with hwloc_bitmap_set()).
|
||||
* One should rather use existing object sets and combine them with
|
||||
* hwloc_bitmap_or(), etc.
|
||||
* For instance, binding the current thread on a pair of cores may be performed with:
|
||||
* \code
|
||||
* hwloc_obj_t core1 = ... , core2 = ... ;
|
||||
* hwloc_bitmap_t set = hwloc_bitmap_alloc();
|
||||
* hwloc_bitmap_or(set, core1->cpuset, core2->cpuset);
|
||||
* hwloc_set_cpubind(topology, set, HWLOC_CPUBIND_THREAD);
|
||||
* hwloc_bitmap_free(set);
|
||||
* \endcode
|
||||
*
|
||||
* \note Most functions below return an int that may be negative in case of
|
||||
* error. The usual error case would be an internal failure to realloc/extend
|
||||
* the storage of the bitmap (\p errno would be set to \c ENOMEM).
|
||||
*
|
||||
* \note Several examples of using the bitmap API are available under the
|
||||
* doc/examples/ directory in the source tree.
|
||||
* Regression tests such as tests/hwloc/hwloc_bitmap*.c also make intensive use
|
||||
* of this API.
|
||||
* @{
|
||||
*/
|
||||
|
||||
|
||||
/** \brief
|
||||
* Set of bits represented as an opaque pointer to an internal bitmap.
|
||||
*/
|
||||
typedef struct hwloc_bitmap_s * hwloc_bitmap_t;
|
||||
/** \brief a non-modifiable ::hwloc_bitmap_t */
|
||||
typedef const struct hwloc_bitmap_s * hwloc_const_bitmap_t;
|
||||
|
||||
|
||||
/*
|
||||
* Bitmap allocation, freeing and copying.
|
||||
*/
|
||||
|
||||
/** \brief Allocate a new empty bitmap.
|
||||
*
|
||||
* \returns A valid bitmap or \c NULL.
|
||||
*
|
||||
* The bitmap should be freed by a corresponding call to
|
||||
* hwloc_bitmap_free().
|
||||
*/
|
||||
HWLOC_DECLSPEC hwloc_bitmap_t hwloc_bitmap_alloc(void) __hwloc_attribute_malloc;
|
||||
|
||||
/** \brief Allocate a new full bitmap. */
|
||||
HWLOC_DECLSPEC hwloc_bitmap_t hwloc_bitmap_alloc_full(void) __hwloc_attribute_malloc;
|
||||
|
||||
/** \brief Free bitmap \p bitmap.
|
||||
*
|
||||
* If \p bitmap is \c NULL, no operation is performed.
|
||||
*/
|
||||
HWLOC_DECLSPEC void hwloc_bitmap_free(hwloc_bitmap_t bitmap);
|
||||
|
||||
/** \brief Duplicate bitmap \p bitmap by allocating a new bitmap and copying \p bitmap contents.
|
||||
*
|
||||
* If \p bitmap is \c NULL, \c NULL is returned.
|
||||
*/
|
||||
HWLOC_DECLSPEC hwloc_bitmap_t hwloc_bitmap_dup(hwloc_const_bitmap_t bitmap) __hwloc_attribute_malloc;
|
||||
|
||||
/** \brief Copy the contents of bitmap \p src into the already allocated bitmap \p dst */
|
||||
HWLOC_DECLSPEC int hwloc_bitmap_copy(hwloc_bitmap_t dst, hwloc_const_bitmap_t src);
|
||||
|
||||
|
||||
/*
|
||||
* Bitmap/String Conversion
|
||||
*/
|
||||
|
||||
/** \brief Stringify a bitmap.
|
||||
*
|
||||
* Up to \p buflen characters may be written in buffer \p buf.
|
||||
*
|
||||
* If \p buflen is 0, \p buf may safely be \c NULL.
|
||||
*
|
||||
* \return the number of character that were actually written if not truncating,
|
||||
* or that would have been written (not including the ending \\0).
|
||||
*/
|
||||
HWLOC_DECLSPEC int hwloc_bitmap_snprintf(char * __hwloc_restrict buf, size_t buflen, hwloc_const_bitmap_t bitmap);
|
||||
|
||||
/** \brief Stringify a bitmap into a newly allocated string.
|
||||
*
|
||||
* \return -1 on error.
|
||||
*/
|
||||
HWLOC_DECLSPEC int hwloc_bitmap_asprintf(char ** strp, hwloc_const_bitmap_t bitmap);
|
||||
|
||||
/** \brief Parse a bitmap string and stores it in bitmap \p bitmap.
|
||||
*/
|
||||
HWLOC_DECLSPEC int hwloc_bitmap_sscanf(hwloc_bitmap_t bitmap, const char * __hwloc_restrict string);
|
||||
|
||||
/** \brief Stringify a bitmap in the list format.
|
||||
*
|
||||
* Lists are comma-separated indexes or ranges.
|
||||
* Ranges are dash separated indexes.
|
||||
* The last range may not have an ending indexes if the bitmap is infinitely set.
|
||||
*
|
||||
* Up to \p buflen characters may be written in buffer \p buf.
|
||||
*
|
||||
* If \p buflen is 0, \p buf may safely be \c NULL.
|
||||
*
|
||||
* \return the number of character that were actually written if not truncating,
|
||||
* or that would have been written (not including the ending \\0).
|
||||
*/
|
||||
HWLOC_DECLSPEC int hwloc_bitmap_list_snprintf(char * __hwloc_restrict buf, size_t buflen, hwloc_const_bitmap_t bitmap);
|
||||
|
||||
/** \brief Stringify a bitmap into a newly allocated list string.
|
||||
*
|
||||
* \return -1 on error.
|
||||
*/
|
||||
HWLOC_DECLSPEC int hwloc_bitmap_list_asprintf(char ** strp, hwloc_const_bitmap_t bitmap);
|
||||
|
||||
/** \brief Parse a list string and stores it in bitmap \p bitmap.
|
||||
*/
|
||||
HWLOC_DECLSPEC int hwloc_bitmap_list_sscanf(hwloc_bitmap_t bitmap, const char * __hwloc_restrict string);
|
||||
|
||||
/** \brief Stringify a bitmap in the taskset-specific format.
|
||||
*
|
||||
* The taskset command manipulates bitmap strings that contain a single
|
||||
* (possible very long) hexadecimal number starting with 0x.
|
||||
*
|
||||
* Up to \p buflen characters may be written in buffer \p buf.
|
||||
*
|
||||
* If \p buflen is 0, \p buf may safely be \c NULL.
|
||||
*
|
||||
* \return the number of character that were actually written if not truncating,
|
||||
* or that would have been written (not including the ending \\0).
|
||||
*/
|
||||
HWLOC_DECLSPEC int hwloc_bitmap_taskset_snprintf(char * __hwloc_restrict buf, size_t buflen, hwloc_const_bitmap_t bitmap);
|
||||
|
||||
/** \brief Stringify a bitmap into a newly allocated taskset-specific string.
|
||||
*
|
||||
* \return -1 on error.
|
||||
*/
|
||||
HWLOC_DECLSPEC int hwloc_bitmap_taskset_asprintf(char ** strp, hwloc_const_bitmap_t bitmap);
|
||||
|
||||
/** \brief Parse a taskset-specific bitmap string and stores it in bitmap \p bitmap.
|
||||
*/
|
||||
HWLOC_DECLSPEC int hwloc_bitmap_taskset_sscanf(hwloc_bitmap_t bitmap, const char * __hwloc_restrict string);
|
||||
|
||||
|
||||
/*
|
||||
* Building bitmaps.
|
||||
*/
|
||||
|
||||
/** \brief Empty the bitmap \p bitmap */
|
||||
HWLOC_DECLSPEC void hwloc_bitmap_zero(hwloc_bitmap_t bitmap);
|
||||
|
||||
/** \brief Fill bitmap \p bitmap with all possible indexes (even if those objects don't exist or are otherwise unavailable) */
|
||||
HWLOC_DECLSPEC void hwloc_bitmap_fill(hwloc_bitmap_t bitmap);
|
||||
|
||||
/** \brief Empty the bitmap \p bitmap and add bit \p id */
|
||||
HWLOC_DECLSPEC int hwloc_bitmap_only(hwloc_bitmap_t bitmap, unsigned id);
|
||||
|
||||
/** \brief Fill the bitmap \p and clear the index \p id */
|
||||
HWLOC_DECLSPEC int hwloc_bitmap_allbut(hwloc_bitmap_t bitmap, unsigned id);
|
||||
|
||||
/** \brief Setup bitmap \p bitmap from unsigned long \p mask */
|
||||
HWLOC_DECLSPEC int hwloc_bitmap_from_ulong(hwloc_bitmap_t bitmap, unsigned long mask);
|
||||
|
||||
/** \brief Setup bitmap \p bitmap from unsigned long \p mask used as \p i -th subset */
|
||||
HWLOC_DECLSPEC int hwloc_bitmap_from_ith_ulong(hwloc_bitmap_t bitmap, unsigned i, unsigned long mask);
|
||||
|
||||
/** \brief Setup bitmap \p bitmap from unsigned longs \p masks used as first \p nr subsets */
|
||||
HWLOC_DECLSPEC int hwloc_bitmap_from_ulongs(hwloc_bitmap_t bitmap, unsigned nr, const unsigned long *masks);
|
||||
|
||||
|
||||
/*
|
||||
* Modifying bitmaps.
|
||||
*/
|
||||
|
||||
/** \brief Add index \p id in bitmap \p bitmap */
|
||||
HWLOC_DECLSPEC int hwloc_bitmap_set(hwloc_bitmap_t bitmap, unsigned id);
|
||||
|
||||
/** \brief Add indexes from \p begin to \p end in bitmap \p bitmap.
|
||||
*
|
||||
* If \p end is \c -1, the range is infinite.
|
||||
*/
|
||||
HWLOC_DECLSPEC int hwloc_bitmap_set_range(hwloc_bitmap_t bitmap, unsigned begin, int end);
|
||||
|
||||
/** \brief Replace \p i -th subset of bitmap \p bitmap with unsigned long \p mask */
|
||||
HWLOC_DECLSPEC int hwloc_bitmap_set_ith_ulong(hwloc_bitmap_t bitmap, unsigned i, unsigned long mask);
|
||||
|
||||
/** \brief Remove index \p id from bitmap \p bitmap */
|
||||
HWLOC_DECLSPEC int hwloc_bitmap_clr(hwloc_bitmap_t bitmap, unsigned id);
|
||||
|
||||
/** \brief Remove indexes from \p begin to \p end in bitmap \p bitmap.
|
||||
*
|
||||
* If \p end is \c -1, the range is infinite.
|
||||
*/
|
||||
HWLOC_DECLSPEC int hwloc_bitmap_clr_range(hwloc_bitmap_t bitmap, unsigned begin, int end);
|
||||
|
||||
/** \brief Keep a single index among those set in bitmap \p bitmap
|
||||
*
|
||||
* May be useful before binding so that the process does not
|
||||
* have a chance of migrating between multiple processors
|
||||
* in the original mask.
|
||||
* Instead of running the task on any PU inside the given CPU set,
|
||||
* the operating system scheduler will be forced to run it on a single
|
||||
* of these PUs.
|
||||
* It avoids a migration overhead and cache-line ping-pongs between PUs.
|
||||
*
|
||||
* \note This function is NOT meant to distribute multiple processes
|
||||
* within a single CPU set. It always return the same single bit when
|
||||
* called multiple times on the same input set. hwloc_distrib() may
|
||||
* be used for generating CPU sets to distribute multiple tasks below
|
||||
* a single multi-PU object.
|
||||
*
|
||||
* \note This function cannot be applied to an object set directly. It
|
||||
* should be applied to a copy (which may be obtained with hwloc_bitmap_dup()).
|
||||
*/
|
||||
HWLOC_DECLSPEC int hwloc_bitmap_singlify(hwloc_bitmap_t bitmap);
|
||||
|
||||
|
||||
/*
|
||||
* Consulting bitmaps.
|
||||
*/
|
||||
|
||||
/** \brief Convert the beginning part of bitmap \p bitmap into unsigned long \p mask */
|
||||
HWLOC_DECLSPEC unsigned long hwloc_bitmap_to_ulong(hwloc_const_bitmap_t bitmap) __hwloc_attribute_pure;
|
||||
|
||||
/** \brief Convert the \p i -th subset of bitmap \p bitmap into unsigned long mask */
|
||||
HWLOC_DECLSPEC unsigned long hwloc_bitmap_to_ith_ulong(hwloc_const_bitmap_t bitmap, unsigned i) __hwloc_attribute_pure;
|
||||
|
||||
/** \brief Convert the first \p nr subsets of bitmap \p bitmap into the array of \p nr unsigned long \p masks
|
||||
*
|
||||
* \p nr may be determined earlier with hwloc_bitmap_nr_ulongs().
|
||||
*
|
||||
* \return 0
|
||||
*/
|
||||
HWLOC_DECLSPEC int hwloc_bitmap_to_ulongs(hwloc_const_bitmap_t bitmap, unsigned nr, unsigned long *masks);
|
||||
|
||||
/** \brief Return the number of unsigned longs required for storing bitmap \p bitmap entirely
|
||||
*
|
||||
* This is the number of contiguous unsigned longs from the very first bit of the bitmap
|
||||
* (even if unset) up to the last set bit.
|
||||
* This is useful for knowing the \p nr parameter to pass to hwloc_bitmap_to_ulongs()
|
||||
* (or which calls to hwloc_bitmap_to_ith_ulong() are needed)
|
||||
* to entirely convert a bitmap into multiple unsigned longs.
|
||||
*
|
||||
* When called on the output of hwloc_topology_get_topology_cpuset(),
|
||||
* the returned number is large enough for all cpusets of the topology.
|
||||
*
|
||||
* \return -1 if \p bitmap is infinite.
|
||||
*/
|
||||
HWLOC_DECLSPEC int hwloc_bitmap_nr_ulongs(hwloc_const_bitmap_t bitmap) __hwloc_attribute_pure;
|
||||
|
||||
/** \brief Test whether index \p id is part of bitmap \p bitmap.
|
||||
*
|
||||
* \return 1 if the bit at index \p id is set in bitmap \p bitmap, 0 otherwise.
|
||||
*/
|
||||
HWLOC_DECLSPEC int hwloc_bitmap_isset(hwloc_const_bitmap_t bitmap, unsigned id) __hwloc_attribute_pure;
|
||||
|
||||
/** \brief Test whether bitmap \p bitmap is empty
|
||||
*
|
||||
* \return 1 if bitmap is empty, 0 otherwise.
|
||||
*/
|
||||
HWLOC_DECLSPEC int hwloc_bitmap_iszero(hwloc_const_bitmap_t bitmap) __hwloc_attribute_pure;
|
||||
|
||||
/** \brief Test whether bitmap \p bitmap is completely full
|
||||
*
|
||||
* \return 1 if bitmap is full, 0 otherwise.
|
||||
*
|
||||
* \note A full bitmap is always infinitely set.
|
||||
*/
|
||||
HWLOC_DECLSPEC int hwloc_bitmap_isfull(hwloc_const_bitmap_t bitmap) __hwloc_attribute_pure;
|
||||
|
||||
/** \brief Compute the first index (least significant bit) in bitmap \p bitmap
|
||||
*
|
||||
* \return -1 if no index is set in \p bitmap.
|
||||
*/
|
||||
HWLOC_DECLSPEC int hwloc_bitmap_first(hwloc_const_bitmap_t bitmap) __hwloc_attribute_pure;
|
||||
|
||||
/** \brief Compute the next index in bitmap \p bitmap which is after index \p prev
|
||||
*
|
||||
* If \p prev is -1, the first index is returned.
|
||||
*
|
||||
* \return -1 if no index with higher index is set in \p bitmap.
|
||||
*/
|
||||
HWLOC_DECLSPEC int hwloc_bitmap_next(hwloc_const_bitmap_t bitmap, int prev) __hwloc_attribute_pure;
|
||||
|
||||
/** \brief Compute the last index (most significant bit) in bitmap \p bitmap
|
||||
*
|
||||
* \return -1 if no index is set in \p bitmap, or if \p bitmap is infinitely set.
|
||||
*/
|
||||
HWLOC_DECLSPEC int hwloc_bitmap_last(hwloc_const_bitmap_t bitmap) __hwloc_attribute_pure;
|
||||
|
||||
/** \brief Compute the "weight" of bitmap \p bitmap (i.e., number of
|
||||
* indexes that are in the bitmap).
|
||||
*
|
||||
* \return the number of indexes that are in the bitmap.
|
||||
*
|
||||
* \return -1 if \p bitmap is infinitely set.
|
||||
*/
|
||||
HWLOC_DECLSPEC int hwloc_bitmap_weight(hwloc_const_bitmap_t bitmap) __hwloc_attribute_pure;
|
||||
|
||||
/** \brief Compute the first unset index (least significant bit) in bitmap \p bitmap
|
||||
*
|
||||
* \return -1 if no index is unset in \p bitmap.
|
||||
*/
|
||||
HWLOC_DECLSPEC int hwloc_bitmap_first_unset(hwloc_const_bitmap_t bitmap) __hwloc_attribute_pure;
|
||||
|
||||
/** \brief Compute the next unset index in bitmap \p bitmap which is after index \p prev
|
||||
*
|
||||
* If \p prev is -1, the first unset index is returned.
|
||||
*
|
||||
* \return -1 if no index with higher index is unset in \p bitmap.
|
||||
*/
|
||||
HWLOC_DECLSPEC int hwloc_bitmap_next_unset(hwloc_const_bitmap_t bitmap, int prev) __hwloc_attribute_pure;
|
||||
|
||||
/** \brief Compute the last unset index (most significant bit) in bitmap \p bitmap
|
||||
*
|
||||
* \return -1 if no index is unset in \p bitmap, or if \p bitmap is infinitely set.
|
||||
*/
|
||||
HWLOC_DECLSPEC int hwloc_bitmap_last_unset(hwloc_const_bitmap_t bitmap) __hwloc_attribute_pure;
|
||||
|
||||
/** \brief Loop macro iterating on bitmap \p bitmap
|
||||
*
|
||||
* The loop must start with hwloc_bitmap_foreach_begin() and end
|
||||
* with hwloc_bitmap_foreach_end() followed by a terminating ';'.
|
||||
*
|
||||
* \p index is the loop variable; it should be an unsigned int. The
|
||||
* first iteration will set \p index to the lowest index in the bitmap.
|
||||
* Successive iterations will iterate through, in order, all remaining
|
||||
* indexes set in the bitmap. To be specific: each iteration will return a
|
||||
* value for \p index such that hwloc_bitmap_isset(bitmap, index) is true.
|
||||
*
|
||||
* The assert prevents the loop from being infinite if the bitmap is infinitely set.
|
||||
*
|
||||
* \hideinitializer
|
||||
*/
|
||||
#define hwloc_bitmap_foreach_begin(id, bitmap) \
|
||||
do { \
|
||||
assert(hwloc_bitmap_weight(bitmap) != -1); \
|
||||
for (id = hwloc_bitmap_first(bitmap); \
|
||||
(unsigned) id != (unsigned) -1; \
|
||||
id = hwloc_bitmap_next(bitmap, id)) {
|
||||
|
||||
/** \brief End of loop macro iterating on a bitmap.
|
||||
*
|
||||
* Needs a terminating ';'.
|
||||
*
|
||||
* \sa hwloc_bitmap_foreach_begin()
|
||||
* \hideinitializer
|
||||
*/
|
||||
#define hwloc_bitmap_foreach_end() \
|
||||
} \
|
||||
} while (0)
|
||||
|
||||
|
||||
/*
|
||||
* Combining bitmaps.
|
||||
*/
|
||||
|
||||
/** \brief Or bitmaps \p bitmap1 and \p bitmap2 and store the result in bitmap \p res
|
||||
*
|
||||
* \p res can be the same as \p bitmap1 or \p bitmap2
|
||||
*/
|
||||
HWLOC_DECLSPEC int hwloc_bitmap_or (hwloc_bitmap_t res, hwloc_const_bitmap_t bitmap1, hwloc_const_bitmap_t bitmap2);
|
||||
|
||||
/** \brief And bitmaps \p bitmap1 and \p bitmap2 and store the result in bitmap \p res
|
||||
*
|
||||
* \p res can be the same as \p bitmap1 or \p bitmap2
|
||||
*/
|
||||
HWLOC_DECLSPEC int hwloc_bitmap_and (hwloc_bitmap_t res, hwloc_const_bitmap_t bitmap1, hwloc_const_bitmap_t bitmap2);
|
||||
|
||||
/** \brief And bitmap \p bitmap1 and the negation of \p bitmap2 and store the result in bitmap \p res
|
||||
*
|
||||
* \p res can be the same as \p bitmap1 or \p bitmap2
|
||||
*/
|
||||
HWLOC_DECLSPEC int hwloc_bitmap_andnot (hwloc_bitmap_t res, hwloc_const_bitmap_t bitmap1, hwloc_const_bitmap_t bitmap2);
|
||||
|
||||
/** \brief Xor bitmaps \p bitmap1 and \p bitmap2 and store the result in bitmap \p res
|
||||
*
|
||||
* \p res can be the same as \p bitmap1 or \p bitmap2
|
||||
*/
|
||||
HWLOC_DECLSPEC int hwloc_bitmap_xor (hwloc_bitmap_t res, hwloc_const_bitmap_t bitmap1, hwloc_const_bitmap_t bitmap2);
|
||||
|
||||
/** \brief Negate bitmap \p bitmap and store the result in bitmap \p res
|
||||
*
|
||||
* \p res can be the same as \p bitmap
|
||||
*/
|
||||
HWLOC_DECLSPEC int hwloc_bitmap_not (hwloc_bitmap_t res, hwloc_const_bitmap_t bitmap);
|
||||
|
||||
|
||||
/*
|
||||
* Comparing bitmaps.
|
||||
*/
|
||||
|
||||
/** \brief Test whether bitmaps \p bitmap1 and \p bitmap2 intersects.
|
||||
*
|
||||
* \return 1 if bitmaps intersect, 0 otherwise.
|
||||
*/
|
||||
HWLOC_DECLSPEC int hwloc_bitmap_intersects (hwloc_const_bitmap_t bitmap1, hwloc_const_bitmap_t bitmap2) __hwloc_attribute_pure;
|
||||
|
||||
/** \brief Test whether bitmap \p sub_bitmap is part of bitmap \p super_bitmap.
|
||||
*
|
||||
* \return 1 if \p sub_bitmap is included in \p super_bitmap, 0 otherwise.
|
||||
*
|
||||
* \note The empty bitmap is considered included in any other bitmap.
|
||||
*/
|
||||
HWLOC_DECLSPEC int hwloc_bitmap_isincluded (hwloc_const_bitmap_t sub_bitmap, hwloc_const_bitmap_t super_bitmap) __hwloc_attribute_pure;
|
||||
|
||||
/** \brief Test whether bitmap \p bitmap1 is equal to bitmap \p bitmap2.
|
||||
*
|
||||
* \return 1 if bitmaps are equal, 0 otherwise.
|
||||
*/
|
||||
HWLOC_DECLSPEC int hwloc_bitmap_isequal (hwloc_const_bitmap_t bitmap1, hwloc_const_bitmap_t bitmap2) __hwloc_attribute_pure;
|
||||
|
||||
/** \brief Compare bitmaps \p bitmap1 and \p bitmap2 using their lowest index.
|
||||
*
|
||||
* A bitmap is considered smaller if its least significant bit is smaller.
|
||||
* The empty bitmap is considered higher than anything (because its least significant bit does not exist).
|
||||
*
|
||||
* \return -1 if \p bitmap1 is considered smaller than \p bitmap2.
|
||||
* \return 1 if \p bitmap1 is considered larger than \p bitmap2.
|
||||
*
|
||||
* For instance comparing binary bitmaps 0011 and 0110 returns -1
|
||||
* (hence 0011 is considered smaller than 0110)
|
||||
* because least significant bit of 0011 (0001) is smaller than least significant bit of 0110 (0010).
|
||||
* Comparing 01001 and 00110 would also return -1 for the same reason.
|
||||
*
|
||||
* \return 0 if bitmaps are considered equal, even if they are not strictly equal.
|
||||
* They just need to have the same least significant bit.
|
||||
* For instance, comparing binary bitmaps 0010 and 0110 returns 0 because they have the same least significant bit.
|
||||
*/
|
||||
HWLOC_DECLSPEC int hwloc_bitmap_compare_first(hwloc_const_bitmap_t bitmap1, hwloc_const_bitmap_t bitmap2) __hwloc_attribute_pure;
|
||||
|
||||
/** \brief Compare bitmaps \p bitmap1 and \p bitmap2 in lexicographic order.
|
||||
*
|
||||
* Lexicographic comparison of bitmaps, starting for their highest indexes.
|
||||
* Compare last indexes first, then second, etc.
|
||||
* The empty bitmap is considered lower than anything.
|
||||
*
|
||||
* \return -1 if \p bitmap1 is considered smaller than \p bitmap2.
|
||||
* \return 1 if \p bitmap1 is considered larger than \p bitmap2.
|
||||
* \return 0 if bitmaps are equal (contrary to hwloc_bitmap_compare_first()).
|
||||
*
|
||||
* For instance comparing binary bitmaps 0011 and 0110 returns -1
|
||||
* (hence 0011 is considered smaller than 0110).
|
||||
* Comparing 00101 and 01010 returns -1 too.
|
||||
*
|
||||
* \note This is different from the non-existing hwloc_bitmap_compare_last()
|
||||
* which would only compare the highest index of each bitmap.
|
||||
*/
|
||||
HWLOC_DECLSPEC int hwloc_bitmap_compare(hwloc_const_bitmap_t bitmap1, hwloc_const_bitmap_t bitmap2) __hwloc_attribute_pure;
|
||||
|
||||
/** @} */
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
} /* extern "C" */
|
||||
#endif
|
||||
|
||||
|
||||
#endif /* HWLOC_BITMAP_H */
|
||||
193
macx64/mpi/openmpi/include/hwloc/cpukinds.h
Normal file
193
macx64/mpi/openmpi/include/hwloc/cpukinds.h
Normal file
@@ -0,0 +1,193 @@
|
||||
/*
|
||||
* Copyright © 2020-2021 Inria. All rights reserved.
|
||||
* See COPYING in top-level directory.
|
||||
*/
|
||||
|
||||
/** \file
|
||||
* \brief Kinds of CPU cores.
|
||||
*/
|
||||
|
||||
#ifndef HWLOC_CPUKINDS_H
|
||||
#define HWLOC_CPUKINDS_H
|
||||
|
||||
#include "hwloc.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#elif 0
|
||||
}
|
||||
#endif
|
||||
|
||||
/** \defgroup hwlocality_cpukinds Kinds of CPU cores
|
||||
*
|
||||
* Platforms with heterogeneous CPUs may have some cores with
|
||||
* different features or frequencies.
|
||||
* This API exposes identical PUs in sets called CPU kinds.
|
||||
* Each PU of the topology may only be in a single kind.
|
||||
*
|
||||
* The number of kinds may be obtained with hwloc_cpukinds_get_nr().
|
||||
* If the platform is homogeneous, there may be a single kind
|
||||
* with all PUs.
|
||||
* If the platform or operating system does not expose any
|
||||
* information about CPU cores, there may be no kind at all.
|
||||
*
|
||||
* The index of the kind that describes a given CPU set
|
||||
* (if any, and not partially)
|
||||
* may be obtained with hwloc_cpukinds_get_by_cpuset().
|
||||
*
|
||||
* From the index of a kind, it is possible to retrieve information
|
||||
* with hwloc_cpukinds_get_info():
|
||||
* an abstracted efficiency value,
|
||||
* and an array of info attributes
|
||||
* (for instance the "CoreType" and "FrequencyMaxMHz",
|
||||
* see \ref topoattrs_cpukinds).
|
||||
*
|
||||
* A higher efficiency value means greater intrinsic performance
|
||||
* (and possibly less performance/power efficiency).
|
||||
* Kinds with lower efficiency values are ranked first:
|
||||
* Passing 0 as \p kind_index to hwloc_cpukinds_get_info() will
|
||||
* return information about the CPU kind with lower performance
|
||||
* but higher energy-efficiency.
|
||||
* Higher \p kind_index values would rather return information
|
||||
* about power-hungry high-performance cores.
|
||||
*
|
||||
* When available, efficiency values are gathered from the operating system.
|
||||
* If so, \p cpukind_efficiency is set in the struct hwloc_topology_discovery_support array.
|
||||
* This is currently available on Windows 10, Mac OS X (Darwin),
|
||||
* and on some Linux platforms where core "capacity" is exposed in sysfs.
|
||||
*
|
||||
* If the operating system does not expose core efficiencies natively,
|
||||
* hwloc tries to compute efficiencies by comparing CPU kinds using
|
||||
* frequencies (on ARM), or core types and frequencies (on other architectures).
|
||||
* The environment variable HWLOC_CPUKINDS_RANKING may be used
|
||||
* to change this heuristics, see \ref envvar.
|
||||
*
|
||||
* If hwloc fails to rank any kind, for instance because the operating
|
||||
* system does not expose efficiencies and core frequencies,
|
||||
* all kinds will have an unknown efficiency (\c -1),
|
||||
* and they are not indexed/ordered in any specific way.
|
||||
*
|
||||
* @{
|
||||
*/
|
||||
|
||||
/** \brief Get the number of different kinds of CPU cores in the topology.
|
||||
*
|
||||
* \p flags must be \c 0 for now.
|
||||
*
|
||||
* \return The number of CPU kinds (positive integer) on success.
|
||||
* \return \c 0 if no information about kinds was found.
|
||||
* \return \c -1 with \p errno set to \c EINVAL if \p flags is invalid.
|
||||
*/
|
||||
HWLOC_DECLSPEC int
|
||||
hwloc_cpukinds_get_nr(hwloc_topology_t topology,
|
||||
unsigned long flags);
|
||||
|
||||
/** \brief Get the index of the CPU kind that contains CPUs listed in \p cpuset.
|
||||
*
|
||||
* \p flags must be \c 0 for now.
|
||||
*
|
||||
* \return The index of the CPU kind (positive integer or 0) on success.
|
||||
* \return \c -1 with \p errno set to \c EXDEV if \p cpuset is
|
||||
* only partially included in the some kind.
|
||||
* \return \c -1 with \p errno set to \c ENOENT if \p cpuset is
|
||||
* not included in any kind, even partially.
|
||||
* \return \c -1 with \p errno set to \c EINVAL if parameters are invalid.
|
||||
*/
|
||||
HWLOC_DECLSPEC int
|
||||
hwloc_cpukinds_get_by_cpuset(hwloc_topology_t topology,
|
||||
hwloc_const_bitmap_t cpuset,
|
||||
unsigned long flags);
|
||||
|
||||
/** \brief Get the CPU set and infos about a CPU kind in the topology.
|
||||
*
|
||||
* \p kind_index identifies one kind of CPU between 0 and the number
|
||||
* of kinds returned by hwloc_cpukinds_get_nr() minus 1.
|
||||
*
|
||||
* If not \c NULL, the bitmap \p cpuset will be filled with
|
||||
* the set of PUs of this kind.
|
||||
*
|
||||
* The integer pointed by \p efficiency, if not \c NULL will, be filled
|
||||
* with the ranking of this kind of CPU in term of efficiency (see above).
|
||||
* It ranges from \c 0 to the number of kinds
|
||||
* (as reported by hwloc_cpukinds_get_nr()) minus 1.
|
||||
*
|
||||
* Kinds with lower efficiency are reported first.
|
||||
*
|
||||
* If there is a single kind in the topology, its efficiency \c 0.
|
||||
* If the efficiency of some kinds of cores is unknown,
|
||||
* the efficiency of all kinds is set to \c -1,
|
||||
* and kinds are reported in no specific order.
|
||||
*
|
||||
* The array of info attributes (for instance the "CoreType",
|
||||
* "FrequencyMaxMHz" or "FrequencyBaseMHz", see \ref topoattrs_cpukinds)
|
||||
* and its length are returned in \p infos or \p nr_infos.
|
||||
* The array belongs to the topology, it should not be freed or modified.
|
||||
*
|
||||
* If \p nr_infos or \p infos is \c NULL, no info is returned.
|
||||
*
|
||||
* \p flags must be \c 0 for now.
|
||||
*
|
||||
* \return \c 0 on success.
|
||||
* \return \c -1 with \p errno set to \c ENOENT if \p kind_index does not match any CPU kind.
|
||||
* \return \c -1 with \p errno set to \c EINVAL if parameters are invalid.
|
||||
*/
|
||||
HWLOC_DECLSPEC int
|
||||
hwloc_cpukinds_get_info(hwloc_topology_t topology,
|
||||
unsigned kind_index,
|
||||
hwloc_bitmap_t cpuset,
|
||||
int *efficiency,
|
||||
unsigned *nr_infos, struct hwloc_info_s **infos,
|
||||
unsigned long flags);
|
||||
|
||||
/** \brief Register a kind of CPU in the topology.
|
||||
*
|
||||
* Mark the PUs listed in \p cpuset as being of the same kind
|
||||
* with respect to the given attributes.
|
||||
*
|
||||
* \p forced_efficiency should be \c -1 if unknown.
|
||||
* Otherwise it is an abstracted efficiency value to enforce
|
||||
* the ranking of all kinds if all of them have valid (and
|
||||
* different) efficiencies.
|
||||
*
|
||||
* The array \p infos of size \p nr_infos may be used to provide
|
||||
* info names and values describing this kind of PUs.
|
||||
*
|
||||
* \p flags must be \c 0 for now.
|
||||
*
|
||||
* Parameters \p cpuset and \p infos will be duplicated internally,
|
||||
* the caller is responsible for freeing them.
|
||||
*
|
||||
* If \p cpuset overlaps with some existing kinds, those might get
|
||||
* modified or split. For instance if existing kind A contains
|
||||
* PUs 0 and 1, and one registers another kind for PU 1 and 2,
|
||||
* there will be 3 resulting kinds:
|
||||
* existing kind A is restricted to only PU 0;
|
||||
* new kind B contains only PU 1 and combines information from A
|
||||
* and from the newly-registered kind;
|
||||
* new kind C contains only PU 2 and only gets information from
|
||||
* the newly-registered kind.
|
||||
*
|
||||
* \note The efficiency \p forced_efficiency provided to this function
|
||||
* may be different from the one reported later by hwloc_cpukinds_get_info()
|
||||
* because hwloc will scale efficiency values down to
|
||||
* between 0 and the number of kinds minus 1.
|
||||
*
|
||||
* \return \c 0 on success.
|
||||
* \return \c -1 with \p errno set to \c EINVAL if some parameters are invalid,
|
||||
* for instance if \p cpuset is \c NULL or empty.
|
||||
*/
|
||||
HWLOC_DECLSPEC int
|
||||
hwloc_cpukinds_register(hwloc_topology_t topology,
|
||||
hwloc_bitmap_t cpuset,
|
||||
int forced_efficiency,
|
||||
unsigned nr_infos, struct hwloc_info_s *infos,
|
||||
unsigned long flags);
|
||||
|
||||
/** @} */
|
||||
|
||||
#ifdef __cplusplus
|
||||
} /* extern "C" */
|
||||
#endif
|
||||
|
||||
|
||||
#endif /* HWLOC_CPUKINDS_H */
|
||||
220
macx64/mpi/openmpi/include/hwloc/cuda.h
Normal file
220
macx64/mpi/openmpi/include/hwloc/cuda.h
Normal file
@@ -0,0 +1,220 @@
|
||||
/*
|
||||
* Copyright © 2010-2021 Inria. All rights reserved.
|
||||
* Copyright © 2010-2011 Université Bordeaux
|
||||
* Copyright © 2011 Cisco Systems, Inc. All rights reserved.
|
||||
* See COPYING in top-level directory.
|
||||
*/
|
||||
|
||||
/** \file
|
||||
* \brief Macros to help interaction between hwloc and the CUDA Driver API.
|
||||
*
|
||||
* Applications that use both hwloc and the CUDA Driver API may want to
|
||||
* include this file so as to get topology information for CUDA devices.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef HWLOC_CUDA_H
|
||||
#define HWLOC_CUDA_H
|
||||
|
||||
#include "hwloc.h"
|
||||
#include "hwloc/autogen/config.h"
|
||||
#include "hwloc/helper.h"
|
||||
#ifdef HWLOC_LINUX_SYS
|
||||
#include "hwloc/linux.h"
|
||||
#endif
|
||||
|
||||
#include <cuda.h>
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
|
||||
/** \defgroup hwlocality_cuda Interoperability with the CUDA Driver API
|
||||
*
|
||||
* This interface offers ways to retrieve topology information about
|
||||
* CUDA devices when using the CUDA Driver API.
|
||||
*
|
||||
* @{
|
||||
*/
|
||||
|
||||
/** \brief Return the domain, bus and device IDs of the CUDA device \p cudevice.
|
||||
*
|
||||
* Device \p cudevice must match the local machine.
|
||||
*/
|
||||
static __hwloc_inline int
|
||||
hwloc_cuda_get_device_pci_ids(hwloc_topology_t topology __hwloc_attribute_unused,
|
||||
CUdevice cudevice, int *domain, int *bus, int *dev)
|
||||
{
|
||||
CUresult cres;
|
||||
|
||||
#if CUDA_VERSION >= 4000
|
||||
cres = cuDeviceGetAttribute(domain, CU_DEVICE_ATTRIBUTE_PCI_DOMAIN_ID, cudevice);
|
||||
if (cres != CUDA_SUCCESS) {
|
||||
errno = ENOSYS;
|
||||
return -1;
|
||||
}
|
||||
#else
|
||||
*domain = 0;
|
||||
#endif
|
||||
cres = cuDeviceGetAttribute(bus, CU_DEVICE_ATTRIBUTE_PCI_BUS_ID, cudevice);
|
||||
if (cres != CUDA_SUCCESS) {
|
||||
errno = ENOSYS;
|
||||
return -1;
|
||||
}
|
||||
cres = cuDeviceGetAttribute(dev, CU_DEVICE_ATTRIBUTE_PCI_DEVICE_ID, cudevice);
|
||||
if (cres != CUDA_SUCCESS) {
|
||||
errno = ENOSYS;
|
||||
return -1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/** \brief Get the CPU set of processors that are physically
|
||||
* close to device \p cudevice.
|
||||
*
|
||||
* Store in \p set the CPU-set describing the locality of the CUDA device \p cudevice.
|
||||
*
|
||||
* Topology \p topology and device \p cudevice must match the local machine.
|
||||
* I/O devices detection and the CUDA component are not needed in the topology.
|
||||
*
|
||||
* The function only returns the locality of the device.
|
||||
* If more information about the device is needed, OS objects should
|
||||
* be used instead, see hwloc_cuda_get_device_osdev()
|
||||
* and hwloc_cuda_get_device_osdev_by_index().
|
||||
*
|
||||
* This function is currently only implemented in a meaningful way for
|
||||
* Linux; other systems will simply get a full cpuset.
|
||||
*/
|
||||
static __hwloc_inline int
|
||||
hwloc_cuda_get_device_cpuset(hwloc_topology_t topology __hwloc_attribute_unused,
|
||||
CUdevice cudevice, hwloc_cpuset_t set)
|
||||
{
|
||||
#ifdef HWLOC_LINUX_SYS
|
||||
/* If we're on Linux, use the sysfs mechanism to get the local cpus */
|
||||
#define HWLOC_CUDA_DEVICE_SYSFS_PATH_MAX 128
|
||||
char path[HWLOC_CUDA_DEVICE_SYSFS_PATH_MAX];
|
||||
int domainid, busid, deviceid;
|
||||
|
||||
if (hwloc_cuda_get_device_pci_ids(topology, cudevice, &domainid, &busid, &deviceid))
|
||||
return -1;
|
||||
|
||||
if (!hwloc_topology_is_thissystem(topology)) {
|
||||
errno = EINVAL;
|
||||
return -1;
|
||||
}
|
||||
|
||||
sprintf(path, "/sys/bus/pci/devices/%04x:%02x:%02x.0/local_cpus", domainid, busid, deviceid);
|
||||
if (hwloc_linux_read_path_as_cpumask(path, set) < 0
|
||||
|| hwloc_bitmap_iszero(set))
|
||||
hwloc_bitmap_copy(set, hwloc_topology_get_complete_cpuset(topology));
|
||||
#else
|
||||
/* Non-Linux systems simply get a full cpuset */
|
||||
hwloc_bitmap_copy(set, hwloc_topology_get_complete_cpuset(topology));
|
||||
#endif
|
||||
return 0;
|
||||
}
|
||||
|
||||
/** \brief Get the hwloc PCI device object corresponding to the
|
||||
* CUDA device \p cudevice.
|
||||
*
|
||||
* \return The hwloc PCI device object describing the CUDA device \p cudevice.
|
||||
* \return \c NULL if none could be found.
|
||||
*
|
||||
* Topology \p topology and device \p cudevice must match the local machine.
|
||||
* I/O devices detection must be enabled in topology \p topology.
|
||||
* The CUDA component is not needed in the topology.
|
||||
*/
|
||||
static __hwloc_inline hwloc_obj_t
|
||||
hwloc_cuda_get_device_pcidev(hwloc_topology_t topology, CUdevice cudevice)
|
||||
{
|
||||
int domain, bus, dev;
|
||||
|
||||
if (hwloc_cuda_get_device_pci_ids(topology, cudevice, &domain, &bus, &dev))
|
||||
return NULL;
|
||||
|
||||
return hwloc_get_pcidev_by_busid(topology, domain, bus, dev, 0);
|
||||
}
|
||||
|
||||
/** \brief Get the hwloc OS device object corresponding to CUDA device \p cudevice.
|
||||
*
|
||||
* \return The hwloc OS device object that describes the given CUDA device \p cudevice.
|
||||
* \return \c NULL if none could be found.
|
||||
*
|
||||
* Topology \p topology and device \p cudevice must match the local machine.
|
||||
* I/O devices detection and the CUDA component must be enabled in the topology.
|
||||
* If not, the locality of the object may still be found using
|
||||
* hwloc_cuda_get_device_cpuset().
|
||||
*
|
||||
* \note This function cannot work if PCI devices are filtered out.
|
||||
*
|
||||
* \note The corresponding hwloc PCI device may be found by looking
|
||||
* at the result parent pointer (unless PCI devices are filtered out).
|
||||
*/
|
||||
static __hwloc_inline hwloc_obj_t
|
||||
hwloc_cuda_get_device_osdev(hwloc_topology_t topology, CUdevice cudevice)
|
||||
{
|
||||
hwloc_obj_t osdev = NULL;
|
||||
int domain, bus, dev;
|
||||
|
||||
if (hwloc_cuda_get_device_pci_ids(topology, cudevice, &domain, &bus, &dev))
|
||||
return NULL;
|
||||
|
||||
osdev = NULL;
|
||||
while ((osdev = hwloc_get_next_osdev(topology, osdev)) != NULL) {
|
||||
hwloc_obj_t pcidev = osdev->parent;
|
||||
if (strncmp(osdev->name, "cuda", 4))
|
||||
continue;
|
||||
if (pcidev
|
||||
&& pcidev->type == HWLOC_OBJ_PCI_DEVICE
|
||||
&& (int) pcidev->attr->pcidev.domain == domain
|
||||
&& (int) pcidev->attr->pcidev.bus == bus
|
||||
&& (int) pcidev->attr->pcidev.dev == dev
|
||||
&& pcidev->attr->pcidev.func == 0)
|
||||
return osdev;
|
||||
/* if PCI are filtered out, we need a info attr to match on */
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/** \brief Get the hwloc OS device object corresponding to the
|
||||
* CUDA device whose index is \p idx.
|
||||
*
|
||||
* \return The hwloc OS device object describing the CUDA device whose index is \p idx.
|
||||
* \return \c NULL if none could be found.
|
||||
*
|
||||
* The topology \p topology does not necessarily have to match the current
|
||||
* machine. For instance the topology may be an XML import of a remote host.
|
||||
* I/O devices detection and the CUDA component must be enabled in the topology.
|
||||
*
|
||||
* \note The corresponding PCI device object can be obtained by looking
|
||||
* at the OS device parent object (unless PCI devices are filtered out).
|
||||
*
|
||||
* \note This function is identical to hwloc_cudart_get_device_osdev_by_index().
|
||||
*/
|
||||
static __hwloc_inline hwloc_obj_t
|
||||
hwloc_cuda_get_device_osdev_by_index(hwloc_topology_t topology, unsigned idx)
|
||||
{
|
||||
hwloc_obj_t osdev = NULL;
|
||||
while ((osdev = hwloc_get_next_osdev(topology, osdev)) != NULL) {
|
||||
if (HWLOC_OBJ_OSDEV_COPROC == osdev->attr->osdev.type
|
||||
&& osdev->name
|
||||
&& !strncmp("cuda", osdev->name, 4)
|
||||
&& atoi(osdev->name + 4) == (int) idx)
|
||||
return osdev;
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/** @} */
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
} /* extern "C" */
|
||||
#endif
|
||||
|
||||
|
||||
#endif /* HWLOC_CUDA_H */
|
||||
177
macx64/mpi/openmpi/include/hwloc/cudart.h
Normal file
177
macx64/mpi/openmpi/include/hwloc/cudart.h
Normal file
@@ -0,0 +1,177 @@
|
||||
/*
|
||||
* Copyright © 2010-2021 Inria. All rights reserved.
|
||||
* Copyright © 2010-2011 Université Bordeaux
|
||||
* Copyright © 2011 Cisco Systems, Inc. All rights reserved.
|
||||
* See COPYING in top-level directory.
|
||||
*/
|
||||
|
||||
/** \file
|
||||
* \brief Macros to help interaction between hwloc and the CUDA Runtime API.
|
||||
*
|
||||
* Applications that use both hwloc and the CUDA Runtime API may want to
|
||||
* include this file so as to get topology information for CUDA devices.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef HWLOC_CUDART_H
|
||||
#define HWLOC_CUDART_H
|
||||
|
||||
#include "hwloc.h"
|
||||
#include "hwloc/autogen/config.h"
|
||||
#include "hwloc/helper.h"
|
||||
#ifdef HWLOC_LINUX_SYS
|
||||
#include "hwloc/linux.h"
|
||||
#endif
|
||||
|
||||
#include <cuda.h> /* for CUDA_VERSION */
|
||||
#include <cuda_runtime_api.h>
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
|
||||
/** \defgroup hwlocality_cudart Interoperability with the CUDA Runtime API
|
||||
*
|
||||
* This interface offers ways to retrieve topology information about
|
||||
* CUDA devices when using the CUDA Runtime API.
|
||||
*
|
||||
* @{
|
||||
*/
|
||||
|
||||
/** \brief Return the domain, bus and device IDs of the CUDA device whose index is \p idx.
|
||||
*
|
||||
* Device index \p idx must match the local machine.
|
||||
*/
|
||||
static __hwloc_inline int
|
||||
hwloc_cudart_get_device_pci_ids(hwloc_topology_t topology __hwloc_attribute_unused,
|
||||
int idx, int *domain, int *bus, int *dev)
|
||||
{
|
||||
cudaError_t cerr;
|
||||
struct cudaDeviceProp prop;
|
||||
|
||||
cerr = cudaGetDeviceProperties(&prop, idx);
|
||||
if (cerr) {
|
||||
errno = ENOSYS;
|
||||
return -1;
|
||||
}
|
||||
|
||||
#if CUDA_VERSION >= 4000
|
||||
*domain = prop.pciDomainID;
|
||||
#else
|
||||
*domain = 0;
|
||||
#endif
|
||||
|
||||
*bus = prop.pciBusID;
|
||||
*dev = prop.pciDeviceID;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/** \brief Get the CPU set of processors that are physically
|
||||
* close to device \p idx.
|
||||
*
|
||||
* Store in \p set the CPU-set describing the locality of the CUDA device
|
||||
* whose index is \p idx.
|
||||
*
|
||||
* Topology \p topology and device \p idx must match the local machine.
|
||||
* I/O devices detection and the CUDA component are not needed in the topology.
|
||||
*
|
||||
* The function only returns the locality of the device.
|
||||
* If more information about the device is needed, OS objects should
|
||||
* be used instead, see hwloc_cudart_get_device_osdev_by_index().
|
||||
*
|
||||
* This function is currently only implemented in a meaningful way for
|
||||
* Linux; other systems will simply get a full cpuset.
|
||||
*/
|
||||
static __hwloc_inline int
|
||||
hwloc_cudart_get_device_cpuset(hwloc_topology_t topology __hwloc_attribute_unused,
|
||||
int idx, hwloc_cpuset_t set)
|
||||
{
|
||||
#ifdef HWLOC_LINUX_SYS
|
||||
/* If we're on Linux, use the sysfs mechanism to get the local cpus */
|
||||
#define HWLOC_CUDART_DEVICE_SYSFS_PATH_MAX 128
|
||||
char path[HWLOC_CUDART_DEVICE_SYSFS_PATH_MAX];
|
||||
int domain, bus, dev;
|
||||
|
||||
if (hwloc_cudart_get_device_pci_ids(topology, idx, &domain, &bus, &dev))
|
||||
return -1;
|
||||
|
||||
if (!hwloc_topology_is_thissystem(topology)) {
|
||||
errno = EINVAL;
|
||||
return -1;
|
||||
}
|
||||
|
||||
sprintf(path, "/sys/bus/pci/devices/%04x:%02x:%02x.0/local_cpus", (unsigned) domain, (unsigned) bus, (unsigned) dev);
|
||||
if (hwloc_linux_read_path_as_cpumask(path, set) < 0
|
||||
|| hwloc_bitmap_iszero(set))
|
||||
hwloc_bitmap_copy(set, hwloc_topology_get_complete_cpuset(topology));
|
||||
#else
|
||||
/* Non-Linux systems simply get a full cpuset */
|
||||
hwloc_bitmap_copy(set, hwloc_topology_get_complete_cpuset(topology));
|
||||
#endif
|
||||
return 0;
|
||||
}
|
||||
|
||||
/** \brief Get the hwloc PCI device object corresponding to the
|
||||
* CUDA device whose index is \p idx.
|
||||
*
|
||||
* \return The hwloc PCI device object describing the CUDA device whose index is \p idx.
|
||||
* \return \c NULL if none could be found.
|
||||
*
|
||||
* Topology \p topology and device \p idx must match the local machine.
|
||||
* I/O devices detection must be enabled in topology \p topology.
|
||||
* The CUDA component is not needed in the topology.
|
||||
*/
|
||||
static __hwloc_inline hwloc_obj_t
|
||||
hwloc_cudart_get_device_pcidev(hwloc_topology_t topology, int idx)
|
||||
{
|
||||
int domain, bus, dev;
|
||||
|
||||
if (hwloc_cudart_get_device_pci_ids(topology, idx, &domain, &bus, &dev))
|
||||
return NULL;
|
||||
|
||||
return hwloc_get_pcidev_by_busid(topology, domain, bus, dev, 0);
|
||||
}
|
||||
|
||||
/** \brief Get the hwloc OS device object corresponding to the
|
||||
* CUDA device whose index is \p idx.
|
||||
*
|
||||
* \return The hwloc OS device object describing the CUDA device whose index is \p idx.
|
||||
* \return \c NULL if none could be found.
|
||||
*
|
||||
* The topology \p topology does not necessarily have to match the current
|
||||
* machine. For instance the topology may be an XML import of a remote host.
|
||||
* I/O devices detection and the CUDA component must be enabled in the topology.
|
||||
* If not, the locality of the object may still be found using
|
||||
* hwloc_cudart_get_device_cpuset().
|
||||
*
|
||||
* \note The corresponding PCI device object can be obtained by looking
|
||||
* at the OS device parent object (unless PCI devices are filtered out).
|
||||
*
|
||||
* \note This function is identical to hwloc_cuda_get_device_osdev_by_index().
|
||||
*/
|
||||
static __hwloc_inline hwloc_obj_t
|
||||
hwloc_cudart_get_device_osdev_by_index(hwloc_topology_t topology, unsigned idx)
|
||||
{
|
||||
hwloc_obj_t osdev = NULL;
|
||||
while ((osdev = hwloc_get_next_osdev(topology, osdev)) != NULL) {
|
||||
if (HWLOC_OBJ_OSDEV_COPROC == osdev->attr->osdev.type
|
||||
&& osdev->name
|
||||
&& !strncmp("cuda", osdev->name, 4)
|
||||
&& atoi(osdev->name + 4) == (int) idx)
|
||||
return osdev;
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/** @} */
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
} /* extern "C" */
|
||||
#endif
|
||||
|
||||
|
||||
#endif /* HWLOC_CUDART_H */
|
||||
217
macx64/mpi/openmpi/include/hwloc/deprecated.h
Normal file
217
macx64/mpi/openmpi/include/hwloc/deprecated.h
Normal file
@@ -0,0 +1,217 @@
|
||||
/*
|
||||
* Copyright © 2009 CNRS
|
||||
* Copyright © 2009-2021 Inria. All rights reserved.
|
||||
* Copyright © 2009-2012 Université Bordeaux
|
||||
* Copyright © 2009-2010 Cisco Systems, Inc. All rights reserved.
|
||||
* See COPYING in top-level directory.
|
||||
*/
|
||||
|
||||
/**
|
||||
* This file contains the inline code of functions declared in hwloc.h
|
||||
*/
|
||||
|
||||
#ifndef HWLOC_DEPRECATED_H
|
||||
#define HWLOC_DEPRECATED_H
|
||||
|
||||
#ifndef HWLOC_H
|
||||
#error Please include the main hwloc.h instead
|
||||
#endif
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/* backward compat with v2.0 before WHOLE_SYSTEM renaming */
|
||||
#define HWLOC_TOPOLOGY_FLAG_WHOLE_SYSTEM HWLOC_TOPOLOGY_FLAG_INCLUDE_DISALLOWED
|
||||
/* backward compat with v1.11 before System removal */
|
||||
#define HWLOC_OBJ_SYSTEM HWLOC_OBJ_MACHINE
|
||||
/* backward compat with v1.10 before Socket->Package renaming */
|
||||
#define HWLOC_OBJ_SOCKET HWLOC_OBJ_PACKAGE
|
||||
/* backward compat with v1.10 before Node->NUMANode clarification */
|
||||
#define HWLOC_OBJ_NODE HWLOC_OBJ_NUMANODE
|
||||
|
||||
/** \brief Add a distances structure.
|
||||
*
|
||||
* Superseded by hwloc_distances_add_create()+hwloc_distances_add_values()+hwloc_distances_add_commit()
|
||||
* in v2.5.
|
||||
*/
|
||||
HWLOC_DECLSPEC int hwloc_distances_add(hwloc_topology_t topology,
|
||||
unsigned nbobjs, hwloc_obj_t *objs, hwloc_uint64_t *values,
|
||||
unsigned long kind, unsigned long flags) __hwloc_attribute_deprecated;
|
||||
|
||||
/** \brief Insert a misc object by parent.
|
||||
*
|
||||
* Identical to hwloc_topology_insert_misc_object().
|
||||
*/
|
||||
static __hwloc_inline hwloc_obj_t
|
||||
hwloc_topology_insert_misc_object_by_parent(hwloc_topology_t topology, hwloc_obj_t parent, const char *name) __hwloc_attribute_deprecated;
|
||||
static __hwloc_inline hwloc_obj_t
|
||||
hwloc_topology_insert_misc_object_by_parent(hwloc_topology_t topology, hwloc_obj_t parent, const char *name)
|
||||
{
|
||||
return hwloc_topology_insert_misc_object(topology, parent, name);
|
||||
}
|
||||
|
||||
/** \brief Stringify the cpuset containing a set of objects.
|
||||
*
|
||||
* If \p size is 0, \p string may safely be \c NULL.
|
||||
*
|
||||
* \return the number of character that were actually written if not truncating,
|
||||
* or that would have been written (not including the ending \\0).
|
||||
*/
|
||||
static __hwloc_inline int
|
||||
hwloc_obj_cpuset_snprintf(char *str, size_t size, size_t nobj, struct hwloc_obj * const *objs) __hwloc_attribute_deprecated;
|
||||
static __hwloc_inline int
|
||||
hwloc_obj_cpuset_snprintf(char *str, size_t size, size_t nobj, struct hwloc_obj * const *objs)
|
||||
{
|
||||
hwloc_bitmap_t set = hwloc_bitmap_alloc();
|
||||
int res;
|
||||
unsigned i;
|
||||
|
||||
hwloc_bitmap_zero(set);
|
||||
for(i=0; i<nobj; i++)
|
||||
if (objs[i]->cpuset)
|
||||
hwloc_bitmap_or(set, set, objs[i]->cpuset);
|
||||
|
||||
res = hwloc_bitmap_snprintf(str, size, set);
|
||||
hwloc_bitmap_free(set);
|
||||
return res;
|
||||
}
|
||||
|
||||
/** \brief Convert a type string into a type and some attributes.
|
||||
*
|
||||
* Deprecated by hwloc_type_sscanf()
|
||||
*/
|
||||
static __hwloc_inline int
|
||||
hwloc_obj_type_sscanf(const char *string, hwloc_obj_type_t *typep, int *depthattrp, void *typeattrp, size_t typeattrsize) __hwloc_attribute_deprecated;
|
||||
static __hwloc_inline int
|
||||
hwloc_obj_type_sscanf(const char *string, hwloc_obj_type_t *typep, int *depthattrp, void *typeattrp, size_t typeattrsize)
|
||||
{
|
||||
union hwloc_obj_attr_u attr;
|
||||
int err = hwloc_type_sscanf(string, typep, &attr, sizeof(attr));
|
||||
if (err < 0)
|
||||
return err;
|
||||
if (hwloc_obj_type_is_cache(*typep)) {
|
||||
if (depthattrp)
|
||||
*depthattrp = (int) attr.cache.depth;
|
||||
if (typeattrp && typeattrsize >= sizeof(hwloc_obj_cache_type_t))
|
||||
memcpy(typeattrp, &attr.cache.type, sizeof(hwloc_obj_cache_type_t));
|
||||
} else if (*typep == HWLOC_OBJ_GROUP) {
|
||||
if (depthattrp)
|
||||
*depthattrp = (int) attr.group.depth;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/** \brief Set the default memory binding policy of the current
|
||||
* process or thread to prefer the NUMA node(s) specified by physical \p nodeset
|
||||
*/
|
||||
static __hwloc_inline int
|
||||
hwloc_set_membind_nodeset(hwloc_topology_t topology, hwloc_const_nodeset_t nodeset, hwloc_membind_policy_t policy, int flags) __hwloc_attribute_deprecated;
|
||||
static __hwloc_inline int
|
||||
hwloc_set_membind_nodeset(hwloc_topology_t topology, hwloc_const_nodeset_t nodeset, hwloc_membind_policy_t policy, int flags)
|
||||
{
|
||||
return hwloc_set_membind(topology, nodeset, policy, flags | HWLOC_MEMBIND_BYNODESET);
|
||||
}
|
||||
|
||||
/** \brief Query the default memory binding policy and physical locality of the
|
||||
* current process or thread.
|
||||
*/
|
||||
static __hwloc_inline int
|
||||
hwloc_get_membind_nodeset(hwloc_topology_t topology, hwloc_nodeset_t nodeset, hwloc_membind_policy_t * policy, int flags) __hwloc_attribute_deprecated;
|
||||
static __hwloc_inline int
|
||||
hwloc_get_membind_nodeset(hwloc_topology_t topology, hwloc_nodeset_t nodeset, hwloc_membind_policy_t * policy, int flags)
|
||||
{
|
||||
return hwloc_get_membind(topology, nodeset, policy, flags | HWLOC_MEMBIND_BYNODESET);
|
||||
}
|
||||
|
||||
/** \brief Set the default memory binding policy of the specified
|
||||
* process to prefer the NUMA node(s) specified by physical \p nodeset
|
||||
*/
|
||||
static __hwloc_inline int
|
||||
hwloc_set_proc_membind_nodeset(hwloc_topology_t topology, hwloc_pid_t pid, hwloc_const_nodeset_t nodeset, hwloc_membind_policy_t policy, int flags) __hwloc_attribute_deprecated;
|
||||
static __hwloc_inline int
|
||||
hwloc_set_proc_membind_nodeset(hwloc_topology_t topology, hwloc_pid_t pid, hwloc_const_nodeset_t nodeset, hwloc_membind_policy_t policy, int flags)
|
||||
{
|
||||
return hwloc_set_proc_membind(topology, pid, nodeset, policy, flags | HWLOC_MEMBIND_BYNODESET);
|
||||
}
|
||||
|
||||
/** \brief Query the default memory binding policy and physical locality of the
|
||||
* specified process.
|
||||
*/
|
||||
static __hwloc_inline int
|
||||
hwloc_get_proc_membind_nodeset(hwloc_topology_t topology, hwloc_pid_t pid, hwloc_nodeset_t nodeset, hwloc_membind_policy_t * policy, int flags) __hwloc_attribute_deprecated;
|
||||
static __hwloc_inline int
|
||||
hwloc_get_proc_membind_nodeset(hwloc_topology_t topology, hwloc_pid_t pid, hwloc_nodeset_t nodeset, hwloc_membind_policy_t * policy, int flags)
|
||||
{
|
||||
return hwloc_get_proc_membind(topology, pid, nodeset, policy, flags | HWLOC_MEMBIND_BYNODESET);
|
||||
}
|
||||
|
||||
/** \brief Bind the already-allocated memory identified by (addr, len)
|
||||
* to the NUMA node(s) in physical \p nodeset.
|
||||
*/
|
||||
static __hwloc_inline int
|
||||
hwloc_set_area_membind_nodeset(hwloc_topology_t topology, const void *addr, size_t len, hwloc_const_nodeset_t nodeset, hwloc_membind_policy_t policy, int flags) __hwloc_attribute_deprecated;
|
||||
static __hwloc_inline int
|
||||
hwloc_set_area_membind_nodeset(hwloc_topology_t topology, const void *addr, size_t len, hwloc_const_nodeset_t nodeset, hwloc_membind_policy_t policy, int flags)
|
||||
{
|
||||
return hwloc_set_area_membind(topology, addr, len, nodeset, policy, flags | HWLOC_MEMBIND_BYNODESET);
|
||||
}
|
||||
|
||||
/** \brief Query the physical NUMA node(s) and binding policy of the memory
|
||||
* identified by (\p addr, \p len ).
|
||||
*/
|
||||
static __hwloc_inline int
|
||||
hwloc_get_area_membind_nodeset(hwloc_topology_t topology, const void *addr, size_t len, hwloc_nodeset_t nodeset, hwloc_membind_policy_t * policy, int flags) __hwloc_attribute_deprecated;
|
||||
static __hwloc_inline int
|
||||
hwloc_get_area_membind_nodeset(hwloc_topology_t topology, const void *addr, size_t len, hwloc_nodeset_t nodeset, hwloc_membind_policy_t * policy, int flags)
|
||||
{
|
||||
return hwloc_get_area_membind(topology, addr, len, nodeset, policy, flags | HWLOC_MEMBIND_BYNODESET);
|
||||
}
|
||||
|
||||
/** \brief Allocate some memory on the given physical nodeset \p nodeset
|
||||
*/
|
||||
static __hwloc_inline void *
|
||||
hwloc_alloc_membind_nodeset(hwloc_topology_t topology, size_t len, hwloc_const_nodeset_t nodeset, hwloc_membind_policy_t policy, int flags) __hwloc_attribute_malloc __hwloc_attribute_deprecated;
|
||||
static __hwloc_inline void *
|
||||
hwloc_alloc_membind_nodeset(hwloc_topology_t topology, size_t len, hwloc_const_nodeset_t nodeset, hwloc_membind_policy_t policy, int flags)
|
||||
{
|
||||
return hwloc_alloc_membind(topology, len, nodeset, policy, flags | HWLOC_MEMBIND_BYNODESET);
|
||||
}
|
||||
|
||||
/** \brief Allocate some memory on the given nodeset \p nodeset.
|
||||
*/
|
||||
static __hwloc_inline void *
|
||||
hwloc_alloc_membind_policy_nodeset(hwloc_topology_t topology, size_t len, hwloc_const_nodeset_t nodeset, hwloc_membind_policy_t policy, int flags) __hwloc_attribute_malloc __hwloc_attribute_deprecated;
|
||||
static __hwloc_inline void *
|
||||
hwloc_alloc_membind_policy_nodeset(hwloc_topology_t topology, size_t len, hwloc_const_nodeset_t nodeset, hwloc_membind_policy_t policy, int flags)
|
||||
{
|
||||
return hwloc_alloc_membind_policy(topology, len, nodeset, policy, flags | HWLOC_MEMBIND_BYNODESET);
|
||||
}
|
||||
|
||||
/** \brief Convert a CPU set into a NUMA node set and handle non-NUMA cases
|
||||
*/
|
||||
static __hwloc_inline void
|
||||
hwloc_cpuset_to_nodeset_strict(hwloc_topology_t topology, hwloc_const_cpuset_t _cpuset, hwloc_nodeset_t nodeset) __hwloc_attribute_deprecated;
|
||||
static __hwloc_inline void
|
||||
hwloc_cpuset_to_nodeset_strict(hwloc_topology_t topology, hwloc_const_cpuset_t _cpuset, hwloc_nodeset_t nodeset)
|
||||
{
|
||||
hwloc_cpuset_to_nodeset(topology, _cpuset, nodeset);
|
||||
}
|
||||
|
||||
/** \brief Convert a NUMA node set into a CPU set and handle non-NUMA cases
|
||||
*/
|
||||
static __hwloc_inline void
|
||||
hwloc_cpuset_from_nodeset_strict(hwloc_topology_t topology, hwloc_cpuset_t _cpuset, hwloc_const_nodeset_t nodeset) __hwloc_attribute_deprecated;
|
||||
static __hwloc_inline void
|
||||
hwloc_cpuset_from_nodeset_strict(hwloc_topology_t topology, hwloc_cpuset_t _cpuset, hwloc_const_nodeset_t nodeset)
|
||||
{
|
||||
hwloc_cpuset_from_nodeset(topology, _cpuset, nodeset);
|
||||
}
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
} /* extern "C" */
|
||||
#endif
|
||||
|
||||
|
||||
#endif /* HWLOC_DEPRECATED_H */
|
||||
289
macx64/mpi/openmpi/include/hwloc/diff.h
Normal file
289
macx64/mpi/openmpi/include/hwloc/diff.h
Normal file
@@ -0,0 +1,289 @@
|
||||
/*
|
||||
* Copyright © 2013-2020 Inria. All rights reserved.
|
||||
* See COPYING in top-level directory.
|
||||
*/
|
||||
|
||||
/** \file
|
||||
* \brief Topology differences.
|
||||
*/
|
||||
|
||||
#ifndef HWLOC_DIFF_H
|
||||
#define HWLOC_DIFF_H
|
||||
|
||||
#ifndef HWLOC_H
|
||||
#error Please include the main hwloc.h instead
|
||||
#endif
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#elif 0
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
/** \defgroup hwlocality_diff Topology differences
|
||||
*
|
||||
* Applications that manipulate many similar topologies, for instance
|
||||
* one for each node of a homogeneous cluster, may want to compress
|
||||
* topologies to reduce the memory footprint.
|
||||
*
|
||||
* This file offers a way to manipulate the difference between topologies
|
||||
* and export/import it to/from XML.
|
||||
* Compression may therefore be achieved by storing one topology
|
||||
* entirely while the others are only described by their differences
|
||||
* with the former.
|
||||
* The actual topology can be reconstructed when actually needed by
|
||||
* applying the precomputed difference to the reference topology.
|
||||
*
|
||||
* This interface targets very similar nodes.
|
||||
* Only very simple differences between topologies are actually
|
||||
* supported, for instance a change in the memory size, the name
|
||||
* of the object, or some info attribute.
|
||||
* More complex differences such as adding or removing objects cannot
|
||||
* be represented in the difference structures and therefore return
|
||||
* errors.
|
||||
* Differences between object sets or topology-wide allowed sets,
|
||||
* cannot be represented either.
|
||||
*
|
||||
* It means that there is no need to apply the difference when
|
||||
* looking at the tree organization (how many levels, how many
|
||||
* objects per level, what kind of objects, CPU and node sets, etc)
|
||||
* and when binding to objects.
|
||||
* However the difference must be applied when looking at object
|
||||
* attributes such as the name, the memory size or info attributes.
|
||||
*
|
||||
* @{
|
||||
*/
|
||||
|
||||
|
||||
/** \brief Type of one object attribute difference.
|
||||
*/
|
||||
typedef enum hwloc_topology_diff_obj_attr_type_e {
|
||||
/** \brief The object local memory is modified.
|
||||
* The union is a hwloc_topology_diff_obj_attr_u::hwloc_topology_diff_obj_attr_uint64_s
|
||||
* (and the index field is ignored).
|
||||
*/
|
||||
HWLOC_TOPOLOGY_DIFF_OBJ_ATTR_SIZE,
|
||||
|
||||
/** \brief The object name is modified.
|
||||
* The union is a hwloc_topology_diff_obj_attr_u::hwloc_topology_diff_obj_attr_string_s
|
||||
* (and the name field is ignored).
|
||||
*/
|
||||
|
||||
HWLOC_TOPOLOGY_DIFF_OBJ_ATTR_NAME,
|
||||
/** \brief the value of an info attribute is modified.
|
||||
* The union is a hwloc_topology_diff_obj_attr_u::hwloc_topology_diff_obj_attr_string_s.
|
||||
*/
|
||||
HWLOC_TOPOLOGY_DIFF_OBJ_ATTR_INFO
|
||||
} hwloc_topology_diff_obj_attr_type_t;
|
||||
|
||||
/** \brief One object attribute difference.
|
||||
*/
|
||||
union hwloc_topology_diff_obj_attr_u {
|
||||
struct hwloc_topology_diff_obj_attr_generic_s {
|
||||
/* each part of the union must start with these */
|
||||
hwloc_topology_diff_obj_attr_type_t type;
|
||||
} generic;
|
||||
|
||||
/** \brief Integer attribute modification with an optional index. */
|
||||
struct hwloc_topology_diff_obj_attr_uint64_s {
|
||||
/* used for storing integer attributes */
|
||||
hwloc_topology_diff_obj_attr_type_t type;
|
||||
hwloc_uint64_t index; /* not used for SIZE */
|
||||
hwloc_uint64_t oldvalue;
|
||||
hwloc_uint64_t newvalue;
|
||||
} uint64;
|
||||
|
||||
/** \brief String attribute modification with an optional name */
|
||||
struct hwloc_topology_diff_obj_attr_string_s {
|
||||
/* used for storing name and info pairs */
|
||||
hwloc_topology_diff_obj_attr_type_t type;
|
||||
char *name; /* not used for NAME */
|
||||
char *oldvalue;
|
||||
char *newvalue;
|
||||
} string;
|
||||
};
|
||||
|
||||
|
||||
/** \brief Type of one element of a difference list.
|
||||
*/
|
||||
typedef enum hwloc_topology_diff_type_e {
|
||||
/** \brief An object attribute was changed.
|
||||
* The union is a hwloc_topology_diff_u::hwloc_topology_diff_obj_attr_s.
|
||||
*/
|
||||
HWLOC_TOPOLOGY_DIFF_OBJ_ATTR,
|
||||
|
||||
/** \brief The difference is too complex,
|
||||
* it cannot be represented. The difference below
|
||||
* this object has not been checked.
|
||||
* hwloc_topology_diff_build() will return 1.
|
||||
*
|
||||
* The union is a hwloc_topology_diff_u::hwloc_topology_diff_too_complex_s.
|
||||
*/
|
||||
HWLOC_TOPOLOGY_DIFF_TOO_COMPLEX
|
||||
} hwloc_topology_diff_type_t;
|
||||
|
||||
/** \brief One element of a difference list between two topologies.
|
||||
*/
|
||||
typedef union hwloc_topology_diff_u {
|
||||
struct hwloc_topology_diff_generic_s {
|
||||
/* each part of the union must start with these */
|
||||
hwloc_topology_diff_type_t type;
|
||||
union hwloc_topology_diff_u * next; /* pointer to the next element of the list, or NULL */
|
||||
} generic;
|
||||
|
||||
/* A difference in an object attribute. */
|
||||
struct hwloc_topology_diff_obj_attr_s {
|
||||
hwloc_topology_diff_type_t type; /* must be ::HWLOC_TOPOLOGY_DIFF_OBJ_ATTR */
|
||||
union hwloc_topology_diff_u * next;
|
||||
/* List of attribute differences for a single object */
|
||||
int obj_depth;
|
||||
unsigned obj_index;
|
||||
union hwloc_topology_diff_obj_attr_u diff;
|
||||
} obj_attr;
|
||||
|
||||
/* A difference that is too complex. */
|
||||
struct hwloc_topology_diff_too_complex_s {
|
||||
hwloc_topology_diff_type_t type; /* must be ::HWLOC_TOPOLOGY_DIFF_TOO_COMPLEX */
|
||||
union hwloc_topology_diff_u * next;
|
||||
/* Where we had to stop computing the diff in the first topology */
|
||||
int obj_depth;
|
||||
unsigned obj_index;
|
||||
} too_complex;
|
||||
} * hwloc_topology_diff_t;
|
||||
|
||||
|
||||
/** \brief Compute the difference between 2 topologies.
|
||||
*
|
||||
* The difference is stored as a list of ::hwloc_topology_diff_t entries
|
||||
* starting at \p diff.
|
||||
* It is computed by doing a depth-first traversal of both topology trees
|
||||
* simultaneously.
|
||||
*
|
||||
* If the difference between 2 objects is too complex to be represented
|
||||
* (for instance if some objects have different types, or different numbers
|
||||
* of children), a special diff entry of type ::HWLOC_TOPOLOGY_DIFF_TOO_COMPLEX
|
||||
* is queued.
|
||||
* The computation of the diff does not continue below these objects.
|
||||
* So each such diff entry means that the difference between two subtrees
|
||||
* could not be computed.
|
||||
*
|
||||
* \return 0 if the difference can be represented properly.
|
||||
*
|
||||
* \return 0 with \p diff pointing to NULL if there is no difference
|
||||
* between the topologies.
|
||||
*
|
||||
* \return 1 if the difference is too complex (see above). Some entries in
|
||||
* the list will be of type ::HWLOC_TOPOLOGY_DIFF_TOO_COMPLEX.
|
||||
*
|
||||
* \return -1 on any other error.
|
||||
*
|
||||
* \note \p flags is currently not used. It should be 0.
|
||||
*
|
||||
* \note The output diff has to be freed with hwloc_topology_diff_destroy().
|
||||
*
|
||||
* \note The output diff can only be exported to XML or passed to
|
||||
* hwloc_topology_diff_apply() if 0 was returned, i.e. if no entry of type
|
||||
* ::HWLOC_TOPOLOGY_DIFF_TOO_COMPLEX is listed.
|
||||
*
|
||||
* \note The output diff may be modified by removing some entries from
|
||||
* the list. The removed entries should be freed by passing them to
|
||||
* to hwloc_topology_diff_destroy() (possible as another list).
|
||||
*/
|
||||
HWLOC_DECLSPEC int hwloc_topology_diff_build(hwloc_topology_t topology, hwloc_topology_t newtopology, unsigned long flags, hwloc_topology_diff_t *diff);
|
||||
|
||||
/** \brief Flags to be given to hwloc_topology_diff_apply().
|
||||
*/
|
||||
enum hwloc_topology_diff_apply_flags_e {
|
||||
/** \brief Apply topology diff in reverse direction.
|
||||
* \hideinitializer
|
||||
*/
|
||||
HWLOC_TOPOLOGY_DIFF_APPLY_REVERSE = (1UL<<0)
|
||||
};
|
||||
|
||||
/** \brief Apply a topology diff to an existing topology.
|
||||
*
|
||||
* \p flags is an OR'ed set of ::hwloc_topology_diff_apply_flags_e.
|
||||
*
|
||||
* The new topology is modified in place. hwloc_topology_dup()
|
||||
* may be used to duplicate it before patching.
|
||||
*
|
||||
* If the difference cannot be applied entirely, all previous applied
|
||||
* elements are unapplied before returning.
|
||||
*
|
||||
* \return 0 on success.
|
||||
*
|
||||
* \return -N if applying the difference failed while trying
|
||||
* to apply the N-th part of the difference. For instance -1
|
||||
* is returned if the very first difference element could not
|
||||
* be applied.
|
||||
*/
|
||||
HWLOC_DECLSPEC int hwloc_topology_diff_apply(hwloc_topology_t topology, hwloc_topology_diff_t diff, unsigned long flags);
|
||||
|
||||
/** \brief Destroy a list of topology differences.
|
||||
*/
|
||||
HWLOC_DECLSPEC int hwloc_topology_diff_destroy(hwloc_topology_diff_t diff);
|
||||
|
||||
/** \brief Load a list of topology differences from a XML file.
|
||||
*
|
||||
* If not \c NULL, \p refname will be filled with the identifier
|
||||
* string of the reference topology for the difference file,
|
||||
* if any was specified in the XML file.
|
||||
* This identifier is usually the name of the other XML file
|
||||
* that contains the reference topology.
|
||||
*
|
||||
* \note the pointer returned in refname should later be freed
|
||||
* by the caller.
|
||||
*/
|
||||
HWLOC_DECLSPEC int hwloc_topology_diff_load_xml(const char *xmlpath, hwloc_topology_diff_t *diff, char **refname);
|
||||
|
||||
/** \brief Export a list of topology differences to a XML file.
|
||||
*
|
||||
* If not \c NULL, \p refname defines an identifier string
|
||||
* for the reference topology which was used as a base when
|
||||
* computing this difference.
|
||||
* This identifier is usually the name of the other XML file
|
||||
* that contains the reference topology.
|
||||
* This attribute is given back when reading the diff from XML.
|
||||
*/
|
||||
HWLOC_DECLSPEC int hwloc_topology_diff_export_xml(hwloc_topology_diff_t diff, const char *refname, const char *xmlpath);
|
||||
|
||||
/** \brief Load a list of topology differences from a XML buffer.
|
||||
*
|
||||
* If not \c NULL, \p refname will be filled with the identifier
|
||||
* string of the reference topology for the difference file,
|
||||
* if any was specified in the XML file.
|
||||
* This identifier is usually the name of the other XML file
|
||||
* that contains the reference topology.
|
||||
*
|
||||
* \note the pointer returned in refname should later be freed
|
||||
* by the caller.
|
||||
*/
|
||||
HWLOC_DECLSPEC int hwloc_topology_diff_load_xmlbuffer(const char *xmlbuffer, int buflen, hwloc_topology_diff_t *diff, char **refname);
|
||||
|
||||
/** \brief Export a list of topology differences to a XML buffer.
|
||||
*
|
||||
* If not \c NULL, \p refname defines an identifier string
|
||||
* for the reference topology which was used as a base when
|
||||
* computing this difference.
|
||||
* This identifier is usually the name of the other XML file
|
||||
* that contains the reference topology.
|
||||
* This attribute is given back when reading the diff from XML.
|
||||
*
|
||||
* The returned buffer ends with a \0 that is included in the returned
|
||||
* length.
|
||||
*
|
||||
* \note The XML buffer should later be freed with hwloc_free_xmlbuffer().
|
||||
*/
|
||||
HWLOC_DECLSPEC int hwloc_topology_diff_export_xmlbuffer(hwloc_topology_diff_t diff, const char *refname, char **xmlbuffer, int *buflen);
|
||||
|
||||
/** @} */
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
} /* extern "C" */
|
||||
#endif
|
||||
|
||||
|
||||
#endif /* HWLOC_DIFF_H */
|
||||
471
macx64/mpi/openmpi/include/hwloc/distances.h
Normal file
471
macx64/mpi/openmpi/include/hwloc/distances.h
Normal file
@@ -0,0 +1,471 @@
|
||||
/*
|
||||
* Copyright © 2010-2021 Inria. All rights reserved.
|
||||
* See COPYING in top-level directory.
|
||||
*/
|
||||
|
||||
/** \file
|
||||
* \brief Object distances.
|
||||
*/
|
||||
|
||||
#ifndef HWLOC_DISTANCES_H
|
||||
#define HWLOC_DISTANCES_H
|
||||
|
||||
#ifndef HWLOC_H
|
||||
#error Please include the main hwloc.h instead
|
||||
#endif
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#elif 0
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
/** \defgroup hwlocality_distances_get Retrieve distances between objects
|
||||
* @{
|
||||
*/
|
||||
|
||||
/** \brief Matrix of distances between a set of objects.
|
||||
*
|
||||
* This matrix often contains latencies between NUMA nodes
|
||||
* (as reported in the System Locality Distance Information Table (SLIT)
|
||||
* in the ACPI specification), which may or may not be physically accurate.
|
||||
* It corresponds to the latency for accessing the memory of one node
|
||||
* from a core in another node.
|
||||
* The corresponding kind is ::HWLOC_DISTANCES_KIND_FROM_OS | ::HWLOC_DISTANCES_KIND_FROM_USER.
|
||||
* The name of this distances structure is "NUMALatency".
|
||||
* Others distance structures include and "XGMIBandwidth", "XGMIHops"
|
||||
* and "NVLinkBandwidth".
|
||||
*
|
||||
* The matrix may also contain bandwidths between random sets of objects,
|
||||
* possibly provided by the user, as specified in the \p kind attribute.
|
||||
*
|
||||
* Pointers \p objs and \p values should not be replaced, reallocated, freed, etc.
|
||||
* However callers are allowed to modify \p kind as well as the contents
|
||||
* of \p objs and \p values arrays.
|
||||
* For instance, if there is a single NUMA node per Package,
|
||||
* hwloc_get_obj_with_same_locality() may be used to convert between them
|
||||
* and replace NUMA nodes in the \p objs array with the corresponding Packages.
|
||||
* See also hwloc_distances_transform() for applying some transformations
|
||||
* to the structure.
|
||||
*/
|
||||
struct hwloc_distances_s {
|
||||
unsigned nbobjs; /**< \brief Number of objects described by the distance matrix. */
|
||||
hwloc_obj_t *objs; /**< \brief Array of objects described by the distance matrix.
|
||||
* These objects are not in any particular order,
|
||||
* see hwloc_distances_obj_index() and hwloc_distances_obj_pair_values()
|
||||
* for easy ways to find objects in this array and their corresponding values.
|
||||
*/
|
||||
unsigned long kind; /**< \brief OR'ed set of ::hwloc_distances_kind_e. */
|
||||
hwloc_uint64_t *values; /**< \brief Matrix of distances between objects, stored as a one-dimension array.
|
||||
*
|
||||
* Distance from i-th to j-th object is stored in slot i*nbobjs+j.
|
||||
* The meaning of the value depends on the \p kind attribute.
|
||||
*/
|
||||
};
|
||||
|
||||
/** \brief Kinds of distance matrices.
|
||||
*
|
||||
* The \p kind attribute of struct hwloc_distances_s is a OR'ed set
|
||||
* of kinds.
|
||||
*
|
||||
* A kind of format HWLOC_DISTANCES_KIND_FROM_* specifies where the
|
||||
* distance information comes from, if known.
|
||||
*
|
||||
* A kind of format HWLOC_DISTANCES_KIND_MEANS_* specifies whether
|
||||
* values are latencies or bandwidths, if applicable.
|
||||
*/
|
||||
enum hwloc_distances_kind_e {
|
||||
/** \brief These distances were obtained from the operating system or hardware.
|
||||
* \hideinitializer
|
||||
*/
|
||||
HWLOC_DISTANCES_KIND_FROM_OS = (1UL<<0),
|
||||
/** \brief These distances were provided by the user.
|
||||
* \hideinitializer
|
||||
*/
|
||||
HWLOC_DISTANCES_KIND_FROM_USER = (1UL<<1),
|
||||
|
||||
/** \brief Distance values are similar to latencies between objects.
|
||||
* Values are smaller for closer objects, hence minimal on the diagonal
|
||||
* of the matrix (distance between an object and itself).
|
||||
* It could also be the number of network hops between objects, etc.
|
||||
* \hideinitializer
|
||||
*/
|
||||
HWLOC_DISTANCES_KIND_MEANS_LATENCY = (1UL<<2),
|
||||
/** \brief Distance values are similar to bandwidths between objects.
|
||||
* Values are higher for closer objects, hence maximal on the diagonal
|
||||
* of the matrix (distance between an object and itself).
|
||||
* Such values are currently ignored for distance-based grouping.
|
||||
* \hideinitializer
|
||||
*/
|
||||
HWLOC_DISTANCES_KIND_MEANS_BANDWIDTH = (1UL<<3),
|
||||
|
||||
/** \brief This distances structure covers objects of different types.
|
||||
* This may apply to the "NVLinkBandwidth" structure in presence
|
||||
* of a NVSwitch or POWER processor NVLink port.
|
||||
* \hideinitializer
|
||||
*/
|
||||
HWLOC_DISTANCES_KIND_HETEROGENEOUS_TYPES = (1UL<<4)
|
||||
};
|
||||
|
||||
/** \brief Retrieve distance matrices.
|
||||
*
|
||||
* Retrieve distance matrices from the topology into the \p distances array.
|
||||
*
|
||||
* \p flags is currently unused, should be \c 0.
|
||||
*
|
||||
* \p kind serves as a filter. If \c 0, all distance matrices are returned.
|
||||
* If it contains some HWLOC_DISTANCES_KIND_FROM_*, only distance matrices
|
||||
* whose kind matches one of these are returned.
|
||||
* If it contains some HWLOC_DISTANCES_KIND_MEANS_*, only distance matrices
|
||||
* whose kind matches one of these are returned.
|
||||
*
|
||||
* On input, \p nr points to the number of distance matrices that may be stored
|
||||
* in \p distances.
|
||||
* On output, \p nr points to the number of distance matrices that were actually
|
||||
* found, even if some of them couldn't be stored in \p distances.
|
||||
* Distance matrices that couldn't be stored are ignored, but the function still
|
||||
* returns success (\c 0). The caller may find out by comparing the value pointed
|
||||
* by \p nr before and after the function call.
|
||||
*
|
||||
* Each distance matrix returned in the \p distances array should be released
|
||||
* by the caller using hwloc_distances_release().
|
||||
*/
|
||||
HWLOC_DECLSPEC int
|
||||
hwloc_distances_get(hwloc_topology_t topology,
|
||||
unsigned *nr, struct hwloc_distances_s **distances,
|
||||
unsigned long kind, unsigned long flags);
|
||||
|
||||
/** \brief Retrieve distance matrices for object at a specific depth in the topology.
|
||||
*
|
||||
* Identical to hwloc_distances_get() with the additional \p depth filter.
|
||||
*/
|
||||
HWLOC_DECLSPEC int
|
||||
hwloc_distances_get_by_depth(hwloc_topology_t topology, int depth,
|
||||
unsigned *nr, struct hwloc_distances_s **distances,
|
||||
unsigned long kind, unsigned long flags);
|
||||
|
||||
/** \brief Retrieve distance matrices for object of a specific type.
|
||||
*
|
||||
* Identical to hwloc_distances_get() with the additional \p type filter.
|
||||
*/
|
||||
HWLOC_DECLSPEC int
|
||||
hwloc_distances_get_by_type(hwloc_topology_t topology, hwloc_obj_type_t type,
|
||||
unsigned *nr, struct hwloc_distances_s **distances,
|
||||
unsigned long kind, unsigned long flags);
|
||||
|
||||
/** \brief Retrieve a distance matrix with the given name.
|
||||
*
|
||||
* Usually only one distances structure may match a given name.
|
||||
*
|
||||
* The name of the most common structure is "NUMALatency".
|
||||
* Others include "XGMIBandwidth", "XGMIHops" and "NVLinkBandwidth".
|
||||
*/
|
||||
HWLOC_DECLSPEC int
|
||||
hwloc_distances_get_by_name(hwloc_topology_t topology, const char *name,
|
||||
unsigned *nr, struct hwloc_distances_s **distances,
|
||||
unsigned long flags);
|
||||
|
||||
/** \brief Get a description of what a distances structure contains.
|
||||
*
|
||||
* For instance "NUMALatency" for hardware-provided NUMA distances (ACPI SLIT),
|
||||
* or NULL if unknown.
|
||||
*/
|
||||
HWLOC_DECLSPEC const char *
|
||||
hwloc_distances_get_name(hwloc_topology_t topology, struct hwloc_distances_s *distances);
|
||||
|
||||
/** \brief Release a distance matrix structure previously returned by hwloc_distances_get().
|
||||
*
|
||||
* \note This function is not required if the structure is removed with hwloc_distances_release_remove().
|
||||
*/
|
||||
HWLOC_DECLSPEC void
|
||||
hwloc_distances_release(hwloc_topology_t topology, struct hwloc_distances_s *distances);
|
||||
|
||||
/** \brief Transformations of distances structures. */
|
||||
enum hwloc_distances_transform_e {
|
||||
/** \brief Remove \c NULL objects from the distances structure.
|
||||
*
|
||||
* Every object that was replaced with \c NULL in the \p objs array
|
||||
* is removed and the \p values array is updated accordingly.
|
||||
*
|
||||
* At least \c 2 objects must remain, otherwise hwloc_distances_transform()
|
||||
* will return \c -1 with \p errno set to \c EINVAL.
|
||||
*
|
||||
* \p kind will be updated with or without ::HWLOC_DISTANCES_KIND_HETEROGENEOUS_TYPES
|
||||
* according to the remaining objects.
|
||||
*
|
||||
* \hideinitializer
|
||||
*/
|
||||
HWLOC_DISTANCES_TRANSFORM_REMOVE_NULL = 0,
|
||||
|
||||
/** \brief Replace bandwidth values with a number of links.
|
||||
*
|
||||
* Usually all values will be either \c 0 (no link) or \c 1 (one link).
|
||||
* However some matrices could get larger values if some pairs of
|
||||
* peers are connected by different numbers of links.
|
||||
*
|
||||
* Values on the diagonal are set to \c 0.
|
||||
*
|
||||
* This transformation only applies to bandwidth matrices.
|
||||
*
|
||||
* \hideinitializer
|
||||
*/
|
||||
HWLOC_DISTANCES_TRANSFORM_LINKS = 1,
|
||||
|
||||
/** \brief Merge switches with multiple ports into a single object.
|
||||
* This currently only applies to NVSwitches where GPUs seem connected to different
|
||||
* separate switch ports in the NVLinkBandwidth matrix. This transformation will
|
||||
* replace all of them with the same port connected to all GPUs.
|
||||
* Other ports are removed by applying ::HWLOC_DISTANCES_TRANSFORM_REMOVE_NULL internally.
|
||||
* \hideinitializer
|
||||
*/
|
||||
HWLOC_DISTANCES_TRANSFORM_MERGE_SWITCH_PORTS = 2,
|
||||
|
||||
/** \brief Apply a transitive closure to the matrix to connect objects across switches.
|
||||
* This currently only applies to GPUs and NVSwitches in the NVLinkBandwidth matrix.
|
||||
* All pairs of GPUs will be reported as directly connected.
|
||||
* \hideinitializer
|
||||
*/
|
||||
HWLOC_DISTANCES_TRANSFORM_TRANSITIVE_CLOSURE = 3
|
||||
};
|
||||
|
||||
/** \brief Apply a transformation to a distances structure.
|
||||
*
|
||||
* Modify a distances structure that was previously obtained with
|
||||
* hwloc_distances_get() or one of its variants.
|
||||
*
|
||||
* This modifies the local copy of the distances structures but does
|
||||
* not modify the distances information stored inside the topology
|
||||
* (retrieved by another call to hwloc_distances_get() or exported to XML).
|
||||
* To do so, one should add a new distances structure with same
|
||||
* name, kind, objects and values (see \ref hwlocality_distances_add)
|
||||
* and then remove this old one with hwloc_distances_release_remove().
|
||||
*
|
||||
* \p transform must be one of the transformations listed
|
||||
* in ::hwloc_distances_transform_e.
|
||||
*
|
||||
* These transformations may modify the contents of the \p objs or \p values arrays.
|
||||
*
|
||||
* \p transform_attr must be \c NULL for now.
|
||||
*
|
||||
* \p flags must be \c 0 for now.
|
||||
*
|
||||
* \note Objects in distances array \p objs may be directly modified
|
||||
* in place without using hwloc_distances_transform().
|
||||
* One may use hwloc_get_obj_with_same_locality() to easily convert
|
||||
* between similar objects of different types.
|
||||
*/
|
||||
HWLOC_DECLSPEC int hwloc_distances_transform(hwloc_topology_t topology, struct hwloc_distances_s *distances,
|
||||
enum hwloc_distances_transform_e transform,
|
||||
void *transform_attr,
|
||||
unsigned long flags);
|
||||
|
||||
/** @} */
|
||||
|
||||
|
||||
|
||||
/** \defgroup hwlocality_distances_consult Helpers for consulting distance matrices
|
||||
* @{
|
||||
*/
|
||||
|
||||
/** \brief Find the index of an object in a distances structure.
|
||||
*
|
||||
* \return -1 if object \p obj is not involved in structure \p distances.
|
||||
*/
|
||||
static __hwloc_inline int
|
||||
hwloc_distances_obj_index(struct hwloc_distances_s *distances, hwloc_obj_t obj)
|
||||
{
|
||||
unsigned i;
|
||||
for(i=0; i<distances->nbobjs; i++)
|
||||
if (distances->objs[i] == obj)
|
||||
return (int)i;
|
||||
return -1;
|
||||
}
|
||||
|
||||
/** \brief Find the values between two objects in a distance matrices.
|
||||
*
|
||||
* The distance from \p obj1 to \p obj2 is stored in the value pointed by
|
||||
* \p value1to2 and reciprocally.
|
||||
*
|
||||
* \return -1 if object \p obj1 or \p obj2 is not involved in structure \p distances.
|
||||
*/
|
||||
static __hwloc_inline int
|
||||
hwloc_distances_obj_pair_values(struct hwloc_distances_s *distances,
|
||||
hwloc_obj_t obj1, hwloc_obj_t obj2,
|
||||
hwloc_uint64_t *value1to2, hwloc_uint64_t *value2to1)
|
||||
{
|
||||
int i1 = hwloc_distances_obj_index(distances, obj1);
|
||||
int i2 = hwloc_distances_obj_index(distances, obj2);
|
||||
if (i1 < 0 || i2 < 0)
|
||||
return -1;
|
||||
*value1to2 = distances->values[i1 * distances->nbobjs + i2];
|
||||
*value2to1 = distances->values[i2 * distances->nbobjs + i1];
|
||||
return 0;
|
||||
}
|
||||
|
||||
/** @} */
|
||||
|
||||
|
||||
|
||||
/** \defgroup hwlocality_distances_add Add distances between objects
|
||||
*
|
||||
* The usual way to add distances is:
|
||||
* \code
|
||||
* hwloc_distances_add_handle_t handle;
|
||||
* int err = -1;
|
||||
* handle = hwloc_distances_add_create(topology, "name", kind, 0);
|
||||
* if (handle) {
|
||||
* err = hwloc_distances_add_values(topology, handle, nbobjs, objs, values, 0);
|
||||
* if (!err)
|
||||
* err = hwloc_distances_add_commit(topology, handle, flags);
|
||||
* }
|
||||
* \endcode
|
||||
* If \p err is \c 0 at the end, then addition was successful.
|
||||
*
|
||||
* @{
|
||||
*/
|
||||
|
||||
/** \brief Handle to a new distances structure during its addition to the topology. */
|
||||
typedef void * hwloc_distances_add_handle_t;
|
||||
|
||||
/** \brief Create a new empty distances structure.
|
||||
*
|
||||
* Create an empty distances structure
|
||||
* to be filled with hwloc_distances_add_values()
|
||||
* and then committed with hwloc_distances_add_commit().
|
||||
*
|
||||
* Parameter \p name is optional, it may be \c NULL.
|
||||
* Otherwise, it will be copied internally and may later be freed by the caller.
|
||||
*
|
||||
* \p kind specifies the kind of distance as a OR'ed set of ::hwloc_distances_kind_e.
|
||||
* Kind ::HWLOC_DISTANCES_KIND_HETEROGENEOUS_TYPES will be automatically set
|
||||
* according to objects having different types in hwloc_distances_add_values().
|
||||
*
|
||||
* \p flags must be \c 0 for now.
|
||||
*
|
||||
* \return A hwloc_distances_add_handle_t that should then be passed
|
||||
* to hwloc_distances_add_values() and hwloc_distances_add_commit().
|
||||
*
|
||||
* \return \c NULL on error.
|
||||
*/
|
||||
HWLOC_DECLSPEC hwloc_distances_add_handle_t
|
||||
hwloc_distances_add_create(hwloc_topology_t topology,
|
||||
const char *name, unsigned long kind,
|
||||
unsigned long flags);
|
||||
|
||||
/** \brief Specify the objects and values in a new empty distances structure.
|
||||
*
|
||||
* Specify the objects and values for a new distances structure
|
||||
* that was returned as a handle by hwloc_distances_add_create().
|
||||
* The structure must then be committed with hwloc_distances_add_commit().
|
||||
*
|
||||
* The number of objects is \p nbobjs and the array of objects is \p objs.
|
||||
* Distance values are stored as a one-dimension array in \p values.
|
||||
* The distance from object i to object j is in slot i*nbobjs+j.
|
||||
*
|
||||
* \p nbobjs must be at least 2.
|
||||
*
|
||||
* Arrays \p objs and \p values will be copied internally,
|
||||
* they may later be freed by the caller.
|
||||
*
|
||||
* On error, the temporary distances structure and its content are destroyed.
|
||||
*
|
||||
* \p flags must be \c 0 for now.
|
||||
*
|
||||
* \return \c 0 on success.
|
||||
* \return \c -1 on error.
|
||||
*/
|
||||
HWLOC_DECLSPEC int hwloc_distances_add_values(hwloc_topology_t topology,
|
||||
hwloc_distances_add_handle_t handle,
|
||||
unsigned nbobjs, hwloc_obj_t *objs,
|
||||
hwloc_uint64_t *values,
|
||||
unsigned long flags);
|
||||
|
||||
/** \brief Flags for adding a new distances to a topology. */
|
||||
enum hwloc_distances_add_flag_e {
|
||||
/** \brief Try to group objects based on the newly provided distance information.
|
||||
* This is ignored for distances between objects of different types.
|
||||
* \hideinitializer
|
||||
*/
|
||||
HWLOC_DISTANCES_ADD_FLAG_GROUP = (1UL<<0),
|
||||
/** \brief If grouping, consider the distance values as inaccurate and relax the
|
||||
* comparisons during the grouping algorithms. The actual accuracy may be modified
|
||||
* through the HWLOC_GROUPING_ACCURACY environment variable (see \ref envvar).
|
||||
* \hideinitializer
|
||||
*/
|
||||
HWLOC_DISTANCES_ADD_FLAG_GROUP_INACCURATE = (1UL<<1)
|
||||
};
|
||||
|
||||
/** \brief Commit a new distances structure.
|
||||
*
|
||||
* This function finalizes the distances structure and inserts in it the topology.
|
||||
*
|
||||
* Parameter \p handle was previously returned by hwloc_distances_add_create().
|
||||
* Then objects and values were specified with hwloc_distances_add_values().
|
||||
*
|
||||
* \p flags configures the behavior of the function using an optional OR'ed set of
|
||||
* ::hwloc_distances_add_flag_e.
|
||||
* It may be used to request the grouping of existing objects based on distances.
|
||||
*
|
||||
* On error, the temporary distances structure and its content are destroyed.
|
||||
*
|
||||
* \return \c 0 on success.
|
||||
* \return \c -1 on error.
|
||||
*/
|
||||
HWLOC_DECLSPEC int hwloc_distances_add_commit(hwloc_topology_t topology,
|
||||
hwloc_distances_add_handle_t handle,
|
||||
unsigned long flags);
|
||||
|
||||
/** @} */
|
||||
|
||||
|
||||
|
||||
/** \defgroup hwlocality_distances_remove Remove distances between objects
|
||||
* @{
|
||||
*/
|
||||
|
||||
/** \brief Remove all distance matrices from a topology.
|
||||
*
|
||||
* Remove all distance matrices, either provided by the user or
|
||||
* gathered through the OS.
|
||||
*
|
||||
* If these distances were used to group objects, these additional
|
||||
* Group objects are not removed from the topology.
|
||||
*/
|
||||
HWLOC_DECLSPEC int hwloc_distances_remove(hwloc_topology_t topology);
|
||||
|
||||
/** \brief Remove distance matrices for objects at a specific depth in the topology.
|
||||
*
|
||||
* Identical to hwloc_distances_remove() but only applies to one level of the topology.
|
||||
*/
|
||||
HWLOC_DECLSPEC int hwloc_distances_remove_by_depth(hwloc_topology_t topology, int depth);
|
||||
|
||||
/** \brief Remove distance matrices for objects of a specific type in the topology.
|
||||
*
|
||||
* Identical to hwloc_distances_remove() but only applies to one level of the topology.
|
||||
*/
|
||||
static __hwloc_inline int
|
||||
hwloc_distances_remove_by_type(hwloc_topology_t topology, hwloc_obj_type_t type)
|
||||
{
|
||||
int depth = hwloc_get_type_depth(topology, type);
|
||||
if (depth == HWLOC_TYPE_DEPTH_UNKNOWN || depth == HWLOC_TYPE_DEPTH_MULTIPLE)
|
||||
return 0;
|
||||
return hwloc_distances_remove_by_depth(topology, depth);
|
||||
}
|
||||
|
||||
/** \brief Release and remove the given distance matrice from the topology.
|
||||
*
|
||||
* This function includes a call to hwloc_distances_release().
|
||||
*/
|
||||
HWLOC_DECLSPEC int hwloc_distances_release_remove(hwloc_topology_t topology, struct hwloc_distances_s *distances);
|
||||
|
||||
/** @} */
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
} /* extern "C" */
|
||||
#endif
|
||||
|
||||
|
||||
#endif /* HWLOC_DISTANCES_H */
|
||||
278
macx64/mpi/openmpi/include/hwloc/export.h
Normal file
278
macx64/mpi/openmpi/include/hwloc/export.h
Normal file
@@ -0,0 +1,278 @@
|
||||
/*
|
||||
* Copyright © 2009-2018 Inria. All rights reserved.
|
||||
* Copyright © 2009-2012 Université Bordeaux
|
||||
* Copyright © 2009-2011 Cisco Systems, Inc. All rights reserved.
|
||||
* See COPYING in top-level directory.
|
||||
*/
|
||||
|
||||
/** \file
|
||||
* \brief Exporting Topologies to XML or to Synthetic strings.
|
||||
*/
|
||||
|
||||
#ifndef HWLOC_EXPORT_H
|
||||
#define HWLOC_EXPORT_H
|
||||
|
||||
#ifndef HWLOC_H
|
||||
#error Please include the main hwloc.h instead
|
||||
#endif
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#elif 0
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
/** \defgroup hwlocality_xmlexport Exporting Topologies to XML
|
||||
* @{
|
||||
*/
|
||||
|
||||
/** \brief Flags for exporting XML topologies.
|
||||
*
|
||||
* Flags to be given as a OR'ed set to hwloc_topology_export_xml().
|
||||
*/
|
||||
enum hwloc_topology_export_xml_flags_e {
|
||||
/** \brief Export XML that is loadable by hwloc v1.x.
|
||||
* However, the export may miss some details about the topology.
|
||||
* \hideinitializer
|
||||
*/
|
||||
HWLOC_TOPOLOGY_EXPORT_XML_FLAG_V1 = (1UL<<0)
|
||||
};
|
||||
|
||||
/** \brief Export the topology into an XML file.
|
||||
*
|
||||
* This file may be loaded later through hwloc_topology_set_xml().
|
||||
*
|
||||
* By default, the latest export format is used, which means older hwloc
|
||||
* releases (e.g. v1.x) will not be able to import it.
|
||||
* Exporting to v1.x specific XML format is possible using flag
|
||||
* ::HWLOC_TOPOLOGY_EXPORT_XML_FLAG_V1 but it may miss some details
|
||||
* about the topology.
|
||||
* If there is any chance that the exported file may ever be imported
|
||||
* back by a process using hwloc 1.x, one should consider detecting
|
||||
* it at runtime and using the corresponding export format.
|
||||
*
|
||||
* \p flags is a OR'ed set of ::hwloc_topology_export_xml_flags_e.
|
||||
*
|
||||
* \return -1 if a failure occured.
|
||||
*
|
||||
* \note See also hwloc_topology_set_userdata_export_callback()
|
||||
* for exporting application-specific object userdata.
|
||||
*
|
||||
* \note The topology-specific userdata pointer is ignored when exporting to XML.
|
||||
*
|
||||
* \note Only printable characters may be exported to XML string attributes.
|
||||
* Any other character, especially any non-ASCII character, will be silently
|
||||
* dropped.
|
||||
*
|
||||
* \note If \p name is "-", the XML output is sent to the standard output.
|
||||
*/
|
||||
HWLOC_DECLSPEC int hwloc_topology_export_xml(hwloc_topology_t topology, const char *xmlpath, unsigned long flags);
|
||||
|
||||
/** \brief Export the topology into a newly-allocated XML memory buffer.
|
||||
*
|
||||
* \p xmlbuffer is allocated by the callee and should be freed with
|
||||
* hwloc_free_xmlbuffer() later in the caller.
|
||||
*
|
||||
* This memory buffer may be loaded later through hwloc_topology_set_xmlbuffer().
|
||||
*
|
||||
* By default, the latest export format is used, which means older hwloc
|
||||
* releases (e.g. v1.x) will not be able to import it.
|
||||
* Exporting to v1.x specific XML format is possible using flag
|
||||
* ::HWLOC_TOPOLOGY_EXPORT_XML_FLAG_V1 but it may miss some details
|
||||
* about the topology.
|
||||
* If there is any chance that the exported buffer may ever be imported
|
||||
* back by a process using hwloc 1.x, one should consider detecting
|
||||
* it at runtime and using the corresponding export format.
|
||||
*
|
||||
* The returned buffer ends with a \0 that is included in the returned
|
||||
* length.
|
||||
*
|
||||
* \p flags is a OR'ed set of ::hwloc_topology_export_xml_flags_e.
|
||||
*
|
||||
* \return -1 if a failure occured.
|
||||
*
|
||||
* \note See also hwloc_topology_set_userdata_export_callback()
|
||||
* for exporting application-specific object userdata.
|
||||
*
|
||||
* \note The topology-specific userdata pointer is ignored when exporting to XML.
|
||||
*
|
||||
* \note Only printable characters may be exported to XML string attributes.
|
||||
* Any other character, especially any non-ASCII character, will be silently
|
||||
* dropped.
|
||||
*/
|
||||
HWLOC_DECLSPEC int hwloc_topology_export_xmlbuffer(hwloc_topology_t topology, char **xmlbuffer, int *buflen, unsigned long flags);
|
||||
|
||||
/** \brief Free a buffer allocated by hwloc_topology_export_xmlbuffer() */
|
||||
HWLOC_DECLSPEC void hwloc_free_xmlbuffer(hwloc_topology_t topology, char *xmlbuffer);
|
||||
|
||||
/** \brief Set the application-specific callback for exporting object userdata
|
||||
*
|
||||
* The object userdata pointer is not exported to XML by default because hwloc
|
||||
* does not know what it contains.
|
||||
*
|
||||
* This function lets applications set \p export_cb to a callback function
|
||||
* that converts this opaque userdata into an exportable string.
|
||||
*
|
||||
* \p export_cb is invoked during XML export for each object whose
|
||||
* \p userdata pointer is not \c NULL.
|
||||
* The callback should use hwloc_export_obj_userdata() or
|
||||
* hwloc_export_obj_userdata_base64() to actually export
|
||||
* something to XML (possibly multiple times per object).
|
||||
*
|
||||
* \p export_cb may be set to \c NULL if userdata should not be exported to XML.
|
||||
*
|
||||
* \note The topology-specific userdata pointer is ignored when exporting to XML.
|
||||
*/
|
||||
HWLOC_DECLSPEC void hwloc_topology_set_userdata_export_callback(hwloc_topology_t topology,
|
||||
void (*export_cb)(void *reserved, hwloc_topology_t topology, hwloc_obj_t obj));
|
||||
|
||||
/** \brief Export some object userdata to XML
|
||||
*
|
||||
* This function may only be called from within the export() callback passed
|
||||
* to hwloc_topology_set_userdata_export_callback().
|
||||
* It may be invoked one of multiple times to export some userdata to XML.
|
||||
* The \p buffer content of length \p length is stored with optional name
|
||||
* \p name.
|
||||
*
|
||||
* When importing this XML file, the import() callback (if set) will be
|
||||
* called exactly as many times as hwloc_export_obj_userdata() was called
|
||||
* during export(). It will receive the corresponding \p name, \p buffer
|
||||
* and \p length arguments.
|
||||
*
|
||||
* \p reserved, \p topology and \p obj must be the first three parameters
|
||||
* that were given to the export callback.
|
||||
*
|
||||
* Only printable characters may be exported to XML string attributes.
|
||||
* If a non-printable character is passed in \p name or \p buffer,
|
||||
* the function returns -1 with errno set to EINVAL.
|
||||
*
|
||||
* If exporting binary data, the application should first encode into
|
||||
* printable characters only (or use hwloc_export_obj_userdata_base64()).
|
||||
* It should also take care of portability issues if the export may
|
||||
* be reimported on a different architecture.
|
||||
*/
|
||||
HWLOC_DECLSPEC int hwloc_export_obj_userdata(void *reserved, hwloc_topology_t topology, hwloc_obj_t obj, const char *name, const void *buffer, size_t length);
|
||||
|
||||
/** \brief Encode and export some object userdata to XML
|
||||
*
|
||||
* This function is similar to hwloc_export_obj_userdata() but it encodes
|
||||
* the input buffer into printable characters before exporting.
|
||||
* On import, decoding is automatically performed before the data is given
|
||||
* to the import() callback if any.
|
||||
*
|
||||
* This function may only be called from within the export() callback passed
|
||||
* to hwloc_topology_set_userdata_export_callback().
|
||||
*
|
||||
* The function does not take care of portability issues if the export
|
||||
* may be reimported on a different architecture.
|
||||
*/
|
||||
HWLOC_DECLSPEC int hwloc_export_obj_userdata_base64(void *reserved, hwloc_topology_t topology, hwloc_obj_t obj, const char *name, const void *buffer, size_t length);
|
||||
|
||||
/** \brief Set the application-specific callback for importing userdata
|
||||
*
|
||||
* On XML import, userdata is ignored by default because hwloc does not know
|
||||
* how to store it in memory.
|
||||
*
|
||||
* This function lets applications set \p import_cb to a callback function
|
||||
* that will get the XML-stored userdata and store it in the object as expected
|
||||
* by the application.
|
||||
*
|
||||
* \p import_cb is called during hwloc_topology_load() as many times as
|
||||
* hwloc_export_obj_userdata() was called during export. The topology
|
||||
* is not entirely setup yet. Object attributes are ready to consult,
|
||||
* but links between objects are not.
|
||||
*
|
||||
* \p import_cb may be \c NULL if userdata should be ignored during import.
|
||||
*
|
||||
* \note \p buffer contains \p length characters followed by a null byte ('\0').
|
||||
*
|
||||
* \note This function should be called before hwloc_topology_load().
|
||||
*
|
||||
* \note The topology-specific userdata pointer is ignored when importing from XML.
|
||||
*/
|
||||
HWLOC_DECLSPEC void hwloc_topology_set_userdata_import_callback(hwloc_topology_t topology,
|
||||
void (*import_cb)(hwloc_topology_t topology, hwloc_obj_t obj, const char *name, const void *buffer, size_t length));
|
||||
|
||||
/** @} */
|
||||
|
||||
|
||||
/** \defgroup hwlocality_syntheticexport Exporting Topologies to Synthetic
|
||||
* @{
|
||||
*/
|
||||
|
||||
/** \brief Flags for exporting synthetic topologies.
|
||||
*
|
||||
* Flags to be given as a OR'ed set to hwloc_topology_export_synthetic().
|
||||
*/
|
||||
enum hwloc_topology_export_synthetic_flags_e {
|
||||
/** \brief Export extended types such as L2dcache as basic types such as Cache.
|
||||
*
|
||||
* This is required if loading the synthetic description with hwloc < 1.9.
|
||||
* \hideinitializer
|
||||
*/
|
||||
HWLOC_TOPOLOGY_EXPORT_SYNTHETIC_FLAG_NO_EXTENDED_TYPES = (1UL<<0),
|
||||
|
||||
/** \brief Do not export level attributes.
|
||||
*
|
||||
* Ignore level attributes such as memory/cache sizes or PU indexes.
|
||||
* This is required if loading the synthetic description with hwloc < 1.10.
|
||||
* \hideinitializer
|
||||
*/
|
||||
HWLOC_TOPOLOGY_EXPORT_SYNTHETIC_FLAG_NO_ATTRS = (1UL<<1),
|
||||
|
||||
/** \brief Export the memory hierarchy as expected in hwloc 1.x.
|
||||
*
|
||||
* Instead of attaching memory children to levels, export single NUMA node child
|
||||
* as normal intermediate levels, when possible.
|
||||
* This is required if loading the synthetic description with hwloc 1.x.
|
||||
* However this may fail if some objects have multiple local NUMA nodes.
|
||||
* \hideinitializer
|
||||
*/
|
||||
HWLOC_TOPOLOGY_EXPORT_SYNTHETIC_FLAG_V1 = (1UL<<2),
|
||||
|
||||
/** \brief Do not export memory information.
|
||||
*
|
||||
* Only export the actual hierarchy of normal CPU-side objects and ignore
|
||||
* where memory is attached.
|
||||
* This is useful for when the hierarchy of CPUs is what really matters,
|
||||
* but it behaves as if there was a single machine-wide NUMA node.
|
||||
* \hideinitializer
|
||||
*/
|
||||
HWLOC_TOPOLOGY_EXPORT_SYNTHETIC_FLAG_IGNORE_MEMORY = (1UL<<3)
|
||||
};
|
||||
|
||||
/** \brief Export the topology as a synthetic string.
|
||||
*
|
||||
* At most \p buflen characters will be written in \p buffer,
|
||||
* including the terminating \0.
|
||||
*
|
||||
* This exported string may be given back to hwloc_topology_set_synthetic().
|
||||
*
|
||||
* \p flags is a OR'ed set of ::hwloc_topology_export_synthetic_flags_e.
|
||||
*
|
||||
* \return The number of characters that were written,
|
||||
* not including the terminating \0.
|
||||
*
|
||||
* \return -1 if the topology could not be exported,
|
||||
* for instance if it is not symmetric.
|
||||
*
|
||||
* \note I/O and Misc children are ignored, the synthetic string only
|
||||
* describes normal children.
|
||||
*
|
||||
* \note A 1024-byte buffer should be large enough for exporting
|
||||
* topologies in the vast majority of cases.
|
||||
*/
|
||||
HWLOC_DECLSPEC int hwloc_topology_export_synthetic(hwloc_topology_t topology, char *buffer, size_t buflen, unsigned long flags);
|
||||
|
||||
/** @} */
|
||||
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
} /* extern "C" */
|
||||
#endif
|
||||
|
||||
|
||||
#endif /* HWLOC_EXPORT_H */
|
||||
136
macx64/mpi/openmpi/include/hwloc/gl.h
Normal file
136
macx64/mpi/openmpi/include/hwloc/gl.h
Normal file
@@ -0,0 +1,136 @@
|
||||
/*
|
||||
* Copyright © 2012 Blue Brain Project, EPFL. All rights reserved.
|
||||
* Copyright © 2012-2021 Inria. All rights reserved.
|
||||
* See COPYING in top-level directory.
|
||||
*/
|
||||
|
||||
/** \file
|
||||
* \brief Macros to help interaction between hwloc and OpenGL displays.
|
||||
*
|
||||
* Applications that use both hwloc and OpenGL may want to include
|
||||
* this file so as to get topology information for OpenGL displays.
|
||||
*/
|
||||
|
||||
#ifndef HWLOC_GL_H
|
||||
#define HWLOC_GL_H
|
||||
|
||||
#include "hwloc.h"
|
||||
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
|
||||
/** \defgroup hwlocality_gl Interoperability with OpenGL displays
|
||||
*
|
||||
* This interface offers ways to retrieve topology information about
|
||||
* OpenGL displays.
|
||||
*
|
||||
* Only the NVIDIA display locality information is currently available,
|
||||
* using the NV-CONTROL X11 extension and the NVCtrl library.
|
||||
*
|
||||
* @{
|
||||
*/
|
||||
|
||||
/** \brief Get the hwloc OS device object corresponding to the
|
||||
* OpenGL display given by port and device index.
|
||||
*
|
||||
* \return The hwloc OS device object describing the OpenGL display
|
||||
* whose port (server) is \p port and device (screen) is \p device.
|
||||
* \return \c NULL if none could be found.
|
||||
*
|
||||
* The topology \p topology does not necessarily have to match the current
|
||||
* machine. For instance the topology may be an XML import of a remote host.
|
||||
* I/O devices detection and the GL component must be enabled in the topology.
|
||||
*
|
||||
* \note The corresponding PCI device object can be obtained by looking
|
||||
* at the OS device parent object (unless PCI devices are filtered out).
|
||||
*/
|
||||
static __hwloc_inline hwloc_obj_t
|
||||
hwloc_gl_get_display_osdev_by_port_device(hwloc_topology_t topology,
|
||||
unsigned port, unsigned device)
|
||||
{
|
||||
unsigned x = (unsigned) -1, y = (unsigned) -1;
|
||||
hwloc_obj_t osdev = NULL;
|
||||
while ((osdev = hwloc_get_next_osdev(topology, osdev)) != NULL) {
|
||||
if (HWLOC_OBJ_OSDEV_GPU == osdev->attr->osdev.type
|
||||
&& osdev->name
|
||||
&& sscanf(osdev->name, ":%u.%u", &x, &y) == 2
|
||||
&& port == x && device == y)
|
||||
return osdev;
|
||||
}
|
||||
errno = EINVAL;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/** \brief Get the hwloc OS device object corresponding to the
|
||||
* OpenGL display given by name.
|
||||
*
|
||||
* \return The hwloc OS device object describing the OpenGL display
|
||||
* whose name is \p name, built as ":port.device" such as ":0.0" .
|
||||
* \return \c NULL if none could be found.
|
||||
*
|
||||
* The topology \p topology does not necessarily have to match the current
|
||||
* machine. For instance the topology may be an XML import of a remote host.
|
||||
* I/O devices detection and the GL component must be enabled in the topology.
|
||||
*
|
||||
* \note The corresponding PCI device object can be obtained by looking
|
||||
* at the OS device parent object (unless PCI devices are filtered out).
|
||||
*/
|
||||
static __hwloc_inline hwloc_obj_t
|
||||
hwloc_gl_get_display_osdev_by_name(hwloc_topology_t topology,
|
||||
const char *name)
|
||||
{
|
||||
hwloc_obj_t osdev = NULL;
|
||||
while ((osdev = hwloc_get_next_osdev(topology, osdev)) != NULL) {
|
||||
if (HWLOC_OBJ_OSDEV_GPU == osdev->attr->osdev.type
|
||||
&& osdev->name
|
||||
&& !strcmp(name, osdev->name))
|
||||
return osdev;
|
||||
}
|
||||
errno = EINVAL;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/** \brief Get the OpenGL display port and device corresponding
|
||||
* to the given hwloc OS object.
|
||||
*
|
||||
* Retrieves the OpenGL display port (server) in \p port and device (screen)
|
||||
* in \p screen that correspond to the given hwloc OS device object.
|
||||
*
|
||||
* \return \c -1 if none could be found.
|
||||
*
|
||||
* The topology \p topology does not necessarily have to match the current
|
||||
* machine. For instance the topology may be an XML import of a remote host.
|
||||
* I/O devices detection and the GL component must be enabled in the topology.
|
||||
*/
|
||||
static __hwloc_inline int
|
||||
hwloc_gl_get_display_by_osdev(hwloc_topology_t topology __hwloc_attribute_unused,
|
||||
hwloc_obj_t osdev,
|
||||
unsigned *port, unsigned *device)
|
||||
{
|
||||
unsigned x = -1, y = -1;
|
||||
if (HWLOC_OBJ_OSDEV_GPU == osdev->attr->osdev.type
|
||||
&& sscanf(osdev->name, ":%u.%u", &x, &y) == 2) {
|
||||
*port = x;
|
||||
*device = y;
|
||||
return 0;
|
||||
}
|
||||
errno = EINVAL;
|
||||
return -1;
|
||||
}
|
||||
|
||||
/** @} */
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
} /* extern "C" */
|
||||
#endif
|
||||
|
||||
|
||||
#endif /* HWLOC_GL_H */
|
||||
|
||||
1231
macx64/mpi/openmpi/include/hwloc/helper.h
Normal file
1231
macx64/mpi/openmpi/include/hwloc/helper.h
Normal file
File diff suppressed because it is too large
Load Diff
146
macx64/mpi/openmpi/include/hwloc/inlines.h
Normal file
146
macx64/mpi/openmpi/include/hwloc/inlines.h
Normal file
@@ -0,0 +1,146 @@
|
||||
/*
|
||||
* Copyright © 2009 CNRS
|
||||
* Copyright © 2009-2018 Inria. All rights reserved.
|
||||
* Copyright © 2009-2012 Université Bordeaux
|
||||
* Copyright © 2009-2010 Cisco Systems, Inc. All rights reserved.
|
||||
* See COPYING in top-level directory.
|
||||
*/
|
||||
|
||||
/**
|
||||
* This file contains the inline code of functions declared in hwloc.h
|
||||
*/
|
||||
|
||||
#ifndef HWLOC_INLINES_H
|
||||
#define HWLOC_INLINES_H
|
||||
|
||||
#ifndef HWLOC_H
|
||||
#error Please include the main hwloc.h instead
|
||||
#endif
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <errno.h>
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
static __hwloc_inline int
|
||||
hwloc_get_type_or_below_depth (hwloc_topology_t topology, hwloc_obj_type_t type)
|
||||
{
|
||||
int depth = hwloc_get_type_depth(topology, type);
|
||||
|
||||
if (depth != HWLOC_TYPE_DEPTH_UNKNOWN)
|
||||
return depth;
|
||||
|
||||
/* find the highest existing level with type order >= */
|
||||
for(depth = hwloc_get_type_depth(topology, HWLOC_OBJ_PU); ; depth--)
|
||||
if (hwloc_compare_types(hwloc_get_depth_type(topology, depth), type) < 0)
|
||||
return depth+1;
|
||||
|
||||
/* Shouldn't ever happen, as there is always a Machine level with lower order and known depth. */
|
||||
/* abort(); */
|
||||
}
|
||||
|
||||
static __hwloc_inline int
|
||||
hwloc_get_type_or_above_depth (hwloc_topology_t topology, hwloc_obj_type_t type)
|
||||
{
|
||||
int depth = hwloc_get_type_depth(topology, type);
|
||||
|
||||
if (depth != HWLOC_TYPE_DEPTH_UNKNOWN)
|
||||
return depth;
|
||||
|
||||
/* find the lowest existing level with type order <= */
|
||||
for(depth = 0; ; depth++)
|
||||
if (hwloc_compare_types(hwloc_get_depth_type(topology, depth), type) > 0)
|
||||
return depth-1;
|
||||
|
||||
/* Shouldn't ever happen, as there is always a PU level with higher order and known depth. */
|
||||
/* abort(); */
|
||||
}
|
||||
|
||||
static __hwloc_inline int
|
||||
hwloc_get_nbobjs_by_type (hwloc_topology_t topology, hwloc_obj_type_t type)
|
||||
{
|
||||
int depth = hwloc_get_type_depth(topology, type);
|
||||
if (depth == HWLOC_TYPE_DEPTH_UNKNOWN)
|
||||
return 0;
|
||||
if (depth == HWLOC_TYPE_DEPTH_MULTIPLE)
|
||||
return -1; /* FIXME: agregate nbobjs from different levels? */
|
||||
return (int) hwloc_get_nbobjs_by_depth(topology, depth);
|
||||
}
|
||||
|
||||
static __hwloc_inline hwloc_obj_t
|
||||
hwloc_get_obj_by_type (hwloc_topology_t topology, hwloc_obj_type_t type, unsigned idx)
|
||||
{
|
||||
int depth = hwloc_get_type_depth(topology, type);
|
||||
if (depth == HWLOC_TYPE_DEPTH_UNKNOWN)
|
||||
return NULL;
|
||||
if (depth == HWLOC_TYPE_DEPTH_MULTIPLE)
|
||||
return NULL;
|
||||
return hwloc_get_obj_by_depth(topology, depth, idx);
|
||||
}
|
||||
|
||||
static __hwloc_inline hwloc_obj_t
|
||||
hwloc_get_next_obj_by_depth (hwloc_topology_t topology, int depth, hwloc_obj_t prev)
|
||||
{
|
||||
if (!prev)
|
||||
return hwloc_get_obj_by_depth (topology, depth, 0);
|
||||
if (prev->depth != depth)
|
||||
return NULL;
|
||||
return prev->next_cousin;
|
||||
}
|
||||
|
||||
static __hwloc_inline hwloc_obj_t
|
||||
hwloc_get_next_obj_by_type (hwloc_topology_t topology, hwloc_obj_type_t type,
|
||||
hwloc_obj_t prev)
|
||||
{
|
||||
int depth = hwloc_get_type_depth(topology, type);
|
||||
if (depth == HWLOC_TYPE_DEPTH_UNKNOWN || depth == HWLOC_TYPE_DEPTH_MULTIPLE)
|
||||
return NULL;
|
||||
return hwloc_get_next_obj_by_depth (topology, depth, prev);
|
||||
}
|
||||
|
||||
static __hwloc_inline hwloc_obj_t
|
||||
hwloc_get_root_obj (hwloc_topology_t topology)
|
||||
{
|
||||
return hwloc_get_obj_by_depth (topology, 0, 0);
|
||||
}
|
||||
|
||||
static __hwloc_inline const char *
|
||||
hwloc_obj_get_info_by_name(hwloc_obj_t obj, const char *name)
|
||||
{
|
||||
unsigned i;
|
||||
for(i=0; i<obj->infos_count; i++) {
|
||||
struct hwloc_info_s *info = &obj->infos[i];
|
||||
if (!strcmp(info->name, name))
|
||||
return info->value;
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static __hwloc_inline void *
|
||||
hwloc_alloc_membind_policy(hwloc_topology_t topology, size_t len, hwloc_const_cpuset_t set, hwloc_membind_policy_t policy, int flags)
|
||||
{
|
||||
void *p = hwloc_alloc_membind(topology, len, set, policy, flags);
|
||||
if (p)
|
||||
return p;
|
||||
|
||||
if (hwloc_set_membind(topology, set, policy, flags) < 0)
|
||||
/* hwloc_set_membind() takes care of ignoring errors if non-STRICT */
|
||||
return NULL;
|
||||
|
||||
p = hwloc_alloc(topology, len);
|
||||
if (p && policy != HWLOC_MEMBIND_FIRSTTOUCH)
|
||||
/* Enforce the binding by touching the data */
|
||||
memset(p, 0, len);
|
||||
return p;
|
||||
}
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
} /* extern "C" */
|
||||
#endif
|
||||
|
||||
|
||||
#endif /* HWLOC_INLINES_H */
|
||||
157
macx64/mpi/openmpi/include/hwloc/levelzero.h
Normal file
157
macx64/mpi/openmpi/include/hwloc/levelzero.h
Normal file
@@ -0,0 +1,157 @@
|
||||
/*
|
||||
* Copyright © 2021 Inria. All rights reserved.
|
||||
* See COPYING in top-level directory.
|
||||
*/
|
||||
|
||||
/** \file
|
||||
* \brief Macros to help interaction between hwloc and the oneAPI Level Zero interface.
|
||||
*
|
||||
* Applications that use both hwloc and Level Zero may want to
|
||||
* include this file so as to get topology information for L0 devices.
|
||||
*/
|
||||
|
||||
#ifndef HWLOC_LEVELZERO_H
|
||||
#define HWLOC_LEVELZERO_H
|
||||
|
||||
#include "hwloc.h"
|
||||
#include "hwloc/autogen/config.h"
|
||||
#include "hwloc/helper.h"
|
||||
#ifdef HWLOC_LINUX_SYS
|
||||
#include "hwloc/linux.h"
|
||||
#endif
|
||||
|
||||
#include <level_zero/ze_api.h>
|
||||
#include <level_zero/zes_api.h>
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
|
||||
/** \defgroup hwlocality_levelzero Interoperability with the oneAPI Level Zero interface.
|
||||
*
|
||||
* This interface offers ways to retrieve topology information about
|
||||
* devices managed by the Level Zero API.
|
||||
*
|
||||
* @{
|
||||
*/
|
||||
|
||||
/** \brief Get the CPU set of logical processors that are physically
|
||||
* close to the Level Zero device \p device
|
||||
*
|
||||
* Store in \p set the CPU-set describing the locality of
|
||||
* the Level Zero device \p device.
|
||||
*
|
||||
* Topology \p topology and device \p device must match the local machine.
|
||||
* The Level Zero must have been initialized with Sysman enabled
|
||||
* (ZES_ENABLE_SYSMAN=1 in the environment).
|
||||
* I/O devices detection and the Level Zero component are not needed in the
|
||||
* topology.
|
||||
*
|
||||
* The function only returns the locality of the device.
|
||||
* If more information about the device is needed, OS objects should
|
||||
* be used instead, see hwloc_levelzero_get_device_osdev().
|
||||
*
|
||||
* This function is currently only implemented in a meaningful way for
|
||||
* Linux; other systems will simply get a full cpuset.
|
||||
*/
|
||||
static __hwloc_inline int
|
||||
hwloc_levelzero_get_device_cpuset(hwloc_topology_t topology __hwloc_attribute_unused,
|
||||
ze_device_handle_t device, hwloc_cpuset_t set)
|
||||
{
|
||||
#ifdef HWLOC_LINUX_SYS
|
||||
/* If we're on Linux, use the sysfs mechanism to get the local cpus */
|
||||
#define HWLOC_LEVELZERO_DEVICE_SYSFS_PATH_MAX 128
|
||||
char path[HWLOC_LEVELZERO_DEVICE_SYSFS_PATH_MAX];
|
||||
zes_pci_properties_t pci;
|
||||
zes_device_handle_t sdevice = device;
|
||||
ze_result_t res;
|
||||
|
||||
if (!hwloc_topology_is_thissystem(topology)) {
|
||||
errno = EINVAL;
|
||||
return -1;
|
||||
}
|
||||
|
||||
res = zesDevicePciGetProperties(sdevice, &pci);
|
||||
if (res != ZE_RESULT_SUCCESS) {
|
||||
errno = EINVAL;
|
||||
return -1;
|
||||
}
|
||||
|
||||
sprintf(path, "/sys/bus/pci/devices/%04x:%02x:%02x.%01x/local_cpus",
|
||||
pci.address.domain, pci.address.bus, pci.address.device, pci.address.function);
|
||||
if (hwloc_linux_read_path_as_cpumask(path, set) < 0
|
||||
|| hwloc_bitmap_iszero(set))
|
||||
hwloc_bitmap_copy(set, hwloc_topology_get_complete_cpuset(topology));
|
||||
#else
|
||||
/* Non-Linux systems simply get a full cpuset */
|
||||
hwloc_bitmap_copy(set, hwloc_topology_get_complete_cpuset(topology));
|
||||
#endif
|
||||
return 0;
|
||||
}
|
||||
|
||||
/** \brief Get the hwloc OS device object corresponding to Level Zero device
|
||||
* \p device.
|
||||
*
|
||||
* \return The hwloc OS device object that describes the given Level Zero device \p device.
|
||||
* \return \c NULL if none could be found.
|
||||
*
|
||||
* Topology \p topology and device \p dv_ind must match the local machine.
|
||||
* I/O devices detection and the Level Zero component must be enabled in the
|
||||
* topology. If not, the locality of the object may still be found using
|
||||
* hwloc_levelzero_get_device_cpuset().
|
||||
*
|
||||
* \note The corresponding hwloc PCI device may be found by looking
|
||||
* at the result parent pointer (unless PCI devices are filtered out).
|
||||
*/
|
||||
static __hwloc_inline hwloc_obj_t
|
||||
hwloc_levelzero_get_device_osdev(hwloc_topology_t topology, ze_device_handle_t device)
|
||||
{
|
||||
zes_device_handle_t sdevice = device;
|
||||
zes_pci_properties_t pci;
|
||||
ze_result_t res;
|
||||
hwloc_obj_t osdev;
|
||||
|
||||
if (!hwloc_topology_is_thissystem(topology)) {
|
||||
errno = EINVAL;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
res = zesDevicePciGetProperties(sdevice, &pci);
|
||||
if (res != ZE_RESULT_SUCCESS) {
|
||||
/* L0 was likely initialized without sysman, don't bother */
|
||||
errno = EINVAL;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
osdev = NULL;
|
||||
while ((osdev = hwloc_get_next_osdev(topology, osdev)) != NULL) {
|
||||
hwloc_obj_t pcidev = osdev->parent;
|
||||
|
||||
if (strncmp(osdev->name, "ze", 2))
|
||||
continue;
|
||||
|
||||
if (pcidev
|
||||
&& pcidev->type == HWLOC_OBJ_PCI_DEVICE
|
||||
&& pcidev->attr->pcidev.domain == pci.address.domain
|
||||
&& pcidev->attr->pcidev.bus == pci.address.bus
|
||||
&& pcidev->attr->pcidev.dev == pci.address.device
|
||||
&& pcidev->attr->pcidev.func == pci.address.function)
|
||||
return osdev;
|
||||
|
||||
/* FIXME: when we'll have serialnumber, try it in case PCI is filtered-out */
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/** @} */
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
} /* extern "C" */
|
||||
#endif
|
||||
|
||||
|
||||
#endif /* HWLOC_LEVELZERO_H */
|
||||
455
macx64/mpi/openmpi/include/hwloc/memattrs.h
Normal file
455
macx64/mpi/openmpi/include/hwloc/memattrs.h
Normal file
@@ -0,0 +1,455 @@
|
||||
/*
|
||||
* Copyright © 2019-2022 Inria. All rights reserved.
|
||||
* See COPYING in top-level directory.
|
||||
*/
|
||||
|
||||
/** \file
|
||||
* \brief Memory node attributes.
|
||||
*/
|
||||
|
||||
#ifndef HWLOC_MEMATTR_H
|
||||
#define HWLOC_MEMATTR_H
|
||||
|
||||
#include "hwloc.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#elif 0
|
||||
}
|
||||
#endif
|
||||
|
||||
/** \defgroup hwlocality_memattrs Comparing memory node attributes for finding where to allocate on
|
||||
*
|
||||
* Platforms with heterogeneous memory require ways to decide whether
|
||||
* a buffer should be allocated on "fast" memory (such as HBM),
|
||||
* "normal" memory (DDR) or even "slow" but large-capacity memory
|
||||
* (non-volatile memory).
|
||||
* These memory nodes are called "Targets" while the CPU accessing them
|
||||
* is called the "Initiator". Access performance depends on their
|
||||
* locality (NUMA platforms) as well as the intrinsic performance
|
||||
* of the targets (heterogeneous platforms).
|
||||
*
|
||||
* The following attributes describe the performance of memory accesses
|
||||
* from an Initiator to a memory Target, for instance their latency
|
||||
* or bandwidth.
|
||||
* Initiators performing these memory accesses are usually some PUs or Cores
|
||||
* (described as a CPU set).
|
||||
* Hence a Core may choose where to allocate a memory buffer by comparing
|
||||
* the attributes of different target memory nodes nearby.
|
||||
*
|
||||
* There are also some attributes that are system-wide.
|
||||
* Their value does not depend on a specific initiator performing
|
||||
* an access.
|
||||
* The memory node Capacity is an example of such attribute without
|
||||
* initiator.
|
||||
*
|
||||
* One way to use this API is to start with a cpuset describing the Cores where
|
||||
* a program is bound. The best target NUMA node for allocating memory in this
|
||||
* program on these Cores may be obtained by passing this cpuset as an initiator
|
||||
* to hwloc_memattr_get_best_target() with the relevant memory attribute.
|
||||
* For instance, if the code is latency limited, use the Latency attribute.
|
||||
*
|
||||
* A more flexible approach consists in getting the list of local NUMA nodes
|
||||
* by passing this cpuset to hwloc_get_local_numanode_objs().
|
||||
* Attribute values for these nodes, if any, may then be obtained with
|
||||
* hwloc_memattr_get_value() and manually compared with the desired criteria.
|
||||
*
|
||||
* \note The API also supports specific objects as initiator,
|
||||
* but it is currently not used internally by hwloc.
|
||||
* Users may for instance use it to provide custom performance
|
||||
* values for host memory accesses performed by GPUs.
|
||||
*
|
||||
* \note The interface actually also accepts targets that are not NUMA nodes.
|
||||
* @{
|
||||
*/
|
||||
|
||||
/** \brief Memory node attributes. */
|
||||
enum hwloc_memattr_id_e {
|
||||
/** \brief "Capacity".
|
||||
* The capacity is returned in bytes
|
||||
* (local_memory attribute in objects).
|
||||
*
|
||||
* Best capacity nodes are nodes with <b>higher capacity</b>.
|
||||
*
|
||||
* No initiator is involved when looking at this attribute.
|
||||
* The corresponding attribute flags are ::HWLOC_MEMATTR_FLAG_HIGHER_FIRST.
|
||||
*/
|
||||
HWLOC_MEMATTR_ID_CAPACITY = 0,
|
||||
|
||||
/** \brief "Locality".
|
||||
* The locality is returned as the number of PUs in that locality
|
||||
* (e.g. the weight of its cpuset).
|
||||
*
|
||||
* Best locality nodes are nodes with <b>smaller locality</b>
|
||||
* (nodes that are local to very few PUs).
|
||||
* Poor locality nodes are nodes with larger locality
|
||||
* (nodes that are local to the entire machine).
|
||||
*
|
||||
* No initiator is involved when looking at this attribute.
|
||||
* The corresponding attribute flags are ::HWLOC_MEMATTR_FLAG_HIGHER_FIRST.
|
||||
*/
|
||||
HWLOC_MEMATTR_ID_LOCALITY = 1,
|
||||
|
||||
/** \brief "Bandwidth".
|
||||
* The bandwidth is returned in MiB/s, as seen from the given initiator location.
|
||||
* Best bandwidth nodes are nodes with <b>higher bandwidth</b>.
|
||||
* The corresponding attribute flags are ::HWLOC_MEMATTR_FLAG_HIGHER_FIRST
|
||||
* and ::HWLOC_MEMATTR_FLAG_NEED_INITIATOR.
|
||||
*/
|
||||
HWLOC_MEMATTR_ID_BANDWIDTH = 2,
|
||||
|
||||
/** \brief "Latency".
|
||||
* The latency is returned as nanoseconds, as seen from the given initiator location.
|
||||
* Best latency nodes are nodes with <b>smaller latency</b>.
|
||||
* The corresponding attribute flags are ::HWLOC_MEMATTR_FLAG_LOWER_FIRST
|
||||
* and ::HWLOC_MEMATTR_FLAG_NEED_INITIATOR.
|
||||
*/
|
||||
HWLOC_MEMATTR_ID_LATENCY = 3
|
||||
|
||||
/* TODO read vs write, persistence? */
|
||||
};
|
||||
|
||||
/** \brief A memory attribute identifier.
|
||||
* May be either one of ::hwloc_memattr_id_e or a new id returned by hwloc_memattr_register().
|
||||
*/
|
||||
typedef unsigned hwloc_memattr_id_t;
|
||||
|
||||
/** \brief Return the identifier of the memory attribute with the given name.
|
||||
*/
|
||||
HWLOC_DECLSPEC int
|
||||
hwloc_memattr_get_by_name(hwloc_topology_t topology,
|
||||
const char *name,
|
||||
hwloc_memattr_id_t *id);
|
||||
|
||||
|
||||
/** \brief Type of location. */
|
||||
enum hwloc_location_type_e {
|
||||
/** \brief Location is given as a cpuset, in the location cpuset union field. \hideinitializer */
|
||||
HWLOC_LOCATION_TYPE_CPUSET = 1,
|
||||
/** \brief Location is given as an object, in the location object union field. \hideinitializer */
|
||||
HWLOC_LOCATION_TYPE_OBJECT = 0
|
||||
};
|
||||
|
||||
/** \brief Where to measure attributes from. */
|
||||
struct hwloc_location {
|
||||
/** \brief Type of location. */
|
||||
enum hwloc_location_type_e type;
|
||||
/** \brief Actual location. */
|
||||
union hwloc_location_u {
|
||||
/** \brief Location as a cpuset, when the location type is ::HWLOC_LOCATION_TYPE_CPUSET. */
|
||||
hwloc_cpuset_t cpuset;
|
||||
/** \brief Location as an object, when the location type is ::HWLOC_LOCATION_TYPE_OBJECT. */
|
||||
hwloc_obj_t object;
|
||||
} location;
|
||||
};
|
||||
|
||||
|
||||
/** \brief Flags for selecting target NUMA nodes. */
|
||||
enum hwloc_local_numanode_flag_e {
|
||||
/** \brief Select NUMA nodes whose locality is larger than the given cpuset.
|
||||
* For instance, if a single PU (or its cpuset) is given in \p initiator,
|
||||
* select all nodes close to the package that contains this PU.
|
||||
* \hideinitializer
|
||||
*/
|
||||
HWLOC_LOCAL_NUMANODE_FLAG_LARGER_LOCALITY = (1UL<<0),
|
||||
|
||||
/** \brief Select NUMA nodes whose locality is smaller than the given cpuset.
|
||||
* For instance, if a package (or its cpuset) is given in \p initiator,
|
||||
* also select nodes that are attached to only a half of that package.
|
||||
* \hideinitializer
|
||||
*/
|
||||
HWLOC_LOCAL_NUMANODE_FLAG_SMALLER_LOCALITY = (1UL<<1),
|
||||
|
||||
/** \brief Select all NUMA nodes in the topology.
|
||||
* The initiator \p initiator is ignored.
|
||||
* \hideinitializer
|
||||
*/
|
||||
HWLOC_LOCAL_NUMANODE_FLAG_ALL = (1UL<<2)
|
||||
};
|
||||
|
||||
/** \brief Return an array of local NUMA nodes.
|
||||
*
|
||||
* By default only select the NUMA nodes whose locality is exactly
|
||||
* the given \p location. More nodes may be selected if additional flags
|
||||
* are given as a OR'ed set of ::hwloc_local_numanode_flag_e.
|
||||
*
|
||||
* If \p location is given as an explicit object, its CPU set is used
|
||||
* to find NUMA nodes with the corresponding locality.
|
||||
* If the object does not have a CPU set (e.g. I/O object), the CPU
|
||||
* parent (where the I/O object is attached) is used.
|
||||
*
|
||||
* On input, \p nr points to the number of nodes that may be stored
|
||||
* in the \p nodes array.
|
||||
* On output, \p nr will be changed to the number of stored nodes,
|
||||
* or the number of nodes that would have been stored if there were
|
||||
* enough room.
|
||||
*
|
||||
* \note Some of these NUMA nodes may not have any memory attribute
|
||||
* values and hence not be reported as actual targets in other functions.
|
||||
*
|
||||
* \note The number of NUMA nodes in the topology (obtained by
|
||||
* hwloc_bitmap_weight() on the root object nodeset) may be used
|
||||
* to allocate the \p nodes array.
|
||||
*
|
||||
* \note When an object CPU set is given as locality, for instance a Package,
|
||||
* and when flags contain both ::HWLOC_LOCAL_NUMANODE_FLAG_LARGER_LOCALITY
|
||||
* and ::HWLOC_LOCAL_NUMANODE_FLAG_SMALLER_LOCALITY,
|
||||
* the returned array corresponds to the nodeset of that object.
|
||||
*/
|
||||
HWLOC_DECLSPEC int
|
||||
hwloc_get_local_numanode_objs(hwloc_topology_t topology,
|
||||
struct hwloc_location *location,
|
||||
unsigned *nr,
|
||||
hwloc_obj_t *nodes,
|
||||
unsigned long flags);
|
||||
|
||||
|
||||
|
||||
/** \brief Return an attribute value for a specific target NUMA node.
|
||||
*
|
||||
* If the attribute does not relate to a specific initiator
|
||||
* (it does not have the flag ::HWLOC_MEMATTR_FLAG_NEED_INITIATOR),
|
||||
* location \p initiator is ignored and may be \c NULL.
|
||||
*
|
||||
* \p flags must be \c 0 for now.
|
||||
*
|
||||
* \note The initiator \p initiator should be of type ::HWLOC_LOCATION_TYPE_CPUSET
|
||||
* when refering to accesses performed by CPU cores.
|
||||
* ::HWLOC_LOCATION_TYPE_OBJECT is currently unused internally by hwloc,
|
||||
* but users may for instance use it to provide custom information about
|
||||
* host memory accesses performed by GPUs.
|
||||
*/
|
||||
HWLOC_DECLSPEC int
|
||||
hwloc_memattr_get_value(hwloc_topology_t topology,
|
||||
hwloc_memattr_id_t attribute,
|
||||
hwloc_obj_t target_node,
|
||||
struct hwloc_location *initiator,
|
||||
unsigned long flags,
|
||||
hwloc_uint64_t *value);
|
||||
|
||||
/** \brief Return the best target NUMA node for the given attribute and initiator.
|
||||
*
|
||||
* If the attribute does not relate to a specific initiator
|
||||
* (it does not have the flag ::HWLOC_MEMATTR_FLAG_NEED_INITIATOR),
|
||||
* location \p initiator is ignored and may be \c NULL.
|
||||
*
|
||||
* If \p value is non \c NULL, the corresponding value is returned there.
|
||||
*
|
||||
* If multiple targets have the same attribute values, only one is
|
||||
* returned (and there is no way to clarify how that one is chosen).
|
||||
* Applications that want to detect targets with identical/similar
|
||||
* values, or that want to look at values for multiple attributes,
|
||||
* should rather get all values using hwloc_memattr_get_value()
|
||||
* and manually select the target they consider the best.
|
||||
*
|
||||
* \p flags must be \c 0 for now.
|
||||
*
|
||||
* If there are no matching targets, \c -1 is returned with \p errno set to \c ENOENT;
|
||||
*
|
||||
* \note The initiator \p initiator should be of type ::HWLOC_LOCATION_TYPE_CPUSET
|
||||
* when refering to accesses performed by CPU cores.
|
||||
* ::HWLOC_LOCATION_TYPE_OBJECT is currently unused internally by hwloc,
|
||||
* but users may for instance use it to provide custom information about
|
||||
* host memory accesses performed by GPUs.
|
||||
*/
|
||||
HWLOC_DECLSPEC int
|
||||
hwloc_memattr_get_best_target(hwloc_topology_t topology,
|
||||
hwloc_memattr_id_t attribute,
|
||||
struct hwloc_location *initiator,
|
||||
unsigned long flags,
|
||||
hwloc_obj_t *best_target, hwloc_uint64_t *value);
|
||||
|
||||
/** \brief Return the best initiator for the given attribute and target NUMA node.
|
||||
*
|
||||
* If the attribute does not relate to a specific initiator
|
||||
* (it does not have the flag ::HWLOC_MEMATTR_FLAG_NEED_INITIATOR),
|
||||
* \c -1 is returned and \p errno is set to \c EINVAL.
|
||||
*
|
||||
* If \p value is non \c NULL, the corresponding value is returned there.
|
||||
*
|
||||
* If multiple initiators have the same attribute values, only one is
|
||||
* returned (and there is no way to clarify how that one is chosen).
|
||||
* Applications that want to detect initiators with identical/similar
|
||||
* values, or that want to look at values for multiple attributes,
|
||||
* should rather get all values using hwloc_memattr_get_value()
|
||||
* and manually select the initiator they consider the best.
|
||||
*
|
||||
* The returned initiator should not be modified or freed,
|
||||
* it belongs to the topology.
|
||||
*
|
||||
* \p flags must be \c 0 for now.
|
||||
*
|
||||
* If there are no matching initiators, \c -1 is returned with \p errno set to \c ENOENT;
|
||||
*/
|
||||
HWLOC_DECLSPEC int
|
||||
hwloc_memattr_get_best_initiator(hwloc_topology_t topology,
|
||||
hwloc_memattr_id_t attribute,
|
||||
hwloc_obj_t target,
|
||||
unsigned long flags,
|
||||
struct hwloc_location *best_initiator, hwloc_uint64_t *value);
|
||||
|
||||
/** @} */
|
||||
|
||||
|
||||
/** \defgroup hwlocality_memattrs_manage Managing memory attributes
|
||||
* @{
|
||||
*/
|
||||
|
||||
/** \brief Return the name of a memory attribute.
|
||||
*/
|
||||
HWLOC_DECLSPEC int
|
||||
hwloc_memattr_get_name(hwloc_topology_t topology,
|
||||
hwloc_memattr_id_t attribute,
|
||||
const char **name);
|
||||
|
||||
/** \brief Return the flags of the given attribute.
|
||||
*
|
||||
* Flags are a OR'ed set of ::hwloc_memattr_flag_e.
|
||||
*/
|
||||
HWLOC_DECLSPEC int
|
||||
hwloc_memattr_get_flags(hwloc_topology_t topology,
|
||||
hwloc_memattr_id_t attribute,
|
||||
unsigned long *flags);
|
||||
|
||||
/** \brief Memory attribute flags.
|
||||
* Given to hwloc_memattr_register() and returned by hwloc_memattr_get_flags().
|
||||
*/
|
||||
enum hwloc_memattr_flag_e {
|
||||
/** \brief The best nodes for this memory attribute are those with the higher values.
|
||||
* For instance Bandwidth.
|
||||
*/
|
||||
HWLOC_MEMATTR_FLAG_HIGHER_FIRST = (1UL<<0),
|
||||
/** \brief The best nodes for this memory attribute are those with the lower values.
|
||||
* For instance Latency.
|
||||
*/
|
||||
HWLOC_MEMATTR_FLAG_LOWER_FIRST = (1UL<<1),
|
||||
/** \brief The value returned for this memory attribute depends on the given initiator.
|
||||
* For instance Bandwidth and Latency, but not Capacity.
|
||||
*/
|
||||
HWLOC_MEMATTR_FLAG_NEED_INITIATOR = (1UL<<2)
|
||||
};
|
||||
|
||||
/** \brief Register a new memory attribute.
|
||||
*
|
||||
* Add a specific memory attribute that is not defined in ::hwloc_memattr_id_e.
|
||||
* Flags are a OR'ed set of ::hwloc_memattr_flag_e. It must contain at least
|
||||
* one of ::HWLOC_MEMATTR_FLAG_HIGHER_FIRST or ::HWLOC_MEMATTR_FLAG_LOWER_FIRST.
|
||||
*/
|
||||
HWLOC_DECLSPEC int
|
||||
hwloc_memattr_register(hwloc_topology_t topology,
|
||||
const char *name,
|
||||
unsigned long flags,
|
||||
hwloc_memattr_id_t *id);
|
||||
|
||||
/** \brief Set an attribute value for a specific target NUMA node.
|
||||
*
|
||||
* If the attribute does not relate to a specific initiator
|
||||
* (it does not have the flag ::HWLOC_MEMATTR_FLAG_NEED_INITIATOR),
|
||||
* location \p initiator is ignored and may be \c NULL.
|
||||
*
|
||||
* The initiator will be copied into the topology,
|
||||
* the caller should free anything allocated to store the initiator,
|
||||
* for instance the cpuset.
|
||||
*
|
||||
* \p flags must be \c 0 for now.
|
||||
*
|
||||
* \note The initiator \p initiator should be of type ::HWLOC_LOCATION_TYPE_CPUSET
|
||||
* when referring to accesses performed by CPU cores.
|
||||
* ::HWLOC_LOCATION_TYPE_OBJECT is currently unused internally by hwloc,
|
||||
* but users may for instance use it to provide custom information about
|
||||
* host memory accesses performed by GPUs.
|
||||
*/
|
||||
HWLOC_DECLSPEC int
|
||||
hwloc_memattr_set_value(hwloc_topology_t topology,
|
||||
hwloc_memattr_id_t attribute,
|
||||
hwloc_obj_t target_node,
|
||||
struct hwloc_location *initiator,
|
||||
unsigned long flags,
|
||||
hwloc_uint64_t value);
|
||||
|
||||
/** \brief Return the target NUMA nodes that have some values for a given attribute.
|
||||
*
|
||||
* Return targets for the given attribute in the \p targets array
|
||||
* (for the given initiator if any).
|
||||
* If \p values is not \c NULL, the corresponding attribute values
|
||||
* are stored in the array it points to.
|
||||
*
|
||||
* On input, \p nr points to the number of targets that may be stored
|
||||
* in the array \p targets (and \p values).
|
||||
* On output, \p nr points to the number of targets (and values) that
|
||||
* were actually found, even if some of them couldn't be stored in the array.
|
||||
* Targets that couldn't be stored are ignored, but the function still
|
||||
* returns success (\c 0). The caller may find out by comparing the value pointed
|
||||
* by \p nr before and after the function call.
|
||||
*
|
||||
* The returned targets should not be modified or freed,
|
||||
* they belong to the topology.
|
||||
*
|
||||
* Argument \p initiator is ignored if the attribute does not relate to a specific
|
||||
* initiator (it does not have the flag ::HWLOC_MEMATTR_FLAG_NEED_INITIATOR).
|
||||
* Otherwise \p initiator may be non \c NULL to report only targets
|
||||
* that have a value for that initiator.
|
||||
*
|
||||
* \p flags must be \c 0 for now.
|
||||
*
|
||||
* \note This function is meant for tools and debugging (listing internal information)
|
||||
* rather than for application queries. Applications should rather select useful
|
||||
* NUMA nodes with hwloc_get_local_numanode_objs() and then look at their attribute
|
||||
* values.
|
||||
*
|
||||
* \note The initiator \p initiator should be of type ::HWLOC_LOCATION_TYPE_CPUSET
|
||||
* when referring to accesses performed by CPU cores.
|
||||
* ::HWLOC_LOCATION_TYPE_OBJECT is currently unused internally by hwloc,
|
||||
* but users may for instance use it to provide custom information about
|
||||
* host memory accesses performed by GPUs.
|
||||
*/
|
||||
HWLOC_DECLSPEC int
|
||||
hwloc_memattr_get_targets(hwloc_topology_t topology,
|
||||
hwloc_memattr_id_t attribute,
|
||||
struct hwloc_location *initiator,
|
||||
unsigned long flags,
|
||||
unsigned *nr, hwloc_obj_t *targets, hwloc_uint64_t *values);
|
||||
|
||||
/** \brief Return the initiators that have values for a given attribute for a specific target NUMA node.
|
||||
*
|
||||
* Return initiators for the given attribute and target node in the
|
||||
* \p initiators array.
|
||||
* If \p values is not \c NULL, the corresponding attribute values
|
||||
* are stored in the array it points to.
|
||||
*
|
||||
* On input, \p nr points to the number of initiators that may be stored
|
||||
* in the array \p initiators (and \p values).
|
||||
* On output, \p nr points to the number of initiators (and values) that
|
||||
* were actually found, even if some of them couldn't be stored in the array.
|
||||
* Initiators that couldn't be stored are ignored, but the function still
|
||||
* returns success (\c 0). The caller may find out by comparing the value pointed
|
||||
* by \p nr before and after the function call.
|
||||
*
|
||||
* The returned initiators should not be modified or freed,
|
||||
* they belong to the topology.
|
||||
*
|
||||
* \p flags must be \c 0 for now.
|
||||
*
|
||||
* If the attribute does not relate to a specific initiator
|
||||
* (it does not have the flag ::HWLOC_MEMATTR_FLAG_NEED_INITIATOR),
|
||||
* no initiator is returned.
|
||||
*
|
||||
* \note This function is meant for tools and debugging (listing internal information)
|
||||
* rather than for application queries. Applications should rather select useful
|
||||
* NUMA nodes with hwloc_get_local_numanode_objs() and then look at their attribute
|
||||
* values for some relevant initiators.
|
||||
*/
|
||||
HWLOC_DECLSPEC int
|
||||
hwloc_memattr_get_initiators(hwloc_topology_t topology,
|
||||
hwloc_memattr_id_t attribute,
|
||||
hwloc_obj_t target_node,
|
||||
unsigned long flags,
|
||||
unsigned *nr, struct hwloc_location *initiators, hwloc_uint64_t *values);
|
||||
/** @} */
|
||||
|
||||
#ifdef __cplusplus
|
||||
} /* extern "C" */
|
||||
#endif
|
||||
|
||||
|
||||
#endif /* HWLOC_MEMATTR_H */
|
||||
181
macx64/mpi/openmpi/include/hwloc/nvml.h
Normal file
181
macx64/mpi/openmpi/include/hwloc/nvml.h
Normal file
@@ -0,0 +1,181 @@
|
||||
/*
|
||||
* Copyright © 2012-2021 Inria. All rights reserved.
|
||||
* See COPYING in top-level directory.
|
||||
*/
|
||||
|
||||
/** \file
|
||||
* \brief Macros to help interaction between hwloc and the NVIDIA Management Library.
|
||||
*
|
||||
* Applications that use both hwloc and the NVIDIA Management Library may want to
|
||||
* include this file so as to get topology information for NVML devices.
|
||||
*/
|
||||
|
||||
#ifndef HWLOC_NVML_H
|
||||
#define HWLOC_NVML_H
|
||||
|
||||
#include "hwloc.h"
|
||||
#include "hwloc/autogen/config.h"
|
||||
#include "hwloc/helper.h"
|
||||
#ifdef HWLOC_LINUX_SYS
|
||||
#include "hwloc/linux.h"
|
||||
#endif
|
||||
|
||||
#include <nvml.h>
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
|
||||
/** \defgroup hwlocality_nvml Interoperability with the NVIDIA Management Library
|
||||
*
|
||||
* This interface offers ways to retrieve topology information about
|
||||
* devices managed by the NVIDIA Management Library (NVML).
|
||||
*
|
||||
* @{
|
||||
*/
|
||||
|
||||
/** \brief Get the CPU set of processors that are physically
|
||||
* close to NVML device \p device.
|
||||
*
|
||||
* Store in \p set the CPU-set describing the locality of the NVML device \p device.
|
||||
*
|
||||
* Topology \p topology and device \p device must match the local machine.
|
||||
* I/O devices detection and the NVML component are not needed in the topology.
|
||||
*
|
||||
* The function only returns the locality of the device.
|
||||
* If more information about the device is needed, OS objects should
|
||||
* be used instead, see hwloc_nvml_get_device_osdev()
|
||||
* and hwloc_nvml_get_device_osdev_by_index().
|
||||
*
|
||||
* This function is currently only implemented in a meaningful way for
|
||||
* Linux; other systems will simply get a full cpuset.
|
||||
*/
|
||||
static __hwloc_inline int
|
||||
hwloc_nvml_get_device_cpuset(hwloc_topology_t topology __hwloc_attribute_unused,
|
||||
nvmlDevice_t device, hwloc_cpuset_t set)
|
||||
{
|
||||
#ifdef HWLOC_LINUX_SYS
|
||||
/* If we're on Linux, use the sysfs mechanism to get the local cpus */
|
||||
#define HWLOC_NVML_DEVICE_SYSFS_PATH_MAX 128
|
||||
char path[HWLOC_NVML_DEVICE_SYSFS_PATH_MAX];
|
||||
nvmlReturn_t nvres;
|
||||
nvmlPciInfo_t pci;
|
||||
|
||||
if (!hwloc_topology_is_thissystem(topology)) {
|
||||
errno = EINVAL;
|
||||
return -1;
|
||||
}
|
||||
|
||||
nvres = nvmlDeviceGetPciInfo(device, &pci);
|
||||
if (NVML_SUCCESS != nvres) {
|
||||
errno = EINVAL;
|
||||
return -1;
|
||||
}
|
||||
|
||||
sprintf(path, "/sys/bus/pci/devices/%04x:%02x:%02x.0/local_cpus", pci.domain, pci.bus, pci.device);
|
||||
if (hwloc_linux_read_path_as_cpumask(path, set) < 0
|
||||
|| hwloc_bitmap_iszero(set))
|
||||
hwloc_bitmap_copy(set, hwloc_topology_get_complete_cpuset(topology));
|
||||
#else
|
||||
/* Non-Linux systems simply get a full cpuset */
|
||||
hwloc_bitmap_copy(set, hwloc_topology_get_complete_cpuset(topology));
|
||||
#endif
|
||||
return 0;
|
||||
}
|
||||
|
||||
/** \brief Get the hwloc OS device object corresponding to the
|
||||
* NVML device whose index is \p idx.
|
||||
*
|
||||
* \return The hwloc OS device object describing the NVML device whose index is \p idx.
|
||||
* \return \c NULL if none could be found.
|
||||
*
|
||||
* The topology \p topology does not necessarily have to match the current
|
||||
* machine. For instance the topology may be an XML import of a remote host.
|
||||
* I/O devices detection and the NVML component must be enabled in the topology.
|
||||
*
|
||||
* \note The corresponding PCI device object can be obtained by looking
|
||||
* at the OS device parent object (unless PCI devices are filtered out).
|
||||
*/
|
||||
static __hwloc_inline hwloc_obj_t
|
||||
hwloc_nvml_get_device_osdev_by_index(hwloc_topology_t topology, unsigned idx)
|
||||
{
|
||||
hwloc_obj_t osdev = NULL;
|
||||
while ((osdev = hwloc_get_next_osdev(topology, osdev)) != NULL) {
|
||||
if (HWLOC_OBJ_OSDEV_GPU == osdev->attr->osdev.type
|
||||
&& osdev->name
|
||||
&& !strncmp("nvml", osdev->name, 4)
|
||||
&& atoi(osdev->name + 4) == (int) idx)
|
||||
return osdev;
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/** \brief Get the hwloc OS device object corresponding to NVML device \p device.
|
||||
*
|
||||
* \return The hwloc OS device object that describes the given NVML device \p device.
|
||||
* \return \c NULL if none could be found.
|
||||
*
|
||||
* Topology \p topology and device \p device must match the local machine.
|
||||
* I/O devices detection and the NVML component must be enabled in the topology.
|
||||
* If not, the locality of the object may still be found using
|
||||
* hwloc_nvml_get_device_cpuset().
|
||||
*
|
||||
* \note The corresponding hwloc PCI device may be found by looking
|
||||
* at the result parent pointer (unless PCI devices are filtered out).
|
||||
*/
|
||||
static __hwloc_inline hwloc_obj_t
|
||||
hwloc_nvml_get_device_osdev(hwloc_topology_t topology, nvmlDevice_t device)
|
||||
{
|
||||
hwloc_obj_t osdev;
|
||||
nvmlReturn_t nvres;
|
||||
nvmlPciInfo_t pci;
|
||||
char uuid[64];
|
||||
|
||||
if (!hwloc_topology_is_thissystem(topology)) {
|
||||
errno = EINVAL;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
nvres = nvmlDeviceGetPciInfo(device, &pci);
|
||||
if (NVML_SUCCESS != nvres)
|
||||
return NULL;
|
||||
|
||||
nvres = nvmlDeviceGetUUID(device, uuid, sizeof(uuid));
|
||||
if (NVML_SUCCESS != nvres)
|
||||
uuid[0] = '\0';
|
||||
|
||||
osdev = NULL;
|
||||
while ((osdev = hwloc_get_next_osdev(topology, osdev)) != NULL) {
|
||||
hwloc_obj_t pcidev = osdev->parent;
|
||||
const char *info;
|
||||
|
||||
if (strncmp(osdev->name, "nvml", 4))
|
||||
continue;
|
||||
|
||||
if (pcidev
|
||||
&& pcidev->type == HWLOC_OBJ_PCI_DEVICE
|
||||
&& pcidev->attr->pcidev.domain == pci.domain
|
||||
&& pcidev->attr->pcidev.bus == pci.bus
|
||||
&& pcidev->attr->pcidev.dev == pci.device
|
||||
&& pcidev->attr->pcidev.func == 0)
|
||||
return osdev;
|
||||
|
||||
info = hwloc_obj_get_info_by_name(osdev, "NVIDIAUUID");
|
||||
if (info && !strcmp(info, uuid))
|
||||
return osdev;
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/** @} */
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
} /* extern "C" */
|
||||
#endif
|
||||
|
||||
|
||||
#endif /* HWLOC_NVML_H */
|
||||
252
macx64/mpi/openmpi/include/hwloc/opencl.h
Normal file
252
macx64/mpi/openmpi/include/hwloc/opencl.h
Normal file
@@ -0,0 +1,252 @@
|
||||
/*
|
||||
* Copyright © 2012-2021 Inria. All rights reserved.
|
||||
* Copyright © 2013, 2018 Université Bordeaux. All right reserved.
|
||||
* See COPYING in top-level directory.
|
||||
*/
|
||||
|
||||
/** \file
|
||||
* \brief Macros to help interaction between hwloc and the OpenCL interface.
|
||||
*
|
||||
* Applications that use both hwloc and OpenCL may want to
|
||||
* include this file so as to get topology information for OpenCL devices.
|
||||
*/
|
||||
|
||||
#ifndef HWLOC_OPENCL_H
|
||||
#define HWLOC_OPENCL_H
|
||||
|
||||
#include "hwloc.h"
|
||||
#include "hwloc/autogen/config.h"
|
||||
#include "hwloc/helper.h"
|
||||
#ifdef HWLOC_LINUX_SYS
|
||||
#include "hwloc/linux.h"
|
||||
#endif
|
||||
|
||||
#ifdef __APPLE__
|
||||
#include <OpenCL/cl.h>
|
||||
#else
|
||||
#include <CL/cl.h>
|
||||
#endif
|
||||
|
||||
#include <stdio.h>
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
|
||||
/* OpenCL extensions aren't always shipped with default headers, and
|
||||
* they don't always reflect what the installed implementations support.
|
||||
* Try everything and let the implementation return errors when non supported.
|
||||
*/
|
||||
/* Copyright (c) 2008-2018 The Khronos Group Inc. */
|
||||
|
||||
/* needs "cl_amd_device_attribute_query" device extension, but not strictly required for clGetDeviceInfo() */
|
||||
#define HWLOC_CL_DEVICE_TOPOLOGY_AMD 0x4037
|
||||
typedef union {
|
||||
struct { cl_uint type; cl_uint data[5]; } raw;
|
||||
struct { cl_uint type; cl_char unused[17]; cl_char bus; cl_char device; cl_char function; } pcie;
|
||||
} hwloc_cl_device_topology_amd;
|
||||
#define HWLOC_CL_DEVICE_TOPOLOGY_TYPE_PCIE_AMD 1
|
||||
|
||||
/* needs "cl_nv_device_attribute_query" device extension, but not strictly required for clGetDeviceInfo() */
|
||||
#define HWLOC_CL_DEVICE_PCI_BUS_ID_NV 0x4008
|
||||
#define HWLOC_CL_DEVICE_PCI_SLOT_ID_NV 0x4009
|
||||
#define HWLOC_CL_DEVICE_PCI_DOMAIN_ID_NV 0x400A
|
||||
|
||||
|
||||
/** \defgroup hwlocality_opencl Interoperability with OpenCL
|
||||
*
|
||||
* This interface offers ways to retrieve topology information about
|
||||
* OpenCL devices.
|
||||
*
|
||||
* Only AMD and NVIDIA OpenCL implementations currently offer useful locality
|
||||
* information about their devices.
|
||||
*
|
||||
* @{
|
||||
*/
|
||||
|
||||
/** \brief Return the domain, bus and device IDs of the OpenCL device \p device.
|
||||
*
|
||||
* Device \p device must match the local machine.
|
||||
*/
|
||||
static __hwloc_inline int
|
||||
hwloc_opencl_get_device_pci_busid(cl_device_id device,
|
||||
unsigned *domain, unsigned *bus, unsigned *dev, unsigned *func)
|
||||
{
|
||||
hwloc_cl_device_topology_amd amdtopo;
|
||||
cl_uint nvbus, nvslot, nvdomain;
|
||||
cl_int clret;
|
||||
|
||||
clret = clGetDeviceInfo(device, HWLOC_CL_DEVICE_TOPOLOGY_AMD, sizeof(amdtopo), &amdtopo, NULL);
|
||||
if (CL_SUCCESS == clret
|
||||
&& HWLOC_CL_DEVICE_TOPOLOGY_TYPE_PCIE_AMD == amdtopo.raw.type) {
|
||||
*domain = 0; /* can't do anything better */
|
||||
/* cl_device_topology_amd stores bus ID in cl_char, dont convert those signed char directly to unsigned int */
|
||||
*bus = (unsigned) (unsigned char) amdtopo.pcie.bus;
|
||||
*dev = (unsigned) (unsigned char) amdtopo.pcie.device;
|
||||
*func = (unsigned) (unsigned char) amdtopo.pcie.function;
|
||||
return 0;
|
||||
}
|
||||
|
||||
clret = clGetDeviceInfo(device, HWLOC_CL_DEVICE_PCI_BUS_ID_NV, sizeof(nvbus), &nvbus, NULL);
|
||||
if (CL_SUCCESS == clret) {
|
||||
clret = clGetDeviceInfo(device, HWLOC_CL_DEVICE_PCI_SLOT_ID_NV, sizeof(nvslot), &nvslot, NULL);
|
||||
if (CL_SUCCESS == clret) {
|
||||
clret = clGetDeviceInfo(device, HWLOC_CL_DEVICE_PCI_DOMAIN_ID_NV, sizeof(nvdomain), &nvdomain, NULL);
|
||||
if (CL_SUCCESS == clret) { /* available since CUDA 10.2 */
|
||||
*domain = nvdomain;
|
||||
} else {
|
||||
*domain = 0;
|
||||
}
|
||||
*bus = nvbus & 0xff;
|
||||
/* non-documented but used in many other projects */
|
||||
*dev = nvslot >> 3;
|
||||
*func = nvslot & 0x7;
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
/** \brief Get the CPU set of processors that are physically
|
||||
* close to OpenCL device \p device.
|
||||
*
|
||||
* Store in \p set the CPU-set describing the locality of the OpenCL device \p device.
|
||||
*
|
||||
* Topology \p topology and device \p device must match the local machine.
|
||||
* I/O devices detection and the OpenCL component are not needed in the topology.
|
||||
*
|
||||
* The function only returns the locality of the device.
|
||||
* If more information about the device is needed, OS objects should
|
||||
* be used instead, see hwloc_opencl_get_device_osdev()
|
||||
* and hwloc_opencl_get_device_osdev_by_index().
|
||||
*
|
||||
* This function is currently only implemented in a meaningful way for
|
||||
* Linux with the AMD or NVIDIA OpenCL implementation; other systems will simply
|
||||
* get a full cpuset.
|
||||
*/
|
||||
static __hwloc_inline int
|
||||
hwloc_opencl_get_device_cpuset(hwloc_topology_t topology __hwloc_attribute_unused,
|
||||
cl_device_id device __hwloc_attribute_unused,
|
||||
hwloc_cpuset_t set)
|
||||
{
|
||||
#if (defined HWLOC_LINUX_SYS)
|
||||
/* If we're on Linux, try AMD/NVIDIA extensions + the sysfs mechanism to get the local cpus */
|
||||
#define HWLOC_OPENCL_DEVICE_SYSFS_PATH_MAX 128
|
||||
char path[HWLOC_OPENCL_DEVICE_SYSFS_PATH_MAX];
|
||||
unsigned pcidomain, pcibus, pcidev, pcifunc;
|
||||
|
||||
if (!hwloc_topology_is_thissystem(topology)) {
|
||||
errno = EINVAL;
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (hwloc_opencl_get_device_pci_busid(device, &pcidomain, &pcibus, &pcidev, &pcifunc) < 0) {
|
||||
hwloc_bitmap_copy(set, hwloc_topology_get_complete_cpuset(topology));
|
||||
return 0;
|
||||
}
|
||||
|
||||
sprintf(path, "/sys/bus/pci/devices/%04x:%02x:%02x.%01x/local_cpus", pcidomain, pcibus, pcidev, pcifunc);
|
||||
if (hwloc_linux_read_path_as_cpumask(path, set) < 0
|
||||
|| hwloc_bitmap_iszero(set))
|
||||
hwloc_bitmap_copy(set, hwloc_topology_get_complete_cpuset(topology));
|
||||
#else
|
||||
/* Non-Linux systems simply get a full cpuset */
|
||||
hwloc_bitmap_copy(set, hwloc_topology_get_complete_cpuset(topology));
|
||||
#endif
|
||||
return 0;
|
||||
}
|
||||
|
||||
/** \brief Get the hwloc OS device object corresponding to the
|
||||
* OpenCL device for the given indexes.
|
||||
*
|
||||
* \return The hwloc OS device object describing the OpenCL device
|
||||
* whose platform index is \p platform_index,
|
||||
* and whose device index within this platform if \p device_index.
|
||||
* \return \c NULL if there is none.
|
||||
*
|
||||
* The topology \p topology does not necessarily have to match the current
|
||||
* machine. For instance the topology may be an XML import of a remote host.
|
||||
* I/O devices detection and the OpenCL component must be enabled in the topology.
|
||||
*
|
||||
* \note The corresponding PCI device object can be obtained by looking
|
||||
* at the OS device parent object (unless PCI devices are filtered out).
|
||||
*/
|
||||
static __hwloc_inline hwloc_obj_t
|
||||
hwloc_opencl_get_device_osdev_by_index(hwloc_topology_t topology,
|
||||
unsigned platform_index, unsigned device_index)
|
||||
{
|
||||
unsigned x = (unsigned) -1, y = (unsigned) -1;
|
||||
hwloc_obj_t osdev = NULL;
|
||||
while ((osdev = hwloc_get_next_osdev(topology, osdev)) != NULL) {
|
||||
if (HWLOC_OBJ_OSDEV_COPROC == osdev->attr->osdev.type
|
||||
&& osdev->name
|
||||
&& sscanf(osdev->name, "opencl%ud%u", &x, &y) == 2
|
||||
&& platform_index == x && device_index == y)
|
||||
return osdev;
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/** \brief Get the hwloc OS device object corresponding to OpenCL device \p deviceX.
|
||||
*
|
||||
* \return The hwloc OS device object corresponding to the given OpenCL device \p device.
|
||||
* \return \c NULL if none could be found, for instance
|
||||
* if required OpenCL attributes are not available.
|
||||
*
|
||||
* This function currently only works on AMD and NVIDIA OpenCL devices that support
|
||||
* relevant OpenCL extensions. hwloc_opencl_get_device_osdev_by_index()
|
||||
* should be preferred whenever possible, i.e. when platform and device index
|
||||
* are known.
|
||||
*
|
||||
* Topology \p topology and device \p device must match the local machine.
|
||||
* I/O devices detection and the OpenCL component must be enabled in the topology.
|
||||
* If not, the locality of the object may still be found using
|
||||
* hwloc_opencl_get_device_cpuset().
|
||||
*
|
||||
* \note This function cannot work if PCI devices are filtered out.
|
||||
*
|
||||
* \note The corresponding hwloc PCI device may be found by looking
|
||||
* at the result parent pointer (unless PCI devices are filtered out).
|
||||
*/
|
||||
static __hwloc_inline hwloc_obj_t
|
||||
hwloc_opencl_get_device_osdev(hwloc_topology_t topology __hwloc_attribute_unused,
|
||||
cl_device_id device __hwloc_attribute_unused)
|
||||
{
|
||||
hwloc_obj_t osdev;
|
||||
unsigned pcidomain, pcibus, pcidevice, pcifunc;
|
||||
|
||||
if (hwloc_opencl_get_device_pci_busid(device, &pcidomain, &pcibus, &pcidevice, &pcifunc) < 0) {
|
||||
errno = EINVAL;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
osdev = NULL;
|
||||
while ((osdev = hwloc_get_next_osdev(topology, osdev)) != NULL) {
|
||||
hwloc_obj_t pcidev = osdev->parent;
|
||||
if (strncmp(osdev->name, "opencl", 6))
|
||||
continue;
|
||||
if (pcidev
|
||||
&& pcidev->type == HWLOC_OBJ_PCI_DEVICE
|
||||
&& pcidev->attr->pcidev.domain == pcidomain
|
||||
&& pcidev->attr->pcidev.bus == pcibus
|
||||
&& pcidev->attr->pcidev.dev == pcidevice
|
||||
&& pcidev->attr->pcidev.func == pcifunc)
|
||||
return osdev;
|
||||
/* if PCI are filtered out, we need a info attr to match on */
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/** @} */
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
} /* extern "C" */
|
||||
#endif
|
||||
|
||||
|
||||
#endif /* HWLOC_OPENCL_H */
|
||||
152
macx64/mpi/openmpi/include/hwloc/openfabrics-verbs.h
Normal file
152
macx64/mpi/openmpi/include/hwloc/openfabrics-verbs.h
Normal file
@@ -0,0 +1,152 @@
|
||||
/*
|
||||
* Copyright © 2009 CNRS
|
||||
* Copyright © 2009-2021 Inria. All rights reserved.
|
||||
* Copyright © 2009-2010 Université Bordeaux
|
||||
* Copyright © 2009-2011 Cisco Systems, Inc. All rights reserved.
|
||||
* See COPYING in top-level directory.
|
||||
*/
|
||||
|
||||
/** \file
|
||||
* \brief Macros to help interaction between hwloc and OpenFabrics
|
||||
* verbs.
|
||||
*
|
||||
* Applications that use both hwloc and OpenFabrics verbs may want to
|
||||
* include this file so as to get topology information for OpenFabrics
|
||||
* hardware (InfiniBand, etc).
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef HWLOC_OPENFABRICS_VERBS_H
|
||||
#define HWLOC_OPENFABRICS_VERBS_H
|
||||
|
||||
#include "hwloc.h"
|
||||
#include "hwloc/autogen/config.h"
|
||||
#ifdef HWLOC_LINUX_SYS
|
||||
#include "hwloc/linux.h"
|
||||
#endif
|
||||
|
||||
#include <infiniband/verbs.h>
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
|
||||
/** \defgroup hwlocality_openfabrics Interoperability with OpenFabrics
|
||||
*
|
||||
* This interface offers ways to retrieve topology information about
|
||||
* OpenFabrics devices (InfiniBand, Omni-Path, usNIC, etc).
|
||||
*
|
||||
* @{
|
||||
*/
|
||||
|
||||
/** \brief Get the CPU set of processors that are physically
|
||||
* close to device \p ibdev.
|
||||
*
|
||||
* Store in \p set the CPU-set describing the locality of the OpenFabrics
|
||||
* device \p ibdev (InfiniBand, etc).
|
||||
*
|
||||
* Topology \p topology and device \p ibdev must match the local machine.
|
||||
* I/O devices detection is not needed in the topology.
|
||||
*
|
||||
* The function only returns the locality of the device.
|
||||
* If more information about the device is needed, OS objects should
|
||||
* be used instead, see hwloc_ibv_get_device_osdev()
|
||||
* and hwloc_ibv_get_device_osdev_by_name().
|
||||
*
|
||||
* This function is currently only implemented in a meaningful way for
|
||||
* Linux; other systems will simply get a full cpuset.
|
||||
*/
|
||||
static __hwloc_inline int
|
||||
hwloc_ibv_get_device_cpuset(hwloc_topology_t topology __hwloc_attribute_unused,
|
||||
struct ibv_device *ibdev, hwloc_cpuset_t set)
|
||||
{
|
||||
#ifdef HWLOC_LINUX_SYS
|
||||
/* If we're on Linux, use the verbs-provided sysfs mechanism to
|
||||
get the local cpus */
|
||||
#define HWLOC_OPENFABRICS_VERBS_SYSFS_PATH_MAX 128
|
||||
char path[HWLOC_OPENFABRICS_VERBS_SYSFS_PATH_MAX];
|
||||
|
||||
if (!hwloc_topology_is_thissystem(topology)) {
|
||||
errno = EINVAL;
|
||||
return -1;
|
||||
}
|
||||
|
||||
sprintf(path, "/sys/class/infiniband/%s/device/local_cpus",
|
||||
ibv_get_device_name(ibdev));
|
||||
if (hwloc_linux_read_path_as_cpumask(path, set) < 0
|
||||
|| hwloc_bitmap_iszero(set))
|
||||
hwloc_bitmap_copy(set, hwloc_topology_get_complete_cpuset(topology));
|
||||
#else
|
||||
/* Non-Linux systems simply get a full cpuset */
|
||||
hwloc_bitmap_copy(set, hwloc_topology_get_complete_cpuset(topology));
|
||||
#endif
|
||||
return 0;
|
||||
}
|
||||
|
||||
/** \brief Get the hwloc OS device object corresponding to the OpenFabrics
|
||||
* device named \p ibname.
|
||||
*
|
||||
* \return The hwloc OS device object describing the OpenFabrics device
|
||||
* (InfiniBand, Omni-Path, usNIC, etc) whose name is \p ibname
|
||||
* (mlx5_0, hfi1_0, usnic_0, qib0, etc).
|
||||
* \return \c NULL if none could be found.
|
||||
*
|
||||
* The name \p ibname is usually obtained from ibv_get_device_name().
|
||||
*
|
||||
* The topology \p topology does not necessarily have to match the current
|
||||
* machine. For instance the topology may be an XML import of a remote host.
|
||||
* I/O devices detection must be enabled in the topology.
|
||||
*
|
||||
* \note The corresponding PCI device object can be obtained by looking
|
||||
* at the OS device parent object.
|
||||
*/
|
||||
static __hwloc_inline hwloc_obj_t
|
||||
hwloc_ibv_get_device_osdev_by_name(hwloc_topology_t topology,
|
||||
const char *ibname)
|
||||
{
|
||||
hwloc_obj_t osdev = NULL;
|
||||
while ((osdev = hwloc_get_next_osdev(topology, osdev)) != NULL) {
|
||||
if (HWLOC_OBJ_OSDEV_OPENFABRICS == osdev->attr->osdev.type
|
||||
&& osdev->name && !strcmp(ibname, osdev->name))
|
||||
return osdev;
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/** \brief Get the hwloc OS device object corresponding to the OpenFabrics
|
||||
* device \p ibdev.
|
||||
*
|
||||
* \return The hwloc OS device object describing the OpenFabrics
|
||||
* device \p ibdev (InfiniBand, etc).
|
||||
* \return \c NULL if none could be found.
|
||||
*
|
||||
* Topology \p topology and device \p ibdev must match the local machine.
|
||||
* I/O devices detection must be enabled in the topology.
|
||||
* If not, the locality of the object may still be found using
|
||||
* hwloc_ibv_get_device_cpuset().
|
||||
*
|
||||
* \note The corresponding PCI device object can be obtained by looking
|
||||
* at the OS device parent object.
|
||||
*/
|
||||
static __hwloc_inline hwloc_obj_t
|
||||
hwloc_ibv_get_device_osdev(hwloc_topology_t topology,
|
||||
struct ibv_device *ibdev)
|
||||
{
|
||||
if (!hwloc_topology_is_thissystem(topology)) {
|
||||
errno = EINVAL;
|
||||
return NULL;
|
||||
}
|
||||
return hwloc_ibv_get_device_osdev_by_name(topology, ibv_get_device_name(ibdev));
|
||||
}
|
||||
|
||||
/** @} */
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
} /* extern "C" */
|
||||
#endif
|
||||
|
||||
|
||||
#endif /* HWLOC_OPENFABRICS_VERBS_H */
|
||||
689
macx64/mpi/openmpi/include/hwloc/plugins.h
Normal file
689
macx64/mpi/openmpi/include/hwloc/plugins.h
Normal file
@@ -0,0 +1,689 @@
|
||||
/*
|
||||
* Copyright © 2013-2021 Inria. All rights reserved.
|
||||
* Copyright © 2016 Cisco Systems, Inc. All rights reserved.
|
||||
* See COPYING in top-level directory.
|
||||
*/
|
||||
|
||||
#ifndef HWLOC_PLUGINS_H
|
||||
#define HWLOC_PLUGINS_H
|
||||
|
||||
/** \file
|
||||
* \brief Public interface for building hwloc plugins.
|
||||
*/
|
||||
|
||||
struct hwloc_backend;
|
||||
|
||||
#include "hwloc.h"
|
||||
|
||||
#ifdef HWLOC_INSIDE_PLUGIN
|
||||
/* needed for hwloc_plugin_check_namespace() */
|
||||
#ifdef HWLOC_HAVE_LTDL
|
||||
#include <ltdl.h>
|
||||
#else
|
||||
#include <dlfcn.h>
|
||||
#endif
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
/** \defgroup hwlocality_disc_components Components and Plugins: Discovery components
|
||||
*
|
||||
* \note These structures and functions may change when ::HWLOC_COMPONENT_ABI is modified.
|
||||
*
|
||||
* @{
|
||||
*/
|
||||
|
||||
/** \brief Discovery component structure
|
||||
*
|
||||
* This is the major kind of components, taking care of the discovery.
|
||||
* They are registered by generic components, either statically-built or as plugins.
|
||||
*/
|
||||
struct hwloc_disc_component {
|
||||
/** \brief Name.
|
||||
* If this component is built as a plugin, this name does not have to match the plugin filename.
|
||||
*/
|
||||
const char *name;
|
||||
|
||||
/** \brief Discovery phases performed by this component.
|
||||
* OR'ed set of ::hwloc_disc_phase_t
|
||||
*/
|
||||
unsigned phases;
|
||||
|
||||
/** \brief Component phases to exclude, as an OR'ed set of ::hwloc_disc_phase_t.
|
||||
*
|
||||
* For a GLOBAL component, this usually includes all other phases (\c ~UL).
|
||||
*
|
||||
* Other components only exclude types that may bring conflicting
|
||||
* topology information. MISC components should likely not be excluded
|
||||
* since they usually bring non-primary additional information.
|
||||
*/
|
||||
unsigned excluded_phases;
|
||||
|
||||
/** \brief Instantiate callback to create a backend from the component.
|
||||
* Parameters data1, data2, data3 are NULL except for components
|
||||
* that have special enabling routines such as hwloc_topology_set_xml(). */
|
||||
struct hwloc_backend * (*instantiate)(struct hwloc_topology *topology, struct hwloc_disc_component *component, unsigned excluded_phases, const void *data1, const void *data2, const void *data3);
|
||||
|
||||
/** \brief Component priority.
|
||||
* Used to sort topology->components, higher priority first.
|
||||
* Also used to decide between two components with the same name.
|
||||
*
|
||||
* Usual values are
|
||||
* 50 for native OS (or platform) components,
|
||||
* 45 for x86,
|
||||
* 40 for no-OS fallback,
|
||||
* 30 for global components (xml, synthetic),
|
||||
* 20 for pci,
|
||||
* 10 for other misc components (opencl etc.).
|
||||
*/
|
||||
unsigned priority;
|
||||
|
||||
/** \brief Enabled by default.
|
||||
* If unset, if will be disabled unless explicitly requested.
|
||||
*/
|
||||
unsigned enabled_by_default;
|
||||
|
||||
/** \private Used internally to list components by priority on topology->components
|
||||
* (the component structure is usually read-only,
|
||||
* the core copies it before using this field for queueing)
|
||||
*/
|
||||
struct hwloc_disc_component * next;
|
||||
};
|
||||
|
||||
/** @} */
|
||||
|
||||
|
||||
|
||||
|
||||
/** \defgroup hwlocality_disc_backends Components and Plugins: Discovery backends
|
||||
*
|
||||
* \note These structures and functions may change when ::HWLOC_COMPONENT_ABI is modified.
|
||||
*
|
||||
* @{
|
||||
*/
|
||||
|
||||
/** \brief Discovery phase */
|
||||
typedef enum hwloc_disc_phase_e {
|
||||
/** \brief xml or synthetic, platform-specific components such as bgq.
|
||||
* Discovers everything including CPU, memory, I/O and everything else.
|
||||
* A component with a Global phase usually excludes all other phases.
|
||||
* \hideinitializer */
|
||||
HWLOC_DISC_PHASE_GLOBAL = (1U<<0),
|
||||
|
||||
/** \brief CPU discovery.
|
||||
* \hideinitializer */
|
||||
HWLOC_DISC_PHASE_CPU = (1U<<1),
|
||||
|
||||
/** \brief Attach memory to existing CPU objects.
|
||||
* \hideinitializer */
|
||||
HWLOC_DISC_PHASE_MEMORY = (1U<<2),
|
||||
|
||||
/** \brief Attach PCI devices and bridges to existing CPU objects.
|
||||
* \hideinitializer */
|
||||
HWLOC_DISC_PHASE_PCI = (1U<<3),
|
||||
|
||||
/** \brief I/O discovery that requires PCI devices (OS devices such as OpenCL, CUDA, etc.).
|
||||
* \hideinitializer */
|
||||
HWLOC_DISC_PHASE_IO = (1U<<4),
|
||||
|
||||
/** \brief Misc objects that gets added below anything else.
|
||||
* \hideinitializer */
|
||||
HWLOC_DISC_PHASE_MISC = (1U<<5),
|
||||
|
||||
/** \brief Annotating existing objects, adding distances, etc.
|
||||
* \hideinitializer */
|
||||
HWLOC_DISC_PHASE_ANNOTATE = (1U<<6),
|
||||
|
||||
/** \brief Final tweaks to a ready-to-use topology.
|
||||
* This phase runs once the topology is loaded, before it is returned to the topology.
|
||||
* Hence it may only use the main hwloc API for modifying the topology,
|
||||
* for instance by restricting it, adding info attributes, etc.
|
||||
* \hideinitializer */
|
||||
HWLOC_DISC_PHASE_TWEAK = (1U<<7)
|
||||
} hwloc_disc_phase_t;
|
||||
|
||||
/** \brief Discovery status flags */
|
||||
enum hwloc_disc_status_flag_e {
|
||||
/** \brief The sets of allowed resources were already retrieved \hideinitializer */
|
||||
HWLOC_DISC_STATUS_FLAG_GOT_ALLOWED_RESOURCES = (1UL<<1)
|
||||
};
|
||||
|
||||
/** \brief Discovery status structure
|
||||
*
|
||||
* Used by the core and backends to inform about what has been/is being done
|
||||
* during the discovery process.
|
||||
*/
|
||||
struct hwloc_disc_status {
|
||||
/** \brief The current discovery phase that is performed.
|
||||
* Must match one of the phases in the component phases field.
|
||||
*/
|
||||
hwloc_disc_phase_t phase;
|
||||
|
||||
/** \brief Dynamically excluded phases.
|
||||
* If a component decides during discovery that some phases are no longer needed.
|
||||
*/
|
||||
unsigned excluded_phases;
|
||||
|
||||
/** \brief OR'ed set of hwloc_disc_status_flag_e */
|
||||
unsigned long flags;
|
||||
};
|
||||
|
||||
/** \brief Discovery backend structure
|
||||
*
|
||||
* A backend is the instantiation of a discovery component.
|
||||
* When a component gets enabled for a topology,
|
||||
* its instantiate() callback creates a backend.
|
||||
*
|
||||
* hwloc_backend_alloc() initializes all fields to default values
|
||||
* that the component may change (except "component" and "next")
|
||||
* before enabling the backend with hwloc_backend_enable().
|
||||
*
|
||||
* Most backends assume that the topology is_thissystem flag is
|
||||
* set because they talk to the underlying operating system.
|
||||
* However they may still be used in topologies without the
|
||||
* is_thissystem flag for debugging reasons.
|
||||
* In practice, they are usually auto-disabled in such cases
|
||||
* (excluded by xml or synthetic backends, or by environment
|
||||
* variables when changing the Linux fsroot or the x86 cpuid path).
|
||||
*/
|
||||
struct hwloc_backend {
|
||||
/** \private Reserved for the core, set by hwloc_backend_alloc() */
|
||||
struct hwloc_disc_component * component;
|
||||
/** \private Reserved for the core, set by hwloc_backend_enable() */
|
||||
struct hwloc_topology * topology;
|
||||
/** \private Reserved for the core. Set to 1 if forced through envvar, 0 otherwise. */
|
||||
int envvar_forced;
|
||||
/** \private Reserved for the core. Used internally to list backends topology->backends. */
|
||||
struct hwloc_backend * next;
|
||||
|
||||
/** \brief Discovery phases performed by this component, possibly without some of them if excluded by other components.
|
||||
* OR'ed set of ::hwloc_disc_phase_t
|
||||
*/
|
||||
unsigned phases;
|
||||
|
||||
/** \brief Backend flags, currently always 0. */
|
||||
unsigned long flags;
|
||||
|
||||
/** \brief Backend-specific 'is_thissystem' property.
|
||||
* Set to 0 if the backend disables the thissystem flag for this topology
|
||||
* (e.g. loading from xml or synthetic string,
|
||||
* or using a different fsroot on Linux, or a x86 CPUID dump).
|
||||
* Set to -1 if the backend doesn't care (default).
|
||||
*/
|
||||
int is_thissystem;
|
||||
|
||||
/** \brief Backend private data, or NULL if none. */
|
||||
void * private_data;
|
||||
/** \brief Callback for freeing the private_data.
|
||||
* May be NULL.
|
||||
*/
|
||||
void (*disable)(struct hwloc_backend *backend);
|
||||
|
||||
/** \brief Main discovery callback.
|
||||
* returns -1 on error, either because it couldn't add its objects ot the existing topology,
|
||||
* or because of an actual discovery/gathering failure.
|
||||
* May be NULL.
|
||||
*/
|
||||
int (*discover)(struct hwloc_backend *backend, struct hwloc_disc_status *status);
|
||||
|
||||
/** \brief Callback to retrieve the locality of a PCI object.
|
||||
* Called by the PCI core when attaching PCI hierarchy to CPU objects.
|
||||
* May be NULL.
|
||||
*/
|
||||
int (*get_pci_busid_cpuset)(struct hwloc_backend *backend, struct hwloc_pcidev_attr_s *busid, hwloc_bitmap_t cpuset);
|
||||
};
|
||||
|
||||
/** \brief Allocate a backend structure, set good default values, initialize backend->component and topology, etc.
|
||||
* The caller will then modify whatever needed, and call hwloc_backend_enable().
|
||||
*/
|
||||
HWLOC_DECLSPEC struct hwloc_backend * hwloc_backend_alloc(struct hwloc_topology *topology, struct hwloc_disc_component *component);
|
||||
|
||||
/** \brief Enable a previously allocated and setup backend. */
|
||||
HWLOC_DECLSPEC int hwloc_backend_enable(struct hwloc_backend *backend);
|
||||
|
||||
/** @} */
|
||||
|
||||
|
||||
|
||||
|
||||
/** \defgroup hwlocality_generic_components Components and Plugins: Generic components
|
||||
*
|
||||
* \note These structures and functions may change when ::HWLOC_COMPONENT_ABI is modified.
|
||||
*
|
||||
* @{
|
||||
*/
|
||||
|
||||
/** \brief Generic component type */
|
||||
typedef enum hwloc_component_type_e {
|
||||
/** \brief The data field must point to a struct hwloc_disc_component. */
|
||||
HWLOC_COMPONENT_TYPE_DISC,
|
||||
|
||||
/** \brief The data field must point to a struct hwloc_xml_component. */
|
||||
HWLOC_COMPONENT_TYPE_XML
|
||||
} hwloc_component_type_t;
|
||||
|
||||
/** \brief Generic component structure
|
||||
*
|
||||
* Generic components structure, either statically listed by configure in static-components.h
|
||||
* or dynamically loaded as a plugin.
|
||||
*/
|
||||
struct hwloc_component {
|
||||
/** \brief Component ABI version, set to ::HWLOC_COMPONENT_ABI */
|
||||
unsigned abi;
|
||||
|
||||
/** \brief Process-wide component initialization callback.
|
||||
*
|
||||
* This optional callback is called when the component is registered
|
||||
* to the hwloc core (after loading the plugin).
|
||||
*
|
||||
* When the component is built as a plugin, this callback
|
||||
* should call hwloc_check_plugin_namespace()
|
||||
* and return an negative error code on error.
|
||||
*
|
||||
* \p flags is always 0 for now.
|
||||
*
|
||||
* \return 0 on success, or a negative code on error.
|
||||
*
|
||||
* \note If the component uses ltdl for loading its own plugins,
|
||||
* it should load/unload them only in init() and finalize(),
|
||||
* to avoid race conditions with hwloc's use of ltdl.
|
||||
*/
|
||||
int (*init)(unsigned long flags);
|
||||
|
||||
/** \brief Process-wide component termination callback.
|
||||
*
|
||||
* This optional callback is called after unregistering the component
|
||||
* from the hwloc core (before unloading the plugin).
|
||||
*
|
||||
* \p flags is always 0 for now.
|
||||
*
|
||||
* \note If the component uses ltdl for loading its own plugins,
|
||||
* it should load/unload them only in init() and finalize(),
|
||||
* to avoid race conditions with hwloc's use of ltdl.
|
||||
*/
|
||||
void (*finalize)(unsigned long flags);
|
||||
|
||||
/** \brief Component type */
|
||||
hwloc_component_type_t type;
|
||||
|
||||
/** \brief Component flags, unused for now */
|
||||
unsigned long flags;
|
||||
|
||||
/** \brief Component data, pointing to a struct hwloc_disc_component or struct hwloc_xml_component. */
|
||||
void * data;
|
||||
};
|
||||
|
||||
/** @} */
|
||||
|
||||
|
||||
|
||||
|
||||
/** \defgroup hwlocality_components_core_funcs Components and Plugins: Core functions to be used by components
|
||||
*
|
||||
* \note These structures and functions may change when ::HWLOC_COMPONENT_ABI is modified.
|
||||
*
|
||||
* @{
|
||||
*/
|
||||
|
||||
/** \brief Check whether error messages are hidden.
|
||||
*
|
||||
* Callers should print critical error messages
|
||||
* (e.g. invalid hw topo info, invalid config)
|
||||
* only if this function returns strictly less than 2.
|
||||
*
|
||||
* Callers should print non-critical error messages
|
||||
* (e.g. failure to initialize CUDA)
|
||||
* if this function returns 0.
|
||||
*
|
||||
* This function return 1 by default (show critical only),
|
||||
* 0 in lstopo (show all),
|
||||
* or anything set in HWLOC_HIDE_ERRORS in the environment.
|
||||
*/
|
||||
HWLOC_DECLSPEC int hwloc_hide_errors(void);
|
||||
|
||||
/** \brief Add an object to the topology.
|
||||
*
|
||||
* Insert new object \p obj in the topology starting under existing object \p root
|
||||
* (if \c NULL, the topology root object is used).
|
||||
*
|
||||
* It is sorted along the tree of other objects according to the inclusion of
|
||||
* cpusets, to eventually be added as a child of the smallest object including
|
||||
* this object.
|
||||
*
|
||||
* If the cpuset is empty, the type of the object (and maybe some attributes)
|
||||
* must be enough to find where to insert the object. This is especially true
|
||||
* for NUMA nodes with memory and no CPUs.
|
||||
*
|
||||
* The given object should not have children.
|
||||
*
|
||||
* This shall only be called before levels are built.
|
||||
*
|
||||
* The caller should check whether the object type is filtered-out before calling this function.
|
||||
*
|
||||
* The topology cpuset/nodesets will be enlarged to include the object sets.
|
||||
*
|
||||
* \p reason is a unique string identifying where and why this insertion call was performed
|
||||
* (it will be displayed in case of internal insertion error).
|
||||
*
|
||||
* Returns the object on success.
|
||||
* Returns NULL and frees obj on error.
|
||||
* Returns another object and frees obj if it was merged with an identical pre-existing object.
|
||||
*/
|
||||
HWLOC_DECLSPEC hwloc_obj_t
|
||||
hwloc__insert_object_by_cpuset(struct hwloc_topology *topology, hwloc_obj_t root,
|
||||
hwloc_obj_t obj, const char *reason);
|
||||
|
||||
/** \brief Insert an object somewhere in the topology.
|
||||
*
|
||||
* It is added as the last child of the given parent.
|
||||
* The cpuset is completely ignored, so strange objects such as I/O devices should
|
||||
* preferably be inserted with this.
|
||||
*
|
||||
* When used for "normal" children with cpusets (when importing from XML
|
||||
* when duplicating a topology), the caller should make sure that:
|
||||
* - children are inserted in order,
|
||||
* - children cpusets do not intersect.
|
||||
*
|
||||
* The given object may have normal, I/O or Misc children, as long as they are in order as well.
|
||||
* These children must have valid parent and next_sibling pointers.
|
||||
*
|
||||
* The caller should check whether the object type is filtered-out before calling this function.
|
||||
*/
|
||||
HWLOC_DECLSPEC void hwloc_insert_object_by_parent(struct hwloc_topology *topology, hwloc_obj_t parent, hwloc_obj_t obj);
|
||||
|
||||
/** \brief Allocate and initialize an object of the given type and physical index.
|
||||
*
|
||||
* If \p os_index is unknown or irrelevant, use \c HWLOC_UNKNOWN_INDEX.
|
||||
*/
|
||||
HWLOC_DECLSPEC hwloc_obj_t hwloc_alloc_setup_object(hwloc_topology_t topology, hwloc_obj_type_t type, unsigned os_index);
|
||||
|
||||
/** \brief Setup object cpusets/nodesets by OR'ing its children.
|
||||
*
|
||||
* Used when adding an object late in the topology.
|
||||
* Will update the new object by OR'ing all its new children sets.
|
||||
*
|
||||
* Used when PCI backend adds a hostbridge parent, when distances
|
||||
* add a new Group, etc.
|
||||
*/
|
||||
HWLOC_DECLSPEC int hwloc_obj_add_children_sets(hwloc_obj_t obj);
|
||||
|
||||
/** \brief Request a reconnection of children and levels in the topology.
|
||||
*
|
||||
* May be used by backends during discovery if they need arrays or lists
|
||||
* of object within levels or children to be fully connected.
|
||||
*
|
||||
* \p flags is currently unused, must 0.
|
||||
*/
|
||||
HWLOC_DECLSPEC int hwloc_topology_reconnect(hwloc_topology_t topology, unsigned long flags __hwloc_attribute_unused);
|
||||
|
||||
/** \brief Make sure that plugins can lookup core symbols.
|
||||
*
|
||||
* This is a sanity check to avoid lazy-lookup failures when libhwloc
|
||||
* is loaded within a plugin, and later tries to load its own plugins.
|
||||
* This may fail (and abort the program) if libhwloc symbols are in a
|
||||
* private namespace.
|
||||
*
|
||||
* \return 0 on success.
|
||||
* \return -1 if the plugin cannot be successfully loaded. The caller
|
||||
* plugin init() callback should return a negative error code as well.
|
||||
*
|
||||
* Plugins should call this function in their init() callback to avoid
|
||||
* later crashes if lazy symbol resolution is used by the upper layer that
|
||||
* loaded hwloc (e.g. OpenCL implementations using dlopen with RTLD_LAZY).
|
||||
*
|
||||
* \note The build system must define HWLOC_INSIDE_PLUGIN if and only if
|
||||
* building the caller as a plugin.
|
||||
*
|
||||
* \note This function should remain inline so plugins can call it even
|
||||
* when they cannot find libhwloc symbols.
|
||||
*/
|
||||
static __hwloc_inline int
|
||||
hwloc_plugin_check_namespace(const char *pluginname __hwloc_attribute_unused, const char *symbol __hwloc_attribute_unused)
|
||||
{
|
||||
#ifdef HWLOC_INSIDE_PLUGIN
|
||||
void *sym;
|
||||
#ifdef HWLOC_HAVE_LTDL
|
||||
lt_dlhandle handle = lt_dlopen(NULL);
|
||||
#else
|
||||
void *handle = dlopen(NULL, RTLD_NOW|RTLD_LOCAL);
|
||||
#endif
|
||||
if (!handle)
|
||||
/* cannot check, assume things will work */
|
||||
return 0;
|
||||
#ifdef HWLOC_HAVE_LTDL
|
||||
sym = lt_dlsym(handle, symbol);
|
||||
lt_dlclose(handle);
|
||||
#else
|
||||
sym = dlsym(handle, symbol);
|
||||
dlclose(handle);
|
||||
#endif
|
||||
if (!sym) {
|
||||
static int verboseenv_checked = 0;
|
||||
static int verboseenv_value = 0;
|
||||
if (!verboseenv_checked) {
|
||||
const char *verboseenv = getenv("HWLOC_PLUGINS_VERBOSE");
|
||||
verboseenv_value = verboseenv ? atoi(verboseenv) : 0;
|
||||
verboseenv_checked = 1;
|
||||
}
|
||||
if (verboseenv_value)
|
||||
fprintf(stderr, "Plugin `%s' disabling itself because it cannot find the `%s' core symbol.\n",
|
||||
pluginname, symbol);
|
||||
return -1;
|
||||
}
|
||||
#endif /* HWLOC_INSIDE_PLUGIN */
|
||||
return 0;
|
||||
}
|
||||
|
||||
/** @} */
|
||||
|
||||
|
||||
|
||||
|
||||
/** \defgroup hwlocality_components_filtering Components and Plugins: Filtering objects
|
||||
*
|
||||
* \note These structures and functions may change when ::HWLOC_COMPONENT_ABI is modified.
|
||||
*
|
||||
* @{
|
||||
*/
|
||||
|
||||
/** \brief Check whether the given PCI device classid is important.
|
||||
*
|
||||
* \return 1 if important, 0 otherwise.
|
||||
*/
|
||||
static __hwloc_inline int
|
||||
hwloc_filter_check_pcidev_subtype_important(unsigned classid)
|
||||
{
|
||||
unsigned baseclass = classid >> 8;
|
||||
return (baseclass == 0x03 /* PCI_BASE_CLASS_DISPLAY */
|
||||
|| baseclass == 0x02 /* PCI_BASE_CLASS_NETWORK */
|
||||
|| baseclass == 0x01 /* PCI_BASE_CLASS_STORAGE */
|
||||
|| baseclass == 0x00 /* Unclassified, for Atos/Bull BXI */
|
||||
|| baseclass == 0x0b /* PCI_BASE_CLASS_PROCESSOR */
|
||||
|| classid == 0x0c04 /* PCI_CLASS_SERIAL_FIBER */
|
||||
|| classid == 0x0c06 /* PCI_CLASS_SERIAL_INFINIBAND */
|
||||
|| baseclass == 0x06 /* PCI_BASE_CLASS_BRIDGE with non-PCI downstream. the core will drop the useless ones later */
|
||||
|| baseclass == 0x12 /* Processing Accelerators */);
|
||||
}
|
||||
|
||||
/** \brief Check whether the given OS device subtype is important.
|
||||
*
|
||||
* \return 1 if important, 0 otherwise.
|
||||
*/
|
||||
static __hwloc_inline int
|
||||
hwloc_filter_check_osdev_subtype_important(hwloc_obj_osdev_type_t subtype)
|
||||
{
|
||||
return (subtype != HWLOC_OBJ_OSDEV_DMA);
|
||||
}
|
||||
|
||||
/** \brief Check whether a non-I/O object type should be filtered-out.
|
||||
*
|
||||
* Cannot be used for I/O objects.
|
||||
*
|
||||
* \return 1 if the object type should be kept, 0 otherwise.
|
||||
*/
|
||||
static __hwloc_inline int
|
||||
hwloc_filter_check_keep_object_type(hwloc_topology_t topology, hwloc_obj_type_t type)
|
||||
{
|
||||
enum hwloc_type_filter_e filter = HWLOC_TYPE_FILTER_KEEP_NONE;
|
||||
hwloc_topology_get_type_filter(topology, type, &filter);
|
||||
assert(filter != HWLOC_TYPE_FILTER_KEEP_IMPORTANT); /* IMPORTANT only used for I/O */
|
||||
return filter == HWLOC_TYPE_FILTER_KEEP_NONE ? 0 : 1;
|
||||
}
|
||||
|
||||
/** \brief Check whether the given object should be filtered-out.
|
||||
*
|
||||
* \return 1 if the object type should be kept, 0 otherwise.
|
||||
*/
|
||||
static __hwloc_inline int
|
||||
hwloc_filter_check_keep_object(hwloc_topology_t topology, hwloc_obj_t obj)
|
||||
{
|
||||
hwloc_obj_type_t type = obj->type;
|
||||
enum hwloc_type_filter_e filter = HWLOC_TYPE_FILTER_KEEP_NONE;
|
||||
hwloc_topology_get_type_filter(topology, type, &filter);
|
||||
if (filter == HWLOC_TYPE_FILTER_KEEP_NONE)
|
||||
return 0;
|
||||
if (filter == HWLOC_TYPE_FILTER_KEEP_IMPORTANT) {
|
||||
if (type == HWLOC_OBJ_PCI_DEVICE)
|
||||
return hwloc_filter_check_pcidev_subtype_important(obj->attr->pcidev.class_id);
|
||||
if (type == HWLOC_OBJ_OS_DEVICE)
|
||||
return hwloc_filter_check_osdev_subtype_important(obj->attr->osdev.type);
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
/** @} */
|
||||
|
||||
|
||||
|
||||
|
||||
/** \defgroup hwlocality_components_pcidisc Components and Plugins: helpers for PCI discovery
|
||||
*
|
||||
* \note These structures and functions may change when ::HWLOC_COMPONENT_ABI is modified.
|
||||
*
|
||||
* @{
|
||||
*/
|
||||
|
||||
/** \brief Return the offset of the given capability in the PCI config space buffer
|
||||
*
|
||||
* This function requires a 256-bytes config space. Unknown/unavailable bytes should be set to 0xff.
|
||||
*/
|
||||
HWLOC_DECLSPEC unsigned hwloc_pcidisc_find_cap(const unsigned char *config, unsigned cap);
|
||||
|
||||
/** \brief Fill linkspeed by reading the PCI config space where PCI_CAP_ID_EXP is at position offset.
|
||||
*
|
||||
* Needs 20 bytes of EXP capability block starting at offset in the config space
|
||||
* for registers up to link status.
|
||||
*/
|
||||
HWLOC_DECLSPEC int hwloc_pcidisc_find_linkspeed(const unsigned char *config, unsigned offset, float *linkspeed);
|
||||
|
||||
/** \brief Return the hwloc object type (PCI device or Bridge) for the given class and configuration space.
|
||||
*
|
||||
* This function requires 16 bytes of common configuration header at the beginning of config.
|
||||
*/
|
||||
HWLOC_DECLSPEC hwloc_obj_type_t hwloc_pcidisc_check_bridge_type(unsigned device_class, const unsigned char *config);
|
||||
|
||||
/** \brief Fills the attributes of the given PCI bridge using the given PCI config space.
|
||||
*
|
||||
* This function requires 32 bytes of common configuration header at the beginning of config.
|
||||
*
|
||||
* Returns -1 and destroys /p obj if bridge fields are invalid.
|
||||
*/
|
||||
HWLOC_DECLSPEC int hwloc_pcidisc_find_bridge_buses(unsigned domain, unsigned bus, unsigned dev, unsigned func,
|
||||
unsigned *secondary_busp, unsigned *subordinate_busp,
|
||||
const unsigned char *config);
|
||||
|
||||
/** \brief Insert a PCI object in the given PCI tree by looking at PCI bus IDs.
|
||||
*
|
||||
* If \p treep points to \c NULL, the new object is inserted there.
|
||||
*/
|
||||
HWLOC_DECLSPEC void hwloc_pcidisc_tree_insert_by_busid(struct hwloc_obj **treep, struct hwloc_obj *obj);
|
||||
|
||||
/** \brief Add some hostbridges on top of the given tree of PCI objects and attach them to the topology.
|
||||
*
|
||||
* Other backends may lookup PCI objects or localities (for instance to attach OS devices)
|
||||
* by using hwloc_pcidisc_find_by_busid() or hwloc_pcidisc_find_busid_parent().
|
||||
*/
|
||||
HWLOC_DECLSPEC int hwloc_pcidisc_tree_attach(struct hwloc_topology *topology, struct hwloc_obj *tree);
|
||||
|
||||
/** @} */
|
||||
|
||||
|
||||
|
||||
|
||||
/** \defgroup hwlocality_components_pcifind Components and Plugins: finding PCI objects during other discoveries
|
||||
*
|
||||
* \note These structures and functions may change when ::HWLOC_COMPONENT_ABI is modified.
|
||||
*
|
||||
* @{
|
||||
*/
|
||||
|
||||
/** \brief Find the object or a parent of a PCI bus ID.
|
||||
*
|
||||
* When attaching a new object (typically an OS device) whose locality
|
||||
* is specified by PCI bus ID, this function returns the PCI object
|
||||
* to use as a parent for attaching.
|
||||
*
|
||||
* If the exact PCI device with this bus ID exists, it is returned.
|
||||
* Otherwise (for instance if it was filtered out), the function returns
|
||||
* another object with similar locality (for instance a parent bridge,
|
||||
* or the local CPU Package).
|
||||
*/
|
||||
HWLOC_DECLSPEC struct hwloc_obj * hwloc_pci_find_parent_by_busid(struct hwloc_topology *topology, unsigned domain, unsigned bus, unsigned dev, unsigned func);
|
||||
|
||||
/** \brief Find the PCI device or bridge matching a PCI bus ID exactly.
|
||||
*
|
||||
* This is useful for adding specific information about some objects
|
||||
* based on their PCI id. When it comes to attaching objects based on
|
||||
* PCI locality, hwloc_pci_find_parent_by_busid() should be preferred.
|
||||
*/
|
||||
HWLOC_DECLSPEC struct hwloc_obj * hwloc_pci_find_by_busid(struct hwloc_topology *topology, unsigned domain, unsigned bus, unsigned dev, unsigned func);
|
||||
|
||||
/** \brief Handle to a new distances structure during its addition to the topology. */
|
||||
typedef void * hwloc_backend_distances_add_handle_t;
|
||||
|
||||
/** \brief Create a new empty distances structure.
|
||||
*
|
||||
* This is identical to hwloc_distances_add_create()
|
||||
* but this variant is designed for backend inserting
|
||||
* distances during topology discovery.
|
||||
*/
|
||||
HWLOC_DECLSPEC hwloc_backend_distances_add_handle_t
|
||||
hwloc_backend_distances_add_create(hwloc_topology_t topology,
|
||||
const char *name, unsigned long kind,
|
||||
unsigned long flags);
|
||||
|
||||
/** \brief Specify the objects and values in a new empty distances structure.
|
||||
*
|
||||
* This is similar to hwloc_distances_add_values()
|
||||
* but this variant is designed for backend inserting
|
||||
* distances during topology discovery.
|
||||
*
|
||||
* The only semantical difference is that \p objs and \p values
|
||||
* are not duplicated, but directly attached to the topology.
|
||||
* On success, these arrays are given to the core and should not
|
||||
* ever be freed by the caller anymore.
|
||||
*/
|
||||
HWLOC_DECLSPEC int
|
||||
hwloc_backend_distances_add_values(hwloc_topology_t topology,
|
||||
hwloc_backend_distances_add_handle_t handle,
|
||||
unsigned nbobjs, hwloc_obj_t *objs,
|
||||
hwloc_uint64_t *values,
|
||||
unsigned long flags);
|
||||
|
||||
/** \brief Commit a new distances structure.
|
||||
*
|
||||
* This is similar to hwloc_distances_add_commit()
|
||||
* but this variant is designed for backend inserting
|
||||
* distances during topology discovery.
|
||||
*/
|
||||
HWLOC_DECLSPEC int
|
||||
hwloc_backend_distances_add_commit(hwloc_topology_t topology,
|
||||
hwloc_backend_distances_add_handle_t handle,
|
||||
unsigned long flags);
|
||||
|
||||
/** @} */
|
||||
|
||||
|
||||
|
||||
|
||||
#endif /* HWLOC_PLUGINS_H */
|
||||
901
macx64/mpi/openmpi/include/hwloc/rename.h
Normal file
901
macx64/mpi/openmpi/include/hwloc/rename.h
Normal file
@@ -0,0 +1,901 @@
|
||||
/*
|
||||
* Copyright © 2009-2011 Cisco Systems, Inc. All rights reserved.
|
||||
* Copyright © 2010-2021 Inria. All rights reserved.
|
||||
* See COPYING in top-level directory.
|
||||
*/
|
||||
|
||||
#ifndef HWLOC_RENAME_H
|
||||
#define HWLOC_RENAME_H
|
||||
|
||||
#include "hwloc/autogen/config.h"
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
|
||||
/* Only enact these defines if we're actually renaming the symbols
|
||||
(i.e., avoid trying to have no-op defines if we're *not*
|
||||
renaming). */
|
||||
|
||||
#if HWLOC_SYM_TRANSFORM
|
||||
|
||||
/* Use a preprocessor two-step in order to get the prefixing right.
|
||||
Make 2 macros: HWLOC_NAME and HWLOC_NAME_CAPS for renaming
|
||||
things. */
|
||||
|
||||
#define HWLOC_MUNGE_NAME(a, b) HWLOC_MUNGE_NAME2(a, b)
|
||||
#define HWLOC_MUNGE_NAME2(a, b) a ## b
|
||||
#define HWLOC_NAME(name) HWLOC_MUNGE_NAME(HWLOC_SYM_PREFIX, hwloc_ ## name)
|
||||
/* FIXME: should be "HWLOC_ ## name" below, unchanged because it doesn't matter much and could break some embedders hacks */
|
||||
#define HWLOC_NAME_CAPS(name) HWLOC_MUNGE_NAME(HWLOC_SYM_PREFIX_CAPS, hwloc_ ## name)
|
||||
|
||||
/* Now define all the "real" names to be the prefixed names. This
|
||||
allows us to use the real names throughout the code base (i.e.,
|
||||
"hwloc_<foo>"); the preprocessor will adjust to have the prefixed
|
||||
name under the covers. */
|
||||
|
||||
/* Names from hwloc.h */
|
||||
|
||||
#define hwloc_get_api_version HWLOC_NAME(get_api_version)
|
||||
|
||||
#define hwloc_topology HWLOC_NAME(topology)
|
||||
#define hwloc_topology_t HWLOC_NAME(topology_t)
|
||||
|
||||
#define hwloc_cpuset_t HWLOC_NAME(cpuset_t)
|
||||
#define hwloc_const_cpuset_t HWLOC_NAME(const_cpuset_t)
|
||||
#define hwloc_nodeset_t HWLOC_NAME(nodeset_t)
|
||||
#define hwloc_const_nodeset_t HWLOC_NAME(const_nodeset_t)
|
||||
|
||||
#define HWLOC_OBJ_MACHINE HWLOC_NAME_CAPS(OBJ_MACHINE)
|
||||
#define HWLOC_OBJ_NUMANODE HWLOC_NAME_CAPS(OBJ_NUMANODE)
|
||||
#define HWLOC_OBJ_MEMCACHE HWLOC_NAME_CAPS(OBJ_MEMCACHE)
|
||||
#define HWLOC_OBJ_PACKAGE HWLOC_NAME_CAPS(OBJ_PACKAGE)
|
||||
#define HWLOC_OBJ_DIE HWLOC_NAME_CAPS(OBJ_DIE)
|
||||
#define HWLOC_OBJ_CORE HWLOC_NAME_CAPS(OBJ_CORE)
|
||||
#define HWLOC_OBJ_PU HWLOC_NAME_CAPS(OBJ_PU)
|
||||
#define HWLOC_OBJ_L1CACHE HWLOC_NAME_CAPS(OBJ_L1CACHE)
|
||||
#define HWLOC_OBJ_L2CACHE HWLOC_NAME_CAPS(OBJ_L2CACHE)
|
||||
#define HWLOC_OBJ_L3CACHE HWLOC_NAME_CAPS(OBJ_L3CACHE)
|
||||
#define HWLOC_OBJ_L4CACHE HWLOC_NAME_CAPS(OBJ_L4CACHE)
|
||||
#define HWLOC_OBJ_L5CACHE HWLOC_NAME_CAPS(OBJ_L5CACHE)
|
||||
#define HWLOC_OBJ_L1ICACHE HWLOC_NAME_CAPS(OBJ_L1ICACHE)
|
||||
#define HWLOC_OBJ_L2ICACHE HWLOC_NAME_CAPS(OBJ_L2ICACHE)
|
||||
#define HWLOC_OBJ_L3ICACHE HWLOC_NAME_CAPS(OBJ_L3ICACHE)
|
||||
#define HWLOC_OBJ_MISC HWLOC_NAME_CAPS(OBJ_MISC)
|
||||
#define HWLOC_OBJ_GROUP HWLOC_NAME_CAPS(OBJ_GROUP)
|
||||
#define HWLOC_OBJ_BRIDGE HWLOC_NAME_CAPS(OBJ_BRIDGE)
|
||||
#define HWLOC_OBJ_PCI_DEVICE HWLOC_NAME_CAPS(OBJ_PCI_DEVICE)
|
||||
#define HWLOC_OBJ_OS_DEVICE HWLOC_NAME_CAPS(OBJ_OS_DEVICE)
|
||||
#define HWLOC_OBJ_TYPE_MAX HWLOC_NAME_CAPS(OBJ_TYPE_MAX)
|
||||
#define hwloc_obj_type_t HWLOC_NAME(obj_type_t)
|
||||
|
||||
#define hwloc_obj_cache_type_e HWLOC_NAME(obj_cache_type_e)
|
||||
#define hwloc_obj_cache_type_t HWLOC_NAME(obj_cache_type_t)
|
||||
#define HWLOC_OBJ_CACHE_UNIFIED HWLOC_NAME_CAPS(OBJ_CACHE_UNIFIED)
|
||||
#define HWLOC_OBJ_CACHE_DATA HWLOC_NAME_CAPS(OBJ_CACHE_DATA)
|
||||
#define HWLOC_OBJ_CACHE_INSTRUCTION HWLOC_NAME_CAPS(OBJ_CACHE_INSTRUCTION)
|
||||
|
||||
#define hwloc_obj_bridge_type_e HWLOC_NAME(obj_bridge_type_e)
|
||||
#define hwloc_obj_bridge_type_t HWLOC_NAME(obj_bridge_type_t)
|
||||
#define HWLOC_OBJ_BRIDGE_HOST HWLOC_NAME_CAPS(OBJ_BRIDGE_HOST)
|
||||
#define HWLOC_OBJ_BRIDGE_PCI HWLOC_NAME_CAPS(OBJ_BRIDGE_PCI)
|
||||
|
||||
#define hwloc_obj_osdev_type_e HWLOC_NAME(obj_osdev_type_e)
|
||||
#define hwloc_obj_osdev_type_t HWLOC_NAME(obj_osdev_type_t)
|
||||
#define HWLOC_OBJ_OSDEV_BLOCK HWLOC_NAME_CAPS(OBJ_OSDEV_BLOCK)
|
||||
#define HWLOC_OBJ_OSDEV_GPU HWLOC_NAME_CAPS(OBJ_OSDEV_GPU)
|
||||
#define HWLOC_OBJ_OSDEV_NETWORK HWLOC_NAME_CAPS(OBJ_OSDEV_NETWORK)
|
||||
#define HWLOC_OBJ_OSDEV_OPENFABRICS HWLOC_NAME_CAPS(OBJ_OSDEV_OPENFABRICS)
|
||||
#define HWLOC_OBJ_OSDEV_DMA HWLOC_NAME_CAPS(OBJ_OSDEV_DMA)
|
||||
#define HWLOC_OBJ_OSDEV_COPROC HWLOC_NAME_CAPS(OBJ_OSDEV_COPROC)
|
||||
|
||||
#define hwloc_compare_types HWLOC_NAME(compare_types)
|
||||
|
||||
#define hwloc_obj HWLOC_NAME(obj)
|
||||
#define hwloc_obj_t HWLOC_NAME(obj_t)
|
||||
|
||||
#define hwloc_info_s HWLOC_NAME(info_s)
|
||||
|
||||
#define hwloc_obj_attr_u HWLOC_NAME(obj_attr_u)
|
||||
#define hwloc_numanode_attr_s HWLOC_NAME(numanode_attr_s)
|
||||
#define hwloc_memory_page_type_s HWLOC_NAME(memory_page_type_s)
|
||||
#define hwloc_cache_attr_s HWLOC_NAME(cache_attr_s)
|
||||
#define hwloc_group_attr_s HWLOC_NAME(group_attr_s)
|
||||
#define hwloc_pcidev_attr_s HWLOC_NAME(pcidev_attr_s)
|
||||
#define hwloc_bridge_attr_s HWLOC_NAME(bridge_attr_s)
|
||||
#define hwloc_osdev_attr_s HWLOC_NAME(osdev_attr_s)
|
||||
|
||||
#define hwloc_topology_init HWLOC_NAME(topology_init)
|
||||
#define hwloc_topology_load HWLOC_NAME(topology_load)
|
||||
#define hwloc_topology_destroy HWLOC_NAME(topology_destroy)
|
||||
#define hwloc_topology_dup HWLOC_NAME(topology_dup)
|
||||
#define hwloc_topology_abi_check HWLOC_NAME(topology_abi_check)
|
||||
#define hwloc_topology_check HWLOC_NAME(topology_check)
|
||||
|
||||
#define hwloc_topology_flags_e HWLOC_NAME(topology_flags_e)
|
||||
|
||||
#define HWLOC_TOPOLOGY_FLAG_INCLUDE_DISALLOWED HWLOC_NAME_CAPS(TOPOLOGY_FLAG_WITH_DISALLOWED)
|
||||
#define HWLOC_TOPOLOGY_FLAG_IS_THISSYSTEM HWLOC_NAME_CAPS(TOPOLOGY_FLAG_IS_THISSYSTEM)
|
||||
#define HWLOC_TOPOLOGY_FLAG_THISSYSTEM_ALLOWED_RESOURCES HWLOC_NAME_CAPS(TOPOLOGY_FLAG_THISSYSTEM_ALLOWED_RESOURCES)
|
||||
#define HWLOC_TOPOLOGY_FLAG_IMPORT_SUPPORT HWLOC_NAME_CAPS(TOPOLOGY_FLAG_IMPORT_SUPPORT)
|
||||
#define HWLOC_TOPOLOGY_FLAG_RESTRICT_TO_CPUBINDING HWLOC_NAME_CAPS(TOPOLOGY_FLAG_RESTRICT_TO_CPUBINDING)
|
||||
#define HWLOC_TOPOLOGY_FLAG_RESTRICT_TO_MEMBINDING HWLOC_NAME_CAPS(TOPOLOGY_FLAG_RESTRICT_TO_MEMBINDING)
|
||||
#define HWLOC_TOPOLOGY_FLAG_DONT_CHANGE_BINDING HWLOC_NAME_CAPS(TOPOLOGY_FLAG_DONT_CHANGE_BINDING)
|
||||
|
||||
#define hwloc_topology_set_pid HWLOC_NAME(topology_set_pid)
|
||||
#define hwloc_topology_set_synthetic HWLOC_NAME(topology_set_synthetic)
|
||||
#define hwloc_topology_set_xml HWLOC_NAME(topology_set_xml)
|
||||
#define hwloc_topology_set_xmlbuffer HWLOC_NAME(topology_set_xmlbuffer)
|
||||
#define hwloc_topology_components_flag_e HWLOC_NAME(hwloc_topology_components_flag_e)
|
||||
#define HWLOC_TOPOLOGY_COMPONENTS_FLAG_BLACKLIST HWLOC_NAME_CAPS(TOPOLOGY_COMPONENTS_FLAG_BLACKLIST)
|
||||
#define hwloc_topology_set_components HWLOC_NAME(topology_set_components)
|
||||
|
||||
#define hwloc_topology_set_flags HWLOC_NAME(topology_set_flags)
|
||||
#define hwloc_topology_is_thissystem HWLOC_NAME(topology_is_thissystem)
|
||||
#define hwloc_topology_get_flags HWLOC_NAME(topology_get_flags)
|
||||
#define hwloc_topology_discovery_support HWLOC_NAME(topology_discovery_support)
|
||||
#define hwloc_topology_cpubind_support HWLOC_NAME(topology_cpubind_support)
|
||||
#define hwloc_topology_membind_support HWLOC_NAME(topology_membind_support)
|
||||
#define hwloc_topology_misc_support HWLOC_NAME(topology_misc_support)
|
||||
#define hwloc_topology_support HWLOC_NAME(topology_support)
|
||||
#define hwloc_topology_get_support HWLOC_NAME(topology_get_support)
|
||||
|
||||
#define hwloc_type_filter_e HWLOC_NAME(type_filter_e)
|
||||
#define HWLOC_TYPE_FILTER_KEEP_ALL HWLOC_NAME_CAPS(TYPE_FILTER_KEEP_ALL)
|
||||
#define HWLOC_TYPE_FILTER_KEEP_NONE HWLOC_NAME_CAPS(TYPE_FILTER_KEEP_NONE)
|
||||
#define HWLOC_TYPE_FILTER_KEEP_STRUCTURE HWLOC_NAME_CAPS(TYPE_FILTER_KEEP_STRUCTURE)
|
||||
#define HWLOC_TYPE_FILTER_KEEP_IMPORTANT HWLOC_NAME_CAPS(TYPE_FILTER_KEEP_IMPORTANT)
|
||||
#define hwloc_topology_set_type_filter HWLOC_NAME(topology_set_type_filter)
|
||||
#define hwloc_topology_get_type_filter HWLOC_NAME(topology_get_type_filter)
|
||||
#define hwloc_topology_set_all_types_filter HWLOC_NAME(topology_set_all_types_filter)
|
||||
#define hwloc_topology_set_cache_types_filter HWLOC_NAME(topology_set_cache_types_filter)
|
||||
#define hwloc_topology_set_icache_types_filter HWLOC_NAME(topology_set_icache_types_filter)
|
||||
#define hwloc_topology_set_io_types_filter HWLOC_NAME(topology_set_io_types_filter)
|
||||
|
||||
#define hwloc_topology_set_userdata HWLOC_NAME(topology_set_userdata)
|
||||
#define hwloc_topology_get_userdata HWLOC_NAME(topology_get_userdata)
|
||||
|
||||
#define hwloc_restrict_flags_e HWLOC_NAME(restrict_flags_e)
|
||||
#define HWLOC_RESTRICT_FLAG_REMOVE_CPULESS HWLOC_NAME_CAPS(RESTRICT_FLAG_REMOVE_CPULESS)
|
||||
#define HWLOC_RESTRICT_FLAG_BYNODESET HWLOC_NAME_CAPS(RESTRICT_FLAG_BYNODESET)
|
||||
#define HWLOC_RESTRICT_FLAG_REMOVE_MEMLESS HWLOC_NAME_CAPS(RESTRICT_FLAG_REMOVE_MEMLESS)
|
||||
#define HWLOC_RESTRICT_FLAG_ADAPT_MISC HWLOC_NAME_CAPS(RESTRICT_FLAG_ADAPT_MISC)
|
||||
#define HWLOC_RESTRICT_FLAG_ADAPT_IO HWLOC_NAME_CAPS(RESTRICT_FLAG_ADAPT_IO)
|
||||
#define hwloc_topology_restrict HWLOC_NAME(topology_restrict)
|
||||
|
||||
#define hwloc_allow_flags_e HWLOC_NAME(allow_flags_e)
|
||||
#define HWLOC_ALLOW_FLAG_ALL HWLOC_NAME_CAPS(ALLOW_FLAG_ALL)
|
||||
#define HWLOC_ALLOW_FLAG_LOCAL_RESTRICTIONS HWLOC_NAME_CAPS(ALLOW_FLAG_LOCAL_RESTRICTIONS)
|
||||
#define HWLOC_ALLOW_FLAG_CUSTOM HWLOC_NAME_CAPS(ALLOW_FLAG_CUSTOM)
|
||||
#define hwloc_topology_allow HWLOC_NAME(topology_allow)
|
||||
|
||||
#define hwloc_topology_insert_misc_object HWLOC_NAME(topology_insert_misc_object)
|
||||
#define hwloc_topology_alloc_group_object HWLOC_NAME(topology_alloc_group_object)
|
||||
#define hwloc_topology_insert_group_object HWLOC_NAME(topology_insert_group_object)
|
||||
#define hwloc_obj_add_other_obj_sets HWLOC_NAME(obj_add_other_obj_sets)
|
||||
#define hwloc_topology_refresh HWLOC_NAME(topology_refresh)
|
||||
|
||||
#define hwloc_topology_get_depth HWLOC_NAME(topology_get_depth)
|
||||
#define hwloc_get_type_depth HWLOC_NAME(get_type_depth)
|
||||
#define hwloc_get_memory_parents_depth HWLOC_NAME(get_memory_parents_depth)
|
||||
|
||||
#define hwloc_get_type_depth_e HWLOC_NAME(get_type_depth_e)
|
||||
#define HWLOC_TYPE_DEPTH_UNKNOWN HWLOC_NAME_CAPS(TYPE_DEPTH_UNKNOWN)
|
||||
#define HWLOC_TYPE_DEPTH_MULTIPLE HWLOC_NAME_CAPS(TYPE_DEPTH_MULTIPLE)
|
||||
#define HWLOC_TYPE_DEPTH_BRIDGE HWLOC_NAME_CAPS(TYPE_DEPTH_BRIDGE)
|
||||
#define HWLOC_TYPE_DEPTH_PCI_DEVICE HWLOC_NAME_CAPS(TYPE_DEPTH_PCI_DEVICE)
|
||||
#define HWLOC_TYPE_DEPTH_OS_DEVICE HWLOC_NAME_CAPS(TYPE_DEPTH_OS_DEVICE)
|
||||
#define HWLOC_TYPE_DEPTH_MISC HWLOC_NAME_CAPS(TYPE_DEPTH_MISC)
|
||||
#define HWLOC_TYPE_DEPTH_NUMANODE HWLOC_NAME_CAPS(TYPE_DEPTH_NUMANODE)
|
||||
#define HWLOC_TYPE_DEPTH_MEMCACHE HWLOC_NAME_CAPS(TYPE_DEPTH_MEMCACHE)
|
||||
|
||||
#define hwloc_get_depth_type HWLOC_NAME(get_depth_type)
|
||||
#define hwloc_get_nbobjs_by_depth HWLOC_NAME(get_nbobjs_by_depth)
|
||||
#define hwloc_get_nbobjs_by_type HWLOC_NAME(get_nbobjs_by_type)
|
||||
|
||||
#define hwloc_get_obj_by_depth HWLOC_NAME(get_obj_by_depth )
|
||||
#define hwloc_get_obj_by_type HWLOC_NAME(get_obj_by_type )
|
||||
|
||||
#define hwloc_obj_type_string HWLOC_NAME(obj_type_string )
|
||||
#define hwloc_obj_type_snprintf HWLOC_NAME(obj_type_snprintf )
|
||||
#define hwloc_obj_attr_snprintf HWLOC_NAME(obj_attr_snprintf )
|
||||
#define hwloc_type_sscanf HWLOC_NAME(type_sscanf)
|
||||
#define hwloc_type_sscanf_as_depth HWLOC_NAME(type_sscanf_as_depth)
|
||||
|
||||
#define hwloc_obj_get_info_by_name HWLOC_NAME(obj_get_info_by_name)
|
||||
#define hwloc_obj_add_info HWLOC_NAME(obj_add_info)
|
||||
|
||||
#define HWLOC_CPUBIND_PROCESS HWLOC_NAME_CAPS(CPUBIND_PROCESS)
|
||||
#define HWLOC_CPUBIND_THREAD HWLOC_NAME_CAPS(CPUBIND_THREAD)
|
||||
#define HWLOC_CPUBIND_STRICT HWLOC_NAME_CAPS(CPUBIND_STRICT)
|
||||
#define HWLOC_CPUBIND_NOMEMBIND HWLOC_NAME_CAPS(CPUBIND_NOMEMBIND)
|
||||
|
||||
#define hwloc_cpubind_flags_t HWLOC_NAME(cpubind_flags_t)
|
||||
|
||||
#define hwloc_set_cpubind HWLOC_NAME(set_cpubind)
|
||||
#define hwloc_get_cpubind HWLOC_NAME(get_cpubind)
|
||||
#define hwloc_set_proc_cpubind HWLOC_NAME(set_proc_cpubind)
|
||||
#define hwloc_get_proc_cpubind HWLOC_NAME(get_proc_cpubind)
|
||||
#define hwloc_set_thread_cpubind HWLOC_NAME(set_thread_cpubind)
|
||||
#define hwloc_get_thread_cpubind HWLOC_NAME(get_thread_cpubind)
|
||||
|
||||
#define hwloc_get_last_cpu_location HWLOC_NAME(get_last_cpu_location)
|
||||
#define hwloc_get_proc_last_cpu_location HWLOC_NAME(get_proc_last_cpu_location)
|
||||
|
||||
#define HWLOC_MEMBIND_DEFAULT HWLOC_NAME_CAPS(MEMBIND_DEFAULT)
|
||||
#define HWLOC_MEMBIND_FIRSTTOUCH HWLOC_NAME_CAPS(MEMBIND_FIRSTTOUCH)
|
||||
#define HWLOC_MEMBIND_BIND HWLOC_NAME_CAPS(MEMBIND_BIND)
|
||||
#define HWLOC_MEMBIND_INTERLEAVE HWLOC_NAME_CAPS(MEMBIND_INTERLEAVE)
|
||||
#define HWLOC_MEMBIND_NEXTTOUCH HWLOC_NAME_CAPS(MEMBIND_NEXTTOUCH)
|
||||
#define HWLOC_MEMBIND_MIXED HWLOC_NAME_CAPS(MEMBIND_MIXED)
|
||||
|
||||
#define hwloc_membind_policy_t HWLOC_NAME(membind_policy_t)
|
||||
|
||||
#define HWLOC_MEMBIND_PROCESS HWLOC_NAME_CAPS(MEMBIND_PROCESS)
|
||||
#define HWLOC_MEMBIND_THREAD HWLOC_NAME_CAPS(MEMBIND_THREAD)
|
||||
#define HWLOC_MEMBIND_STRICT HWLOC_NAME_CAPS(MEMBIND_STRICT)
|
||||
#define HWLOC_MEMBIND_MIGRATE HWLOC_NAME_CAPS(MEMBIND_MIGRATE)
|
||||
#define HWLOC_MEMBIND_NOCPUBIND HWLOC_NAME_CAPS(MEMBIND_NOCPUBIND)
|
||||
#define HWLOC_MEMBIND_BYNODESET HWLOC_NAME_CAPS(MEMBIND_BYNODESET)
|
||||
|
||||
#define hwloc_membind_flags_t HWLOC_NAME(membind_flags_t)
|
||||
|
||||
#define hwloc_set_membind HWLOC_NAME(set_membind)
|
||||
#define hwloc_get_membind HWLOC_NAME(get_membind)
|
||||
#define hwloc_set_proc_membind HWLOC_NAME(set_proc_membind)
|
||||
#define hwloc_get_proc_membind HWLOC_NAME(get_proc_membind)
|
||||
#define hwloc_set_area_membind HWLOC_NAME(set_area_membind)
|
||||
#define hwloc_get_area_membind HWLOC_NAME(get_area_membind)
|
||||
#define hwloc_get_area_memlocation HWLOC_NAME(get_area_memlocation)
|
||||
#define hwloc_alloc_membind HWLOC_NAME(alloc_membind)
|
||||
#define hwloc_alloc HWLOC_NAME(alloc)
|
||||
#define hwloc_free HWLOC_NAME(free)
|
||||
|
||||
#define hwloc_get_non_io_ancestor_obj HWLOC_NAME(get_non_io_ancestor_obj)
|
||||
#define hwloc_get_next_pcidev HWLOC_NAME(get_next_pcidev)
|
||||
#define hwloc_get_pcidev_by_busid HWLOC_NAME(get_pcidev_by_busid)
|
||||
#define hwloc_get_pcidev_by_busidstring HWLOC_NAME(get_pcidev_by_busidstring)
|
||||
#define hwloc_get_next_osdev HWLOC_NAME(get_next_osdev)
|
||||
#define hwloc_get_next_bridge HWLOC_NAME(get_next_bridge)
|
||||
#define hwloc_bridge_covers_pcibus HWLOC_NAME(bridge_covers_pcibus)
|
||||
|
||||
/* hwloc/bitmap.h */
|
||||
|
||||
#define hwloc_bitmap_s HWLOC_NAME(bitmap_s)
|
||||
#define hwloc_bitmap_t HWLOC_NAME(bitmap_t)
|
||||
#define hwloc_const_bitmap_t HWLOC_NAME(const_bitmap_t)
|
||||
|
||||
#define hwloc_bitmap_alloc HWLOC_NAME(bitmap_alloc)
|
||||
#define hwloc_bitmap_alloc_full HWLOC_NAME(bitmap_alloc_full)
|
||||
#define hwloc_bitmap_free HWLOC_NAME(bitmap_free)
|
||||
#define hwloc_bitmap_dup HWLOC_NAME(bitmap_dup)
|
||||
#define hwloc_bitmap_copy HWLOC_NAME(bitmap_copy)
|
||||
#define hwloc_bitmap_snprintf HWLOC_NAME(bitmap_snprintf)
|
||||
#define hwloc_bitmap_asprintf HWLOC_NAME(bitmap_asprintf)
|
||||
#define hwloc_bitmap_sscanf HWLOC_NAME(bitmap_sscanf)
|
||||
#define hwloc_bitmap_list_snprintf HWLOC_NAME(bitmap_list_snprintf)
|
||||
#define hwloc_bitmap_list_asprintf HWLOC_NAME(bitmap_list_asprintf)
|
||||
#define hwloc_bitmap_list_sscanf HWLOC_NAME(bitmap_list_sscanf)
|
||||
#define hwloc_bitmap_taskset_snprintf HWLOC_NAME(bitmap_taskset_snprintf)
|
||||
#define hwloc_bitmap_taskset_asprintf HWLOC_NAME(bitmap_taskset_asprintf)
|
||||
#define hwloc_bitmap_taskset_sscanf HWLOC_NAME(bitmap_taskset_sscanf)
|
||||
#define hwloc_bitmap_zero HWLOC_NAME(bitmap_zero)
|
||||
#define hwloc_bitmap_fill HWLOC_NAME(bitmap_fill)
|
||||
#define hwloc_bitmap_from_ulong HWLOC_NAME(bitmap_from_ulong)
|
||||
#define hwloc_bitmap_from_ulongs HWLOC_NAME(bitmap_from_ulongs)
|
||||
#define hwloc_bitmap_from_ith_ulong HWLOC_NAME(bitmap_from_ith_ulong)
|
||||
#define hwloc_bitmap_to_ulong HWLOC_NAME(bitmap_to_ulong)
|
||||
#define hwloc_bitmap_to_ith_ulong HWLOC_NAME(bitmap_to_ith_ulong)
|
||||
#define hwloc_bitmap_to_ulongs HWLOC_NAME(bitmap_to_ulongs)
|
||||
#define hwloc_bitmap_nr_ulongs HWLOC_NAME(bitmap_nr_ulongs)
|
||||
#define hwloc_bitmap_only HWLOC_NAME(bitmap_only)
|
||||
#define hwloc_bitmap_allbut HWLOC_NAME(bitmap_allbut)
|
||||
#define hwloc_bitmap_set HWLOC_NAME(bitmap_set)
|
||||
#define hwloc_bitmap_set_range HWLOC_NAME(bitmap_set_range)
|
||||
#define hwloc_bitmap_set_ith_ulong HWLOC_NAME(bitmap_set_ith_ulong)
|
||||
#define hwloc_bitmap_clr HWLOC_NAME(bitmap_clr)
|
||||
#define hwloc_bitmap_clr_range HWLOC_NAME(bitmap_clr_range)
|
||||
#define hwloc_bitmap_isset HWLOC_NAME(bitmap_isset)
|
||||
#define hwloc_bitmap_iszero HWLOC_NAME(bitmap_iszero)
|
||||
#define hwloc_bitmap_isfull HWLOC_NAME(bitmap_isfull)
|
||||
#define hwloc_bitmap_isequal HWLOC_NAME(bitmap_isequal)
|
||||
#define hwloc_bitmap_intersects HWLOC_NAME(bitmap_intersects)
|
||||
#define hwloc_bitmap_isincluded HWLOC_NAME(bitmap_isincluded)
|
||||
#define hwloc_bitmap_or HWLOC_NAME(bitmap_or)
|
||||
#define hwloc_bitmap_and HWLOC_NAME(bitmap_and)
|
||||
#define hwloc_bitmap_andnot HWLOC_NAME(bitmap_andnot)
|
||||
#define hwloc_bitmap_xor HWLOC_NAME(bitmap_xor)
|
||||
#define hwloc_bitmap_not HWLOC_NAME(bitmap_not)
|
||||
#define hwloc_bitmap_first HWLOC_NAME(bitmap_first)
|
||||
#define hwloc_bitmap_last HWLOC_NAME(bitmap_last)
|
||||
#define hwloc_bitmap_next HWLOC_NAME(bitmap_next)
|
||||
#define hwloc_bitmap_first_unset HWLOC_NAME(bitmap_first_unset)
|
||||
#define hwloc_bitmap_last_unset HWLOC_NAME(bitmap_last_unset)
|
||||
#define hwloc_bitmap_next_unset HWLOC_NAME(bitmap_next_unset)
|
||||
#define hwloc_bitmap_singlify HWLOC_NAME(bitmap_singlify)
|
||||
#define hwloc_bitmap_compare_first HWLOC_NAME(bitmap_compare_first)
|
||||
#define hwloc_bitmap_compare HWLOC_NAME(bitmap_compare)
|
||||
#define hwloc_bitmap_weight HWLOC_NAME(bitmap_weight)
|
||||
|
||||
/* hwloc/helper.h */
|
||||
|
||||
#define hwloc_get_type_or_below_depth HWLOC_NAME(get_type_or_below_depth)
|
||||
#define hwloc_get_type_or_above_depth HWLOC_NAME(get_type_or_above_depth)
|
||||
#define hwloc_get_root_obj HWLOC_NAME(get_root_obj)
|
||||
#define hwloc_get_ancestor_obj_by_depth HWLOC_NAME(get_ancestor_obj_by_depth)
|
||||
#define hwloc_get_ancestor_obj_by_type HWLOC_NAME(get_ancestor_obj_by_type)
|
||||
#define hwloc_get_next_obj_by_depth HWLOC_NAME(get_next_obj_by_depth)
|
||||
#define hwloc_get_next_obj_by_type HWLOC_NAME(get_next_obj_by_type)
|
||||
#define hwloc_bitmap_singlify_per_core HWLOC_NAME(bitmap_singlify_by_core)
|
||||
#define hwloc_get_pu_obj_by_os_index HWLOC_NAME(get_pu_obj_by_os_index)
|
||||
#define hwloc_get_numanode_obj_by_os_index HWLOC_NAME(get_numanode_obj_by_os_index)
|
||||
#define hwloc_get_next_child HWLOC_NAME(get_next_child)
|
||||
#define hwloc_get_common_ancestor_obj HWLOC_NAME(get_common_ancestor_obj)
|
||||
#define hwloc_obj_is_in_subtree HWLOC_NAME(obj_is_in_subtree)
|
||||
#define hwloc_get_first_largest_obj_inside_cpuset HWLOC_NAME(get_first_largest_obj_inside_cpuset)
|
||||
#define hwloc_get_largest_objs_inside_cpuset HWLOC_NAME(get_largest_objs_inside_cpuset)
|
||||
#define hwloc_get_next_obj_inside_cpuset_by_depth HWLOC_NAME(get_next_obj_inside_cpuset_by_depth)
|
||||
#define hwloc_get_next_obj_inside_cpuset_by_type HWLOC_NAME(get_next_obj_inside_cpuset_by_type)
|
||||
#define hwloc_get_obj_inside_cpuset_by_depth HWLOC_NAME(get_obj_inside_cpuset_by_depth)
|
||||
#define hwloc_get_obj_inside_cpuset_by_type HWLOC_NAME(get_obj_inside_cpuset_by_type)
|
||||
#define hwloc_get_nbobjs_inside_cpuset_by_depth HWLOC_NAME(get_nbobjs_inside_cpuset_by_depth)
|
||||
#define hwloc_get_nbobjs_inside_cpuset_by_type HWLOC_NAME(get_nbobjs_inside_cpuset_by_type)
|
||||
#define hwloc_get_obj_index_inside_cpuset HWLOC_NAME(get_obj_index_inside_cpuset)
|
||||
#define hwloc_get_child_covering_cpuset HWLOC_NAME(get_child_covering_cpuset)
|
||||
#define hwloc_get_obj_covering_cpuset HWLOC_NAME(get_obj_covering_cpuset)
|
||||
#define hwloc_get_next_obj_covering_cpuset_by_depth HWLOC_NAME(get_next_obj_covering_cpuset_by_depth)
|
||||
#define hwloc_get_next_obj_covering_cpuset_by_type HWLOC_NAME(get_next_obj_covering_cpuset_by_type)
|
||||
#define hwloc_obj_type_is_normal HWLOC_NAME(obj_type_is_normal)
|
||||
#define hwloc_obj_type_is_memory HWLOC_NAME(obj_type_is_memory)
|
||||
#define hwloc_obj_type_is_io HWLOC_NAME(obj_type_is_io)
|
||||
#define hwloc_obj_type_is_cache HWLOC_NAME(obj_type_is_cache)
|
||||
#define hwloc_obj_type_is_dcache HWLOC_NAME(obj_type_is_dcache)
|
||||
#define hwloc_obj_type_is_icache HWLOC_NAME(obj_type_is_icache)
|
||||
#define hwloc_get_cache_type_depth HWLOC_NAME(get_cache_type_depth)
|
||||
#define hwloc_get_cache_covering_cpuset HWLOC_NAME(get_cache_covering_cpuset)
|
||||
#define hwloc_get_shared_cache_covering_obj HWLOC_NAME(get_shared_cache_covering_obj)
|
||||
#define hwloc_get_closest_objs HWLOC_NAME(get_closest_objs)
|
||||
#define hwloc_get_obj_below_by_type HWLOC_NAME(get_obj_below_by_type)
|
||||
#define hwloc_get_obj_below_array_by_type HWLOC_NAME(get_obj_below_array_by_type)
|
||||
#define hwloc_get_obj_with_same_locality HWLOC_NAME(get_obj_with_same_locality)
|
||||
#define hwloc_distrib_flags_e HWLOC_NAME(distrib_flags_e)
|
||||
#define HWLOC_DISTRIB_FLAG_REVERSE HWLOC_NAME_CAPS(DISTRIB_FLAG_REVERSE)
|
||||
#define hwloc_distrib HWLOC_NAME(distrib)
|
||||
#define hwloc_alloc_membind_policy HWLOC_NAME(alloc_membind_policy)
|
||||
#define hwloc_alloc_membind_policy_nodeset HWLOC_NAME(alloc_membind_policy_nodeset)
|
||||
#define hwloc_topology_get_complete_cpuset HWLOC_NAME(topology_get_complete_cpuset)
|
||||
#define hwloc_topology_get_topology_cpuset HWLOC_NAME(topology_get_topology_cpuset)
|
||||
#define hwloc_topology_get_allowed_cpuset HWLOC_NAME(topology_get_allowed_cpuset)
|
||||
#define hwloc_topology_get_complete_nodeset HWLOC_NAME(topology_get_complete_nodeset)
|
||||
#define hwloc_topology_get_topology_nodeset HWLOC_NAME(topology_get_topology_nodeset)
|
||||
#define hwloc_topology_get_allowed_nodeset HWLOC_NAME(topology_get_allowed_nodeset)
|
||||
#define hwloc_cpuset_to_nodeset HWLOC_NAME(cpuset_to_nodeset)
|
||||
#define hwloc_cpuset_from_nodeset HWLOC_NAME(cpuset_from_nodeset)
|
||||
|
||||
/* memattrs.h */
|
||||
|
||||
#define hwloc_memattr_id_e HWLOC_NAME(memattr_id_e)
|
||||
#define HWLOC_MEMATTR_ID_CAPACITY HWLOC_NAME_CAPS(MEMATTR_ID_CAPACITY)
|
||||
#define HWLOC_MEMATTR_ID_LOCALITY HWLOC_NAME_CAPS(MEMATTR_ID_LOCALITY)
|
||||
#define HWLOC_MEMATTR_ID_BANDWIDTH HWLOC_NAME_CAPS(MEMATTR_ID_BANDWIDTH)
|
||||
#define HWLOC_MEMATTR_ID_LATENCY HWLOC_NAME_CAPS(MEMATTR_ID_LATENCY)
|
||||
|
||||
#define hwloc_memattr_id_t HWLOC_NAME(memattr_id_t)
|
||||
#define hwloc_memattr_get_by_name HWLOC_NAME(memattr_get_by_name)
|
||||
|
||||
#define hwloc_location HWLOC_NAME(location)
|
||||
#define hwloc_location_type_e HWLOC_NAME(location_type_e)
|
||||
#define HWLOC_LOCATION_TYPE_OBJECT HWLOC_NAME_CAPS(LOCATION_TYPE_OBJECT)
|
||||
#define HWLOC_LOCATION_TYPE_CPUSET HWLOC_NAME_CAPS(LOCATION_TYPE_CPUSET)
|
||||
#define hwloc_location_u HWLOC_NAME(location_u)
|
||||
|
||||
#define hwloc_memattr_get_value HWLOC_NAME(memattr_get_value)
|
||||
#define hwloc_memattr_get_best_target HWLOC_NAME(memattr_get_best_target)
|
||||
#define hwloc_memattr_get_best_initiator HWLOC_NAME(memattr_get_best_initiator)
|
||||
|
||||
#define hwloc_local_numanode_flag_e HWLOC_NAME(local_numanode_flag_e)
|
||||
#define HWLOC_LOCAL_NUMANODE_FLAG_LARGER_LOCALITY HWLOC_NAME_CAPS(LOCAL_NUMANODE_FLAG_LARGER_LOCALITY)
|
||||
#define HWLOC_LOCAL_NUMANODE_FLAG_SMALLER_LOCALITY HWLOC_NAME_CAPS(LOCAL_NUMANODE_FLAG_SMALLER_LOCALITY)
|
||||
#define HWLOC_LOCAL_NUMANODE_FLAG_ALL HWLOC_NAME_CAPS(LOCAL_NUMANODE_FLAG_ALL)
|
||||
#define hwloc_get_local_numanode_objs HWLOC_NAME(get_local_numanode_objs)
|
||||
|
||||
#define hwloc_memattr_get_name HWLOC_NAME(memattr_get_name)
|
||||
#define hwloc_memattr_get_flags HWLOC_NAME(memattr_get_flags)
|
||||
#define hwloc_memattr_flag_e HWLOC_NAME(memattr_flag_e)
|
||||
#define HWLOC_MEMATTR_FLAG_HIGHER_FIRST HWLOC_NAME_CAPS(MEMATTR_FLAG_HIGHER_FIRST)
|
||||
#define HWLOC_MEMATTR_FLAG_LOWER_FIRST HWLOC_NAME_CAPS(MEMATTR_FLAG_LOWER_FIRST)
|
||||
#define HWLOC_MEMATTR_FLAG_NEED_INITIATOR HWLOC_NAME_CAPS(MEMATTR_FLAG_NEED_INITIATOR)
|
||||
#define hwloc_memattr_register HWLOC_NAME(memattr_register)
|
||||
#define hwloc_memattr_set_value HWLOC_NAME(memattr_set_value)
|
||||
#define hwloc_memattr_get_targets HWLOC_NAME(memattr_get_targets)
|
||||
#define hwloc_memattr_get_initiators HWLOC_NAME(memattr_get_initiators)
|
||||
|
||||
/* cpukinds.h */
|
||||
|
||||
#define hwloc_cpukinds_get_nr HWLOC_NAME(cpukinds_get_nr)
|
||||
#define hwloc_cpukinds_get_by_cpuset HWLOC_NAME(cpukinds_get_by_cpuset)
|
||||
#define hwloc_cpukinds_get_info HWLOC_NAME(cpukinds_get_info)
|
||||
#define hwloc_cpukinds_register HWLOC_NAME(cpukinds_register)
|
||||
|
||||
/* export.h */
|
||||
|
||||
#define hwloc_topology_export_xml_flags_e HWLOC_NAME(topology_export_xml_flags_e)
|
||||
#define HWLOC_TOPOLOGY_EXPORT_XML_FLAG_V1 HWLOC_NAME_CAPS(TOPOLOGY_EXPORT_XML_FLAG_V1)
|
||||
#define hwloc_topology_export_xml HWLOC_NAME(topology_export_xml)
|
||||
#define hwloc_topology_export_xmlbuffer HWLOC_NAME(topology_export_xmlbuffer)
|
||||
#define hwloc_free_xmlbuffer HWLOC_NAME(free_xmlbuffer)
|
||||
#define hwloc_topology_set_userdata_export_callback HWLOC_NAME(topology_set_userdata_export_callback)
|
||||
#define hwloc_export_obj_userdata HWLOC_NAME(export_obj_userdata)
|
||||
#define hwloc_export_obj_userdata_base64 HWLOC_NAME(export_obj_userdata_base64)
|
||||
#define hwloc_topology_set_userdata_import_callback HWLOC_NAME(topology_set_userdata_import_callback)
|
||||
|
||||
#define hwloc_topology_export_synthetic_flags_e HWLOC_NAME(topology_export_synthetic_flags_e)
|
||||
#define HWLOC_TOPOLOGY_EXPORT_SYNTHETIC_FLAG_NO_EXTENDED_TYPES HWLOC_NAME_CAPS(TOPOLOGY_EXPORT_SYNTHETIC_FLAG_NO_EXTENDED_TYPES)
|
||||
#define HWLOC_TOPOLOGY_EXPORT_SYNTHETIC_FLAG_NO_ATTRS HWLOC_NAME_CAPS(TOPOLOGY_EXPORT_SYNTHETIC_FLAG_NO_ATTRS)
|
||||
#define HWLOC_TOPOLOGY_EXPORT_SYNTHETIC_FLAG_V1 HWLOC_NAME_CAPS(TOPOLOGY_EXPORT_SYNTHETIC_FLAG_V1)
|
||||
#define HWLOC_TOPOLOGY_EXPORT_SYNTHETIC_FLAG_IGNORE_MEMORY HWLOC_NAME_CAPS(TOPOLOGY_EXPORT_SYNTHETIC_FLAG_IGNORE_MEMORY)
|
||||
#define hwloc_topology_export_synthetic HWLOC_NAME(topology_export_synthetic)
|
||||
|
||||
/* distances.h */
|
||||
|
||||
#define hwloc_distances_s HWLOC_NAME(distances_s)
|
||||
|
||||
#define hwloc_distances_kind_e HWLOC_NAME(distances_kind_e)
|
||||
#define HWLOC_DISTANCES_KIND_FROM_OS HWLOC_NAME_CAPS(DISTANCES_KIND_FROM_OS)
|
||||
#define HWLOC_DISTANCES_KIND_FROM_USER HWLOC_NAME_CAPS(DISTANCES_KIND_FROM_USER)
|
||||
#define HWLOC_DISTANCES_KIND_MEANS_LATENCY HWLOC_NAME_CAPS(DISTANCES_KIND_MEANS_LATENCY)
|
||||
#define HWLOC_DISTANCES_KIND_MEANS_BANDWIDTH HWLOC_NAME_CAPS(DISTANCES_KIND_MEANS_BANDWIDTH)
|
||||
#define HWLOC_DISTANCES_KIND_HETEROGENEOUS_TYPES HWLOC_NAME_CAPS(DISTANCES_KIND_HETEROGENEOUS_TYPES)
|
||||
|
||||
#define hwloc_distances_get HWLOC_NAME(distances_get)
|
||||
#define hwloc_distances_get_by_depth HWLOC_NAME(distances_get_by_depth)
|
||||
#define hwloc_distances_get_by_type HWLOC_NAME(distances_get_by_type)
|
||||
#define hwloc_distances_get_by_name HWLOC_NAME(distances_get_by_name)
|
||||
#define hwloc_distances_get_name HWLOC_NAME(distances_get_name)
|
||||
#define hwloc_distances_release HWLOC_NAME(distances_release)
|
||||
#define hwloc_distances_obj_index HWLOC_NAME(distances_obj_index)
|
||||
#define hwloc_distances_obj_pair_values HWLOC_NAME(distances_pair_values)
|
||||
|
||||
#define hwloc_distances_transform_e HWLOC_NAME(distances_transform_e)
|
||||
#define HWLOC_DISTANCES_TRANSFORM_REMOVE_NULL HWLOC_NAME_CAPS(DISTANCES_TRANSFORM_REMOVE_NULL)
|
||||
#define HWLOC_DISTANCES_TRANSFORM_LINKS HWLOC_NAME_CAPS(DISTANCES_TRANSFORM_LINKS)
|
||||
#define HWLOC_DISTANCES_TRANSFORM_MERGE_SWITCH_PORTS HWLOC_NAME_CAPS(DISTANCES_TRANSFORM_MERGE_SWITCH_PORTS)
|
||||
#define HWLOC_DISTANCES_TRANSFORM_TRANSITIVE_CLOSURE HWLOC_NAME_CAPS(DISTANCES_TRANSFORM_TRANSITIVE_CLOSURE)
|
||||
#define hwloc_distances_transform HWLOC_NAME(distances_transform)
|
||||
|
||||
#define hwloc_distances_add_flag_e HWLOC_NAME(distances_add_flag_e)
|
||||
#define HWLOC_DISTANCES_ADD_FLAG_GROUP HWLOC_NAME_CAPS(DISTANCES_ADD_FLAG_GROUP)
|
||||
#define HWLOC_DISTANCES_ADD_FLAG_GROUP_INACCURATE HWLOC_NAME_CAPS(DISTANCES_ADD_FLAG_GROUP_INACCURATE)
|
||||
|
||||
#define hwloc_distances_add_handle_t HWLOC_NAME(distances_add_handle_t)
|
||||
#define hwloc_distances_add_create HWLOC_NAME(distances_add_create)
|
||||
#define hwloc_distances_add_values HWLOC_NAME(distances_add_values)
|
||||
#define hwloc_distances_add_commit HWLOC_NAME(distances_add_commit)
|
||||
|
||||
#define hwloc_distances_remove HWLOC_NAME(distances_remove)
|
||||
#define hwloc_distances_remove_by_depth HWLOC_NAME(distances_remove_by_depth)
|
||||
#define hwloc_distances_remove_by_type HWLOC_NAME(distances_remove_by_type)
|
||||
#define hwloc_distances_release_remove HWLOC_NAME(distances_release_remove)
|
||||
|
||||
/* diff.h */
|
||||
|
||||
#define hwloc_topology_diff_obj_attr_type_e HWLOC_NAME(topology_diff_obj_attr_type_e)
|
||||
#define hwloc_topology_diff_obj_attr_type_t HWLOC_NAME(topology_diff_obj_attr_type_t)
|
||||
#define HWLOC_TOPOLOGY_DIFF_OBJ_ATTR_SIZE HWLOC_NAME_CAPS(TOPOLOGY_DIFF_OBJ_ATTR_SIZE)
|
||||
#define HWLOC_TOPOLOGY_DIFF_OBJ_ATTR_NAME HWLOC_NAME_CAPS(TOPOLOGY_DIFF_OBJ_ATTR_NAME)
|
||||
#define HWLOC_TOPOLOGY_DIFF_OBJ_ATTR_INFO HWLOC_NAME_CAPS(TOPOLOGY_DIFF_OBJ_ATTR_INFO)
|
||||
#define hwloc_topology_diff_obj_attr_u HWLOC_NAME(topology_diff_obj_attr_u)
|
||||
#define hwloc_topology_diff_obj_attr_generic_s HWLOC_NAME(topology_diff_obj_attr_generic_s)
|
||||
#define hwloc_topology_diff_obj_attr_uint64_s HWLOC_NAME(topology_diff_obj_attr_uint64_s)
|
||||
#define hwloc_topology_diff_obj_attr_string_s HWLOC_NAME(topology_diff_obj_attr_string_s)
|
||||
#define hwloc_topology_diff_type_e HWLOC_NAME(topology_diff_type_e)
|
||||
#define hwloc_topology_diff_type_t HWLOC_NAME(topology_diff_type_t)
|
||||
#define HWLOC_TOPOLOGY_DIFF_OBJ_ATTR HWLOC_NAME_CAPS(TOPOLOGY_DIFF_OBJ_ATTR)
|
||||
#define HWLOC_TOPOLOGY_DIFF_TOO_COMPLEX HWLOC_NAME_CAPS(TOPOLOGY_DIFF_TOO_COMPLEX)
|
||||
#define hwloc_topology_diff_u HWLOC_NAME(topology_diff_u)
|
||||
#define hwloc_topology_diff_t HWLOC_NAME(topology_diff_t)
|
||||
#define hwloc_topology_diff_generic_s HWLOC_NAME(topology_diff_generic_s)
|
||||
#define hwloc_topology_diff_obj_attr_s HWLOC_NAME(topology_diff_obj_attr_s)
|
||||
#define hwloc_topology_diff_too_complex_s HWLOC_NAME(topology_diff_too_complex_s)
|
||||
#define hwloc_topology_diff_build HWLOC_NAME(topology_diff_build)
|
||||
#define hwloc_topology_diff_apply_flags_e HWLOC_NAME(topology_diff_apply_flags_e)
|
||||
#define HWLOC_TOPOLOGY_DIFF_APPLY_REVERSE HWLOC_NAME_CAPS(TOPOLOGY_DIFF_APPLY_REVERSE)
|
||||
#define hwloc_topology_diff_apply HWLOC_NAME(topology_diff_apply)
|
||||
#define hwloc_topology_diff_destroy HWLOC_NAME(topology_diff_destroy)
|
||||
#define hwloc_topology_diff_load_xml HWLOC_NAME(topology_diff_load_xml)
|
||||
#define hwloc_topology_diff_export_xml HWLOC_NAME(topology_diff_export_xml)
|
||||
#define hwloc_topology_diff_load_xmlbuffer HWLOC_NAME(topology_diff_load_xmlbuffer)
|
||||
#define hwloc_topology_diff_export_xmlbuffer HWLOC_NAME(topology_diff_export_xmlbuffer)
|
||||
|
||||
/* shmem.h */
|
||||
|
||||
#define hwloc_shmem_topology_get_length HWLOC_NAME(shmem_topology_get_length)
|
||||
#define hwloc_shmem_topology_write HWLOC_NAME(shmem_topology_write)
|
||||
#define hwloc_shmem_topology_adopt HWLOC_NAME(shmem_topology_adopt)
|
||||
|
||||
/* glibc-sched.h */
|
||||
|
||||
#define hwloc_cpuset_to_glibc_sched_affinity HWLOC_NAME(cpuset_to_glibc_sched_affinity)
|
||||
#define hwloc_cpuset_from_glibc_sched_affinity HWLOC_NAME(cpuset_from_glibc_sched_affinity)
|
||||
|
||||
/* linux-libnuma.h */
|
||||
|
||||
#define hwloc_cpuset_to_linux_libnuma_ulongs HWLOC_NAME(cpuset_to_linux_libnuma_ulongs)
|
||||
#define hwloc_nodeset_to_linux_libnuma_ulongs HWLOC_NAME(nodeset_to_linux_libnuma_ulongs)
|
||||
#define hwloc_cpuset_from_linux_libnuma_ulongs HWLOC_NAME(cpuset_from_linux_libnuma_ulongs)
|
||||
#define hwloc_nodeset_from_linux_libnuma_ulongs HWLOC_NAME(nodeset_from_linux_libnuma_ulongs)
|
||||
#define hwloc_cpuset_to_linux_libnuma_bitmask HWLOC_NAME(cpuset_to_linux_libnuma_bitmask)
|
||||
#define hwloc_nodeset_to_linux_libnuma_bitmask HWLOC_NAME(nodeset_to_linux_libnuma_bitmask)
|
||||
#define hwloc_cpuset_from_linux_libnuma_bitmask HWLOC_NAME(cpuset_from_linux_libnuma_bitmask)
|
||||
#define hwloc_nodeset_from_linux_libnuma_bitmask HWLOC_NAME(nodeset_from_linux_libnuma_bitmask)
|
||||
|
||||
/* linux.h */
|
||||
|
||||
#define hwloc_linux_set_tid_cpubind HWLOC_NAME(linux_set_tid_cpubind)
|
||||
#define hwloc_linux_get_tid_cpubind HWLOC_NAME(linux_get_tid_cpubind)
|
||||
#define hwloc_linux_get_tid_last_cpu_location HWLOC_NAME(linux_get_tid_last_cpu_location)
|
||||
#define hwloc_linux_read_path_as_cpumask HWLOC_NAME(linux_read_file_cpumask)
|
||||
|
||||
/* windows.h */
|
||||
|
||||
#define hwloc_windows_get_nr_processor_groups HWLOC_NAME(windows_get_nr_processor_groups)
|
||||
#define hwloc_windows_get_processor_group_cpuset HWLOC_NAME(windows_get_processor_group_cpuset)
|
||||
|
||||
/* openfabrics-verbs.h */
|
||||
|
||||
#define hwloc_ibv_get_device_cpuset HWLOC_NAME(ibv_get_device_cpuset)
|
||||
#define hwloc_ibv_get_device_osdev HWLOC_NAME(ibv_get_device_osdev)
|
||||
#define hwloc_ibv_get_device_osdev_by_name HWLOC_NAME(ibv_get_device_osdev_by_name)
|
||||
|
||||
/* opencl.h */
|
||||
|
||||
#define hwloc_cl_device_topology_amd HWLOC_NAME(cl_device_topology_amd)
|
||||
#define hwloc_opencl_get_device_pci_busid HWLOC_NAME(opencl_get_device_pci_ids)
|
||||
#define hwloc_opencl_get_device_cpuset HWLOC_NAME(opencl_get_device_cpuset)
|
||||
#define hwloc_opencl_get_device_osdev HWLOC_NAME(opencl_get_device_osdev)
|
||||
#define hwloc_opencl_get_device_osdev_by_index HWLOC_NAME(opencl_get_device_osdev_by_index)
|
||||
|
||||
/* cuda.h */
|
||||
|
||||
#define hwloc_cuda_get_device_pci_ids HWLOC_NAME(cuda_get_device_pci_ids)
|
||||
#define hwloc_cuda_get_device_cpuset HWLOC_NAME(cuda_get_device_cpuset)
|
||||
#define hwloc_cuda_get_device_pcidev HWLOC_NAME(cuda_get_device_pcidev)
|
||||
#define hwloc_cuda_get_device_osdev HWLOC_NAME(cuda_get_device_osdev)
|
||||
#define hwloc_cuda_get_device_osdev_by_index HWLOC_NAME(cuda_get_device_osdev_by_index)
|
||||
|
||||
/* cudart.h */
|
||||
|
||||
#define hwloc_cudart_get_device_pci_ids HWLOC_NAME(cudart_get_device_pci_ids)
|
||||
#define hwloc_cudart_get_device_cpuset HWLOC_NAME(cudart_get_device_cpuset)
|
||||
#define hwloc_cudart_get_device_pcidev HWLOC_NAME(cudart_get_device_pcidev)
|
||||
#define hwloc_cudart_get_device_osdev_by_index HWLOC_NAME(cudart_get_device_osdev_by_index)
|
||||
|
||||
/* nvml.h */
|
||||
|
||||
#define hwloc_nvml_get_device_cpuset HWLOC_NAME(nvml_get_device_cpuset)
|
||||
#define hwloc_nvml_get_device_osdev HWLOC_NAME(nvml_get_device_osdev)
|
||||
#define hwloc_nvml_get_device_osdev_by_index HWLOC_NAME(nvml_get_device_osdev_by_index)
|
||||
|
||||
/* rsmi.h */
|
||||
|
||||
#define hwloc_rsmi_get_device_cpuset HWLOC_NAME(rsmi_get_device_cpuset)
|
||||
#define hwloc_rsmi_get_device_osdev HWLOC_NAME(rsmi_get_device_osdev)
|
||||
#define hwloc_rsmi_get_device_osdev_by_index HWLOC_NAME(rsmi_get_device_osdev_by_index)
|
||||
|
||||
/* levelzero.h */
|
||||
|
||||
#define hwloc_levelzero_get_device_cpuset HWLOC_NAME(levelzero_get_device_cpuset)
|
||||
#define hwloc_levelzero_get_device_osdev HWLOC_NAME(levelzero_get_device_osdev)
|
||||
|
||||
/* gl.h */
|
||||
|
||||
#define hwloc_gl_get_display_osdev_by_port_device HWLOC_NAME(gl_get_display_osdev_by_port_device)
|
||||
#define hwloc_gl_get_display_osdev_by_name HWLOC_NAME(gl_get_display_osdev_by_name)
|
||||
#define hwloc_gl_get_display_by_osdev HWLOC_NAME(gl_get_display_by_osdev)
|
||||
|
||||
/* hwloc/plugins.h */
|
||||
|
||||
#define hwloc_disc_phase_e HWLOC_NAME(disc_phase_e)
|
||||
#define HWLOC_DISC_PHASE_GLOBAL HWLOC_NAME_CAPS(DISC_PHASE_GLOBAL)
|
||||
#define HWLOC_DISC_PHASE_CPU HWLOC_NAME_CAPS(DISC_PHASE_CPU)
|
||||
#define HWLOC_DISC_PHASE_MEMORY HWLOC_NAME_CAPS(DISC_PHASE_MEMORY)
|
||||
#define HWLOC_DISC_PHASE_PCI HWLOC_NAME_CAPS(DISC_PHASE_PCI)
|
||||
#define HWLOC_DISC_PHASE_IO HWLOC_NAME_CAPS(DISC_PHASE_IO)
|
||||
#define HWLOC_DISC_PHASE_MISC HWLOC_NAME_CAPS(DISC_PHASE_MISC)
|
||||
#define HWLOC_DISC_PHASE_ANNOTATE HWLOC_NAME_CAPS(DISC_PHASE_ANNOTATE)
|
||||
#define HWLOC_DISC_PHASE_TWEAK HWLOC_NAME_CAPS(DISC_PHASE_TWEAK)
|
||||
#define hwloc_disc_phase_t HWLOC_NAME(disc_phase_t)
|
||||
#define hwloc_disc_component HWLOC_NAME(disc_component)
|
||||
|
||||
#define hwloc_disc_status_flag_e HWLOC_NAME(disc_status_flag_e)
|
||||
#define HWLOC_DISC_STATUS_FLAG_GOT_ALLOWED_RESOURCES HWLOC_NAME_CAPS(DISC_STATUS_FLAG_GOT_ALLOWED_RESOURCES)
|
||||
#define hwloc_disc_status HWLOC_NAME(disc_status)
|
||||
|
||||
#define hwloc_backend HWLOC_NAME(backend)
|
||||
|
||||
#define hwloc_backend_alloc HWLOC_NAME(backend_alloc)
|
||||
#define hwloc_backend_enable HWLOC_NAME(backend_enable)
|
||||
|
||||
#define hwloc_component_type_e HWLOC_NAME(component_type_e)
|
||||
#define HWLOC_COMPONENT_TYPE_DISC HWLOC_NAME_CAPS(COMPONENT_TYPE_DISC)
|
||||
#define HWLOC_COMPONENT_TYPE_XML HWLOC_NAME_CAPS(COMPONENT_TYPE_XML)
|
||||
#define hwloc_component_type_t HWLOC_NAME(component_type_t)
|
||||
#define hwloc_component HWLOC_NAME(component)
|
||||
|
||||
#define hwloc_plugin_check_namespace HWLOC_NAME(plugin_check_namespace)
|
||||
|
||||
#define hwloc_hide_errors HWLOC_NAME(hide_errors)
|
||||
#define hwloc__insert_object_by_cpuset HWLOC_NAME(_insert_object_by_cpuset)
|
||||
#define hwloc_insert_object_by_parent HWLOC_NAME(insert_object_by_parent)
|
||||
#define hwloc_alloc_setup_object HWLOC_NAME(alloc_setup_object)
|
||||
#define hwloc_obj_add_children_sets HWLOC_NAME(add_children_sets)
|
||||
#define hwloc_topology_reconnect HWLOC_NAME(topology_reconnect)
|
||||
|
||||
#define hwloc_filter_check_pcidev_subtype_important HWLOC_NAME(filter_check_pcidev_subtype_important)
|
||||
#define hwloc_filter_check_osdev_subtype_important HWLOC_NAME(filter_check_osdev_subtype_important)
|
||||
#define hwloc_filter_check_keep_object_type HWLOC_NAME(filter_check_keep_object_type)
|
||||
#define hwloc_filter_check_keep_object HWLOC_NAME(filter_check_keep_object)
|
||||
|
||||
#define hwloc_pcidisc_find_cap HWLOC_NAME(pcidisc_find_cap)
|
||||
#define hwloc_pcidisc_find_linkspeed HWLOC_NAME(pcidisc_find_linkspeed)
|
||||
#define hwloc_pcidisc_check_bridge_type HWLOC_NAME(pcidisc_check_bridge_type)
|
||||
#define hwloc_pcidisc_find_bridge_buses HWLOC_NAME(pcidisc_find_bridge_buses)
|
||||
#define hwloc_pcidisc_tree_insert_by_busid HWLOC_NAME(pcidisc_tree_insert_by_busid)
|
||||
#define hwloc_pcidisc_tree_attach HWLOC_NAME(pcidisc_tree_attach)
|
||||
|
||||
#define hwloc_pci_find_by_busid HWLOC_NAME(pcidisc_find_by_busid)
|
||||
#define hwloc_pci_find_parent_by_busid HWLOC_NAME(pcidisc_find_busid_parent)
|
||||
|
||||
#define hwloc_backend_distances_add_handle_t HWLOC_NAME(backend_distances_add_handle_t)
|
||||
#define hwloc_backend_distances_add_create HWLOC_NAME(backend_distances_add_create)
|
||||
#define hwloc_backend_distances_add_values HWLOC_NAME(backend_distances_add_values)
|
||||
#define hwloc_backend_distances_add_commit HWLOC_NAME(backend_distances_add_commit)
|
||||
|
||||
/* hwloc/deprecated.h */
|
||||
|
||||
#define hwloc_distances_add HWLOC_NAME(distances_add)
|
||||
|
||||
#define hwloc_topology_insert_misc_object_by_parent HWLOC_NAME(topology_insert_misc_object_by_parent)
|
||||
#define hwloc_obj_cpuset_snprintf HWLOC_NAME(obj_cpuset_snprintf)
|
||||
#define hwloc_obj_type_sscanf HWLOC_NAME(obj_type_sscanf)
|
||||
|
||||
#define hwloc_set_membind_nodeset HWLOC_NAME(set_membind_nodeset)
|
||||
#define hwloc_get_membind_nodeset HWLOC_NAME(get_membind_nodeset)
|
||||
#define hwloc_set_proc_membind_nodeset HWLOC_NAME(set_proc_membind_nodeset)
|
||||
#define hwloc_get_proc_membind_nodeset HWLOC_NAME(get_proc_membind_nodeset)
|
||||
#define hwloc_set_area_membind_nodeset HWLOC_NAME(set_area_membind_nodeset)
|
||||
#define hwloc_get_area_membind_nodeset HWLOC_NAME(get_area_membind_nodeset)
|
||||
#define hwloc_alloc_membind_nodeset HWLOC_NAME(alloc_membind_nodeset)
|
||||
|
||||
#define hwloc_cpuset_to_nodeset_strict HWLOC_NAME(cpuset_to_nodeset_strict)
|
||||
#define hwloc_cpuset_from_nodeset_strict HWLOC_NAME(cpuset_from_nodeset_strict)
|
||||
|
||||
/* private/debug.h */
|
||||
|
||||
#define hwloc_debug_enabled HWLOC_NAME(debug_enabled)
|
||||
#define hwloc_debug HWLOC_NAME(debug)
|
||||
|
||||
/* private/misc.h */
|
||||
|
||||
#ifndef HWLOC_HAVE_CORRECT_SNPRINTF
|
||||
#define hwloc_snprintf HWLOC_NAME(snprintf)
|
||||
#endif
|
||||
#define hwloc_ffsl_manual HWLOC_NAME(ffsl_manual)
|
||||
#define hwloc_ffs32 HWLOC_NAME(ffs32)
|
||||
#define hwloc_ffsl_from_ffs32 HWLOC_NAME(ffsl_from_ffs32)
|
||||
#define hwloc_flsl_manual HWLOC_NAME(flsl_manual)
|
||||
#define hwloc_fls32 HWLOC_NAME(fls32)
|
||||
#define hwloc_flsl_from_fls32 HWLOC_NAME(flsl_from_fls32)
|
||||
#define hwloc_weight_long HWLOC_NAME(weight_long)
|
||||
#define hwloc_strncasecmp HWLOC_NAME(strncasecmp)
|
||||
|
||||
#define hwloc_bitmap_compare_inclusion HWLOC_NAME(bitmap_compare_inclusion)
|
||||
|
||||
#define hwloc_pci_class_string HWLOC_NAME(pci_class_string)
|
||||
#define hwloc_linux_pci_link_speed_from_string HWLOC_NAME(linux_pci_link_speed_from_string)
|
||||
|
||||
#define hwloc_cache_type_by_depth_type HWLOC_NAME(cache_type_by_depth_type)
|
||||
#define hwloc__obj_type_is_normal HWLOC_NAME(_obj_type_is_normal)
|
||||
#define hwloc__obj_type_is_memory HWLOC_NAME(_obj_type_is_memory)
|
||||
#define hwloc__obj_type_is_io HWLOC_NAME(_obj_type_is_io)
|
||||
#define hwloc__obj_type_is_special HWLOC_NAME(_obj_type_is_special)
|
||||
|
||||
#define hwloc__obj_type_is_cache HWLOC_NAME(_obj_type_is_cache)
|
||||
#define hwloc__obj_type_is_dcache HWLOC_NAME(_obj_type_is_dcache)
|
||||
#define hwloc__obj_type_is_icache HWLOC_NAME(_obj_type_is_icache)
|
||||
|
||||
/* private/cpuid-x86.h */
|
||||
|
||||
#define hwloc_have_x86_cpuid HWLOC_NAME(have_x86_cpuid)
|
||||
#define hwloc_x86_cpuid HWLOC_NAME(x86_cpuid)
|
||||
|
||||
/* private/xml.h */
|
||||
|
||||
#define hwloc__xml_verbose HWLOC_NAME(_xml_verbose)
|
||||
|
||||
#define hwloc__xml_import_state_s HWLOC_NAME(_xml_import_state_s)
|
||||
#define hwloc__xml_import_state_t HWLOC_NAME(_xml_import_state_t)
|
||||
#define hwloc__xml_import_diff HWLOC_NAME(_xml_import_diff)
|
||||
#define hwloc_xml_backend_data_s HWLOC_NAME(xml_backend_data_s)
|
||||
#define hwloc__xml_export_state_s HWLOC_NAME(_xml_export_state_s)
|
||||
#define hwloc__xml_export_state_t HWLOC_NAME(_xml_export_state_t)
|
||||
#define hwloc__xml_export_data_s HWLOC_NAME(_xml_export_data_s)
|
||||
#define hwloc__xml_export_topology HWLOC_NAME(_xml_export_topology)
|
||||
#define hwloc__xml_export_diff HWLOC_NAME(_xml_export_diff)
|
||||
|
||||
#define hwloc_xml_callbacks HWLOC_NAME(xml_callbacks)
|
||||
#define hwloc_xml_component HWLOC_NAME(xml_component)
|
||||
#define hwloc_xml_callbacks_register HWLOC_NAME(xml_callbacks_register)
|
||||
#define hwloc_xml_callbacks_reset HWLOC_NAME(xml_callbacks_reset)
|
||||
|
||||
#define hwloc__xml_imported_v1distances_s HWLOC_NAME(_xml_imported_v1distances_s)
|
||||
|
||||
/* private/components.h */
|
||||
|
||||
#define hwloc_disc_component_force_enable HWLOC_NAME(disc_component_force_enable)
|
||||
#define hwloc_disc_components_enable_others HWLOC_NAME(disc_components_instantiate_others)
|
||||
|
||||
#define hwloc_backends_is_thissystem HWLOC_NAME(backends_is_thissystem)
|
||||
#define hwloc_backends_find_callbacks HWLOC_NAME(backends_find_callbacks)
|
||||
|
||||
#define hwloc_topology_components_init HWLOC_NAME(topology_components_init)
|
||||
#define hwloc_backends_disable_all HWLOC_NAME(backends_disable_all)
|
||||
#define hwloc_topology_components_fini HWLOC_NAME(topology_components_fini)
|
||||
|
||||
#define hwloc_components_init HWLOC_NAME(components_init)
|
||||
#define hwloc_components_fini HWLOC_NAME(components_fini)
|
||||
|
||||
/* private/internal-private.h */
|
||||
|
||||
#define hwloc_xml_component HWLOC_NAME(xml_component)
|
||||
#define hwloc_synthetic_component HWLOC_NAME(synthetic_component)
|
||||
|
||||
#define hwloc_aix_component HWLOC_NAME(aix_component)
|
||||
#define hwloc_bgq_component HWLOC_NAME(bgq_component)
|
||||
#define hwloc_darwin_component HWLOC_NAME(darwin_component)
|
||||
#define hwloc_freebsd_component HWLOC_NAME(freebsd_component)
|
||||
#define hwloc_hpux_component HWLOC_NAME(hpux_component)
|
||||
#define hwloc_linux_component HWLOC_NAME(linux_component)
|
||||
#define hwloc_netbsd_component HWLOC_NAME(netbsd_component)
|
||||
#define hwloc_noos_component HWLOC_NAME(noos_component)
|
||||
#define hwloc_solaris_component HWLOC_NAME(solaris_component)
|
||||
#define hwloc_windows_component HWLOC_NAME(windows_component)
|
||||
#define hwloc_x86_component HWLOC_NAME(x86_component)
|
||||
|
||||
#define hwloc_cuda_component HWLOC_NAME(cuda_component)
|
||||
#define hwloc_gl_component HWLOC_NAME(gl_component)
|
||||
#define hwloc_levelzero_component HWLOC_NAME(levelzero_component)
|
||||
#define hwloc_nvml_component HWLOC_NAME(nvml_component)
|
||||
#define hwloc_rsmi_component HWLOC_NAME(rsmi_component)
|
||||
#define hwloc_opencl_component HWLOC_NAME(opencl_component)
|
||||
#define hwloc_pci_component HWLOC_NAME(pci_component)
|
||||
|
||||
#define hwloc_xml_libxml_component HWLOC_NAME(xml_libxml_component)
|
||||
#define hwloc_xml_nolibxml_component HWLOC_NAME(xml_nolibxml_component)
|
||||
|
||||
/* private/private.h */
|
||||
|
||||
#define hwloc_internal_location_s HWLOC_NAME(internal_location_s)
|
||||
|
||||
#define hwloc_special_level_s HWLOC_NAME(special_level_s)
|
||||
|
||||
#define hwloc_pci_forced_locality_s HWLOC_NAME(pci_forced_locality_s)
|
||||
#define hwloc_pci_locality_s HWLOC_NAME(pci_locality_s)
|
||||
|
||||
#define hwloc_topology_forced_component_s HWLOC_NAME(topology_forced_component)
|
||||
|
||||
#define hwloc_alloc_root_sets HWLOC_NAME(alloc_root_sets)
|
||||
#define hwloc_setup_pu_level HWLOC_NAME(setup_pu_level)
|
||||
#define hwloc_get_sysctlbyname HWLOC_NAME(get_sysctlbyname)
|
||||
#define hwloc_get_sysctl HWLOC_NAME(get_sysctl)
|
||||
#define hwloc_fallback_nbprocessors HWLOC_NAME(fallback_nbprocessors)
|
||||
#define hwloc_fallback_memsize HWLOC_NAME(fallback_memsize)
|
||||
|
||||
#define hwloc__object_cpusets_compare_first HWLOC_NAME(_object_cpusets_compare_first)
|
||||
#define hwloc__reorder_children HWLOC_NAME(_reorder_children)
|
||||
|
||||
#define hwloc_topology_setup_defaults HWLOC_NAME(topology_setup_defaults)
|
||||
#define hwloc_topology_clear HWLOC_NAME(topology_clear)
|
||||
|
||||
#define hwloc__attach_memory_object HWLOC_NAME(insert_memory_object)
|
||||
|
||||
#define hwloc_get_obj_by_type_and_gp_index HWLOC_NAME(get_obj_by_type_and_gp_index)
|
||||
|
||||
#define hwloc_pci_discovery_init HWLOC_NAME(pci_discovery_init)
|
||||
#define hwloc_pci_discovery_prepare HWLOC_NAME(pci_discovery_prepare)
|
||||
#define hwloc_pci_discovery_exit HWLOC_NAME(pci_discovery_exit)
|
||||
#define hwloc_find_insert_io_parent_by_complete_cpuset HWLOC_NAME(hwloc_find_insert_io_parent_by_complete_cpuset)
|
||||
|
||||
#define hwloc__add_info HWLOC_NAME(_add_info)
|
||||
#define hwloc__add_info_nodup HWLOC_NAME(_add_info_nodup)
|
||||
#define hwloc__move_infos HWLOC_NAME(_move_infos)
|
||||
#define hwloc__free_infos HWLOC_NAME(_free_infos)
|
||||
#define hwloc__tma_dup_infos HWLOC_NAME(_tma_dup_infos)
|
||||
|
||||
#define hwloc_binding_hooks HWLOC_NAME(binding_hooks)
|
||||
#define hwloc_set_native_binding_hooks HWLOC_NAME(set_native_binding_hooks)
|
||||
#define hwloc_set_binding_hooks HWLOC_NAME(set_binding_hooks)
|
||||
|
||||
#define hwloc_set_linuxfs_hooks HWLOC_NAME(set_linuxfs_hooks)
|
||||
#define hwloc_set_bgq_hooks HWLOC_NAME(set_bgq_hooks)
|
||||
#define hwloc_set_solaris_hooks HWLOC_NAME(set_solaris_hooks)
|
||||
#define hwloc_set_aix_hooks HWLOC_NAME(set_aix_hooks)
|
||||
#define hwloc_set_windows_hooks HWLOC_NAME(set_windows_hooks)
|
||||
#define hwloc_set_darwin_hooks HWLOC_NAME(set_darwin_hooks)
|
||||
#define hwloc_set_freebsd_hooks HWLOC_NAME(set_freebsd_hooks)
|
||||
#define hwloc_set_netbsd_hooks HWLOC_NAME(set_netbsd_hooks)
|
||||
#define hwloc_set_hpux_hooks HWLOC_NAME(set_hpux_hooks)
|
||||
|
||||
#define hwloc_look_hardwired_fujitsu_k HWLOC_NAME(look_hardwired_fujitsu_k)
|
||||
#define hwloc_look_hardwired_fujitsu_fx10 HWLOC_NAME(look_hardwired_fujitsu_fx10)
|
||||
#define hwloc_look_hardwired_fujitsu_fx100 HWLOC_NAME(look_hardwired_fujitsu_fx100)
|
||||
|
||||
#define hwloc_add_uname_info HWLOC_NAME(add_uname_info)
|
||||
#define hwloc_free_unlinked_object HWLOC_NAME(free_unlinked_object)
|
||||
#define hwloc_free_object_and_children HWLOC_NAME(free_object_and_children)
|
||||
#define hwloc_free_object_siblings_and_children HWLOC_NAME(free_object_siblings_and_children)
|
||||
|
||||
#define hwloc_alloc_heap HWLOC_NAME(alloc_heap)
|
||||
#define hwloc_alloc_mmap HWLOC_NAME(alloc_mmap)
|
||||
#define hwloc_free_heap HWLOC_NAME(free_heap)
|
||||
#define hwloc_free_mmap HWLOC_NAME(free_mmap)
|
||||
#define hwloc_alloc_or_fail HWLOC_NAME(alloc_or_fail)
|
||||
|
||||
#define hwloc_internal_distances_s HWLOC_NAME(internal_distances_s)
|
||||
#define hwloc_internal_distances_init HWLOC_NAME(internal_distances_init)
|
||||
#define hwloc_internal_distances_prepare HWLOC_NAME(internal_distances_prepare)
|
||||
#define hwloc_internal_distances_dup HWLOC_NAME(internal_distances_dup)
|
||||
#define hwloc_internal_distances_refresh HWLOC_NAME(internal_distances_refresh)
|
||||
#define hwloc_internal_distances_destroy HWLOC_NAME(internal_distances_destroy)
|
||||
#define hwloc_internal_distances_add HWLOC_NAME(internal_distances_add)
|
||||
#define hwloc_internal_distances_add_by_index HWLOC_NAME(internal_distances_add_by_index)
|
||||
#define hwloc_internal_distances_invalidate_cached_objs HWLOC_NAME(hwloc_internal_distances_invalidate_cached_objs)
|
||||
|
||||
#define hwloc_internal_memattr_s HWLOC_NAME(internal_memattr_s)
|
||||
#define hwloc_internal_memattr_target_s HWLOC_NAME(internal_memattr_target_s)
|
||||
#define hwloc_internal_memattr_initiator_s HWLOC_NAME(internal_memattr_initiator_s)
|
||||
#define hwloc_internal_memattrs_init HWLOC_NAME(internal_memattrs_init)
|
||||
#define hwloc_internal_memattrs_prepare HWLOC_NAME(internal_memattrs_prepare)
|
||||
#define hwloc_internal_memattrs_dup HWLOC_NAME(internal_memattrs_dup)
|
||||
#define hwloc_internal_memattrs_destroy HWLOC_NAME(internal_memattrs_destroy)
|
||||
#define hwloc_internal_memattrs_need_refresh HWLOC_NAME(internal_memattrs_need_refresh)
|
||||
#define hwloc_internal_memattrs_refresh HWLOC_NAME(internal_memattrs_refresh)
|
||||
|
||||
#define hwloc_internal_cpukind_s HWLOC_NAME(internal_cpukind_s)
|
||||
#define hwloc_internal_cpukinds_init HWLOC_NAME(internal_cpukinds_init)
|
||||
#define hwloc_internal_cpukinds_destroy HWLOC_NAME(internal_cpukinds_destroy)
|
||||
#define hwloc_internal_cpukinds_dup HWLOC_NAME(internal_cpukinds_dup)
|
||||
#define hwloc_internal_cpukinds_register HWLOC_NAME(internal_cpukinds_register)
|
||||
#define hwloc_internal_cpukinds_rank HWLOC_NAME(internal_cpukinds_rank)
|
||||
#define hwloc_internal_cpukinds_restrict HWLOC_NAME(internal_cpukinds_restrict)
|
||||
|
||||
#define hwloc_encode_to_base64 HWLOC_NAME(encode_to_base64)
|
||||
#define hwloc_decode_from_base64 HWLOC_NAME(decode_from_base64)
|
||||
|
||||
#define hwloc_progname HWLOC_NAME(progname)
|
||||
|
||||
#define hwloc__topology_disadopt HWLOC_NAME(_topology_disadopt)
|
||||
#define hwloc__topology_dup HWLOC_NAME(_topology_dup)
|
||||
|
||||
#define hwloc_tma HWLOC_NAME(tma)
|
||||
#define hwloc_tma_malloc HWLOC_NAME(tma_malloc)
|
||||
#define hwloc_tma_calloc HWLOC_NAME(tma_calloc)
|
||||
#define hwloc_tma_strdup HWLOC_NAME(tma_strdup)
|
||||
#define hwloc_bitmap_tma_dup HWLOC_NAME(bitmap_tma_dup)
|
||||
|
||||
/* private/solaris-chiptype.h */
|
||||
|
||||
#define hwloc_solaris_chip_info_s HWLOC_NAME(solaris_chip_info_s)
|
||||
#define hwloc_solaris_get_chip_info HWLOC_NAME(solaris_get_chip_info)
|
||||
|
||||
#endif /* HWLOC_SYM_TRANSFORM */
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
} /* extern "C" */
|
||||
#endif
|
||||
|
||||
|
||||
#endif /* HWLOC_RENAME_H */
|
||||
203
macx64/mpi/openmpi/include/hwloc/rsmi.h
Normal file
203
macx64/mpi/openmpi/include/hwloc/rsmi.h
Normal file
@@ -0,0 +1,203 @@
|
||||
/*
|
||||
* Copyright © 2012-2021 Inria. All rights reserved.
|
||||
* Copyright (c) 2020, Advanced Micro Devices, Inc. All rights reserved.
|
||||
* Written by Advanced Micro Devices,
|
||||
* See COPYING in top-level directory.
|
||||
*/
|
||||
|
||||
/** \file
|
||||
* \brief Macros to help interaction between hwloc and the ROCm SMI Management Library.
|
||||
*
|
||||
* Applications that use both hwloc and the ROCm SMI Management Library may want to
|
||||
* include this file so as to get topology information for AMD GPU devices.
|
||||
*/
|
||||
|
||||
#ifndef HWLOC_RSMI_H
|
||||
#define HWLOC_RSMI_H
|
||||
|
||||
#include "hwloc.h"
|
||||
#include "hwloc/autogen/config.h"
|
||||
#include "hwloc/helper.h"
|
||||
#ifdef HWLOC_LINUX_SYS
|
||||
#include "hwloc/linux.h"
|
||||
#endif
|
||||
|
||||
#include <rocm_smi/rocm_smi.h>
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
|
||||
/** \defgroup hwlocality_rsmi Interoperability with the ROCm SMI Management Library
|
||||
*
|
||||
* This interface offers ways to retrieve topology information about
|
||||
* devices managed by the ROCm SMI Management Library.
|
||||
*
|
||||
* @{
|
||||
*/
|
||||
|
||||
/** \brief Get the CPU set of logical processors that are physically
|
||||
* close to AMD GPU device whose index is \p dv_ind.
|
||||
*
|
||||
* Store in \p set the CPU-set describing the locality of the AMD GPU device
|
||||
* whose index is \p dv_ind.
|
||||
*
|
||||
* Topology \p topology and device \p dv_ind must match the local machine.
|
||||
* I/O devices detection and the ROCm SMI component are not needed in the
|
||||
* topology.
|
||||
*
|
||||
* The function only returns the locality of the device.
|
||||
* If more information about the device is needed, OS objects should
|
||||
* be used instead, see hwloc_rsmi_get_device_osdev()
|
||||
* and hwloc_rsmi_get_device_osdev_by_index().
|
||||
*
|
||||
* This function is currently only implemented in a meaningful way for
|
||||
* Linux; other systems will simply get a full cpuset.
|
||||
*/
|
||||
static __hwloc_inline int
|
||||
hwloc_rsmi_get_device_cpuset(hwloc_topology_t topology __hwloc_attribute_unused,
|
||||
uint32_t dv_ind, hwloc_cpuset_t set)
|
||||
{
|
||||
#ifdef HWLOC_LINUX_SYS
|
||||
/* If we're on Linux, use the sysfs mechanism to get the local cpus */
|
||||
#define HWLOC_RSMI_DEVICE_SYSFS_PATH_MAX 128
|
||||
char path[HWLOC_RSMI_DEVICE_SYSFS_PATH_MAX];
|
||||
rsmi_status_t ret;
|
||||
uint64_t bdfid = 0;
|
||||
unsigned domain, device, bus;
|
||||
|
||||
if (!hwloc_topology_is_thissystem(topology)) {
|
||||
errno = EINVAL;
|
||||
return -1;
|
||||
}
|
||||
|
||||
ret = rsmi_dev_pci_id_get(dv_ind, &bdfid);
|
||||
if (RSMI_STATUS_SUCCESS != ret) {
|
||||
errno = EINVAL;
|
||||
return -1;
|
||||
}
|
||||
domain = (bdfid>>32) & 0xffffffff;
|
||||
bus = ((bdfid & 0xffff)>>8) & 0xff;
|
||||
device = ((bdfid & 0xff)>>3) & 0x1f;
|
||||
|
||||
sprintf(path, "/sys/bus/pci/devices/%04x:%02x:%02x.0/local_cpus", domain, bus, device);
|
||||
if (hwloc_linux_read_path_as_cpumask(path, set) < 0
|
||||
|| hwloc_bitmap_iszero(set))
|
||||
hwloc_bitmap_copy(set, hwloc_topology_get_complete_cpuset(topology));
|
||||
#else
|
||||
/* Non-Linux systems simply get a full cpuset */
|
||||
hwloc_bitmap_copy(set, hwloc_topology_get_complete_cpuset(topology));
|
||||
#endif
|
||||
return 0;
|
||||
}
|
||||
|
||||
/** \brief Get the hwloc OS device object corresponding to the
|
||||
* AMD GPU device whose index is \p dv_ind.
|
||||
*
|
||||
* \return The hwloc OS device object describing the AMD GPU device whose
|
||||
* index is \p dv_ind.
|
||||
* \return \c NULL if none could be found.
|
||||
*
|
||||
* The topology \p topology does not necessarily have to match the current
|
||||
* machine. For instance the topology may be an XML import of a remote host.
|
||||
* I/O devices detection and the ROCm SMI component must be enabled in the
|
||||
* topology.
|
||||
*
|
||||
* \note The corresponding PCI device object can be obtained by looking
|
||||
* at the OS device parent object (unless PCI devices are filtered out).
|
||||
*/
|
||||
static __hwloc_inline hwloc_obj_t
|
||||
hwloc_rsmi_get_device_osdev_by_index(hwloc_topology_t topology, uint32_t dv_ind)
|
||||
{
|
||||
hwloc_obj_t osdev = NULL;
|
||||
while ((osdev = hwloc_get_next_osdev(topology, osdev)) != NULL) {
|
||||
if (HWLOC_OBJ_OSDEV_GPU == osdev->attr->osdev.type
|
||||
&& osdev->name
|
||||
&& !strncmp("rsmi", osdev->name, 4)
|
||||
&& atoi(osdev->name + 4) == (int) dv_ind)
|
||||
return osdev;
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/** \brief Get the hwloc OS device object corresponding to AMD GPU device,
|
||||
* whose index is \p dv_ind.
|
||||
*
|
||||
* \return The hwloc OS device object that describes the given
|
||||
* AMD GPU, whose index is \p dv_ind.
|
||||
* \return \c NULL if none could be found.
|
||||
*
|
||||
* Topology \p topology and device \p dv_ind must match the local machine.
|
||||
* I/O devices detection and the ROCm SMI component must be enabled in the
|
||||
* topology. If not, the locality of the object may still be found using
|
||||
* hwloc_rsmi_get_device_cpuset().
|
||||
*
|
||||
* \note The corresponding hwloc PCI device may be found by looking
|
||||
* at the result parent pointer (unless PCI devices are filtered out).
|
||||
*/
|
||||
static __hwloc_inline hwloc_obj_t
|
||||
hwloc_rsmi_get_device_osdev(hwloc_topology_t topology, uint32_t dv_ind)
|
||||
{
|
||||
hwloc_obj_t osdev;
|
||||
rsmi_status_t ret;
|
||||
uint64_t bdfid = 0;
|
||||
unsigned domain, device, bus, func;
|
||||
uint64_t id;
|
||||
char uuid[64];
|
||||
|
||||
if (!hwloc_topology_is_thissystem(topology)) {
|
||||
errno = EINVAL;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
ret = rsmi_dev_pci_id_get(dv_ind, &bdfid);
|
||||
if (RSMI_STATUS_SUCCESS != ret) {
|
||||
errno = EINVAL;
|
||||
return NULL;
|
||||
}
|
||||
domain = (bdfid>>32) & 0xffffffff;
|
||||
bus = ((bdfid & 0xffff)>>8) & 0xff;
|
||||
device = ((bdfid & 0xff)>>3) & 0x1f;
|
||||
func = bdfid & 0x7;
|
||||
|
||||
ret = rsmi_dev_unique_id_get(dv_ind, &id);
|
||||
if (RSMI_STATUS_SUCCESS != ret)
|
||||
uuid[0] = '\0';
|
||||
else
|
||||
sprintf(uuid, "%lx", id);
|
||||
|
||||
osdev = NULL;
|
||||
while ((osdev = hwloc_get_next_osdev(topology, osdev)) != NULL) {
|
||||
hwloc_obj_t pcidev = osdev->parent;
|
||||
const char *info;
|
||||
|
||||
if (strncmp(osdev->name, "rsmi", 4))
|
||||
continue;
|
||||
|
||||
if (pcidev
|
||||
&& pcidev->type == HWLOC_OBJ_PCI_DEVICE
|
||||
&& pcidev->attr->pcidev.domain == domain
|
||||
&& pcidev->attr->pcidev.bus == bus
|
||||
&& pcidev->attr->pcidev.dev == device
|
||||
&& pcidev->attr->pcidev.func == func)
|
||||
return osdev;
|
||||
|
||||
info = hwloc_obj_get_info_by_name(osdev, "AMDUUID");
|
||||
if (info && !strcmp(info, uuid))
|
||||
return osdev;
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/** @} */
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
} /* extern "C" */
|
||||
#endif
|
||||
|
||||
|
||||
#endif /* HWLOC_RSMI_H */
|
||||
137
macx64/mpi/openmpi/include/hwloc/shmem.h
Normal file
137
macx64/mpi/openmpi/include/hwloc/shmem.h
Normal file
@@ -0,0 +1,137 @@
|
||||
/*
|
||||
* Copyright © 2013-2018 Inria. All rights reserved.
|
||||
* See COPYING in top-level directory.
|
||||
*/
|
||||
|
||||
/** \file
|
||||
* \brief Sharing topologies between processes
|
||||
*/
|
||||
|
||||
#ifndef HWLOC_SHMEM_H
|
||||
#define HWLOC_SHMEM_H
|
||||
|
||||
#include "hwloc.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#elif 0
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
/** \defgroup hwlocality_shmem Sharing topologies between processes
|
||||
*
|
||||
* These functions are used to share a topology between processes by
|
||||
* duplicating it into a file-backed shared-memory buffer.
|
||||
*
|
||||
* The master process must first get the required shared-memory size
|
||||
* for storing this topology with hwloc_shmem_topology_get_length().
|
||||
*
|
||||
* Then it must find a virtual memory area of that size that is available
|
||||
* in all processes (identical virtual addresses in all processes).
|
||||
* On Linux, this can be done by comparing holes found in /proc/\<pid\>/maps
|
||||
* for each process.
|
||||
*
|
||||
* Once found, it must open a destination file for storing the buffer,
|
||||
* and pass it to hwloc_shmem_topology_write() together with
|
||||
* virtual memory address and length obtained above.
|
||||
*
|
||||
* Other processes may then adopt this shared topology by opening the
|
||||
* same file and passing it to hwloc_shmem_topology_adopt() with the
|
||||
* exact same virtual memory address and length.
|
||||
*
|
||||
* @{
|
||||
*/
|
||||
|
||||
/** \brief Get the required shared memory length for storing a topology.
|
||||
*
|
||||
* This length (in bytes) must be used in hwloc_shmem_topology_write()
|
||||
* and hwloc_shmem_topology_adopt() later.
|
||||
*
|
||||
* \note Flags \p flags are currently unused, must be 0.
|
||||
*/
|
||||
HWLOC_DECLSPEC int hwloc_shmem_topology_get_length(hwloc_topology_t topology,
|
||||
size_t *lengthp,
|
||||
unsigned long flags);
|
||||
|
||||
/** \brief Duplicate a topology to a shared memory file.
|
||||
*
|
||||
* Temporarily map a file in virtual memory and duplicate the
|
||||
* topology \p topology by allocating duplicates in there.
|
||||
*
|
||||
* The segment of the file pointed by descriptor \p fd,
|
||||
* starting at offset \p fileoffset, and of length \p length (in bytes),
|
||||
* will be temporarily mapped at virtual address \p mmap_address
|
||||
* during the duplication.
|
||||
*
|
||||
* The mapping length \p length must have been previously obtained with
|
||||
* hwloc_shmem_topology_get_length()
|
||||
* and the topology must not have been modified in the meantime.
|
||||
*
|
||||
* \note Flags \p flags are currently unused, must be 0.
|
||||
*
|
||||
* \note The object userdata pointer is duplicated but the pointed buffer
|
||||
* is not. However the caller may also allocate it manually in shared memory
|
||||
* to share it as well.
|
||||
*
|
||||
* \return -1 with errno set to EBUSY if the virtual memory mapping defined
|
||||
* by \p mmap_address and \p length isn't available in the process.
|
||||
* \return -1 with errno set to EINVAL if \p fileoffset, \p mmap_address
|
||||
* or \p length aren't page-aligned.
|
||||
*/
|
||||
HWLOC_DECLSPEC int hwloc_shmem_topology_write(hwloc_topology_t topology,
|
||||
int fd, hwloc_uint64_t fileoffset,
|
||||
void *mmap_address, size_t length,
|
||||
unsigned long flags);
|
||||
|
||||
/** \brief Adopt a shared memory topology stored in a file.
|
||||
*
|
||||
* Map a file in virtual memory and adopt the topology that was previously
|
||||
* stored there with hwloc_shmem_topology_write().
|
||||
*
|
||||
* The returned adopted topology in \p topologyp can be used just like any
|
||||
* topology. And it must be destroyed with hwloc_topology_destroy() as usual.
|
||||
*
|
||||
* However the topology is read-only.
|
||||
* For instance, it cannot be modified with hwloc_topology_restrict()
|
||||
* and object userdata pointers cannot be changed.
|
||||
*
|
||||
* The segment of the file pointed by descriptor \p fd,
|
||||
* starting at offset \p fileoffset, and of length \p length (in bytes),
|
||||
* will be mapped at virtual address \p mmap_address.
|
||||
*
|
||||
* The file pointed by descriptor \p fd, the offset \p fileoffset,
|
||||
* the requested mapping virtual address \p mmap_address and the length \p length
|
||||
* must be identical to what was given to hwloc_shmem_topology_write() earlier.
|
||||
*
|
||||
* \note Flags \p flags are currently unused, must be 0.
|
||||
*
|
||||
* \note The object userdata pointer should not be used unless the process
|
||||
* that created the shared topology also placed userdata-pointed buffers
|
||||
* in shared memory.
|
||||
*
|
||||
* \note This function takes care of calling hwloc_topology_abi_check().
|
||||
*
|
||||
* \return -1 with errno set to EBUSY if the virtual memory mapping defined
|
||||
* by \p mmap_address and \p length isn't available in the process.
|
||||
*
|
||||
* \return -1 with errno set to EINVAL if \p fileoffset, \p mmap_address
|
||||
* or \p length aren't page-aligned, or do not match what was given to
|
||||
* hwloc_shmem_topology_write() earlier.
|
||||
*
|
||||
* \return -1 with errno set to EINVAL if the layout of the topology structure
|
||||
* is different between the writer process and the adopter process.
|
||||
*/
|
||||
HWLOC_DECLSPEC int hwloc_shmem_topology_adopt(hwloc_topology_t *topologyp,
|
||||
int fd, hwloc_uint64_t fileoffset,
|
||||
void *mmap_address, size_t length,
|
||||
unsigned long flags);
|
||||
/** @} */
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
} /* extern "C" */
|
||||
#endif
|
||||
|
||||
|
||||
#endif /* HWLOC_SHMEM_H */
|
||||
@@ -19,9 +19,17 @@ extern "C" {
|
||||
#define OMPI_HAVE_MPI_EXT_CUDA 1
|
||||
#include "openmpi/mpiext/mpiext_cuda_c.h"
|
||||
|
||||
/* Enabled Extension: pcollreq */
|
||||
#define OMPI_HAVE_MPI_EXT_PCOLLREQ 1
|
||||
#include "openmpi/mpiext/mpiext_pcollreq_c.h"
|
||||
/* Enabled Extension: ftmpi */
|
||||
#define OMPI_HAVE_MPI_EXT_FTMPI 1
|
||||
#include "openmpi/mpiext/mpiext_ftmpi_c.h"
|
||||
|
||||
/* Enabled Extension: rocm */
|
||||
#define OMPI_HAVE_MPI_EXT_ROCM 1
|
||||
#include "openmpi/mpiext/mpiext_rocm_c.h"
|
||||
|
||||
/* Enabled Extension: shortfloat */
|
||||
#define OMPI_HAVE_MPI_EXT_SHORTFLOAT 1
|
||||
#include "openmpi/mpiext/mpiext_shortfloat_c.h"
|
||||
|
||||
|
||||
#if defined(c_plusplus) || defined(__cplusplus)
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,51 @@
|
||||
/* WARNING: This is a generated file! Edits will be lost! */
|
||||
/*
|
||||
* Copyright (c) 2015 Research Organization for Information Science
|
||||
* and Technology (RIST). All rights reserved.
|
||||
* Copyright (c) 2015 Cisco Systems, Inc. All rights reserved.
|
||||
* $COPYRIGHT$
|
||||
*
|
||||
* This file was generated by gen-mpi-mangling.pl
|
||||
*/
|
||||
|
||||
/* Note that the rationale for the types of each of these variables is
|
||||
discussed in ompi/include/mpif-common.h. Do not change the types
|
||||
without also changing ompi/runtime/ompi_mpi_init.c and
|
||||
ompi/include/mpif-common.h. */
|
||||
|
||||
extern char mpi_fortran_argv_null_;
|
||||
#define OMPI_IS_FORTRAN_ARGV_NULL(addr) \
|
||||
(addr == (void*) &mpi_fortran_argv_null_)
|
||||
|
||||
extern char mpi_fortran_argvs_null_;
|
||||
#define OMPI_IS_FORTRAN_ARGVS_NULL(addr) \
|
||||
(addr == (void*) &mpi_fortran_argvs_null_)
|
||||
|
||||
extern int mpi_fortran_bottom_;
|
||||
#define OMPI_IS_FORTRAN_BOTTOM(addr) \
|
||||
(addr == (void*) &mpi_fortran_bottom_)
|
||||
|
||||
extern int mpi_fortran_errcodes_ignore_;
|
||||
#define OMPI_IS_FORTRAN_ERRCODES_IGNORE(addr) \
|
||||
(addr == (void*) &mpi_fortran_errcodes_ignore_)
|
||||
|
||||
extern int mpi_fortran_in_place_;
|
||||
#define OMPI_IS_FORTRAN_IN_PLACE(addr) \
|
||||
(addr == (void*) &mpi_fortran_in_place_)
|
||||
|
||||
extern int * mpi_fortran_status_ignore_;
|
||||
#define OMPI_IS_FORTRAN_STATUS_IGNORE(addr) \
|
||||
(addr == (void*) &mpi_fortran_status_ignore_)
|
||||
|
||||
extern int * mpi_fortran_statuses_ignore_;
|
||||
#define OMPI_IS_FORTRAN_STATUSES_IGNORE(addr) \
|
||||
(addr == (void*) &mpi_fortran_statuses_ignore_)
|
||||
|
||||
extern int mpi_fortran_unweighted_;
|
||||
#define OMPI_IS_FORTRAN_UNWEIGHTED(addr) \
|
||||
(addr == (void*) &mpi_fortran_unweighted_)
|
||||
|
||||
extern int mpi_fortran_weights_empty_;
|
||||
#define OMPI_IS_FORTRAN_WEIGHTS_EMPTY(addr) \
|
||||
(addr == (void*) &mpi_fortran_weights_empty_)
|
||||
|
||||
|
||||
87
macx64/mpi/openmpi/include/mpif-config.h
Normal file
87
macx64/mpi/openmpi/include/mpif-config.h
Normal file
@@ -0,0 +1,87 @@
|
||||
! -*- fortran -*-
|
||||
!
|
||||
! Copyright (c) 2004-2006 The Trustees of Indiana University and Indiana
|
||||
! University Research and Technology
|
||||
! Corporation. All rights reserved.
|
||||
! Copyright (c) 2004-2005 The University of Tennessee and The University
|
||||
! of Tennessee Research Foundation. All rights
|
||||
! reserved.
|
||||
! Copyright (c) 2004-2005 High Performance Computing Center Stuttgart,
|
||||
! University of Stuttgart. All rights reserved.
|
||||
! Copyright (c) 2004-2005 The Regents of the University of California.
|
||||
! All rights reserved.
|
||||
! Copyright (c) 2006-2017 Cisco Systems, Inc. All rights reserved
|
||||
! Copyright (c) 2013 Los Alamos National Security, LLC. All rights
|
||||
! reserved.
|
||||
! Copyright (c) 2019 Triad National Security, LLC. All rights
|
||||
! reserved.
|
||||
! $COPYRIGHT$
|
||||
!
|
||||
! Additional copyrights may follow
|
||||
!
|
||||
! $HEADER$
|
||||
!
|
||||
|
||||
!
|
||||
! This file contains the output from configure that is relevant for
|
||||
! Fortran applications and a few values that are necessary to
|
||||
! compile the Fortran modules (e.g., MPI_STATUS_SIZE).
|
||||
!
|
||||
|
||||
!
|
||||
! OMPI version
|
||||
! This file is generated from configure; do not edit it manually.
|
||||
!
|
||||
integer OMPI_MAJOR_VERSION, OMPI_MINOR_VERSION
|
||||
integer OMPI_RELEASE_VERSION
|
||||
parameter (OMPI_MAJOR_VERSION=5)
|
||||
parameter (OMPI_MINOR_VERSION=0)
|
||||
parameter (OMPI_RELEASE_VERSION=7)
|
||||
!
|
||||
! Kind parameters
|
||||
!
|
||||
integer MPI_OFFSET_KIND, MPI_ADDRESS_KIND, MPI_INTEGER_KIND
|
||||
integer MPI_COUNT_KIND
|
||||
parameter (MPI_INTEGER_KIND=4)
|
||||
parameter (MPI_ADDRESS_KIND=8)
|
||||
parameter (MPI_OFFSET_KIND=8)
|
||||
parameter (MPI_COUNT_KIND=8)
|
||||
!
|
||||
! Miscellaneous constants
|
||||
!
|
||||
integer MPI_STATUS_SIZE
|
||||
parameter (MPI_STATUS_SIZE=6)
|
||||
!
|
||||
! Configurable length constants
|
||||
!
|
||||
integer MPI_MAX_PROCESSOR_NAME
|
||||
integer MPI_MAX_ERROR_STRING
|
||||
integer MPI_MAX_OBJECT_NAME
|
||||
integer MPI_MAX_LIBRARY_VERSION_STRING
|
||||
integer MPI_MAX_INFO_KEY
|
||||
integer MPI_MAX_INFO_VAL
|
||||
integer MPI_MAX_PORT_NAME
|
||||
integer MPI_MAX_DATAREP_STRING
|
||||
integer MPI_MAX_PSET_NAME_LEN
|
||||
integer MPI_MAX_STRINGTAG_LEN
|
||||
parameter (MPI_MAX_PROCESSOR_NAME=256-1)
|
||||
parameter (MPI_MAX_ERROR_STRING=256-1)
|
||||
parameter (MPI_MAX_OBJECT_NAME=64-1)
|
||||
parameter (MPI_MAX_LIBRARY_VERSION_STRING=256-1)
|
||||
parameter (MPI_MAX_INFO_KEY=36-1)
|
||||
parameter (MPI_MAX_INFO_VAL=256-1)
|
||||
parameter (MPI_MAX_PORT_NAME=1024-1)
|
||||
parameter (MPI_MAX_DATAREP_STRING=128-1)
|
||||
parameter (MPI_MAX_PSET_NAME_LEN=512-1)
|
||||
parameter (MPI_MAX_STRINGTAG_LEN=1024-1)
|
||||
|
||||
!
|
||||
! MPI F08 conformance
|
||||
!
|
||||
logical MPI_SUBARRAYS_SUPPORTED
|
||||
logical MPI_ASYNC_PROTECTS_NONBLOCKING
|
||||
! Hard-coded for .false. for now
|
||||
parameter (MPI_SUBARRAYS_SUPPORTED= .false.)
|
||||
! Hard-coded for .false. for now
|
||||
parameter (MPI_ASYNC_PROTECTS_NONBLOCKING = .false.)
|
||||
|
||||
371
macx64/mpi/openmpi/include/mpif-constants.h
Normal file
371
macx64/mpi/openmpi/include/mpif-constants.h
Normal file
@@ -0,0 +1,371 @@
|
||||
! -*- fortran -*-
|
||||
! WARNING! THIS IS A GENERATED FILE!!
|
||||
! ANY EDITS YOU PUT HERE WILL BE LOST!
|
||||
! ==> Instead, edit topdir/ompi/include/mpif-values.pl.
|
||||
|
||||
! Copyright (c) 2004-2006 The Trustees of Indiana University and Indiana
|
||||
! University Research and Technology
|
||||
! Corporation. All rights reserved.
|
||||
! Copyright (c) 2004-2016 The University of Tennessee and The University
|
||||
! of Tennessee Research Foundation. All rights
|
||||
! reserved.
|
||||
! Copyright (c) 2004-2007 High Performance Computing Center Stuttgart,
|
||||
! University of Stuttgart. All rights reserved.
|
||||
! Copyright (c) 2004-2005 The Regents of the University of California.
|
||||
! All rights reserved.
|
||||
! Copyright (c) 2006-2012 Cisco Systems, Inc. All rights reserved.
|
||||
! Copyright (c) 2009-2012 Oak Ridge National Labs. All rights reserved.
|
||||
! Copyright (c) 2016 Research Organization for Information Science
|
||||
! and Technology (RIST). All rights reserved.
|
||||
! $COPYRIGHT$
|
||||
!
|
||||
! Additional copyrights may follow
|
||||
!
|
||||
! $HEADER$
|
||||
!
|
||||
|
||||
integer MPI_ANY_SOURCE
|
||||
integer MPI_ANY_TAG
|
||||
integer MPI_APPNUM
|
||||
integer MPI_BSEND_OVERHEAD
|
||||
integer MPI_CART
|
||||
integer MPI_COMBINER_CONTIGUOUS
|
||||
integer MPI_COMBINER_DARRAY
|
||||
integer MPI_COMBINER_DUP
|
||||
integer MPI_COMBINER_F90_COMPLEX
|
||||
integer MPI_COMBINER_F90_INTEGER
|
||||
integer MPI_COMBINER_F90_REAL
|
||||
integer MPI_COMBINER_HINDEXED
|
||||
integer MPI_COMBINER_HINDEXED_BLOCK
|
||||
integer MPI_COMBINER_HINDEXED_INTEGER
|
||||
integer MPI_COMBINER_HVECTOR
|
||||
integer MPI_COMBINER_HVECTOR_INTEGER
|
||||
integer MPI_COMBINER_INDEXED
|
||||
integer MPI_COMBINER_INDEXED_BLOCK
|
||||
integer MPI_COMBINER_NAMED
|
||||
integer MPI_COMBINER_RESIZED
|
||||
integer MPI_COMBINER_STRUCT
|
||||
integer MPI_COMBINER_STRUCT_INTEGER
|
||||
integer MPI_COMBINER_SUBARRAY
|
||||
integer MPI_COMBINER_VECTOR
|
||||
integer MPI_COMM_TYPE_HW_GUIDED
|
||||
integer MPI_COMM_TYPE_HW_UNGUIDED
|
||||
integer MPI_COMM_TYPE_SHARED
|
||||
integer MPI_CONGRUENT
|
||||
integer MPI_DISTRIBUTE_BLOCK
|
||||
integer MPI_DISTRIBUTE_CYCLIC
|
||||
integer MPI_DISTRIBUTE_DFLT_DARG
|
||||
integer MPI_DISTRIBUTE_NONE
|
||||
integer MPI_DIST_GRAPH
|
||||
integer MPI_ERROR
|
||||
integer MPI_ERR_ACCESS
|
||||
integer MPI_ERR_AMODE
|
||||
integer MPI_ERR_ARG
|
||||
integer MPI_ERR_ASSERT
|
||||
integer MPI_ERR_BAD_FILE
|
||||
integer MPI_ERR_BASE
|
||||
integer MPI_ERR_BUFFER
|
||||
integer MPI_ERR_COMM
|
||||
integer MPI_ERR_CONVERSION
|
||||
integer MPI_ERR_COUNT
|
||||
integer MPI_ERR_DIMS
|
||||
integer MPI_ERR_DISP
|
||||
integer MPI_ERR_DUP_DATAREP
|
||||
integer MPI_ERR_FILE
|
||||
integer MPI_ERR_FILE_EXISTS
|
||||
integer MPI_ERR_FILE_IN_USE
|
||||
integer MPI_ERR_GROUP
|
||||
integer MPI_ERR_INFO
|
||||
integer MPI_ERR_INFO_KEY
|
||||
integer MPI_ERR_INFO_NOKEY
|
||||
integer MPI_ERR_INFO_VALUE
|
||||
integer MPI_ERR_INTERN
|
||||
integer MPI_ERR_IN_STATUS
|
||||
integer MPI_ERR_IO
|
||||
integer MPI_ERR_KEYVAL
|
||||
integer MPI_ERR_LASTCODE
|
||||
integer MPI_ERR_LOCKTYPE
|
||||
integer MPI_ERR_NAME
|
||||
integer MPI_ERR_NOT_SAME
|
||||
integer MPI_ERR_NO_MEM
|
||||
integer MPI_ERR_NO_SPACE
|
||||
integer MPI_ERR_NO_SUCH_FILE
|
||||
integer MPI_ERR_OP
|
||||
integer MPI_ERR_OTHER
|
||||
integer MPI_ERR_PENDING
|
||||
integer MPI_ERR_PORT
|
||||
integer MPI_ERR_PROC_ABORTED
|
||||
integer MPI_ERR_PROC_FAILED
|
||||
integer MPI_ERR_PROC_FAILED_PENDING
|
||||
integer MPI_ERR_QUOTA
|
||||
integer MPI_ERR_RANK
|
||||
integer MPI_ERR_READ_ONLY
|
||||
integer MPI_ERR_REQUEST
|
||||
integer MPI_ERR_REVOKED
|
||||
integer MPI_ERR_RMA_ATTACH
|
||||
integer MPI_ERR_RMA_CONFLICT
|
||||
integer MPI_ERR_RMA_FLAVOR
|
||||
integer MPI_ERR_RMA_RANGE
|
||||
integer MPI_ERR_RMA_SHARED
|
||||
integer MPI_ERR_RMA_SYNC
|
||||
integer MPI_ERR_ROOT
|
||||
integer MPI_ERR_SERVICE
|
||||
integer MPI_ERR_SESSION
|
||||
integer MPI_ERR_SIZE
|
||||
integer MPI_ERR_SPAWN
|
||||
integer MPI_ERR_TAG
|
||||
integer MPI_ERR_TOPOLOGY
|
||||
integer MPI_ERR_TRUNCATE
|
||||
integer MPI_ERR_TYPE
|
||||
integer MPI_ERR_UNKNOWN
|
||||
integer MPI_ERR_UNSUPPORTED_DATAREP
|
||||
integer MPI_ERR_UNSUPPORTED_OPERATION
|
||||
integer MPI_ERR_VALUE_TOO_LARGE
|
||||
integer MPI_ERR_WIN
|
||||
integer MPI_FT
|
||||
integer MPI_GRAPH
|
||||
integer MPI_HOST
|
||||
integer MPI_IDENT
|
||||
integer MPI_IO
|
||||
integer MPI_KEYVAL_INVALID
|
||||
integer MPI_LASTUSEDCODE
|
||||
integer MPI_LOCK_EXCLUSIVE
|
||||
integer MPI_LOCK_SHARED
|
||||
integer MPI_MODE_NOCHECK
|
||||
integer MPI_MODE_NOPRECEDE
|
||||
integer MPI_MODE_NOPUT
|
||||
integer MPI_MODE_NOSTORE
|
||||
integer MPI_MODE_NOSUCCEED
|
||||
integer MPI_ORDER_C
|
||||
integer MPI_ORDER_FORTRAN
|
||||
integer MPI_PROC_NULL
|
||||
integer MPI_ROOT
|
||||
integer MPI_SIMILAR
|
||||
integer MPI_SOURCE
|
||||
integer MPI_SUBVERSION
|
||||
integer MPI_SUCCESS
|
||||
integer MPI_TAG
|
||||
integer MPI_TAG_UB
|
||||
integer MPI_THREAD_FUNNELED
|
||||
integer MPI_THREAD_MULTIPLE
|
||||
integer MPI_THREAD_SERIALIZED
|
||||
integer MPI_THREAD_SINGLE
|
||||
integer MPI_TYPECLASS_COMPLEX
|
||||
integer MPI_TYPECLASS_INTEGER
|
||||
integer MPI_TYPECLASS_REAL
|
||||
integer MPI_T_ERR_CANNOT_INIT
|
||||
integer MPI_T_ERR_CVAR_SET_NEVER
|
||||
integer MPI_T_ERR_CVAR_SET_NOT_NOW
|
||||
integer MPI_T_ERR_INVALID
|
||||
integer MPI_T_ERR_INVALID_HANDLE
|
||||
integer MPI_T_ERR_INVALID_INDEX
|
||||
integer MPI_T_ERR_INVALID_ITEM
|
||||
integer MPI_T_ERR_INVALID_SESSION
|
||||
integer MPI_T_ERR_MEMORY
|
||||
integer MPI_T_ERR_NOT_INITIALIZED
|
||||
integer MPI_T_ERR_OUT_OF_HANDLES
|
||||
integer MPI_T_ERR_OUT_OF_SESSIONS
|
||||
integer MPI_T_ERR_PVAR_NO_ATOMIC
|
||||
integer MPI_T_ERR_PVAR_NO_STARTSTOP
|
||||
integer MPI_T_ERR_PVAR_NO_WRITE
|
||||
integer MPI_UNDEFINED
|
||||
integer MPI_UNEQUAL
|
||||
integer MPI_UNIVERSE_SIZE
|
||||
integer MPI_VERSION
|
||||
integer MPI_WIN_BASE
|
||||
integer MPI_WIN_CREATE_FLAVOR
|
||||
integer MPI_WIN_DISP_UNIT
|
||||
integer MPI_WIN_FLAVOR_ALLOCATE
|
||||
integer MPI_WIN_FLAVOR_CREATE
|
||||
integer MPI_WIN_FLAVOR_DYNAMIC
|
||||
integer MPI_WIN_FLAVOR_SHARED
|
||||
integer MPI_WIN_MODEL
|
||||
integer MPI_WIN_SEPARATE
|
||||
integer MPI_WIN_SIZE
|
||||
integer MPI_WIN_UNIFIED
|
||||
integer MPI_WTIME_IS_GLOBAL
|
||||
integer OMPI_COMM_TYPE_BOARD
|
||||
integer OMPI_COMM_TYPE_CLUSTER
|
||||
integer OMPI_COMM_TYPE_CORE
|
||||
integer OMPI_COMM_TYPE_CU
|
||||
integer OMPI_COMM_TYPE_HOST
|
||||
integer OMPI_COMM_TYPE_HWTHREAD
|
||||
integer OMPI_COMM_TYPE_L1CACHE
|
||||
integer OMPI_COMM_TYPE_L2CACHE
|
||||
integer OMPI_COMM_TYPE_L3CACHE
|
||||
integer OMPI_COMM_TYPE_NODE
|
||||
integer OMPI_COMM_TYPE_NUMA
|
||||
integer OMPI_COMM_TYPE_SOCKET
|
||||
|
||||
parameter (MPI_ANY_SOURCE=-1)
|
||||
parameter (MPI_ANY_TAG=-1)
|
||||
parameter (MPI_APPNUM=4)
|
||||
parameter (MPI_BSEND_OVERHEAD=128)
|
||||
parameter (MPI_CART=1)
|
||||
parameter (MPI_COMBINER_CONTIGUOUS=2)
|
||||
parameter (MPI_COMBINER_DARRAY=13)
|
||||
parameter (MPI_COMBINER_DUP=1)
|
||||
parameter (MPI_COMBINER_F90_COMPLEX=15)
|
||||
parameter (MPI_COMBINER_F90_INTEGER=16)
|
||||
parameter (MPI_COMBINER_F90_REAL=14)
|
||||
parameter (MPI_COMBINER_HINDEXED=8)
|
||||
parameter (MPI_COMBINER_HINDEXED_BLOCK=18)
|
||||
parameter (MPI_COMBINER_HINDEXED_INTEGER=7)
|
||||
parameter (MPI_COMBINER_HVECTOR=5)
|
||||
parameter (MPI_COMBINER_HVECTOR_INTEGER=4)
|
||||
parameter (MPI_COMBINER_INDEXED=6)
|
||||
parameter (MPI_COMBINER_INDEXED_BLOCK=9)
|
||||
parameter (MPI_COMBINER_NAMED=0)
|
||||
parameter (MPI_COMBINER_RESIZED=17)
|
||||
parameter (MPI_COMBINER_STRUCT=11)
|
||||
parameter (MPI_COMBINER_STRUCT_INTEGER=10)
|
||||
parameter (MPI_COMBINER_SUBARRAY=12)
|
||||
parameter (MPI_COMBINER_VECTOR=3)
|
||||
parameter (MPI_COMM_TYPE_HW_GUIDED=13)
|
||||
parameter (MPI_COMM_TYPE_HW_UNGUIDED=12)
|
||||
parameter (MPI_COMM_TYPE_SHARED=0)
|
||||
parameter (MPI_CONGRUENT=1)
|
||||
parameter (MPI_DISTRIBUTE_BLOCK=0)
|
||||
parameter (MPI_DISTRIBUTE_CYCLIC=1)
|
||||
parameter (MPI_DISTRIBUTE_DFLT_DARG=-1)
|
||||
parameter (MPI_DISTRIBUTE_NONE=2)
|
||||
parameter (MPI_DIST_GRAPH=3)
|
||||
parameter (MPI_ERROR=3)
|
||||
parameter (MPI_ERR_ACCESS=20)
|
||||
parameter (MPI_ERR_AMODE=21)
|
||||
parameter (MPI_ERR_ARG=13)
|
||||
parameter (MPI_ERR_ASSERT=22)
|
||||
parameter (MPI_ERR_BAD_FILE=23)
|
||||
parameter (MPI_ERR_BASE=24)
|
||||
parameter (MPI_ERR_BUFFER=1)
|
||||
parameter (MPI_ERR_COMM=5)
|
||||
parameter (MPI_ERR_CONVERSION=25)
|
||||
parameter (MPI_ERR_COUNT=2)
|
||||
parameter (MPI_ERR_DIMS=12)
|
||||
parameter (MPI_ERR_DISP=26)
|
||||
parameter (MPI_ERR_DUP_DATAREP=27)
|
||||
parameter (MPI_ERR_FILE=30)
|
||||
parameter (MPI_ERR_FILE_EXISTS=28)
|
||||
parameter (MPI_ERR_FILE_IN_USE=29)
|
||||
parameter (MPI_ERR_GROUP=9)
|
||||
parameter (MPI_ERR_INFO=34)
|
||||
parameter (MPI_ERR_INFO_KEY=31)
|
||||
parameter (MPI_ERR_INFO_NOKEY=32)
|
||||
parameter (MPI_ERR_INFO_VALUE=33)
|
||||
parameter (MPI_ERR_INTERN=17)
|
||||
parameter (MPI_ERR_IN_STATUS=18)
|
||||
parameter (MPI_ERR_IO=35)
|
||||
parameter (MPI_ERR_KEYVAL=36)
|
||||
parameter (MPI_ERR_LASTCODE=92)
|
||||
parameter (MPI_ERR_LOCKTYPE=37)
|
||||
parameter (MPI_ERR_NAME=38)
|
||||
parameter (MPI_ERR_NOT_SAME=40)
|
||||
parameter (MPI_ERR_NO_MEM=39)
|
||||
parameter (MPI_ERR_NO_SPACE=41)
|
||||
parameter (MPI_ERR_NO_SUCH_FILE=42)
|
||||
parameter (MPI_ERR_OP=10)
|
||||
parameter (MPI_ERR_OTHER=16)
|
||||
parameter (MPI_ERR_PENDING=19)
|
||||
parameter (MPI_ERR_PORT=43)
|
||||
parameter (MPI_ERR_PROC_ABORTED=74)
|
||||
parameter (MPI_ERR_PROC_FAILED=75)
|
||||
parameter (MPI_ERR_PROC_FAILED_PENDING=76)
|
||||
parameter (MPI_ERR_QUOTA=44)
|
||||
parameter (MPI_ERR_RANK=6)
|
||||
parameter (MPI_ERR_READ_ONLY=45)
|
||||
parameter (MPI_ERR_REQUEST=7)
|
||||
parameter (MPI_ERR_REVOKED=77)
|
||||
parameter (MPI_ERR_RMA_ATTACH=69)
|
||||
parameter (MPI_ERR_RMA_CONFLICT=46)
|
||||
parameter (MPI_ERR_RMA_FLAVOR=70)
|
||||
parameter (MPI_ERR_RMA_RANGE=68)
|
||||
parameter (MPI_ERR_RMA_SHARED=71)
|
||||
parameter (MPI_ERR_RMA_SYNC=47)
|
||||
parameter (MPI_ERR_ROOT=8)
|
||||
parameter (MPI_ERR_SERVICE=48)
|
||||
parameter (MPI_ERR_SESSION=78)
|
||||
parameter (MPI_ERR_SIZE=49)
|
||||
parameter (MPI_ERR_SPAWN=50)
|
||||
parameter (MPI_ERR_TAG=4)
|
||||
parameter (MPI_ERR_TOPOLOGY=11)
|
||||
parameter (MPI_ERR_TRUNCATE=15)
|
||||
parameter (MPI_ERR_TYPE=3)
|
||||
parameter (MPI_ERR_UNKNOWN=14)
|
||||
parameter (MPI_ERR_UNSUPPORTED_DATAREP=51)
|
||||
parameter (MPI_ERR_UNSUPPORTED_OPERATION=52)
|
||||
parameter (MPI_ERR_VALUE_TOO_LARGE=79)
|
||||
parameter (MPI_ERR_WIN=53)
|
||||
parameter (MPI_FT=12)
|
||||
parameter (MPI_GRAPH=2)
|
||||
parameter (MPI_HOST=1)
|
||||
parameter (MPI_IDENT=0)
|
||||
parameter (MPI_IO=2)
|
||||
parameter (MPI_KEYVAL_INVALID=-1)
|
||||
parameter (MPI_LASTUSEDCODE=5)
|
||||
parameter (MPI_LOCK_EXCLUSIVE=1)
|
||||
parameter (MPI_LOCK_SHARED=2)
|
||||
parameter (MPI_MODE_NOCHECK=1)
|
||||
parameter (MPI_MODE_NOPRECEDE=2)
|
||||
parameter (MPI_MODE_NOPUT=4)
|
||||
parameter (MPI_MODE_NOSTORE=8)
|
||||
parameter (MPI_MODE_NOSUCCEED=16)
|
||||
parameter (MPI_ORDER_C=0)
|
||||
parameter (MPI_ORDER_FORTRAN=1)
|
||||
parameter (MPI_PROC_NULL=-2)
|
||||
parameter (MPI_ROOT=-4)
|
||||
parameter (MPI_SIMILAR=2)
|
||||
parameter (MPI_SOURCE=1)
|
||||
parameter (MPI_SUBVERSION=1)
|
||||
parameter (MPI_SUCCESS=0)
|
||||
parameter (MPI_TAG=2)
|
||||
parameter (MPI_TAG_UB=0)
|
||||
parameter (MPI_THREAD_FUNNELED=1)
|
||||
parameter (MPI_THREAD_MULTIPLE=3)
|
||||
parameter (MPI_THREAD_SERIALIZED=2)
|
||||
parameter (MPI_THREAD_SINGLE=0)
|
||||
parameter (MPI_TYPECLASS_COMPLEX=3)
|
||||
parameter (MPI_TYPECLASS_INTEGER=1)
|
||||
parameter (MPI_TYPECLASS_REAL=2)
|
||||
parameter (MPI_T_ERR_CANNOT_INIT=56)
|
||||
parameter (MPI_T_ERR_CVAR_SET_NEVER=64)
|
||||
parameter (MPI_T_ERR_CVAR_SET_NOT_NOW=63)
|
||||
parameter (MPI_T_ERR_INVALID=72)
|
||||
parameter (MPI_T_ERR_INVALID_HANDLE=59)
|
||||
parameter (MPI_T_ERR_INVALID_INDEX=57)
|
||||
parameter (MPI_T_ERR_INVALID_ITEM=58)
|
||||
parameter (MPI_T_ERR_INVALID_SESSION=62)
|
||||
parameter (MPI_T_ERR_MEMORY=54)
|
||||
parameter (MPI_T_ERR_NOT_INITIALIZED=55)
|
||||
parameter (MPI_T_ERR_OUT_OF_HANDLES=60)
|
||||
parameter (MPI_T_ERR_OUT_OF_SESSIONS=61)
|
||||
parameter (MPI_T_ERR_PVAR_NO_ATOMIC=67)
|
||||
parameter (MPI_T_ERR_PVAR_NO_STARTSTOP=65)
|
||||
parameter (MPI_T_ERR_PVAR_NO_WRITE=66)
|
||||
parameter (MPI_UNDEFINED=-32766)
|
||||
parameter (MPI_UNEQUAL=3)
|
||||
parameter (MPI_UNIVERSE_SIZE=6)
|
||||
parameter (MPI_VERSION=3)
|
||||
parameter (MPI_WIN_BASE=7)
|
||||
parameter (MPI_WIN_CREATE_FLAVOR=10)
|
||||
parameter (MPI_WIN_DISP_UNIT=9)
|
||||
parameter (MPI_WIN_FLAVOR_ALLOCATE=2)
|
||||
parameter (MPI_WIN_FLAVOR_CREATE=1)
|
||||
parameter (MPI_WIN_FLAVOR_DYNAMIC=3)
|
||||
parameter (MPI_WIN_FLAVOR_SHARED=4)
|
||||
parameter (MPI_WIN_MODEL=11)
|
||||
parameter (MPI_WIN_SEPARATE=1)
|
||||
parameter (MPI_WIN_SIZE=8)
|
||||
parameter (MPI_WIN_UNIFIED=0)
|
||||
parameter (MPI_WTIME_IS_GLOBAL=3)
|
||||
parameter (OMPI_COMM_TYPE_BOARD=8)
|
||||
parameter (OMPI_COMM_TYPE_CLUSTER=11)
|
||||
parameter (OMPI_COMM_TYPE_CORE=2)
|
||||
parameter (OMPI_COMM_TYPE_CU=10)
|
||||
parameter (OMPI_COMM_TYPE_HOST=9)
|
||||
parameter (OMPI_COMM_TYPE_HWTHREAD=1)
|
||||
parameter (OMPI_COMM_TYPE_L1CACHE=3)
|
||||
parameter (OMPI_COMM_TYPE_L2CACHE=4)
|
||||
parameter (OMPI_COMM_TYPE_L3CACHE=5)
|
||||
parameter (OMPI_COMM_TYPE_NODE=0)
|
||||
parameter (OMPI_COMM_TYPE_NUMA=7)
|
||||
parameter (OMPI_COMM_TYPE_SOCKET=6)
|
||||
@@ -22,11 +22,26 @@
|
||||
parameter (OMPI_HAVE_MPI_EXT_CUDA=0)
|
||||
|
||||
!
|
||||
! Enabled Extension: pcollreq
|
||||
! Enabled Extension: ftmpi
|
||||
!
|
||||
integer OMPI_HAVE_MPI_EXT_PCOLLREQ
|
||||
parameter (OMPI_HAVE_MPI_EXT_PCOLLREQ=1)
|
||||
integer OMPI_HAVE_MPI_EXT_FTMPI
|
||||
parameter (OMPI_HAVE_MPI_EXT_FTMPI=1)
|
||||
|
||||
include 'openmpi/mpiext/mpiext_pcollreq_mpifh.h'
|
||||
include 'openmpi/mpiext/mpiext_ftmpi_mpifh.h'
|
||||
|
||||
!
|
||||
! Enabled Extension: rocm
|
||||
! No mpif.h bindings available
|
||||
!
|
||||
integer OMPI_HAVE_MPI_EXT_ROCM
|
||||
parameter (OMPI_HAVE_MPI_EXT_ROCM=0)
|
||||
|
||||
!
|
||||
! Enabled Extension: shortfloat
|
||||
!
|
||||
integer OMPI_HAVE_MPI_EXT_SHORTFLOAT
|
||||
parameter (OMPI_HAVE_MPI_EXT_SHORTFLOAT=1)
|
||||
|
||||
include 'openmpi/mpiext/mpiext_shortfloat_mpifh.h'
|
||||
|
||||
!
|
||||
|
||||
48
macx64/mpi/openmpi/include/mpif-externals.h
Normal file
48
macx64/mpi/openmpi/include/mpif-externals.h
Normal file
@@ -0,0 +1,48 @@
|
||||
! -*- fortran -*-
|
||||
!
|
||||
! Copyright (c) 2004-2006 The Trustees of Indiana University and Indiana
|
||||
! University Research and Technology
|
||||
! Corporation. All rights reserved.
|
||||
! Copyright (c) 2004-2005 The University of Tennessee and The University
|
||||
! of Tennessee Research Foundation. All rights
|
||||
! reserved.
|
||||
! Copyright (c) 2004-2005 High Performance Computing Center Stuttgart,
|
||||
! University of Stuttgart. All rights reserved.
|
||||
! Copyright (c) 2004-2005 The Regents of the University of California.
|
||||
! All rights reserved.
|
||||
! Copyright (c) 2006-2017 Cisco Systems, Inc. All rights reserved
|
||||
! $COPYRIGHT$
|
||||
!
|
||||
! Additional copyrights may follow
|
||||
!
|
||||
! $HEADER$
|
||||
!
|
||||
|
||||
!
|
||||
! These "external" statements are specific to the MPI mpif.h
|
||||
! interface (and are toxic to the MPI module interfaces),.
|
||||
!
|
||||
external MPI_NULL_COPY_FN, MPI_NULL_DELETE_FN
|
||||
external MPI_COMM_NULL_COPY_FN, MPI_COMM_NULL_DELETE_FN
|
||||
external MPI_TYPE_NULL_COPY_FN, MPI_TYPE_NULL_DELETE_FN
|
||||
external MPI_DUP_FN, MPI_COMM_DUP_FN, MPI_TYPE_DUP_FN
|
||||
external MPI_WIN_NULL_COPY_FN
|
||||
external MPI_WIN_NULL_DELETE_FN
|
||||
external MPI_WIN_DUP_FN
|
||||
! Note that MPI_CONVERSION_FN_NULL is a "constant" (it is only ever
|
||||
! checked for comparison; it is never invoked), but it is passed as
|
||||
! a function pointer (to MPI_REGISTER_DATAREP) and therefore must be
|
||||
! the same size/type. It is therefore external'ed here, and not
|
||||
! defined with an integer value in mpif-common.h.
|
||||
external MPI_CONVERSION_FN_NULL
|
||||
|
||||
!
|
||||
! double precision functions
|
||||
!
|
||||
external MPI_WTIME, MPI_WTICK , PMPI_WTICK, PMPI_WTIME
|
||||
double precision MPI_WTIME, MPI_WTICK , PMPI_WTICK, PMPI_WTIME
|
||||
!
|
||||
! address integer functions
|
||||
!
|
||||
external MPI_AINT_ADD, MPI_AINT_DIFF
|
||||
integer(kind=MPI_ADDRESS_KIND) MPI_AINT_ADD, MPI_AINT_DIFF
|
||||
243
macx64/mpi/openmpi/include/mpif-handles.h
Normal file
243
macx64/mpi/openmpi/include/mpif-handles.h
Normal file
@@ -0,0 +1,243 @@
|
||||
! -*- fortran -*-
|
||||
! WARNING! THIS IS A GENERATED FILE!!
|
||||
! ANY EDITS YOU PUT HERE WILL BE LOST!
|
||||
! ==> Instead, edit topdir/ompi/include/mpif-values.pl.
|
||||
|
||||
! Copyright (c) 2004-2006 The Trustees of Indiana University and Indiana
|
||||
! University Research and Technology
|
||||
! Corporation. All rights reserved.
|
||||
! Copyright (c) 2004-2016 The University of Tennessee and The University
|
||||
! of Tennessee Research Foundation. All rights
|
||||
! reserved.
|
||||
! Copyright (c) 2004-2007 High Performance Computing Center Stuttgart,
|
||||
! University of Stuttgart. All rights reserved.
|
||||
! Copyright (c) 2004-2005 The Regents of the University of California.
|
||||
! All rights reserved.
|
||||
! Copyright (c) 2006-2012 Cisco Systems, Inc. All rights reserved.
|
||||
! Copyright (c) 2009-2012 Oak Ridge National Labs. All rights reserved.
|
||||
! Copyright (c) 2016 Research Organization for Information Science
|
||||
! and Technology (RIST). All rights reserved.
|
||||
! $COPYRIGHT$
|
||||
!
|
||||
! Additional copyrights may follow
|
||||
!
|
||||
! $HEADER$
|
||||
!
|
||||
|
||||
integer MPI_2COMPLEX
|
||||
integer MPI_2DOUBLE_COMPLEX
|
||||
integer MPI_2DOUBLE_PRECISION
|
||||
integer MPI_2INT
|
||||
integer MPI_2INTEGER
|
||||
integer MPI_2REAL
|
||||
integer MPI_AINT
|
||||
integer MPI_BAND
|
||||
integer MPI_BOR
|
||||
integer MPI_BXOR
|
||||
integer MPI_BYTE
|
||||
integer MPI_CHAR
|
||||
integer MPI_CHARACTER
|
||||
integer MPI_COMM_NULL
|
||||
integer MPI_COMM_SELF
|
||||
integer MPI_COMM_WORLD
|
||||
integer MPI_COMPLEX
|
||||
integer MPI_COMPLEX16
|
||||
integer MPI_COMPLEX32
|
||||
integer MPI_COMPLEX4
|
||||
integer MPI_COMPLEX8
|
||||
integer MPI_COUNT
|
||||
integer MPI_CXX_BOOL
|
||||
integer MPI_CXX_COMPLEX
|
||||
integer MPI_CXX_DOUBLE_COMPLEX
|
||||
integer MPI_CXX_FLOAT_COMPLEX
|
||||
integer MPI_CXX_LONG_DOUBLE_COMPLEX
|
||||
integer MPI_C_BOOL
|
||||
integer MPI_C_COMPLEX
|
||||
integer MPI_C_DOUBLE_COMPLEX
|
||||
integer MPI_C_FLOAT_COMPLEX
|
||||
integer MPI_C_LONG_DOUBLE_COMPLEX
|
||||
integer MPI_DATATYPE_NULL
|
||||
integer MPI_DOUBLE
|
||||
integer MPI_DOUBLE_COMPLEX
|
||||
integer MPI_DOUBLE_INT
|
||||
integer MPI_DOUBLE_PRECISION
|
||||
integer MPI_ERRHANDLER_NULL
|
||||
integer MPI_ERRORS_ABORT
|
||||
integer MPI_ERRORS_ARE_FATAL
|
||||
integer MPI_ERRORS_RETURN
|
||||
integer MPI_FLOAT
|
||||
integer MPI_FLOAT_INT
|
||||
integer MPI_GROUP_EMPTY
|
||||
integer MPI_GROUP_NULL
|
||||
integer MPI_INFO_ENV
|
||||
integer MPI_INFO_NULL
|
||||
integer MPI_INT
|
||||
integer MPI_INT16_T
|
||||
integer MPI_INT32_T
|
||||
integer MPI_INT64_T
|
||||
integer MPI_INT8_T
|
||||
integer MPI_INTEGER
|
||||
integer MPI_INTEGER1
|
||||
integer MPI_INTEGER16
|
||||
integer MPI_INTEGER2
|
||||
integer MPI_INTEGER4
|
||||
integer MPI_INTEGER8
|
||||
integer MPI_LAND
|
||||
integer MPI_LB
|
||||
integer MPI_LOGICAL
|
||||
integer MPI_LOGICAL1
|
||||
integer MPI_LOGICAL2
|
||||
integer MPI_LOGICAL4
|
||||
integer MPI_LOGICAL8
|
||||
integer MPI_LONG
|
||||
integer MPI_LONG_DOUBLE
|
||||
integer MPI_LONG_DOUBLE_INT
|
||||
integer MPI_LONG_INT
|
||||
integer MPI_LONG_LONG
|
||||
integer MPI_LONG_LONG_INT
|
||||
integer MPI_LOR
|
||||
integer MPI_LXOR
|
||||
integer MPI_MAX
|
||||
integer MPI_MAXLOC
|
||||
integer MPI_MESSAGE_NO_PROC
|
||||
integer MPI_MESSAGE_NULL
|
||||
integer MPI_MIN
|
||||
integer MPI_MINLOC
|
||||
integer MPI_NO_OP
|
||||
integer MPI_OFFSET
|
||||
integer MPI_OP_NULL
|
||||
integer MPI_PACKED
|
||||
integer MPI_PROD
|
||||
integer MPI_REAL
|
||||
integer MPI_REAL16
|
||||
integer MPI_REAL2
|
||||
integer MPI_REAL4
|
||||
integer MPI_REAL8
|
||||
integer MPI_REPLACE
|
||||
integer MPI_REQUEST_NULL
|
||||
integer MPI_SESSION_NULL
|
||||
integer MPI_SHORT
|
||||
integer MPI_SHORT_INT
|
||||
integer MPI_SIGNED_CHAR
|
||||
integer MPI_SUM
|
||||
integer MPI_UB
|
||||
integer MPI_UINT16_T
|
||||
integer MPI_UINT32_T
|
||||
integer MPI_UINT64_T
|
||||
integer MPI_UINT8_T
|
||||
integer MPI_UNSIGNED
|
||||
integer MPI_UNSIGNED_CHAR
|
||||
integer MPI_UNSIGNED_LONG
|
||||
integer MPI_UNSIGNED_LONG_LONG
|
||||
integer MPI_UNSIGNED_SHORT
|
||||
integer MPI_WCHAR
|
||||
integer MPI_WIN_NULL
|
||||
|
||||
parameter (MPI_2COMPLEX=26)
|
||||
parameter (MPI_2DOUBLE_COMPLEX=27)
|
||||
parameter (MPI_2DOUBLE_PRECISION=24)
|
||||
parameter (MPI_2INT=52)
|
||||
parameter (MPI_2INTEGER=25)
|
||||
parameter (MPI_2REAL=23)
|
||||
parameter (MPI_AINT=66)
|
||||
parameter (MPI_BAND=6)
|
||||
parameter (MPI_BOR=8)
|
||||
parameter (MPI_BXOR=10)
|
||||
parameter (MPI_BYTE=1)
|
||||
parameter (MPI_CHAR=34)
|
||||
parameter (MPI_CHARACTER=5)
|
||||
parameter (MPI_COMM_NULL=2)
|
||||
parameter (MPI_COMM_SELF=1)
|
||||
parameter (MPI_COMM_WORLD=0)
|
||||
parameter (MPI_COMPLEX=18)
|
||||
parameter (MPI_COMPLEX16=20)
|
||||
parameter (MPI_COMPLEX32=21)
|
||||
parameter (MPI_COMPLEX4=73)
|
||||
parameter (MPI_COMPLEX8=19)
|
||||
parameter (MPI_COUNT=72)
|
||||
parameter (MPI_CXX_BOOL=54)
|
||||
parameter (MPI_CXX_COMPLEX=55)
|
||||
parameter (MPI_CXX_DOUBLE_COMPLEX=56)
|
||||
parameter (MPI_CXX_FLOAT_COMPLEX=55)
|
||||
parameter (MPI_CXX_LONG_DOUBLE_COMPLEX=57)
|
||||
parameter (MPI_C_BOOL=68)
|
||||
parameter (MPI_C_COMPLEX=69)
|
||||
parameter (MPI_C_DOUBLE_COMPLEX=70)
|
||||
parameter (MPI_C_FLOAT_COMPLEX=69)
|
||||
parameter (MPI_C_LONG_DOUBLE_COMPLEX=71)
|
||||
parameter (MPI_DATATYPE_NULL=0)
|
||||
parameter (MPI_DOUBLE=46)
|
||||
parameter (MPI_DOUBLE_COMPLEX=22)
|
||||
parameter (MPI_DOUBLE_INT=49)
|
||||
parameter (MPI_DOUBLE_PRECISION=17)
|
||||
parameter (MPI_ERRHANDLER_NULL=0)
|
||||
parameter (MPI_ERRORS_ABORT=3)
|
||||
parameter (MPI_ERRORS_ARE_FATAL=1)
|
||||
parameter (MPI_ERRORS_RETURN=2)
|
||||
parameter (MPI_FLOAT=45)
|
||||
parameter (MPI_FLOAT_INT=48)
|
||||
parameter (MPI_GROUP_EMPTY=1)
|
||||
parameter (MPI_GROUP_NULL=0)
|
||||
parameter (MPI_INFO_ENV=1)
|
||||
parameter (MPI_INFO_NULL=0)
|
||||
parameter (MPI_INT=39)
|
||||
parameter (MPI_INT16_T=60)
|
||||
parameter (MPI_INT32_T=62)
|
||||
parameter (MPI_INT64_T=64)
|
||||
parameter (MPI_INT8_T=58)
|
||||
parameter (MPI_INTEGER=7)
|
||||
parameter (MPI_INTEGER1=8)
|
||||
parameter (MPI_INTEGER16=12)
|
||||
parameter (MPI_INTEGER2=9)
|
||||
parameter (MPI_INTEGER4=10)
|
||||
parameter (MPI_INTEGER8=11)
|
||||
parameter (MPI_LAND=5)
|
||||
parameter (MPI_LB=4)
|
||||
parameter (MPI_LOGICAL=6)
|
||||
parameter (MPI_LOGICAL1=29)
|
||||
parameter (MPI_LOGICAL2=30)
|
||||
parameter (MPI_LOGICAL4=31)
|
||||
parameter (MPI_LOGICAL8=32)
|
||||
parameter (MPI_LONG=41)
|
||||
parameter (MPI_LONG_DOUBLE=47)
|
||||
parameter (MPI_LONG_DOUBLE_INT=50)
|
||||
parameter (MPI_LONG_INT=51)
|
||||
parameter (MPI_LONG_LONG=43)
|
||||
parameter (MPI_LONG_LONG_INT=43)
|
||||
parameter (MPI_LOR=7)
|
||||
parameter (MPI_LXOR=9)
|
||||
parameter (MPI_MAX=1)
|
||||
parameter (MPI_MAXLOC=11)
|
||||
parameter (MPI_MESSAGE_NO_PROC=1)
|
||||
parameter (MPI_MESSAGE_NULL=0)
|
||||
parameter (MPI_MIN=2)
|
||||
parameter (MPI_MINLOC=12)
|
||||
parameter (MPI_NO_OP=14)
|
||||
parameter (MPI_OFFSET=67)
|
||||
parameter (MPI_OP_NULL=0)
|
||||
parameter (MPI_PACKED=2)
|
||||
parameter (MPI_PROD=4)
|
||||
parameter (MPI_REAL=13)
|
||||
parameter (MPI_REAL16=16)
|
||||
parameter (MPI_REAL2=28)
|
||||
parameter (MPI_REAL4=14)
|
||||
parameter (MPI_REAL8=15)
|
||||
parameter (MPI_REPLACE=13)
|
||||
parameter (MPI_REQUEST_NULL=0)
|
||||
parameter (MPI_SESSION_NULL=0)
|
||||
parameter (MPI_SHORT=37)
|
||||
parameter (MPI_SHORT_INT=53)
|
||||
parameter (MPI_SIGNED_CHAR=36)
|
||||
parameter (MPI_SUM=3)
|
||||
parameter (MPI_UB=3)
|
||||
parameter (MPI_UINT16_T=61)
|
||||
parameter (MPI_UINT32_T=63)
|
||||
parameter (MPI_UINT64_T=65)
|
||||
parameter (MPI_UINT8_T=59)
|
||||
parameter (MPI_UNSIGNED=40)
|
||||
parameter (MPI_UNSIGNED_CHAR=35)
|
||||
parameter (MPI_UNSIGNED_LONG=42)
|
||||
parameter (MPI_UNSIGNED_LONG_LONG=44)
|
||||
parameter (MPI_UNSIGNED_SHORT=38)
|
||||
parameter (MPI_WCHAR=33)
|
||||
parameter (MPI_WIN_NULL=0)
|
||||
53
macx64/mpi/openmpi/include/mpif-io-constants.h
Normal file
53
macx64/mpi/openmpi/include/mpif-io-constants.h
Normal file
@@ -0,0 +1,53 @@
|
||||
! -*- fortran -*-
|
||||
! WARNING! THIS IS A GENERATED FILE!!
|
||||
! ANY EDITS YOU PUT HERE WILL BE LOST!
|
||||
! ==> Instead, edit topdir/ompi/include/mpif-values.pl.
|
||||
|
||||
! Copyright (c) 2004-2006 The Trustees of Indiana University and Indiana
|
||||
! University Research and Technology
|
||||
! Corporation. All rights reserved.
|
||||
! Copyright (c) 2004-2016 The University of Tennessee and The University
|
||||
! of Tennessee Research Foundation. All rights
|
||||
! reserved.
|
||||
! Copyright (c) 2004-2007 High Performance Computing Center Stuttgart,
|
||||
! University of Stuttgart. All rights reserved.
|
||||
! Copyright (c) 2004-2005 The Regents of the University of California.
|
||||
! All rights reserved.
|
||||
! Copyright (c) 2006-2012 Cisco Systems, Inc. All rights reserved.
|
||||
! Copyright (c) 2009-2012 Oak Ridge National Labs. All rights reserved.
|
||||
! Copyright (c) 2016 Research Organization for Information Science
|
||||
! and Technology (RIST). All rights reserved.
|
||||
! $COPYRIGHT$
|
||||
!
|
||||
! Additional copyrights may follow
|
||||
!
|
||||
! $HEADER$
|
||||
!
|
||||
|
||||
integer MPI_MODE_APPEND
|
||||
integer MPI_MODE_CREATE
|
||||
integer MPI_MODE_DELETE_ON_CLOSE
|
||||
integer MPI_MODE_EXCL
|
||||
integer MPI_MODE_RDONLY
|
||||
integer MPI_MODE_RDWR
|
||||
integer MPI_MODE_SEQUENTIAL
|
||||
integer MPI_MODE_UNIQUE_OPEN
|
||||
integer MPI_MODE_WRONLY
|
||||
integer MPI_SEEK_CUR
|
||||
integer MPI_SEEK_END
|
||||
integer MPI_SEEK_SET
|
||||
integer(KIND=MPI_OFFSET_KIND) MPI_DISPLACEMENT_CURRENT
|
||||
|
||||
parameter (MPI_MODE_APPEND=128)
|
||||
parameter (MPI_MODE_CREATE=1)
|
||||
parameter (MPI_MODE_DELETE_ON_CLOSE=16)
|
||||
parameter (MPI_MODE_EXCL=64)
|
||||
parameter (MPI_MODE_RDONLY=2)
|
||||
parameter (MPI_MODE_RDWR=8)
|
||||
parameter (MPI_MODE_SEQUENTIAL=256)
|
||||
parameter (MPI_MODE_UNIQUE_OPEN=32)
|
||||
parameter (MPI_MODE_WRONLY=4)
|
||||
parameter (MPI_SEEK_CUR=602)
|
||||
parameter (MPI_SEEK_END=604)
|
||||
parameter (MPI_SEEK_SET=600)
|
||||
parameter (MPI_DISPLACEMENT_CURRENT=-54278278)
|
||||
29
macx64/mpi/openmpi/include/mpif-io-handles.h
Normal file
29
macx64/mpi/openmpi/include/mpif-io-handles.h
Normal file
@@ -0,0 +1,29 @@
|
||||
! -*- fortran -*-
|
||||
! WARNING! THIS IS A GENERATED FILE!!
|
||||
! ANY EDITS YOU PUT HERE WILL BE LOST!
|
||||
! ==> Instead, edit topdir/ompi/include/mpif-values.pl.
|
||||
|
||||
! Copyright (c) 2004-2006 The Trustees of Indiana University and Indiana
|
||||
! University Research and Technology
|
||||
! Corporation. All rights reserved.
|
||||
! Copyright (c) 2004-2016 The University of Tennessee and The University
|
||||
! of Tennessee Research Foundation. All rights
|
||||
! reserved.
|
||||
! Copyright (c) 2004-2007 High Performance Computing Center Stuttgart,
|
||||
! University of Stuttgart. All rights reserved.
|
||||
! Copyright (c) 2004-2005 The Regents of the University of California.
|
||||
! All rights reserved.
|
||||
! Copyright (c) 2006-2012 Cisco Systems, Inc. All rights reserved.
|
||||
! Copyright (c) 2009-2012 Oak Ridge National Labs. All rights reserved.
|
||||
! Copyright (c) 2016 Research Organization for Information Science
|
||||
! and Technology (RIST). All rights reserved.
|
||||
! $COPYRIGHT$
|
||||
!
|
||||
! Additional copyrights may follow
|
||||
!
|
||||
! $HEADER$
|
||||
!
|
||||
|
||||
integer MPI_FILE_NULL
|
||||
|
||||
parameter (MPI_FILE_NULL=0)
|
||||
68
macx64/mpi/openmpi/include/mpif-sentinels.h
Normal file
68
macx64/mpi/openmpi/include/mpif-sentinels.h
Normal file
@@ -0,0 +1,68 @@
|
||||
! -*- fortran -*-
|
||||
!
|
||||
! Copyright (c) 2004-2006 The Trustees of Indiana University and Indiana
|
||||
! University Research and Technology
|
||||
! Corporation. All rights reserved.
|
||||
! Copyright (c) 2004-2010 The University of Tennessee and The University
|
||||
! of Tennessee Research Foundation. All rights
|
||||
! reserved.
|
||||
! Copyright (c) 2004-2007 High Performance Computing Center Stuttgart,
|
||||
! University of Stuttgart. All rights reserved.
|
||||
! Copyright (c) 2004-2005 The Regents of the University of California.
|
||||
! All rights reserved.
|
||||
! Copyright (c) 2006-2012 Cisco Systems, Inc. All rights reserved.
|
||||
! Copyright (c) 2009 Oak Ridge National Labs. All rights reserved.
|
||||
! $COPYRIGHT$
|
||||
!
|
||||
! Additional copyrights may follow
|
||||
!
|
||||
! $HEADER$
|
||||
!
|
||||
|
||||
!
|
||||
! All of these types were chosen with care to match the types of
|
||||
! their corresponding C variables. Do not arbitrarily change
|
||||
! their types without also updating:
|
||||
!
|
||||
! - the "mpi" module bindings
|
||||
! - the "mpi_f08" module bindings
|
||||
! - ompi/mpi/fortran/base/gen-mpi-mangling.pl
|
||||
!
|
||||
|
||||
! MPI_BOTTOM is only used where choice buffers can be used (meaning
|
||||
! that we already have overloaded F90 bindings for all available
|
||||
! types), so any type is fine.
|
||||
integer MPI_BOTTOM
|
||||
! MPI_IN_PLACE has the same rationale as MPI_BOTTOM.
|
||||
integer MPI_IN_PLACE
|
||||
! Making MPI_ARGV_NULL be the same type as the parameter that is
|
||||
! expected in the F90 binding for MPI_COMM_SPAWN means that we
|
||||
! don't need another interface for MPI_COMM_SPAWN.
|
||||
character MPI_ARGV_NULL(1)
|
||||
! Ditto for MPI_ARGVS_NULL / MPI_COMM_SPAWN_MULTIPLE.
|
||||
character MPI_ARGVS_NULL(1, 1)
|
||||
! MPI_ERRCODES_IGNORE has similar rationale to MPI_ARGV_NULL. The
|
||||
! F77 functions are all smart enough to check that the errcodes
|
||||
! parameter is not ERRCODES_IGNORE before assigning values into it
|
||||
! (hence, the fact that this is an array of only 1 element does not
|
||||
! matter -- we'll never overrun it because we never assign values
|
||||
! into it).
|
||||
integer MPI_ERRCODES_IGNORE(1)
|
||||
! MPI_STATUS_IGNORE has similar rationale to MPI_ERRCODES_IGNORE.
|
||||
integer MPI_STATUS_IGNORE(MPI_STATUS_SIZE)
|
||||
! Ditto for MPI_STATUSES_IGNORE
|
||||
integer MPI_STATUSES_IGNORE(MPI_STATUS_SIZE, 1)
|
||||
! Ditto for MPI_UNWEIGHTED
|
||||
integer MPI_UNWEIGHTED(1)
|
||||
! Ditto for MPI_WEIGHTS_EMPTY
|
||||
integer MPI_WEIGHTS_EMPTY(1)
|
||||
|
||||
common/mpi_fortran_bottom/MPI_BOTTOM
|
||||
common/mpi_fortran_in_place/MPI_IN_PLACE
|
||||
common/mpi_fortran_argv_null/MPI_ARGV_NULL
|
||||
common/mpi_fortran_argvs_null/MPI_ARGVS_NULL
|
||||
common/mpi_fortran_errcodes_ignore/MPI_ERRCODES_IGNORE
|
||||
common/mpi_fortran_status_ignore/MPI_STATUS_IGNORE
|
||||
common/mpi_fortran_statuses_ignore/MPI_STATUSES_IGNORE
|
||||
common/mpi_fortran_unweighted/MPI_UNWEIGHTED
|
||||
common/mpi_fortran_weights_empty/MPI_WEIGHTS_EMPTY
|
||||
File diff suppressed because it is too large
Load Diff
@@ -3,6 +3,9 @@
|
||||
* All rights reserved.
|
||||
* Copyright (c) 2010-2012 Cisco Systems, Inc. All rights reserved.
|
||||
* Copyright (c) 2010 Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2021 The University of Tennessee and the University
|
||||
* of Tennessee research Foundation. All rights
|
||||
* reserved.
|
||||
* $COPYRIGHT$
|
||||
*
|
||||
* Additional copyrights may follow
|
||||
|
||||
50
macx64/mpi/openmpi/include/openmpi/mpiext/mpiext_ftmpi_c.h
Normal file
50
macx64/mpi/openmpi/include/openmpi/mpiext/mpiext_ftmpi_c.h
Normal file
@@ -0,0 +1,50 @@
|
||||
/*
|
||||
* Copyright (c) 2010-2012 Oak Ridge National Labs. All rights reserved.
|
||||
* Copyright (c) 2010-2020 The University of Tennessee and the University
|
||||
* of Tennessee research Foundation. All rights
|
||||
* reserved.
|
||||
* $COPYRIGHT$
|
||||
*
|
||||
* Additional copyrights may follow
|
||||
*
|
||||
* $HEADER$
|
||||
*
|
||||
*/
|
||||
|
||||
/********************************
|
||||
* Error codes and classes
|
||||
********************************/
|
||||
#define MPIX_ERR_PROC_FAILED MPI_ERR_PROC_FAILED
|
||||
#define MPIX_ERR_PROC_FAILED_PENDING MPI_ERR_PROC_FAILED_PENDING
|
||||
#define MPIX_ERR_REVOKED MPI_ERR_REVOKED
|
||||
#define MPIX_FT MPI_FT
|
||||
|
||||
/********************************
|
||||
* Communicators
|
||||
********************************/
|
||||
OMPI_DECLSPEC int MPIX_Comm_revoke(MPI_Comm comm);
|
||||
OMPI_DECLSPEC int MPIX_Comm_is_revoked(MPI_Comm comm, int *flag);
|
||||
OMPI_DECLSPEC int MPIX_Comm_shrink(MPI_Comm comm, MPI_Comm *newcomm);
|
||||
OMPI_DECLSPEC int MPIX_Comm_failure_ack(MPI_Comm comm);
|
||||
OMPI_DECLSPEC int MPIX_Comm_failure_get_acked(MPI_Comm comm, MPI_Group *failedgrp);
|
||||
OMPI_DECLSPEC int MPIX_Comm_get_failed(MPI_Comm comm, MPI_Group *failedgroup);
|
||||
OMPI_DECLSPEC int MPIX_Comm_ack_failed(MPI_Comm comm, int num_to_ack, int *num_acked);
|
||||
OMPI_DECLSPEC int MPIX_Comm_agree(MPI_Comm comm, int *flag);
|
||||
OMPI_DECLSPEC int MPIX_Comm_iagree(MPI_Comm comm, int *flag, MPI_Request *request);
|
||||
|
||||
OMPI_DECLSPEC int PMPIX_Comm_revoke(MPI_Comm comm);
|
||||
OMPI_DECLSPEC int PMPIX_Comm_is_revoked(MPI_Comm comm, int *flag);
|
||||
OMPI_DECLSPEC int PMPIX_Comm_shrink(MPI_Comm comm, MPI_Comm *newcomm);
|
||||
OMPI_DECLSPEC int PMPIX_Comm_failure_ack(MPI_Comm comm);
|
||||
OMPI_DECLSPEC int PMPIX_Comm_failure_get_acked(MPI_Comm comm, MPI_Group *failedgrp);
|
||||
OMPI_DECLSPEC int PMPIX_Comm_get_failed(MPI_Comm comm, MPI_Group *failedgroup);
|
||||
OMPI_DECLSPEC int PMPIX_Comm_ack_failed(MPI_Comm comm, int num_to_ack, int *num_acked);
|
||||
OMPI_DECLSPEC int PMPIX_Comm_agree(MPI_Comm comm, int *flag);
|
||||
OMPI_DECLSPEC int PMPIX_Comm_iagree(MPI_Comm comm, int *flag, MPI_Request *request);
|
||||
|
||||
#include <stdbool.h>
|
||||
OMPI_DECLSPEC int OMPI_Comm_failure_inject(MPI_Comm comm, bool notify);
|
||||
/* Provide defines to facilitate the detection of the new API */
|
||||
#define OMPI_HAVE_MPIX_COMM_GET_FAILED 1
|
||||
#define OMPI_HAVE_MPIX_COMM_ACK_FAILED 1
|
||||
|
||||
@@ -0,0 +1,22 @@
|
||||
! -*- fortran -*-
|
||||
! Copyright (c) 2010-2012 Oak Ridge National Labs. All rights reserved.
|
||||
! Copyright (c) 2010-2020 The Trustees of the University of Tennessee.
|
||||
! All rights reserved.
|
||||
! $COPYRIGHT$
|
||||
!
|
||||
! Additional copyrights may follow
|
||||
!
|
||||
! $HEADER$
|
||||
!
|
||||
|
||||
!
|
||||
! Error codes
|
||||
!
|
||||
integer MPIX_ERR_PROC_FAILED
|
||||
integer MPIX_ERR_PROC_FAILED_PENDING
|
||||
integer MPIX_ERR_REVOKED
|
||||
! These values must match the same define in mpif-common.h
|
||||
parameter (MPIX_ERR_PROC_FAILED = 75)
|
||||
parameter (MPIX_ERR_PROC_FAILED_PENDING = 76)
|
||||
parameter (MPIX_ERR_REVOKED = 77)
|
||||
|
||||
@@ -1,62 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 2017 FUJITSU LIMITED. All rights reserved.
|
||||
* Copyright (c) 2018 Research Organization for Information Science
|
||||
* and Technology (RIST). All rights reserved.
|
||||
* $COPYRIGHT$
|
||||
*
|
||||
* Additional copyrights may follow
|
||||
*
|
||||
* $HEADER$
|
||||
*
|
||||
*/
|
||||
|
||||
OMPI_DECLSPEC int MPIX_Allgather_init(const void *sendbuf, int sendcount, MPI_Datatype sendtype, void *recvbuf, int recvcount, MPI_Datatype recvtype, MPI_Comm comm, MPI_Info info, MPI_Request *request);
|
||||
OMPI_DECLSPEC int MPIX_Allgatherv_init(const void *sendbuf, int sendcount, MPI_Datatype sendtype, void *recvbuf, const int recvcounts[], const int displs[], MPI_Datatype recvtype, MPI_Comm comm, MPI_Info info, MPI_Request *request);
|
||||
OMPI_DECLSPEC int MPIX_Allreduce_init(const void *sendbuf, void *recvbuf, int count, MPI_Datatype datatype, MPI_Op op, MPI_Comm comm, MPI_Info info, MPI_Request *request);
|
||||
OMPI_DECLSPEC int MPIX_Alltoall_init(const void *sendbuf, int sendcount, MPI_Datatype sendtype, void *recvbuf, int recvcount, MPI_Datatype recvtype, MPI_Comm comm, MPI_Info info, MPI_Request *request);
|
||||
OMPI_DECLSPEC int MPIX_Alltoallv_init(const void *sendbuf, const int sendcounts[], const int sdispls[], MPI_Datatype sendtype, void *recvbuf, const int recvcounts[], const int rdispls[], MPI_Datatype recvtype, MPI_Comm comm, MPI_Info info, MPI_Request *request);
|
||||
OMPI_DECLSPEC int MPIX_Alltoallw_init(const void *sendbuf, const int sendcounts[], const int sdispls[], const MPI_Datatype sendtypes[], void *recvbuf, const int recvcounts[], const int rdispls[], const MPI_Datatype recvtypes[], MPI_Comm comm, MPI_Info info, MPI_Request *request);
|
||||
OMPI_DECLSPEC int MPIX_Barrier_init(MPI_Comm comm, MPI_Info info, MPI_Request *request);
|
||||
OMPI_DECLSPEC int MPIX_Bcast_init(void *buffer, int count, MPI_Datatype datatype, int root, MPI_Comm comm, MPI_Info info, MPI_Request *request);
|
||||
OMPI_DECLSPEC int MPIX_Exscan_init(const void *sendbuf, void *recvbuf, int count, MPI_Datatype datatype, MPI_Op op, MPI_Comm comm, MPI_Info info, MPI_Request *request);
|
||||
OMPI_DECLSPEC int MPIX_Gather_init(const void *sendbuf, int sendcount, MPI_Datatype sendtype, void *recvbuf, int recvcount, MPI_Datatype recvtype, int root, MPI_Comm comm, MPI_Info info, MPI_Request *request);
|
||||
OMPI_DECLSPEC int MPIX_Gatherv_init(const void *sendbuf, int sendcount, MPI_Datatype sendtype, void *recvbuf, const int recvcounts[], const int displs[], MPI_Datatype recvtype, int root, MPI_Comm comm, MPI_Info info, MPI_Request *request);
|
||||
OMPI_DECLSPEC int MPIX_Reduce_init(const void *sendbuf, void *recvbuf, int count, MPI_Datatype datatype, MPI_Op op, int root, MPI_Comm comm, MPI_Info info, MPI_Request *request);
|
||||
OMPI_DECLSPEC int MPIX_Reduce_scatter_init(const void *sendbuf, void *recvbuf, const int recvcounts[], MPI_Datatype datatype, MPI_Op op, MPI_Comm comm, MPI_Info info, MPI_Request *request);
|
||||
OMPI_DECLSPEC int MPIX_Reduce_scatter_block_init(const void *sendbuf, void *recvbuf, int recvcount, MPI_Datatype datatype, MPI_Op op, MPI_Comm comm, MPI_Info info, MPI_Request *request);
|
||||
OMPI_DECLSPEC int MPIX_Scan_init(const void *sendbuf, void *recvbuf, int count, MPI_Datatype datatype, MPI_Op op, MPI_Comm comm, MPI_Info info, MPI_Request *request);
|
||||
OMPI_DECLSPEC int MPIX_Scatter_init(const void *sendbuf, int sendcount, MPI_Datatype sendtype, void *recvbuf, int recvcount, MPI_Datatype recvtype, int root, MPI_Comm comm, MPI_Info info, MPI_Request *request);
|
||||
OMPI_DECLSPEC int MPIX_Scatterv_init(const void *sendbuf, const int sendcounts[], const int displs[], MPI_Datatype sendtype, void *recvbuf, int recvcount, MPI_Datatype recvtype, int root, MPI_Comm comm, MPI_Info info, MPI_Request *request);
|
||||
|
||||
OMPI_DECLSPEC int MPIX_Neighbor_allgather_init(const void *sendbuf, int sendcount, MPI_Datatype sendtype, void *recvbuf, int recvcount, MPI_Datatype recvtype, MPI_Comm comm, MPI_Info info, MPI_Request *request);
|
||||
OMPI_DECLSPEC int MPIX_Neighbor_allgatherv_init(const void *sendbuf, int sendcount, MPI_Datatype sendtype, void *recvbuf, const int recvcounts[], const int displs[], MPI_Datatype recvtype, MPI_Comm comm, MPI_Info info, MPI_Request *request);
|
||||
OMPI_DECLSPEC int MPIX_Neighbor_alltoall_init(const void *sendbuf, int sendcount, MPI_Datatype sendtype, void *recvbuf, int recvcount, MPI_Datatype recvtype, MPI_Comm comm, MPI_Info info, MPI_Request *request);
|
||||
OMPI_DECLSPEC int MPIX_Neighbor_alltoallv_init(const void *sendbuf, const int sendcounts[], const int sdispls[], MPI_Datatype sendtype, void *recvbuf, const int recvcounts[], const int rdispls[], MPI_Datatype recvtype, MPI_Comm comm, MPI_Info info, MPI_Request *request);
|
||||
OMPI_DECLSPEC int MPIX_Neighbor_alltoallw_init(const void *sendbuf, const int sendcounts[], const MPI_Aint sdispls[], const MPI_Datatype sendtypes[], void *recvbuf, const int recvcounts[], const MPI_Aint rdispls[], const MPI_Datatype recvtypes[], MPI_Comm comm, MPI_Info info, MPI_Request *request);
|
||||
|
||||
/*
|
||||
* Profiling MPI API
|
||||
*/
|
||||
OMPI_DECLSPEC int PMPIX_Allgather_init(const void *sendbuf, int sendcount, MPI_Datatype sendtype, void *recvbuf, int recvcount, MPI_Datatype recvtype, MPI_Comm comm, MPI_Info info, MPI_Request *request);
|
||||
OMPI_DECLSPEC int PMPIX_Allgatherv_init(const void *sendbuf, int sendcount, MPI_Datatype sendtype, void *recvbuf, const int recvcounts[], const int displs[], MPI_Datatype recvtype, MPI_Comm comm, MPI_Info info, MPI_Request *request);
|
||||
OMPI_DECLSPEC int PMPIX_Allreduce_init(const void *sendbuf, void *recvbuf, int count, MPI_Datatype datatype, MPI_Op op, MPI_Comm comm, MPI_Info info, MPI_Request *request);
|
||||
OMPI_DECLSPEC int PMPIX_Alltoall_init(const void *sendbuf, int sendcount, MPI_Datatype sendtype, void *recvbuf, int recvcount, MPI_Datatype recvtype, MPI_Comm comm, MPI_Info info, MPI_Request *request);
|
||||
OMPI_DECLSPEC int PMPIX_Alltoallv_init(const void *sendbuf, const int sendcounts[], const int sdispls[], MPI_Datatype sendtype, void *recvbuf, const int recvcounts[], const int rdispls[], MPI_Datatype recvtype, MPI_Comm comm, MPI_Info info, MPI_Request *request);
|
||||
OMPI_DECLSPEC int PMPIX_Alltoallw_init(const void *sendbuf, const int sendcounts[], const int sdispls[], const MPI_Datatype sendtypes[], void *recvbuf, const int recvcounts[], const int rdispls[], const MPI_Datatype recvtypes[], MPI_Comm comm, MPI_Info info, MPI_Request *request);
|
||||
OMPI_DECLSPEC int PMPIX_Barrier_init(MPI_Comm comm, MPI_Info info, MPI_Request *request);
|
||||
OMPI_DECLSPEC int PMPIX_Bcast_init(void *buffer, int count, MPI_Datatype datatype, int root, MPI_Comm comm, MPI_Info info, MPI_Request *request);
|
||||
OMPI_DECLSPEC int PMPIX_Exscan_init(const void *sendbuf, void *recvbuf, int count, MPI_Datatype datatype, MPI_Op op, MPI_Comm comm, MPI_Info info, MPI_Request *request);
|
||||
OMPI_DECLSPEC int PMPIX_Gather_init(const void *sendbuf, int sendcount, MPI_Datatype sendtype, void *recvbuf, int recvcount, MPI_Datatype recvtype, int root, MPI_Comm comm, MPI_Info info, MPI_Request *request);
|
||||
OMPI_DECLSPEC int PMPIX_Gatherv_init(const void *sendbuf, int sendcount, MPI_Datatype sendtype, void *recvbuf, const int recvcounts[], const int displs[], MPI_Datatype recvtype, int root, MPI_Comm comm, MPI_Info info, MPI_Request *request);
|
||||
OMPI_DECLSPEC int PMPIX_Reduce_init(const void *sendbuf, void *recvbuf, int count, MPI_Datatype datatype, MPI_Op op, int root, MPI_Comm comm, MPI_Info info, MPI_Request *request);
|
||||
OMPI_DECLSPEC int PMPIX_Reduce_scatter_init(const void *sendbuf, void *recvbuf, const int recvcounts[], MPI_Datatype datatype, MPI_Op op, MPI_Comm comm, MPI_Info info, MPI_Request *request);
|
||||
OMPI_DECLSPEC int PMPIX_Reduce_scatter_block_init(const void *sendbuf, void *recvbuf, int recvcount, MPI_Datatype datatype, MPI_Op op, MPI_Comm comm, MPI_Info info, MPI_Request *request);
|
||||
OMPI_DECLSPEC int PMPIX_Scan_init(const void *sendbuf, void *recvbuf, int count, MPI_Datatype datatype, MPI_Op op, MPI_Comm comm, MPI_Info info, MPI_Request *request);
|
||||
OMPI_DECLSPEC int PMPIX_Scatter_init(const void *sendbuf, int sendcount, MPI_Datatype sendtype, void *recvbuf, int recvcount, MPI_Datatype recvtype, int root, MPI_Comm comm, MPI_Info info, MPI_Request *request);
|
||||
OMPI_DECLSPEC int PMPIX_Scatterv_init(const void *sendbuf, const int sendcounts[], const int displs[], MPI_Datatype sendtype, void *recvbuf, int recvcount, MPI_Datatype recvtype, int root, MPI_Comm comm, MPI_Info info, MPI_Request *request);
|
||||
|
||||
OMPI_DECLSPEC int PMPIX_Neighbor_allgather_init(const void *sendbuf, int sendcount, MPI_Datatype sendtype, void *recvbuf, int recvcount, MPI_Datatype recvtype, MPI_Comm comm, MPI_Info info, MPI_Request *request);
|
||||
OMPI_DECLSPEC int PMPIX_Neighbor_allgatherv_init(const void *sendbuf, int sendcount, MPI_Datatype sendtype, void *recvbuf, const int recvcounts[], const int displs[], MPI_Datatype recvtype, MPI_Comm comm, MPI_Info info, MPI_Request *request);
|
||||
OMPI_DECLSPEC int PMPIX_Neighbor_alltoall_init(const void *sendbuf, int sendcount, MPI_Datatype sendtype, void *recvbuf, int recvcount, MPI_Datatype recvtype, MPI_Comm comm, MPI_Info info, MPI_Request *request);
|
||||
OMPI_DECLSPEC int PMPIX_Neighbor_alltoallv_init(const void *sendbuf, const int sendcounts[], const int sdispls[], MPI_Datatype sendtype, void *recvbuf, const int recvcounts[], const int rdispls[], MPI_Datatype recvtype, MPI_Comm comm, MPI_Info info, MPI_Request *request);
|
||||
OMPI_DECLSPEC int PMPIX_Neighbor_alltoallw_init(const void *sendbuf, const int sendcounts[], const MPI_Aint sdispls[], const MPI_Datatype sendtypes[], void *recvbuf, const int recvcounts[], const MPI_Aint rdispls[], const MPI_Datatype recvtypes[], MPI_Comm comm, MPI_Info info, MPI_Request *request);
|
||||
18
macx64/mpi/openmpi/include/openmpi/mpiext/mpiext_rocm_c.h
Normal file
18
macx64/mpi/openmpi/include/openmpi/mpiext/mpiext_rocm_c.h
Normal file
@@ -0,0 +1,18 @@
|
||||
/* ompi/mpiext/rocm/c/mpiext_rocm_c.h. Generated from mpiext_rocm_c.h.in by configure. */
|
||||
/*
|
||||
* Copyright (c) 2004-2009 The Trustees of Indiana University.
|
||||
* All rights reserved.
|
||||
* Copyright (c) 2010-2012 Cisco Systems, Inc. All rights reserved.
|
||||
* Copyright (c) 2010 Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2015 NVIDIA, Inc. All rights reserved.
|
||||
* Copyright (c) 2022 Advanced Micro Devices, Inc. All rights reserved.
|
||||
* $COPYRIGHT$
|
||||
*
|
||||
* Additional copyrights may follow
|
||||
*
|
||||
* $HEADER$
|
||||
*
|
||||
*/
|
||||
|
||||
#define MPIX_ROCM_AWARE_SUPPORT 0
|
||||
OMPI_DECLSPEC int MPIX_Query_rocm_support(void);
|
||||
@@ -0,0 +1,21 @@
|
||||
/*
|
||||
* Copyright (c) 2018 FUJITSU LIMITED. All rights reserved.
|
||||
* $COPYRIGHT$
|
||||
*
|
||||
* Additional copyrights may follow
|
||||
*
|
||||
* $HEADER$
|
||||
*
|
||||
*/
|
||||
|
||||
OMPI_DECLSPEC extern struct ompi_predefined_datatype_t ompi_mpi_short_float;
|
||||
OMPI_DECLSPEC extern struct ompi_predefined_datatype_t ompi_mpi_c_short_float_complex;
|
||||
OMPI_DECLSPEC extern struct ompi_predefined_datatype_t ompi_mpi_cxx_sfltcplex;
|
||||
|
||||
#define MPIX_SHORT_FLOAT OMPI_PREDEFINED_GLOBAL(MPI_Datatype, ompi_mpi_short_float)
|
||||
#define MPIX_C_SHORT_FLOAT_COMPLEX OMPI_PREDEFINED_GLOBAL(MPI_Datatype, ompi_mpi_c_short_float_complex)
|
||||
#define MPIX_CXX_SHORT_FLOAT_COMPLEX OMPI_PREDEFINED_GLOBAL(MPI_Datatype, ompi_mpi_cxx_sfltcplex)
|
||||
|
||||
#if 1
|
||||
#define MPIX_C_FLOAT16 OMPI_PREDEFINED_GLOBAL(MPI_Datatype, ompi_mpi_short_float)
|
||||
#endif
|
||||
@@ -0,0 +1,19 @@
|
||||
! -*- fortran -*-
|
||||
!
|
||||
! Copyright (c) 2018 FUJITSU LIMITED. All rights reserved.
|
||||
! $COPYRIGHT$
|
||||
!
|
||||
! Additional copyrights may follow
|
||||
!
|
||||
! $HEADER$
|
||||
!
|
||||
|
||||
integer MPIX_SHORT_FLOAT
|
||||
integer MPIX_C_SHORT_FLOAT_COMPLEX
|
||||
integer MPIX_CXX_SHORT_FLOAT_COMPLEX
|
||||
integer MPIX_C_FLOAT16
|
||||
|
||||
parameter (MPIX_SHORT_FLOAT=74)
|
||||
parameter (MPIX_C_SHORT_FLOAT_COMPLEX=75)
|
||||
parameter (MPIX_CXX_SHORT_FLOAT_COMPLEX=76)
|
||||
parameter (MPIX_C_FLOAT16=74)
|
||||
@@ -1,62 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 2017 FUJITSU LIMITED. All rights reserved.
|
||||
* Copyright (c) 2018 Research Organization for Information Science
|
||||
* and Technology (RIST). All rights reserved.
|
||||
* $COPYRIGHT$
|
||||
*
|
||||
* Additional copyrights may follow
|
||||
*
|
||||
* $HEADER$
|
||||
*
|
||||
*/
|
||||
|
||||
OMPI_DECLSPEC int MPIX_Allgather_init(const void *sendbuf, int sendcount, MPI_Datatype sendtype, void *recvbuf, int recvcount, MPI_Datatype recvtype, MPI_Comm comm, MPI_Info info, MPI_Request *request);
|
||||
OMPI_DECLSPEC int MPIX_Allgatherv_init(const void *sendbuf, int sendcount, MPI_Datatype sendtype, void *recvbuf, const int recvcounts[], const int displs[], MPI_Datatype recvtype, MPI_Comm comm, MPI_Info info, MPI_Request *request);
|
||||
OMPI_DECLSPEC int MPIX_Allreduce_init(const void *sendbuf, void *recvbuf, int count, MPI_Datatype datatype, MPI_Op op, MPI_Comm comm, MPI_Info info, MPI_Request *request);
|
||||
OMPI_DECLSPEC int MPIX_Alltoall_init(const void *sendbuf, int sendcount, MPI_Datatype sendtype, void *recvbuf, int recvcount, MPI_Datatype recvtype, MPI_Comm comm, MPI_Info info, MPI_Request *request);
|
||||
OMPI_DECLSPEC int MPIX_Alltoallv_init(const void *sendbuf, const int sendcounts[], const int sdispls[], MPI_Datatype sendtype, void *recvbuf, const int recvcounts[], const int rdispls[], MPI_Datatype recvtype, MPI_Comm comm, MPI_Info info, MPI_Request *request);
|
||||
OMPI_DECLSPEC int MPIX_Alltoallw_init(const void *sendbuf, const int sendcounts[], const int sdispls[], const MPI_Datatype sendtypes[], void *recvbuf, const int recvcounts[], const int rdispls[], const MPI_Datatype recvtypes[], MPI_Comm comm, MPI_Info info, MPI_Request *request);
|
||||
OMPI_DECLSPEC int MPIX_Barrier_init(MPI_Comm comm, MPI_Info info, MPI_Request *request);
|
||||
OMPI_DECLSPEC int MPIX_Bcast_init(void *buffer, int count, MPI_Datatype datatype, int root, MPI_Comm comm, MPI_Info info, MPI_Request *request);
|
||||
OMPI_DECLSPEC int MPIX_Exscan_init(const void *sendbuf, void *recvbuf, int count, MPI_Datatype datatype, MPI_Op op, MPI_Comm comm, MPI_Info info, MPI_Request *request);
|
||||
OMPI_DECLSPEC int MPIX_Gather_init(const void *sendbuf, int sendcount, MPI_Datatype sendtype, void *recvbuf, int recvcount, MPI_Datatype recvtype, int root, MPI_Comm comm, MPI_Info info, MPI_Request *request);
|
||||
OMPI_DECLSPEC int MPIX_Gatherv_init(const void *sendbuf, int sendcount, MPI_Datatype sendtype, void *recvbuf, const int recvcounts[], const int displs[], MPI_Datatype recvtype, int root, MPI_Comm comm, MPI_Info info, MPI_Request *request);
|
||||
OMPI_DECLSPEC int MPIX_Reduce_init(const void *sendbuf, void *recvbuf, int count, MPI_Datatype datatype, MPI_Op op, int root, MPI_Comm comm, MPI_Info info, MPI_Request *request);
|
||||
OMPI_DECLSPEC int MPIX_Reduce_scatter_init(const void *sendbuf, void *recvbuf, const int recvcounts[], MPI_Datatype datatype, MPI_Op op, MPI_Comm comm, MPI_Info info, MPI_Request *request);
|
||||
OMPI_DECLSPEC int MPIX_Reduce_scatter_block_init(const void *sendbuf, void *recvbuf, int recvcount, MPI_Datatype datatype, MPI_Op op, MPI_Comm comm, MPI_Info info, MPI_Request *request);
|
||||
OMPI_DECLSPEC int MPIX_Scan_init(const void *sendbuf, void *recvbuf, int count, MPI_Datatype datatype, MPI_Op op, MPI_Comm comm, MPI_Info info, MPI_Request *request);
|
||||
OMPI_DECLSPEC int MPIX_Scatter_init(const void *sendbuf, int sendcount, MPI_Datatype sendtype, void *recvbuf, int recvcount, MPI_Datatype recvtype, int root, MPI_Comm comm, MPI_Info info, MPI_Request *request);
|
||||
OMPI_DECLSPEC int MPIX_Scatterv_init(const void *sendbuf, const int sendcounts[], const int displs[], MPI_Datatype sendtype, void *recvbuf, int recvcount, MPI_Datatype recvtype, int root, MPI_Comm comm, MPI_Info info, MPI_Request *request);
|
||||
|
||||
OMPI_DECLSPEC int MPIX_Neighbor_allgather_init(const void *sendbuf, int sendcount, MPI_Datatype sendtype, void *recvbuf, int recvcount, MPI_Datatype recvtype, MPI_Comm comm, MPI_Info info, MPI_Request *request);
|
||||
OMPI_DECLSPEC int MPIX_Neighbor_allgatherv_init(const void *sendbuf, int sendcount, MPI_Datatype sendtype, void *recvbuf, const int recvcounts[], const int displs[], MPI_Datatype recvtype, MPI_Comm comm, MPI_Info info, MPI_Request *request);
|
||||
OMPI_DECLSPEC int MPIX_Neighbor_alltoall_init(const void *sendbuf, int sendcount, MPI_Datatype sendtype, void *recvbuf, int recvcount, MPI_Datatype recvtype, MPI_Comm comm, MPI_Info info, MPI_Request *request);
|
||||
OMPI_DECLSPEC int MPIX_Neighbor_alltoallv_init(const void *sendbuf, const int sendcounts[], const int sdispls[], MPI_Datatype sendtype, void *recvbuf, const int recvcounts[], const int rdispls[], MPI_Datatype recvtype, MPI_Comm comm, MPI_Info info, MPI_Request *request);
|
||||
OMPI_DECLSPEC int MPIX_Neighbor_alltoallw_init(const void *sendbuf, const int sendcounts[], const MPI_Aint sdispls[], const MPI_Datatype sendtypes[], void *recvbuf, const int recvcounts[], const MPI_Aint rdispls[], const MPI_Datatype recvtypes[], MPI_Comm comm, MPI_Info info, MPI_Request *request);
|
||||
|
||||
/*
|
||||
* Profiling MPI API
|
||||
*/
|
||||
OMPI_DECLSPEC int PMPIX_Allgather_init(const void *sendbuf, int sendcount, MPI_Datatype sendtype, void *recvbuf, int recvcount, MPI_Datatype recvtype, MPI_Comm comm, MPI_Info info, MPI_Request *request);
|
||||
OMPI_DECLSPEC int PMPIX_Allgatherv_init(const void *sendbuf, int sendcount, MPI_Datatype sendtype, void *recvbuf, const int recvcounts[], const int displs[], MPI_Datatype recvtype, MPI_Comm comm, MPI_Info info, MPI_Request *request);
|
||||
OMPI_DECLSPEC int PMPIX_Allreduce_init(const void *sendbuf, void *recvbuf, int count, MPI_Datatype datatype, MPI_Op op, MPI_Comm comm, MPI_Info info, MPI_Request *request);
|
||||
OMPI_DECLSPEC int PMPIX_Alltoall_init(const void *sendbuf, int sendcount, MPI_Datatype sendtype, void *recvbuf, int recvcount, MPI_Datatype recvtype, MPI_Comm comm, MPI_Info info, MPI_Request *request);
|
||||
OMPI_DECLSPEC int PMPIX_Alltoallv_init(const void *sendbuf, const int sendcounts[], const int sdispls[], MPI_Datatype sendtype, void *recvbuf, const int recvcounts[], const int rdispls[], MPI_Datatype recvtype, MPI_Comm comm, MPI_Info info, MPI_Request *request);
|
||||
OMPI_DECLSPEC int PMPIX_Alltoallw_init(const void *sendbuf, const int sendcounts[], const int sdispls[], const MPI_Datatype sendtypes[], void *recvbuf, const int recvcounts[], const int rdispls[], const MPI_Datatype recvtypes[], MPI_Comm comm, MPI_Info info, MPI_Request *request);
|
||||
OMPI_DECLSPEC int PMPIX_Barrier_init(MPI_Comm comm, MPI_Info info, MPI_Request *request);
|
||||
OMPI_DECLSPEC int PMPIX_Bcast_init(void *buffer, int count, MPI_Datatype datatype, int root, MPI_Comm comm, MPI_Info info, MPI_Request *request);
|
||||
OMPI_DECLSPEC int PMPIX_Exscan_init(const void *sendbuf, void *recvbuf, int count, MPI_Datatype datatype, MPI_Op op, MPI_Comm comm, MPI_Info info, MPI_Request *request);
|
||||
OMPI_DECLSPEC int PMPIX_Gather_init(const void *sendbuf, int sendcount, MPI_Datatype sendtype, void *recvbuf, int recvcount, MPI_Datatype recvtype, int root, MPI_Comm comm, MPI_Info info, MPI_Request *request);
|
||||
OMPI_DECLSPEC int PMPIX_Gatherv_init(const void *sendbuf, int sendcount, MPI_Datatype sendtype, void *recvbuf, const int recvcounts[], const int displs[], MPI_Datatype recvtype, int root, MPI_Comm comm, MPI_Info info, MPI_Request *request);
|
||||
OMPI_DECLSPEC int PMPIX_Reduce_init(const void *sendbuf, void *recvbuf, int count, MPI_Datatype datatype, MPI_Op op, int root, MPI_Comm comm, MPI_Info info, MPI_Request *request);
|
||||
OMPI_DECLSPEC int PMPIX_Reduce_scatter_init(const void *sendbuf, void *recvbuf, const int recvcounts[], MPI_Datatype datatype, MPI_Op op, MPI_Comm comm, MPI_Info info, MPI_Request *request);
|
||||
OMPI_DECLSPEC int PMPIX_Reduce_scatter_block_init(const void *sendbuf, void *recvbuf, int recvcount, MPI_Datatype datatype, MPI_Op op, MPI_Comm comm, MPI_Info info, MPI_Request *request);
|
||||
OMPI_DECLSPEC int PMPIX_Scan_init(const void *sendbuf, void *recvbuf, int count, MPI_Datatype datatype, MPI_Op op, MPI_Comm comm, MPI_Info info, MPI_Request *request);
|
||||
OMPI_DECLSPEC int PMPIX_Scatter_init(const void *sendbuf, int sendcount, MPI_Datatype sendtype, void *recvbuf, int recvcount, MPI_Datatype recvtype, int root, MPI_Comm comm, MPI_Info info, MPI_Request *request);
|
||||
OMPI_DECLSPEC int PMPIX_Scatterv_init(const void *sendbuf, const int sendcounts[], const int displs[], MPI_Datatype sendtype, void *recvbuf, int recvcount, MPI_Datatype recvtype, int root, MPI_Comm comm, MPI_Info info, MPI_Request *request);
|
||||
|
||||
OMPI_DECLSPEC int PMPIX_Neighbor_allgather_init(const void *sendbuf, int sendcount, MPI_Datatype sendtype, void *recvbuf, int recvcount, MPI_Datatype recvtype, MPI_Comm comm, MPI_Info info, MPI_Request *request);
|
||||
OMPI_DECLSPEC int PMPIX_Neighbor_allgatherv_init(const void *sendbuf, int sendcount, MPI_Datatype sendtype, void *recvbuf, const int recvcounts[], const int displs[], MPI_Datatype recvtype, MPI_Comm comm, MPI_Info info, MPI_Request *request);
|
||||
OMPI_DECLSPEC int PMPIX_Neighbor_alltoall_init(const void *sendbuf, int sendcount, MPI_Datatype sendtype, void *recvbuf, int recvcount, MPI_Datatype recvtype, MPI_Comm comm, MPI_Info info, MPI_Request *request);
|
||||
OMPI_DECLSPEC int PMPIX_Neighbor_alltoallv_init(const void *sendbuf, const int sendcounts[], const int sdispls[], MPI_Datatype sendtype, void *recvbuf, const int recvcounts[], const int rdispls[], MPI_Datatype recvtype, MPI_Comm comm, MPI_Info info, MPI_Request *request);
|
||||
OMPI_DECLSPEC int PMPIX_Neighbor_alltoallw_init(const void *sendbuf, const int sendcounts[], const MPI_Aint sdispls[], const MPI_Datatype sendtypes[], void *recvbuf, const int recvcounts[], const MPI_Aint rdispls[], const MPI_Datatype recvtypes[], MPI_Comm comm, MPI_Info info, MPI_Request *request);
|
||||
2102
macx64/mpi/openmpi/include/pmix.h
Normal file
2102
macx64/mpi/openmpi/include/pmix.h
Normal file
File diff suppressed because it is too large
Load Diff
251
macx64/mpi/openmpi/include/pmix/src/class/pmix_bitmap.h
Normal file
251
macx64/mpi/openmpi/include/pmix/src/class/pmix_bitmap.h
Normal file
@@ -0,0 +1,251 @@
|
||||
/* -*- Mode: C; c-basic-offset:4 ; -*- */
|
||||
/*
|
||||
* Copyright (c) 2004-2005 The Trustees of Indiana University and Indiana
|
||||
* University Research and Technology
|
||||
* Corporation. All rights reserved.
|
||||
* Copyright (c) 2004-2014 The University of Tennessee and The University
|
||||
* of Tennessee Research Foundation. All rights
|
||||
* reserved.
|
||||
* Copyright (c) 2004-2005 High Performance Computing Center Stuttgart,
|
||||
* University of Stuttgart. All rights reserved.
|
||||
* Copyright (c) 2004-2005 The Regents of the University of California.
|
||||
* All rights reserved.
|
||||
* Copyright (c) 2007 Cisco Systems, Inc. All rights reserved.
|
||||
* Copyright (c) 2010-2012 Oak Ridge National Labs. All rights reserved.
|
||||
* Copyright (c) 2018-2020 Intel, Inc. All rights reserved.
|
||||
* Copyright (c) 2021 Nanook Consulting. All rights reserved.
|
||||
* $COPYRIGHT$
|
||||
*
|
||||
* Additional copyrights may follow
|
||||
*
|
||||
* $HEADER$
|
||||
*
|
||||
*/
|
||||
|
||||
/** @file
|
||||
*
|
||||
* A bitmap implementation. The bits start off with 0, so this bitmap
|
||||
* has bits numbered as bit 0, bit 1, bit 2 and so on. This bitmap
|
||||
* has auto-expansion capabilities, that is once the size is set
|
||||
* during init, it can be automatically expanded by setting the bit
|
||||
* beyond the current size. But note, this is allowed just when the
|
||||
* bit is set -- so the valid functions are set_bit and
|
||||
* find_and_set_bit. Other functions like clear, if passed a bit
|
||||
* outside the initialized range will result in an error.
|
||||
*
|
||||
* To allow these bitmaps to track fortran handles (which MPI defines
|
||||
* to be Fortran INTEGER), we offer a pmix_bitmap_set_max_size, so that
|
||||
* the upper layer can ask to never have more than
|
||||
* OMPI_FORTRAN_HANDLE_MAX, which is min(INT_MAX, fortran INTEGER max).
|
||||
*/
|
||||
|
||||
#ifndef PMIX_BITMAP_H
|
||||
#define PMIX_BITMAP_H
|
||||
|
||||
#include "src/include/pmix_config.h"
|
||||
|
||||
#include <string.h>
|
||||
|
||||
#include "src/class/pmix_object.h"
|
||||
|
||||
BEGIN_C_DECLS
|
||||
|
||||
struct pmix_bitmap_t {
|
||||
pmix_object_t super; /**< Subclass of pmix_object_t */
|
||||
uint64_t *bitmap; /**< The actual bitmap array of characters */
|
||||
int array_size; /**< The actual array size that maintains the bitmap */
|
||||
int max_size; /**< The maximum size that this bitmap may grow (optional) */
|
||||
};
|
||||
|
||||
typedef struct pmix_bitmap_t pmix_bitmap_t;
|
||||
|
||||
PMIX_EXPORT PMIX_CLASS_DECLARATION(pmix_bitmap_t);
|
||||
|
||||
/**
|
||||
* Set the maximum size of the bitmap.
|
||||
* May be reset any time, but HAS TO BE SET BEFORE pmix_bitmap_init!
|
||||
*
|
||||
* @param bitmap The input bitmap (IN)
|
||||
* @param max_size The maximum size of the bitmap in terms of bits (IN)
|
||||
* @return PMIX error code or success
|
||||
*
|
||||
*/
|
||||
PMIX_EXPORT int pmix_bitmap_set_max_size(pmix_bitmap_t *bm, int max_size);
|
||||
|
||||
/**
|
||||
* Initializes the bitmap and sets its size. This must be called
|
||||
* before the bitmap can be actually used
|
||||
*
|
||||
* @param bitmap The input bitmap (IN)
|
||||
* @param size The initial size of the bitmap in terms of bits (IN)
|
||||
* @return PMIX error code or success
|
||||
*
|
||||
*/
|
||||
PMIX_EXPORT int pmix_bitmap_init(pmix_bitmap_t *bm, int size);
|
||||
|
||||
/**
|
||||
* Set a bit of the bitmap. If the bit asked for is beyond the current
|
||||
* size of the bitmap, then the bitmap is extended to accommodate the
|
||||
* bit
|
||||
*
|
||||
* @param bitmap The input bitmap (IN)
|
||||
* @param bit The bit which is to be set (IN)
|
||||
* @return PMIX error code or success
|
||||
*
|
||||
*/
|
||||
PMIX_EXPORT int pmix_bitmap_set_bit(pmix_bitmap_t *bm, int bit);
|
||||
|
||||
/**
|
||||
* Clear/unset a bit of the bitmap. If the bit is beyond the current
|
||||
* size of the bitmap, an error is returned
|
||||
*
|
||||
* @param bitmap The input bitmap (IN)
|
||||
* @param bit The bit which is to be cleared (IN)
|
||||
* @return PMIX error code if the bit is out of range, else success
|
||||
*
|
||||
*/
|
||||
PMIX_EXPORT int pmix_bitmap_clear_bit(pmix_bitmap_t *bm, int bit);
|
||||
|
||||
/**
|
||||
* Find out if a bit is set in the bitmap
|
||||
*
|
||||
* @param bitmap The input bitmap (IN)
|
||||
* @param bit The bit which is to be checked (IN)
|
||||
* @return true if the bit is set
|
||||
* false if the bit is not set OR the index
|
||||
* is outside the bounds of the provided
|
||||
* bitmap
|
||||
*
|
||||
*/
|
||||
PMIX_EXPORT bool pmix_bitmap_is_set_bit(pmix_bitmap_t *bm, int bit);
|
||||
|
||||
/**
|
||||
* Find the first clear bit in the bitmap and set it
|
||||
*
|
||||
* @param bitmap The input bitmap (IN)
|
||||
* @param position Position of the first clear bit (OUT)
|
||||
|
||||
* @return err PMIX_SUCCESS on success
|
||||
*/
|
||||
PMIX_EXPORT int pmix_bitmap_find_and_set_first_unset_bit(pmix_bitmap_t *bm, int *position);
|
||||
|
||||
/**
|
||||
* Clear all bits in the bitmap
|
||||
*
|
||||
* @param bitmap The input bitmap (IN)
|
||||
* @return PMIX error code if bm is NULL
|
||||
*
|
||||
*/
|
||||
PMIX_EXPORT int pmix_bitmap_clear_all_bits(pmix_bitmap_t *bm);
|
||||
|
||||
/**
|
||||
* Set all bits in the bitmap
|
||||
* @param bitmap The input bitmap (IN)
|
||||
* @return PMIX error code if bm is NULL
|
||||
*
|
||||
*/
|
||||
PMIX_EXPORT int pmix_bitmap_set_all_bits(pmix_bitmap_t *bm);
|
||||
|
||||
/**
|
||||
* Gives the current size (number of bits) in the bitmap. This is the
|
||||
* legal (accessible) number of bits
|
||||
*
|
||||
* @param bitmap The input bitmap (IN)
|
||||
* @return PMIX error code if bm is NULL
|
||||
*
|
||||
*/
|
||||
static inline int pmix_bitmap_size(pmix_bitmap_t *bm)
|
||||
{
|
||||
return (NULL == bm) ? 0 : (bm->array_size * ((int) (sizeof(*bm->bitmap) * 8)));
|
||||
}
|
||||
|
||||
/**
|
||||
* Copy a bitmap
|
||||
*
|
||||
* @param dest Pointer to the destination bitmap
|
||||
* @param src Pointer to the source bitmap
|
||||
* @ return PMIX error code if something goes wrong
|
||||
*/
|
||||
static inline void pmix_bitmap_copy(pmix_bitmap_t *dest, pmix_bitmap_t *src)
|
||||
{
|
||||
if (dest->array_size < src->array_size) {
|
||||
if (NULL != dest->bitmap)
|
||||
free(dest->bitmap);
|
||||
dest->max_size = src->max_size;
|
||||
dest->bitmap = (uint64_t *) malloc(src->array_size * sizeof(uint64_t));
|
||||
}
|
||||
memcpy(dest->bitmap, src->bitmap, src->array_size * sizeof(uint64_t));
|
||||
dest->array_size = src->array_size;
|
||||
}
|
||||
|
||||
/**
|
||||
* Bitwise AND operator (inplace)
|
||||
*
|
||||
* @param dest Pointer to the bitmap that should be modified
|
||||
* @param right Point to the other bitmap in the operation
|
||||
* @return PMIX error code if the length of the two bitmaps is not equal or one is NULL.
|
||||
*/
|
||||
PMIX_EXPORT int pmix_bitmap_bitwise_and_inplace(pmix_bitmap_t *dest, pmix_bitmap_t *right);
|
||||
|
||||
/**
|
||||
* Bitwise OR operator (inplace)
|
||||
*
|
||||
* @param dest Pointer to the bitmap that should be modified
|
||||
* @param right Point to the other bitmap in the operation
|
||||
* @return PMIX error code if the length of the two bitmaps is not equal or one is NULL.
|
||||
*/
|
||||
PMIX_EXPORT int pmix_bitmap_bitwise_or_inplace(pmix_bitmap_t *dest, pmix_bitmap_t *right);
|
||||
|
||||
/**
|
||||
* Bitwise XOR operator (inplace)
|
||||
*
|
||||
* @param dest Pointer to the bitmap that should be modified
|
||||
* @param right Point to the other bitmap in the operation
|
||||
* @return PMIX error code if the length of the two bitmaps is not equal or one is NULL.
|
||||
*/
|
||||
PMIX_EXPORT int pmix_bitmap_bitwise_xor_inplace(pmix_bitmap_t *dest, pmix_bitmap_t *right);
|
||||
|
||||
/**
|
||||
* If the bitmaps are different
|
||||
*
|
||||
* @param left Pointer to a bitmap
|
||||
* @param right Pointer to another bitmap
|
||||
* @return true if different, false if the same
|
||||
*/
|
||||
PMIX_EXPORT bool pmix_bitmap_are_different(pmix_bitmap_t *left, pmix_bitmap_t *right);
|
||||
|
||||
/**
|
||||
* Get a string representation of the bitmap.
|
||||
* Useful for debugging.
|
||||
*
|
||||
* @param bitmap Point to the bitmap to represent
|
||||
* @return Pointer to the string (caller must free if not NULL)
|
||||
*/
|
||||
PMIX_EXPORT char *pmix_bitmap_get_string(pmix_bitmap_t *bitmap);
|
||||
|
||||
/**
|
||||
* Return the number of 'unset' bits, up to the specified length
|
||||
*
|
||||
* @param bitmap Pointer to the bitmap
|
||||
* @param len Number of bits to check
|
||||
* @return Integer
|
||||
*/
|
||||
PMIX_EXPORT int pmix_bitmap_num_unset_bits(pmix_bitmap_t *bm, int len);
|
||||
|
||||
/**
|
||||
* Return the number of 'set' bits, up to the specified length
|
||||
*
|
||||
* @param bitmap Pointer to the bitmap
|
||||
* @param len Number of bits to check
|
||||
* @return Integer
|
||||
*/
|
||||
PMIX_EXPORT int pmix_bitmap_num_set_bits(pmix_bitmap_t *bm, int len);
|
||||
|
||||
/**
|
||||
* Check a bitmap to see if any bit is set
|
||||
*/
|
||||
PMIX_EXPORT bool pmix_bitmap_is_clear(pmix_bitmap_t *bm);
|
||||
|
||||
END_C_DECLS
|
||||
|
||||
#endif
|
||||
427
macx64/mpi/openmpi/include/pmix/src/class/pmix_hash_table.h
Normal file
427
macx64/mpi/openmpi/include/pmix/src/class/pmix_hash_table.h
Normal file
@@ -0,0 +1,427 @@
|
||||
/*
|
||||
* Copyright (c) 2004-2007 The Trustees of Indiana University and Indiana
|
||||
* University Research and Technology
|
||||
* Corporation. All rights reserved.
|
||||
* Copyright (c) 2004-2005 The University of Tennessee and The University
|
||||
* of Tennessee Research Foundation. All rights
|
||||
* reserved.
|
||||
* Copyright (c) 2004-2005 High Performance Computing Center Stuttgart,
|
||||
* University of Stuttgart. All rights reserved.
|
||||
* Copyright (c) 2004-2005 The Regents of the University of California.
|
||||
* All rights reserved.
|
||||
* Copyright (c) 2015-2020 Intel, Inc. All rights reserved.
|
||||
* Copyright (c) 2015-2016 Research Organization for Information Science
|
||||
* and Technology (RIST). All rights reserved.
|
||||
* Copyright (c) 2016 Mellanox Technologies, Inc.
|
||||
* All rights reserved.
|
||||
* Copyright (c) 2022 Triad National Security, LLC. All rights reserved.
|
||||
*
|
||||
* Copyright (c) 2021-2022 Nanook Consulting. All rights reserved.
|
||||
* $COPYRIGHT$
|
||||
*
|
||||
* Additional copyrights may follow
|
||||
*
|
||||
* $HEADER$
|
||||
*
|
||||
*/
|
||||
|
||||
/** @file
|
||||
*
|
||||
* A hash table that may be indexed with either fixed length
|
||||
* (e.g. uint32_t/uint64_t) or arbitrary size binary key
|
||||
* values. However, only one key type may be used in a given table
|
||||
* concurrently.
|
||||
*/
|
||||
|
||||
#ifndef PMIX_HASH_TABLE_H
|
||||
#define PMIX_HASH_TABLE_H
|
||||
|
||||
#include "src/include/pmix_config.h"
|
||||
#include "src/include/pmix_prefetch.h"
|
||||
|
||||
#ifdef HAVE_STDINT_H
|
||||
# include <stdint.h>
|
||||
#endif
|
||||
|
||||
#include "src/class/pmix_list.h"
|
||||
|
||||
#include "pmix_common.h"
|
||||
|
||||
BEGIN_C_DECLS
|
||||
|
||||
PMIX_EXPORT PMIX_CLASS_DECLARATION(pmix_hash_table_t);
|
||||
|
||||
struct pmix_hash_table_t {
|
||||
pmix_object_t super; /**< subclass of pmix_object_t */
|
||||
const char *ht_label; /**< label for debugging */
|
||||
struct pmix_hash_element_t *ht_table; /**< table of elements (opaque to users) */
|
||||
size_t ht_capacity; /**< allocated size (capacity) of table */
|
||||
size_t ht_size; /**< number of extant entries */
|
||||
size_t ht_growth_trigger; /**< size hits this and table is grown */
|
||||
int ht_density_numer, ht_density_denom; /**< max allowed density of table */
|
||||
int ht_growth_numer, ht_growth_denom; /**< growth factor when grown */
|
||||
const struct pmix_hash_type_methods_t *ht_type_methods;
|
||||
};
|
||||
typedef struct pmix_hash_table_t pmix_hash_table_t;
|
||||
|
||||
#define PMIX_HASH_TABLE_STATIC_INIT \
|
||||
{ \
|
||||
.super = PMIX_OBJ_STATIC_INIT(pmix_object_t), \
|
||||
.ht_label = NULL, \
|
||||
.ht_table = NULL, \
|
||||
.ht_capacity = 0, \
|
||||
.ht_size = 0, \
|
||||
.ht_growth_trigger = 0, \
|
||||
.ht_density_numer = 0, \
|
||||
.ht_density_denom = 0, \
|
||||
.ht_growth_numer = 0, \
|
||||
.ht_growth_denom = 0, \
|
||||
.ht_type_methods = NULL \
|
||||
}
|
||||
/**
|
||||
* Initializes the table size, must be called before using
|
||||
* the table.
|
||||
*
|
||||
* @param table The input hash table (IN).
|
||||
* @param size The size of the table, which will be rounded up
|
||||
* (if required) to the next highest power of two (IN).
|
||||
* @return PMIX error code.
|
||||
*
|
||||
*/
|
||||
|
||||
PMIX_EXPORT int pmix_hash_table_init(pmix_hash_table_t *ht, size_t table_size);
|
||||
|
||||
/* this could be the new init if people wanted a more general API */
|
||||
PMIX_EXPORT int pmix_hash_table_init2(pmix_hash_table_t *ht, size_t estimated_max_size,
|
||||
int density_numer, int density_denom, int growth_numer,
|
||||
int growth_denom);
|
||||
|
||||
/**
|
||||
* Returns the number of elements currently stored in the table.
|
||||
*
|
||||
* @param table The input hash table (IN).
|
||||
* @return The number of elements in the table.
|
||||
*
|
||||
*/
|
||||
|
||||
static inline size_t pmix_hash_table_get_size(pmix_hash_table_t *ht)
|
||||
{
|
||||
return ht->ht_size;
|
||||
}
|
||||
|
||||
/**
|
||||
* Remove all elements from the table.
|
||||
*
|
||||
* @param table The input hash table (IN).
|
||||
* @return PMIX return code.
|
||||
*
|
||||
*/
|
||||
|
||||
PMIX_EXPORT int pmix_hash_table_remove_all(pmix_hash_table_t *ht);
|
||||
|
||||
/**
|
||||
* Retrieve value via uint32_t key.
|
||||
*
|
||||
* @param table The input hash table (IN).
|
||||
* @param key The input key (IN).
|
||||
* @param ptr The value associated with the key
|
||||
* @return integer return code:
|
||||
* - PMIX_SUCCESS if key was found
|
||||
* - PMIX_ERR_NOT_FOUND if key was not found
|
||||
* - PMIX_ERROR other error
|
||||
*
|
||||
*/
|
||||
|
||||
PMIX_EXPORT int pmix_hash_table_get_value_uint32(pmix_hash_table_t *table, uint32_t key,
|
||||
void **ptr);
|
||||
|
||||
/**
|
||||
* Set value based on uint32_t key.
|
||||
*
|
||||
* @param table The input hash table (IN).
|
||||
* @param key The input key (IN).
|
||||
* @param value The value to be associated with the key (IN).
|
||||
* @return PMIX return code.
|
||||
*
|
||||
*/
|
||||
|
||||
PMIX_EXPORT int pmix_hash_table_set_value_uint32(pmix_hash_table_t *table, uint32_t key,
|
||||
void *value);
|
||||
|
||||
/**
|
||||
* Remove value based on uint32_t key.
|
||||
*
|
||||
* @param table The input hash table (IN).
|
||||
* @param key The input key (IN).
|
||||
* @return PMIX return code.
|
||||
*
|
||||
*/
|
||||
|
||||
PMIX_EXPORT int pmix_hash_table_remove_value_uint32(pmix_hash_table_t *table, uint32_t key);
|
||||
|
||||
/**
|
||||
* Retrieve value via uint64_t key.
|
||||
*
|
||||
* @param table The input hash table (IN).
|
||||
* @param key The input key (IN).
|
||||
* @param ptr The value associated with the key
|
||||
* @return integer return code:
|
||||
* - PMIX_SUCCESS if key was found
|
||||
* - PMIX_ERR_NOT_FOUND if key was not found
|
||||
* - PMIX_ERROR other error
|
||||
*
|
||||
*/
|
||||
|
||||
PMIX_EXPORT int pmix_hash_table_get_value_uint64(pmix_hash_table_t *table, uint64_t key,
|
||||
void **ptr);
|
||||
|
||||
/**
|
||||
* Set value based on uint64_t key.
|
||||
*
|
||||
* @param table The input hash table (IN).
|
||||
* @param key The input key (IN).
|
||||
* @param value The value to be associated with the key (IN).
|
||||
* @return PMIX return code.
|
||||
*
|
||||
*/
|
||||
|
||||
PMIX_EXPORT int pmix_hash_table_set_value_uint64(pmix_hash_table_t *table, uint64_t key,
|
||||
void *value);
|
||||
|
||||
/**
|
||||
* Remove value based on uint64_t key.
|
||||
*
|
||||
* @param table The input hash table (IN).
|
||||
* @param key The input key (IN).
|
||||
* @return PMIX return code.
|
||||
*
|
||||
*/
|
||||
|
||||
PMIX_EXPORT int pmix_hash_table_remove_value_uint64(pmix_hash_table_t *table, uint64_t key);
|
||||
|
||||
/**
|
||||
* Retrieve value via arbitrary length binary key.
|
||||
*
|
||||
* @param table The input hash table (IN).
|
||||
* @param key The input key (IN).
|
||||
* @param ptr The value associated with the key
|
||||
* @return integer return code:
|
||||
* - PMIX_SUCCESS if key was found
|
||||
* - PMIX_ERR_NOT_FOUND if key was not found
|
||||
* - PMIX_ERROR other error
|
||||
*
|
||||
*/
|
||||
|
||||
PMIX_EXPORT int pmix_hash_table_get_value_ptr(pmix_hash_table_t *table, const void *key,
|
||||
size_t keylen, void **ptr);
|
||||
|
||||
/**
|
||||
* Set value based on arbitrary length binary key.
|
||||
*
|
||||
* @param table The input hash table (IN).
|
||||
* @param key The input key (IN).
|
||||
* @param value The value to be associated with the key (IN).
|
||||
* @return PMIX return code.
|
||||
*
|
||||
*/
|
||||
|
||||
PMIX_EXPORT int pmix_hash_table_set_value_ptr(pmix_hash_table_t *table, const void *key,
|
||||
size_t keylen, void *value);
|
||||
|
||||
/**
|
||||
* Remove value based on arbitrary length binary key.
|
||||
*
|
||||
* @param table The input hash table (IN).
|
||||
* @param key The input key (IN).
|
||||
* @return PMIX return code.
|
||||
*
|
||||
*/
|
||||
|
||||
PMIX_EXPORT int pmix_hash_table_remove_value_ptr(pmix_hash_table_t *table, const void *key,
|
||||
size_t keylen);
|
||||
|
||||
/** The following functions are only for allowing iterating through
|
||||
the hash table. The calls return along with a key, a pointer to
|
||||
the hash node with the current key, so that subsequent calls do
|
||||
not have to traverse all over again to the key (although it may
|
||||
just be a simple thing - to go to the array element and then
|
||||
traverse through the individual list). But lets take out this
|
||||
inefficiency too. This is similar to having an STL iterator in
|
||||
functionality */
|
||||
|
||||
/**
|
||||
* Get the first 32 bit key from the hash table, which can be used later to
|
||||
* get the next key
|
||||
* @param table The hash table pointer (IN)
|
||||
* @param key The first key (OUT)
|
||||
* @param value The value corresponding to this key (OUT)
|
||||
* @param node The pointer to the hash table internal node which stores
|
||||
* the key-value pair (this is required for subsequent calls
|
||||
* to get_next_key) (OUT)
|
||||
* @return PMIX error code
|
||||
*
|
||||
*/
|
||||
|
||||
PMIX_EXPORT int pmix_hash_table_get_first_key_uint32(pmix_hash_table_t *table, uint32_t *key,
|
||||
void **value, void **node);
|
||||
|
||||
/**
|
||||
* Get the next 32 bit key from the hash table, knowing the current key
|
||||
* @param table The hash table pointer (IN)
|
||||
* @param key The key (OUT)
|
||||
* @param value The value corresponding to this key (OUT)
|
||||
* @param in_node The node pointer from previous call to either get_first
|
||||
or get_next (IN)
|
||||
* @param out_node The pointer to the hash table internal node which stores
|
||||
* the key-value pair (this is required for subsequent calls
|
||||
* to get_next_key) (OUT)
|
||||
* @return PMIX error code
|
||||
*
|
||||
*/
|
||||
|
||||
PMIX_EXPORT int pmix_hash_table_get_next_key_uint32(pmix_hash_table_t *table, uint32_t *key,
|
||||
void **value, void *in_node, void **out_node);
|
||||
|
||||
/**
|
||||
* Get the first 64 key from the hash table, which can be used later to
|
||||
* get the next key
|
||||
* @param table The hash table pointer (IN)
|
||||
* @param key The first key (OUT)
|
||||
* @param value The value corresponding to this key (OUT)
|
||||
* @param node The pointer to the hash table internal node which stores
|
||||
* the key-value pair (this is required for subsequent calls
|
||||
* to get_next_key) (OUT)
|
||||
* @return PMIX error code
|
||||
*
|
||||
*/
|
||||
|
||||
PMIX_EXPORT int pmix_hash_table_get_first_key_uint64(pmix_hash_table_t *table, uint64_t *key,
|
||||
void **value, void **node);
|
||||
|
||||
/**
|
||||
* Get the next 64 bit key from the hash table, knowing the current key
|
||||
* @param table The hash table pointer (IN)
|
||||
* @param key The key (OUT)
|
||||
* @param value The value corresponding to this key (OUT)
|
||||
* @param in_node The node pointer from previous call to either get_first
|
||||
or get_next (IN)
|
||||
* @param out_node The pointer to the hash table internal node which stores
|
||||
* the key-value pair (this is required for subsequent calls
|
||||
* to get_next_key) (OUT)
|
||||
* @return PMIX error code
|
||||
*
|
||||
*/
|
||||
|
||||
PMIX_EXPORT int pmix_hash_table_get_next_key_uint64(pmix_hash_table_t *table, uint64_t *key,
|
||||
void **value, void *in_node, void **out_node);
|
||||
|
||||
/**
|
||||
* Get the first ptr bit key from the hash table, which can be used later to
|
||||
* get the next key
|
||||
* @param table The hash table pointer (IN)
|
||||
* @param key The first key (OUT)
|
||||
* @param key_size The first key size (OUT)
|
||||
* @param value The value corresponding to this key (OUT)
|
||||
* @param node The pointer to the hash table internal node which stores
|
||||
* the key-value pair (this is required for subsequent calls
|
||||
* to get_next_key) (OUT)
|
||||
* @return PMIX error code
|
||||
*
|
||||
*/
|
||||
|
||||
PMIX_EXPORT int pmix_hash_table_get_first_key_ptr(pmix_hash_table_t *table, void **key,
|
||||
size_t *key_size, void **value, void **node);
|
||||
|
||||
/**
|
||||
* Get the next ptr bit key from the hash table, knowing the current key
|
||||
* @param table The hash table pointer (IN)
|
||||
* @param key The key (OUT)
|
||||
* @param key_size The key size (OUT)
|
||||
* @param value The value corresponding to this key (OUT)
|
||||
* @param in_node The node pointer from previous call to either get_first
|
||||
or get_next (IN)
|
||||
* @param out_node The pointer to the hash table internal node which stores
|
||||
* the key-value pair (this is required for subsequent calls
|
||||
* to get_next_key) (OUT)
|
||||
* @return PMIX error code
|
||||
*
|
||||
*/
|
||||
|
||||
PMIX_EXPORT int pmix_hash_table_get_next_key_ptr(pmix_hash_table_t *table, void **key,
|
||||
size_t *key_size, void **value, void *in_node,
|
||||
void **out_node);
|
||||
|
||||
/**
|
||||
* Returns the size of the opaque pmix_hash_element_t structure. Note that this
|
||||
* only returns the size of the structure itself and does not capture the size
|
||||
* of data that are stored within an element.
|
||||
*/
|
||||
PMIX_EXPORT size_t
|
||||
pmix_hash_table_sizeof_hash_element(void);
|
||||
|
||||
/**
|
||||
* @brief Returns next power-of-two of the given value.
|
||||
*
|
||||
* @param value The integer value to return power of 2
|
||||
*
|
||||
* @returns The next power of two
|
||||
*
|
||||
* WARNING: *NO* error checking is performed. This is meant to be a
|
||||
* fast inline function.
|
||||
* Using __builtin_clz (count-leading-zeros) uses 4 cycles instead of 77
|
||||
* compared to the loop-version (on Intel Nehalem -- with icc-12.1.0 -O2).
|
||||
*/
|
||||
static inline int pmix_next_poweroftwo(int value)
|
||||
{
|
||||
int power2;
|
||||
|
||||
#if PMIX_C_HAVE_BUILTIN_CLZ
|
||||
if (PMIX_UNLIKELY(0 == value)) {
|
||||
return 1;
|
||||
}
|
||||
power2 = 1 << (8 * sizeof(int) - __builtin_clz(value));
|
||||
#else
|
||||
for (power2 = 1; value > 0; value >>= 1, power2 <<= 1) /* empty */
|
||||
;
|
||||
#endif
|
||||
|
||||
return power2;
|
||||
}
|
||||
|
||||
/**
|
||||
* Loop over a hash table.
|
||||
*
|
||||
* @param[in] key Key for each item
|
||||
* @param[in] type Type of key (ui32|ui64|ptr)
|
||||
* @param[in] value Storage for each item
|
||||
* @param[in] ht Hash table to iterate over
|
||||
*
|
||||
* This macro provides a simple way to loop over the items in a pmix_hash_table_t. It
|
||||
* is not safe to call pmix_hash_table_remove* from within the loop.
|
||||
*
|
||||
* Example Usage:
|
||||
*
|
||||
* uint64_t key;
|
||||
* void * value;
|
||||
* PMIX_HASH_TABLE_FOREACH(key, uint64, value, ht) {
|
||||
* do_something(key, value);
|
||||
* }
|
||||
*/
|
||||
#define PMIX_HASH_TABLE_FOREACH(key, type, value, ht) \
|
||||
for (void *_nptr = NULL; \
|
||||
PMIX_SUCCESS \
|
||||
== pmix_hash_table_get_next_key_##type(ht, &key, (void **) &value, _nptr, &_nptr);)
|
||||
|
||||
#define PMIX_HASH_TABLE_FOREACH_PTR(key, value, ht, body) \
|
||||
{ \
|
||||
size_t key_size_; \
|
||||
for (void *_nptr = NULL; \
|
||||
PMIX_SUCCESS \
|
||||
== pmix_hash_table_get_next_key_ptr(ht, &key, &key_size_, (void **) &value, _nptr, \
|
||||
&_nptr);) \
|
||||
body \
|
||||
}
|
||||
|
||||
END_C_DECLS
|
||||
|
||||
#endif /* PMIX_HASH_TABLE_H */
|
||||
378
macx64/mpi/openmpi/include/pmix/src/class/pmix_hotel.h
Normal file
378
macx64/mpi/openmpi/include/pmix/src/class/pmix_hotel.h
Normal file
@@ -0,0 +1,378 @@
|
||||
/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil -*- */
|
||||
/*
|
||||
* Copyright (c) 2012-2016 Cisco Systems, Inc. All rights reserved.
|
||||
* Copyright (c) 2012 Los Alamos National Security, LLC. All rights reserved
|
||||
* Copyright (c) 2015-2020 Intel, Inc. All rights reserved.
|
||||
* Copyright (c) 2019 Research Organization for Information Science
|
||||
* and Technology (RIST). All rights reserved.
|
||||
* Copyright (c) 2020 IBM Corporation. All rights reserved.
|
||||
* Copyright (c) 2021-2022 Nanook Consulting. All rights reserved.
|
||||
* $COPYRIGHT$
|
||||
*
|
||||
* Additional copyrights may follow
|
||||
*
|
||||
* $HEADER$
|
||||
*/
|
||||
|
||||
/** @file
|
||||
*
|
||||
* This file provides a "hotel" class:
|
||||
*
|
||||
* - A hotel has a fixed number of rooms (i.e., storage slots)
|
||||
* - An arbitrary data pointer can check into an empty room at any time
|
||||
* - The occupant of a room can check out at any time
|
||||
* - Optionally, the occupant of a room can be forcibly evicted at a
|
||||
* given time (i.e., when an pmix timer event expires).
|
||||
* - The hotel has finite occupancy; if you try to checkin a new
|
||||
* occupant and the hotel is already full, it will gracefully fail
|
||||
* to checkin.
|
||||
*
|
||||
* One use case for this class is for ACK-based network retransmission
|
||||
* schemes (NACK-based retransmission schemes probably can use
|
||||
* pmix_ring_buffer).
|
||||
*
|
||||
* For ACK-based retransmission schemes, a hotel might be used
|
||||
* something like this:
|
||||
*
|
||||
* - when a message is sent, check it in to a hotel with a timer
|
||||
* - if an ACK is received, check it out of the hotel (which also cancels
|
||||
* the timer)
|
||||
* - if an ACK isn't received in time, the timer will expire and the
|
||||
* upper layer will get a callback with the message
|
||||
* - if an ACK is received late (i.e., after its timer has expired),
|
||||
* then checkout will gracefully fail
|
||||
*
|
||||
* Note that this class intentionally provides pretty minimal
|
||||
* functionality. It is intended to be used in performance-critical
|
||||
* code paths -- extra functionality would simply add latency.
|
||||
*
|
||||
* There is an pmix_hotel_init() function to create a hotel, but no
|
||||
* corresponding finalize; the destructor will handle all finalization
|
||||
* issues. Note that when a hotel is destroyed, it will delete all
|
||||
* pending events from the event base (i.e., all pending eviction
|
||||
* callbacks); no further eviction callbacks will be invoked.
|
||||
*/
|
||||
|
||||
#ifndef PMIX_HOTEL_H
|
||||
#define PMIX_HOTEL_H
|
||||
|
||||
#include "src/include/pmix_config.h"
|
||||
#include "pmix_common.h"
|
||||
#include "src/class/pmix_object.h"
|
||||
#include "src/include/pmix_prefetch.h"
|
||||
#include "src/include/pmix_types.h"
|
||||
#include <event.h>
|
||||
|
||||
#include "src/util/pmix_error.h"
|
||||
#include "src/util/pmix_output.h"
|
||||
|
||||
BEGIN_C_DECLS
|
||||
|
||||
struct pmix_hotel_t;
|
||||
|
||||
/* User-supplied function to be invoked when an occupant is evicted. */
|
||||
typedef void (*pmix_hotel_eviction_callback_fn_t)(struct pmix_hotel_t *hotel, int room_num,
|
||||
void *occupant);
|
||||
|
||||
/* Note that this is an internal data structure; it is not part of the
|
||||
public pmix_hotel interface. Public consumers of pmix_hotel
|
||||
shouldn't need to use this struct at all (we only have it here in
|
||||
this .h file because some functions are inlined for speed, and need
|
||||
to get to the internals of this struct).
|
||||
|
||||
The room struct should be as small as possible to be cache
|
||||
friendly. Specifically: it would be great if multiple rooms could
|
||||
fit in a single cache line because we'll always allocate a
|
||||
contiguous set of rooms in an array. */
|
||||
typedef struct {
|
||||
void *occupant;
|
||||
pmix_event_t eviction_timer_event;
|
||||
} pmix_hotel_room_t;
|
||||
|
||||
/* Note that this is an internal data structure; it is not part of the
|
||||
public pmix_hotel interface. Public consumers of pmix_hotel
|
||||
shouldn't need to use this struct at all (we only have it here in
|
||||
this .h file because some functions are inlined for speed, and need
|
||||
to get to the internals of this struct).
|
||||
|
||||
Use a unique struct for holding the arguments for eviction
|
||||
callbacks. We *could* make the to-be-evicted pmix_hotel_room_t
|
||||
instance as the argument, but we don't, for 2 reasons:
|
||||
|
||||
1. We want as many pmix_hotel_room_t's to fit in a cache line as
|
||||
possible (i.e., to be as cache-friendly as possible). The
|
||||
common/fast code path only needs to access the data in the
|
||||
pmix_hotel_room_t (and not the callback argument data).
|
||||
|
||||
2. Evictions will be uncommon, so we don't mind penalizing them a
|
||||
bit by making the data be in a separate cache line.
|
||||
*/
|
||||
typedef struct {
|
||||
struct pmix_hotel_t *hotel;
|
||||
int room_num;
|
||||
} pmix_hotel_room_eviction_callback_arg_t;
|
||||
|
||||
typedef struct pmix_hotel_t {
|
||||
/* make this an object */
|
||||
pmix_object_t super;
|
||||
|
||||
/* Max number of rooms in the hotel */
|
||||
int num_rooms;
|
||||
|
||||
/* event base to be used for eviction timeout */
|
||||
pmix_event_base_t *evbase;
|
||||
struct timeval eviction_timeout;
|
||||
pmix_hotel_eviction_callback_fn_t evict_callback_fn;
|
||||
|
||||
/* All rooms in this hotel */
|
||||
pmix_hotel_room_t *rooms;
|
||||
|
||||
/* Separate array for all the eviction callback arguments (see
|
||||
rationale above for why this is a separate array) */
|
||||
pmix_hotel_room_eviction_callback_arg_t *eviction_args;
|
||||
|
||||
/* All currently unoccupied rooms in this hotel (not necessarily
|
||||
in any particular order) */
|
||||
int *unoccupied_rooms;
|
||||
int last_unoccupied_room;
|
||||
} pmix_hotel_t;
|
||||
PMIX_EXPORT PMIX_CLASS_DECLARATION(pmix_hotel_t);
|
||||
|
||||
#define PMIX_HOTEL_STATIC_INIT \
|
||||
{ \
|
||||
.super = PMIX_OBJ_STATIC_INIT(pmix_object_t), \
|
||||
.num_rooms = 0, \
|
||||
.evbase = NULL, \
|
||||
.eviction_timeout = {0, 0}, \
|
||||
.evict_callback_fn = NULL, \
|
||||
.rooms = NULL, \
|
||||
.eviction_args = NULL, \
|
||||
.unoccupied_rooms = NULL, \
|
||||
.last_unoccupied_room = 0 \
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Initialize the hotel.
|
||||
*
|
||||
* @param hotel Pointer to a hotel (IN)
|
||||
* @param num_rooms The total number of rooms in the hotel (IN)
|
||||
* @param evbase Pointer to event base used for eviction timeout
|
||||
* @param eviction_timeout Max length of a stay at the hotel before
|
||||
* the eviction callback is invoked (in seconds)
|
||||
* @param evict_callback_fn Callback function invoked if an occupant
|
||||
* does not check out before the eviction_timeout.
|
||||
*
|
||||
* NOTE: If the callback function is NULL, then no eviction timer
|
||||
* will be set - occupants will remain checked into the hotel until
|
||||
* explicitly checked out.
|
||||
*
|
||||
* Also note: the eviction_callback_fn should absolutely not call any
|
||||
* of the hotel checkout functions. Specifically: the occupant has
|
||||
* already been ("forcibly") checked out *before* the
|
||||
* eviction_callback_fn is invoked.
|
||||
*
|
||||
* @return PMIX_SUCCESS if all initializations were successful. Otherwise,
|
||||
* the error indicate what went wrong in the function.
|
||||
*/
|
||||
PMIX_EXPORT pmix_status_t pmix_hotel_init(pmix_hotel_t *hotel, int num_rooms,
|
||||
pmix_event_base_t *evbase, uint32_t eviction_timeout,
|
||||
pmix_hotel_eviction_callback_fn_t evict_callback_fn);
|
||||
|
||||
/**
|
||||
* Check in an occupant to the hotel.
|
||||
*
|
||||
* @param hotel Pointer to hotel (IN)
|
||||
* @param occupant Occupant to check in (opaque to the hotel) (IN)
|
||||
* @param room The room number that identifies this occupant in the
|
||||
* hotel (OUT).
|
||||
*
|
||||
* If there is room in the hotel, the occupant is checked in and the
|
||||
* timer for that occupant is started. The occupant's room is
|
||||
* returned in the "room" param.
|
||||
*
|
||||
* Note that once a room's checkout_expire timer expires, the occupant
|
||||
* is forcibly checked out, and then the eviction callback is invoked.
|
||||
*
|
||||
* @return PMIX_SUCCESS if the occupant is successfully checked in,
|
||||
* and the room parameter will contain a valid value.
|
||||
* @return PMIX_ERR_TEMP_OUT_OF_RESOURCE is the hotel is full. Try
|
||||
* again later.
|
||||
*/
|
||||
static inline pmix_status_t pmix_hotel_checkin(pmix_hotel_t *hotel, void *occupant, int *room_num)
|
||||
{
|
||||
pmix_hotel_room_t *room;
|
||||
|
||||
/* Do we have any rooms available? */
|
||||
if (PMIX_UNLIKELY(hotel->last_unoccupied_room < 0)) {
|
||||
*room_num = -1;
|
||||
return PMIX_ERR_OUT_OF_RESOURCE;
|
||||
}
|
||||
|
||||
/* Put this occupant into the first empty room that we have */
|
||||
*room_num = hotel->unoccupied_rooms[hotel->last_unoccupied_room--];
|
||||
room = &(hotel->rooms[*room_num]);
|
||||
room->occupant = occupant;
|
||||
|
||||
/* Assign the event and make it pending */
|
||||
if (NULL != hotel->evbase) {
|
||||
pmix_event_add(&(room->eviction_timer_event), &(hotel->eviction_timeout));
|
||||
}
|
||||
|
||||
return PMIX_SUCCESS;
|
||||
}
|
||||
|
||||
/**
|
||||
* Same as pmix_hotel_checkin(), but slightly optimized for when the
|
||||
* caller *knows* that there is a room available.
|
||||
*/
|
||||
static inline void pmix_hotel_checkin_with_res(pmix_hotel_t *hotel, void *occupant, int *room_num)
|
||||
{
|
||||
pmix_hotel_room_t *room;
|
||||
|
||||
/* Put this occupant into the first empty room that we have */
|
||||
*room_num = hotel->unoccupied_rooms[hotel->last_unoccupied_room--];
|
||||
room = &(hotel->rooms[*room_num]);
|
||||
assert(room->occupant == NULL);
|
||||
room->occupant = occupant;
|
||||
|
||||
/* Assign the event and make it pending */
|
||||
if (NULL != hotel->evbase) {
|
||||
pmix_event_add(&(room->eviction_timer_event), &(hotel->eviction_timeout));
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Check the specified occupant out of the hotel.
|
||||
*
|
||||
* @param hotel Pointer to hotel (IN)
|
||||
* @param room Room number to checkout (IN)
|
||||
*
|
||||
* If there is an occupant in the room, their timer is canceled and
|
||||
* they are checked out.
|
||||
*
|
||||
* Nothing is returned (as a minor optimization).
|
||||
*/
|
||||
static inline void pmix_hotel_checkout(pmix_hotel_t *hotel, int room_num)
|
||||
{
|
||||
pmix_hotel_room_t *room;
|
||||
|
||||
/* Bozo check */
|
||||
assert(room_num < hotel->num_rooms);
|
||||
if (0 > room_num) {
|
||||
/* occupant wasn't checked in */
|
||||
return;
|
||||
}
|
||||
|
||||
/* If there's an occupant in the room, check them out */
|
||||
room = &(hotel->rooms[room_num]);
|
||||
if (PMIX_LIKELY(NULL != room->occupant)) {
|
||||
/* Do not change this logic without also changing the same
|
||||
logic in pmix_hotel_checkout_and_return_occupant() and
|
||||
pmix_hotel.c:local_eviction_callback(). */
|
||||
room->occupant = NULL;
|
||||
if (NULL != hotel->evbase) {
|
||||
pmix_event_del(&(room->eviction_timer_event));
|
||||
}
|
||||
hotel->last_unoccupied_room++;
|
||||
assert(hotel->last_unoccupied_room < hotel->num_rooms);
|
||||
hotel->unoccupied_rooms[hotel->last_unoccupied_room] = room_num;
|
||||
}
|
||||
|
||||
/* Don't bother returning whether we actually checked someone out
|
||||
or not (because this is in the critical performance path) --
|
||||
assume the upper layer knows what it's doing. */
|
||||
}
|
||||
|
||||
/**
|
||||
* Check the specified occupant out of the hotel and return the occupant.
|
||||
*
|
||||
* @param hotel Pointer to hotel (IN)
|
||||
* @param room Room number to checkout (IN)
|
||||
* @param void * occupant (OUT)
|
||||
* If there is an occupant in the room, their timer is canceled and
|
||||
* they are checked out.
|
||||
*
|
||||
* Use this checkout and when caller needs the occupant
|
||||
*/
|
||||
static inline void pmix_hotel_checkout_and_return_occupant(pmix_hotel_t *hotel, int room_num,
|
||||
void **occupant)
|
||||
{
|
||||
pmix_hotel_room_t *room;
|
||||
|
||||
/* Bozo check */
|
||||
assert(room_num < hotel->num_rooms);
|
||||
if (0 > room_num) {
|
||||
/* occupant wasn't checked in */
|
||||
*occupant = NULL;
|
||||
return;
|
||||
}
|
||||
|
||||
/* If there's an occupant in the room, check them out */
|
||||
room = &(hotel->rooms[room_num]);
|
||||
if (PMIX_LIKELY(NULL != room->occupant)) {
|
||||
pmix_output(10, "checking out occupant %p from room num %d", room->occupant, room_num);
|
||||
/* Do not change this logic without also changing the same
|
||||
logic in pmix_hotel_checkout() and
|
||||
pmix_hotel.c:local_eviction_callback(). */
|
||||
*occupant = room->occupant;
|
||||
room->occupant = NULL;
|
||||
if (NULL != hotel->evbase) {
|
||||
pmix_event_del(&(room->eviction_timer_event));
|
||||
}
|
||||
hotel->last_unoccupied_room++;
|
||||
assert(hotel->last_unoccupied_room < hotel->num_rooms);
|
||||
hotel->unoccupied_rooms[hotel->last_unoccupied_room] = room_num;
|
||||
} else {
|
||||
*occupant = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns true if the hotel is empty (no occupant)
|
||||
* @param hotel Pointer to hotel (IN)
|
||||
* @return bool true if empty false if there is a occupant(s)
|
||||
*
|
||||
*/
|
||||
static inline bool pmix_hotel_is_empty(pmix_hotel_t *hotel)
|
||||
{
|
||||
if (hotel->last_unoccupied_room == hotel->num_rooms - 1)
|
||||
return true;
|
||||
else
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Access the occupant of a room, but leave them checked into their room.
|
||||
*
|
||||
* @param hotel Pointer to hotel (IN)
|
||||
* @param room Room number to checkout (IN)
|
||||
* @param void * occupant (OUT)
|
||||
*
|
||||
* This accessor function is typically used to cycle across the occupants
|
||||
* to check for someone already present that matches a description.
|
||||
*/
|
||||
static inline void pmix_hotel_knock(pmix_hotel_t *hotel, int room_num, void **occupant)
|
||||
{
|
||||
pmix_hotel_room_t *room;
|
||||
|
||||
/* Bozo check */
|
||||
assert(room_num < hotel->num_rooms);
|
||||
|
||||
*occupant = NULL;
|
||||
if (0 > room_num) {
|
||||
/* occupant wasn't checked in */
|
||||
return;
|
||||
}
|
||||
|
||||
/* If there's an occupant in the room, have them come to the door */
|
||||
room = &(hotel->rooms[room_num]);
|
||||
if (PMIX_LIKELY(NULL != room->occupant)) {
|
||||
pmix_output(10, "occupant %p in room num %d responded to knock", room->occupant, room_num);
|
||||
*occupant = room->occupant;
|
||||
}
|
||||
}
|
||||
|
||||
END_C_DECLS
|
||||
|
||||
#endif /* PMIX_HOTEL_H */
|
||||
918
macx64/mpi/openmpi/include/pmix/src/class/pmix_list.h
Normal file
918
macx64/mpi/openmpi/include/pmix/src/class/pmix_list.h
Normal file
@@ -0,0 +1,918 @@
|
||||
/* -*- Mode: C; c-basic-offset:4 ; -*- */
|
||||
/*
|
||||
* Copyright (c) 2004-2005 The Trustees of Indiana University and Indiana
|
||||
* University Research and Technology
|
||||
* Corporation. All rights reserved.
|
||||
* Copyright (c) 2004-2006 The University of Tennessee and The University
|
||||
* of Tennessee Research Foundation. All rights
|
||||
* reserved.
|
||||
* Copyright (c) 2004-2005 High Performance Computing Center Stuttgart,
|
||||
* University of Stuttgart. All rights reserved.
|
||||
* Copyright (c) 2004-2005 The Regents of the University of California.
|
||||
* All rights reserved.
|
||||
* Copyright (c) 2007 Voltaire All rights reserved.
|
||||
* Copyright (c) 2013 Los Alamos National Security, LLC. All rights
|
||||
* reserved.
|
||||
* Copyright (c) 2013-2020 Intel, Inc. All rights reserved.
|
||||
* Copyright (c) 2021-2022 Nanook Consulting All rights reserved.
|
||||
* $COPYRIGHT$
|
||||
*
|
||||
* Additional copyrights may follow
|
||||
*
|
||||
* $HEADER$
|
||||
*/
|
||||
/**
|
||||
* @file
|
||||
*
|
||||
* The pmix_list_t interface is used to provide a generic
|
||||
* doubly-linked list container for PMIx. It was inspired by (but
|
||||
* is slightly different than) the Standard Template Library (STL)
|
||||
* std::list class. One notable difference from std::list is that
|
||||
* when an pmix_list_t is destroyed, all of the pmix_list_item_t
|
||||
* objects that it contains are orphaned -- they are \em not
|
||||
* destroyed.
|
||||
*
|
||||
* The general idea is that pmix_list_item_t objects can be put on an
|
||||
* pmix_list_t. Hence, you create a new type that derives from
|
||||
* pmix_list_item_t; this new type can then be used with pmix_list_t
|
||||
* containers.
|
||||
*
|
||||
* NOTE: pmix_list_item_t instances can only be on \em one list at a
|
||||
* time. Specifically, if you add an pmix_list_item_t to one list,
|
||||
* and then add it to another list (without first removing it from the
|
||||
* first list), you will effectively be hosing the first list. You
|
||||
* have been warned.
|
||||
*
|
||||
* If PMIX_ENABLE_DEBUG is true, a bunch of checks occur, including
|
||||
* some spot checks for a debugging reference count in an attempt to
|
||||
* ensure that an pmix_list_item_t is only one *one* list at a time.
|
||||
* Given the highly concurrent nature of this class, these spot checks
|
||||
* cannot guarantee that an item is only one list at a time.
|
||||
* Specifically, since it is a desirable attribute of this class to
|
||||
* not use locks for normal operations, it is possible that two
|
||||
* threads may [erroneously] modify an pmix_list_item_t concurrently.
|
||||
*
|
||||
* The only way to guarantee that a debugging reference count is valid
|
||||
* for the duration of an operation is to lock the item_t during the
|
||||
* operation. But this fundamentally changes the desirable attribute
|
||||
* of this class (i.e., no locks). So all we can do is spot-check the
|
||||
* reference count in a bunch of places and check that it is still the
|
||||
* value that we think it should be. But this doesn't mean that you
|
||||
* can run into "unlucky" cases where two threads are concurrently
|
||||
* modifying an item_t, but all the spot checks still return the
|
||||
* "right" values. All we can do is hope that we have enough spot
|
||||
* checks to statistically drive down the possibility of the unlucky
|
||||
* cases happening.
|
||||
*/
|
||||
|
||||
#ifndef PMIX_LIST_H
|
||||
#define PMIX_LIST_H
|
||||
|
||||
#include "src/include/pmix_config.h"
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#if HAVE_STDBOOL_H
|
||||
# include <stdbool.h>
|
||||
#endif
|
||||
|
||||
#include "pmix_common.h"
|
||||
#include "src/class/pmix_object.h"
|
||||
|
||||
BEGIN_C_DECLS
|
||||
|
||||
/**
|
||||
* \internal
|
||||
*
|
||||
* The class for the list container.
|
||||
*/
|
||||
PMIX_EXPORT PMIX_CLASS_DECLARATION(pmix_list_t);
|
||||
/**
|
||||
* \internal
|
||||
*
|
||||
* Base class for items that are put in list (pmix_list_t) containers.
|
||||
*/
|
||||
PMIX_EXPORT PMIX_CLASS_DECLARATION(pmix_list_item_t);
|
||||
|
||||
/**
|
||||
* \internal
|
||||
*
|
||||
* Struct of an pmix_list_item_t
|
||||
*/
|
||||
struct pmix_list_item_t {
|
||||
pmix_object_t super;
|
||||
/**< Generic parent class for all PMIx objects */
|
||||
volatile struct pmix_list_item_t *pmix_list_next;
|
||||
/**< Pointer to next list item */
|
||||
volatile struct pmix_list_item_t *pmix_list_prev;
|
||||
/**< Pointer to previous list item */
|
||||
int32_t item_free;
|
||||
|
||||
#if PMIX_ENABLE_DEBUG
|
||||
/** Atomic reference count for debugging */
|
||||
int32_t pmix_list_item_refcount;
|
||||
/** The list this item belong to */
|
||||
volatile struct pmix_list_t *pmix_list_item_belong_to;
|
||||
#endif
|
||||
};
|
||||
/**
|
||||
* Base type for items that are put in a list (pmix_list_t) containers.
|
||||
*/
|
||||
typedef struct pmix_list_item_t pmix_list_item_t;
|
||||
|
||||
/* static initializer for pmix_list_t */
|
||||
#define PMIX_LIST_ITEM_STATIC_INIT \
|
||||
{ \
|
||||
.super = PMIX_OBJ_STATIC_INIT(pmix_object_t), \
|
||||
.pmix_list_next = NULL, \
|
||||
.pmix_list_prev = NULL, \
|
||||
.item_free = 0 \
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the next item in a list.
|
||||
*
|
||||
* @param item A list item.
|
||||
*
|
||||
* @returns The next item in the list
|
||||
*/
|
||||
#define pmix_list_get_next(item) \
|
||||
((item) ? ((pmix_list_item_t *) ((pmix_list_item_t *) (item))->pmix_list_next) : NULL)
|
||||
|
||||
/**
|
||||
* Get the next item in a list.
|
||||
*
|
||||
* @param item A list item.
|
||||
*
|
||||
* @returns The next item in the list
|
||||
*/
|
||||
#define pmix_list_get_prev(item) \
|
||||
((item) ? ((pmix_list_item_t *) ((pmix_list_item_t *) (item))->pmix_list_prev) : NULL)
|
||||
|
||||
/**
|
||||
* \internal
|
||||
*
|
||||
* Struct of an pmix_list_t
|
||||
*/
|
||||
struct pmix_list_t {
|
||||
pmix_object_t super;
|
||||
/**< Generic parent class for all PMIx objects */
|
||||
pmix_list_item_t pmix_list_sentinel;
|
||||
/**< Head and tail item of the list */
|
||||
volatile size_t pmix_list_length;
|
||||
/**< Quick reference to the number of items in the list */
|
||||
};
|
||||
/**
|
||||
* List container type.
|
||||
*/
|
||||
typedef struct pmix_list_t pmix_list_t;
|
||||
|
||||
/* static initializer for pmix_list_t */
|
||||
#define PMIX_LIST_STATIC_INIT \
|
||||
{ \
|
||||
.super = PMIX_OBJ_STATIC_INIT(pmix_object_t), \
|
||||
.pmix_list_sentinel = PMIX_LIST_ITEM_STATIC_INIT, \
|
||||
.pmix_list_length = 0 \
|
||||
}
|
||||
|
||||
/** Cleanly destruct a list
|
||||
*
|
||||
* The pmix_list_t destructor doesn't release the items on the
|
||||
* list - so provide two convenience macros that do so and then
|
||||
* destruct/release the list object itself
|
||||
*
|
||||
* @param[in] list List to destruct or release
|
||||
*/
|
||||
#define PMIX_LIST_DESTRUCT(list) \
|
||||
do { \
|
||||
pmix_list_item_t *it; \
|
||||
while (NULL != (it = pmix_list_remove_first(list))) { \
|
||||
PMIX_RELEASE(it); \
|
||||
} \
|
||||
PMIX_DESTRUCT(list); \
|
||||
} while (0)
|
||||
|
||||
#define PMIX_LIST_RELEASE(list) \
|
||||
do { \
|
||||
pmix_list_item_t *it; \
|
||||
while (NULL != (it = pmix_list_remove_first(list))) { \
|
||||
PMIX_RELEASE(it); \
|
||||
} \
|
||||
PMIX_RELEASE(list); \
|
||||
} while (0)
|
||||
|
||||
/**
|
||||
* Loop over a list.
|
||||
*
|
||||
* @param[in] item Storage for each item
|
||||
* @param[in] list List to iterate over
|
||||
* @param[in] type Type of each list item
|
||||
*
|
||||
* This macro provides a simple way to loop over the items in an pmix_list_t. It
|
||||
* is not safe to call pmix_list_remove_item from within the loop.
|
||||
*
|
||||
* Example Usage:
|
||||
*
|
||||
* class_foo_t *foo;
|
||||
* pmix_list_foreach(foo, list, class_foo_t) {
|
||||
* do something;
|
||||
* }
|
||||
*/
|
||||
#define PMIX_LIST_FOREACH(item, list, type) \
|
||||
for (item = (type *) (list)->pmix_list_sentinel.pmix_list_next; \
|
||||
item != (type *) &(list)->pmix_list_sentinel; \
|
||||
item = (type *) ((pmix_list_item_t *) (item))->pmix_list_next)
|
||||
|
||||
#define PMIX_LIST_FOREACH_DECL(item, list, type) \
|
||||
for (type *item = (type *) (list)->pmix_list_sentinel.pmix_list_next; \
|
||||
item != (type *) &(list)->pmix_list_sentinel; \
|
||||
item = (type *) ((pmix_list_item_t *) (item))->pmix_list_next)
|
||||
/**
|
||||
* Loop over a list in reverse.
|
||||
*
|
||||
* @param[in] item Storage for each item
|
||||
* @param[in] list List to iterate over
|
||||
* @param[in] type Type of each list item
|
||||
*
|
||||
* This macro provides a simple way to loop over the items in an pmix_list_t. It
|
||||
* is not safe to call pmix_list_remove_item from within the loop.
|
||||
*
|
||||
* Example Usage:
|
||||
*
|
||||
* class_foo_t *foo;
|
||||
* pmix_list_foreach(foo, list, class_foo_t) {
|
||||
* do something;
|
||||
* }
|
||||
*/
|
||||
#define PMIX_LIST_FOREACH_REV(item, list, type) \
|
||||
for (item = (type *) (list)->pmix_list_sentinel.pmix_list_prev; \
|
||||
item != (type *) &(list)->pmix_list_sentinel; \
|
||||
item = (type *) ((pmix_list_item_t *) (item))->pmix_list_prev)
|
||||
|
||||
/**
|
||||
* Loop over a list in a *safe* way
|
||||
*
|
||||
* @param[in] item Storage for each item
|
||||
* @param[in] next Storage for next item
|
||||
* @param[in] list List to iterate over
|
||||
* @param[in] type Type of each list item
|
||||
*
|
||||
* This macro provides a simple way to loop over the items in an pmix_list_t. It
|
||||
* is safe to call pmix_list_remove_item(list, item) from within the loop.
|
||||
*
|
||||
* Example Usage:
|
||||
*
|
||||
* class_foo_t *foo, *next;
|
||||
* pmix_list_foreach_safe(foo, next, list, class_foo_t) {
|
||||
* do something;
|
||||
* pmix_list_remove_item (list, (pmix_list_item_t *) foo);
|
||||
* }
|
||||
*/
|
||||
#define PMIX_LIST_FOREACH_SAFE(item, next, list, type) \
|
||||
for (item = (type *) (list)->pmix_list_sentinel.pmix_list_next, \
|
||||
next = (type *) ((pmix_list_item_t *) (item))->pmix_list_next; \
|
||||
item != (type *) &(list)->pmix_list_sentinel; \
|
||||
item = next, next = (type *) ((pmix_list_item_t *) (item))->pmix_list_next)
|
||||
|
||||
/**
|
||||
* Loop over a list in a *safe* way
|
||||
*
|
||||
* @param[in] item Storage for each item
|
||||
* @param[in] next Storage for next item
|
||||
* @param[in] list List to iterate over
|
||||
* @param[in] type Type of each list item
|
||||
*
|
||||
* This macro provides a simple way to loop over the items in an pmix_list_t. If
|
||||
* is safe to call pmix_list_remove_item(list, item) from within the loop.
|
||||
*
|
||||
* Example Usage:
|
||||
*
|
||||
* class_foo_t *foo, *next;
|
||||
* pmix_list_foreach_safe(foo, next, list, class_foo_t) {
|
||||
* do something;
|
||||
* pmix_list_remove_item (list, (pmix_list_item_t *) foo);
|
||||
* }
|
||||
*/
|
||||
#define PMIX_LIST_FOREACH_SAFE_REV(item, prev, list, type) \
|
||||
for (item = (type *) (list)->pmix_list_sentinel.pmix_list_prev, \
|
||||
prev = (type *) ((pmix_list_item_t *) (item))->pmix_list_prev; \
|
||||
item != (type *) &(list)->pmix_list_sentinel; \
|
||||
item = prev, prev = (type *) ((pmix_list_item_t *) (item))->pmix_list_prev)
|
||||
|
||||
/**
|
||||
* Check for empty list
|
||||
*
|
||||
* @param list The list container
|
||||
*
|
||||
* @returns true if list's size is 0, false otherwise
|
||||
*
|
||||
* This is an O(1) operation.
|
||||
*
|
||||
* This is an inlined function in compilers that support inlining,
|
||||
* so it's usually a cheap operation.
|
||||
*/
|
||||
static inline bool pmix_list_is_empty(pmix_list_t *list)
|
||||
{
|
||||
return (list->pmix_list_sentinel.pmix_list_next == &(list->pmix_list_sentinel) ? true : false);
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the first item on the list (does not remove it).
|
||||
*
|
||||
* @param list The list container
|
||||
*
|
||||
* @returns A pointer to the first item on the list
|
||||
*
|
||||
* This is an O(1) operation to return the first item on the list. It
|
||||
* should be compared against the returned value from
|
||||
* pmix_list_get_end() to ensure that the list is not empty.
|
||||
*
|
||||
* This is an inlined function in compilers that support inlining, so
|
||||
* it's usually a cheap operation.
|
||||
*/
|
||||
static inline pmix_list_item_t *pmix_list_get_first(pmix_list_t *list)
|
||||
{
|
||||
pmix_list_item_t *item = (pmix_list_item_t *) list->pmix_list_sentinel.pmix_list_next;
|
||||
#if PMIX_ENABLE_DEBUG
|
||||
/* Spot check: ensure that the first item is only on one list */
|
||||
|
||||
assert(1 == item->pmix_list_item_refcount);
|
||||
assert(list == item->pmix_list_item_belong_to);
|
||||
#endif
|
||||
|
||||
return item;
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the last item on the list (does not remove it).
|
||||
*
|
||||
* @param list The list container
|
||||
*
|
||||
* @returns A pointer to the last item on the list
|
||||
*
|
||||
* This is an O(1) operation to return the last item on the list. It
|
||||
* should be compared against the returned value from
|
||||
* pmix_list_get_begin() to ensure that the list is not empty.
|
||||
*
|
||||
* This is an inlined function in compilers that support inlining, so
|
||||
* it's usually a cheap operation.
|
||||
*/
|
||||
static inline pmix_list_item_t *pmix_list_get_last(pmix_list_t *list)
|
||||
{
|
||||
pmix_list_item_t *item = (pmix_list_item_t *) list->pmix_list_sentinel.pmix_list_prev;
|
||||
#if PMIX_ENABLE_DEBUG
|
||||
/* Spot check: ensure that the last item is only on one list */
|
||||
|
||||
assert(1 == item->pmix_list_item_refcount);
|
||||
assert(list == item->pmix_list_item_belong_to);
|
||||
#endif
|
||||
|
||||
return item;
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the beginning of the list; an invalid list entry suitable
|
||||
* for comparison only.
|
||||
*
|
||||
* @param list The list container
|
||||
*
|
||||
* @returns A pointer to the beginning of the list.
|
||||
*
|
||||
* This is an O(1) operation to return the beginning of the list.
|
||||
* Similar to the STL, this is a special invalid list item -- it
|
||||
* should \em not be used for storage. It is only suitable for
|
||||
* comparison to other items in the list to see if they are valid or
|
||||
* not; it's usually used when iterating through the items in a list.
|
||||
*
|
||||
* This is an inlined function in compilers that support inlining, so
|
||||
* it's usually a cheap operation.
|
||||
*/
|
||||
static inline pmix_list_item_t *pmix_list_get_begin(pmix_list_t *list)
|
||||
{
|
||||
return &(list->pmix_list_sentinel);
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the end of the list; an invalid list entry suitable for
|
||||
* comparison only.
|
||||
*
|
||||
* @param list The list container
|
||||
*
|
||||
* @returns A pointer to the end of the list.
|
||||
*
|
||||
* This is an O(1) operation to return the end of the list.
|
||||
* Similar to the STL, this is a special invalid list item -- it
|
||||
* should \em not be used for storage. It is only suitable for
|
||||
* comparison to other items in the list to see if they are valid or
|
||||
* not; it's usually used when iterating through the items in a list.
|
||||
*
|
||||
* This is an inlined function in compilers that support inlining, so
|
||||
* it's usually a cheap operation.
|
||||
*/
|
||||
static inline pmix_list_item_t *pmix_list_get_end(pmix_list_t *list)
|
||||
{
|
||||
return &(list->pmix_list_sentinel);
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the number of items in a list
|
||||
*
|
||||
* @param list The list container
|
||||
*
|
||||
* @returns The size of the list (size_t)
|
||||
*
|
||||
* This is an O(1) lookup to return the size of the list.
|
||||
*
|
||||
* This is an inlined function in compilers that support inlining, so
|
||||
* it's usually a cheap operation.
|
||||
*
|
||||
* \warning The size of the list is cached as part of the list. In
|
||||
* the future, calling \c pmix_list_splice or \c pmix_list_join may
|
||||
* result in this function recomputing the list size, which would be
|
||||
* an O(N) operation. If \c pmix_list_splice or \c pmix_list_join is
|
||||
* never called on the specified list, this function will always be
|
||||
* O(1).
|
||||
*/
|
||||
static inline size_t pmix_list_get_size(pmix_list_t *list)
|
||||
{
|
||||
#if PMIX_ENABLE_DEBUG && 0
|
||||
/* not sure if we really want this running in devel, as it does
|
||||
* slow things down. Wanted for development of splice / join to
|
||||
* make sure length was reset properly
|
||||
*/
|
||||
size_t check_len = 0;
|
||||
pmix_list_item_t *item;
|
||||
|
||||
for (item = pmix_list_get_first(list); item != pmix_list_get_end(list);
|
||||
item = pmix_list_get_next(item)) {
|
||||
check_len++;
|
||||
}
|
||||
|
||||
if (check_len != list->pmix_list_length) {
|
||||
fprintf(
|
||||
stderr,
|
||||
" Error :: pmix_list_get_size - pmix_list_length does not match actual list length\n");
|
||||
fflush(stderr);
|
||||
abort();
|
||||
}
|
||||
#endif
|
||||
|
||||
return list->pmix_list_length;
|
||||
}
|
||||
|
||||
/**
|
||||
* Remove an item from a list.
|
||||
*
|
||||
* @param list The list container
|
||||
* @param item The item to remove
|
||||
*
|
||||
* @returns A pointer to the item on the list previous to the one
|
||||
* that was removed.
|
||||
*
|
||||
* This is an O(1) operation to remove an item from the list. The
|
||||
* forward / reverse pointers in the list are updated and the item is
|
||||
* removed. The list item that is returned is now "owned" by the
|
||||
* caller -- they are responsible for PMIX_RELEASE()'ing it.
|
||||
*
|
||||
* If debugging is enabled (specifically, if --enable-debug was used
|
||||
* to configure PMIx), this is an O(N) operation because it checks
|
||||
* to see if the item is actually in the list first.
|
||||
*
|
||||
* This is an inlined function in compilers that support inlining, so
|
||||
* it's usually a cheap operation.
|
||||
*/
|
||||
static inline pmix_list_item_t *pmix_list_remove_item(pmix_list_t *list, pmix_list_item_t *item)
|
||||
{
|
||||
#if PMIX_ENABLE_DEBUG
|
||||
pmix_list_item_t *item_ptr;
|
||||
bool found = false;
|
||||
|
||||
/* check to see that the item is in the list */
|
||||
for (item_ptr = pmix_list_get_first(list); item_ptr != pmix_list_get_end(list);
|
||||
item_ptr = (pmix_list_item_t *) (item_ptr->pmix_list_next)) {
|
||||
if (item_ptr == (pmix_list_item_t *) item) {
|
||||
found = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (!found) {
|
||||
fprintf(stderr, " Warning :: pmix_list_remove_item - the item %p is not on the list %p \n",
|
||||
(void *) item, (void *) list);
|
||||
fflush(stderr);
|
||||
return (pmix_list_item_t *) NULL;
|
||||
}
|
||||
|
||||
assert(list == item->pmix_list_item_belong_to);
|
||||
#endif
|
||||
|
||||
/* reset next pointer of previous element */
|
||||
item->pmix_list_prev->pmix_list_next = item->pmix_list_next;
|
||||
|
||||
/* reset previous pointer of next element */
|
||||
item->pmix_list_next->pmix_list_prev = item->pmix_list_prev;
|
||||
|
||||
list->pmix_list_length--;
|
||||
|
||||
#if PMIX_ENABLE_DEBUG
|
||||
/* Spot check: ensure that this item is still only on one list */
|
||||
|
||||
item->pmix_list_item_refcount -= 1;
|
||||
assert(0 == item->pmix_list_item_refcount);
|
||||
item->pmix_list_item_belong_to = NULL;
|
||||
#endif
|
||||
|
||||
return (pmix_list_item_t *) item->pmix_list_prev;
|
||||
}
|
||||
|
||||
/**
|
||||
* Append an item to the end of the list.
|
||||
*
|
||||
* @param list The list container
|
||||
* @param item The item to append
|
||||
*
|
||||
* This is an O(1) operation to append an item to the end of a list.
|
||||
* The pmix_list_item_t is not PMIX_RETAIN()'ed; it is assumed that
|
||||
* "ownership" of the item is passed from the caller to the list.
|
||||
*
|
||||
* This is an inlined function in compilers that support inlining, so
|
||||
* it's usually a cheap operation.
|
||||
*/
|
||||
|
||||
#if PMIX_ENABLE_DEBUG
|
||||
# define pmix_list_append(l, i) _pmix_list_append(l, i, __FILE__, __LINE__)
|
||||
#else
|
||||
# define pmix_list_append(l, i) _pmix_list_append(l, i)
|
||||
#endif /* PMIX_ENABLE_DEBUG */
|
||||
|
||||
static inline void _pmix_list_append(pmix_list_t *list, pmix_list_item_t *item
|
||||
#if PMIX_ENABLE_DEBUG
|
||||
,
|
||||
const char *FILE_NAME, int LINENO
|
||||
#endif /* PMIX_ENABLE_DEBUG */
|
||||
)
|
||||
{
|
||||
pmix_list_item_t *sentinel = &(list->pmix_list_sentinel);
|
||||
#if PMIX_ENABLE_DEBUG
|
||||
/* Spot check: ensure that this item is previously on no lists */
|
||||
|
||||
assert(0 == item->pmix_list_item_refcount);
|
||||
assert(NULL == item->pmix_list_item_belong_to);
|
||||
item->super.cls_init_file_name = FILE_NAME;
|
||||
item->super.cls_init_lineno = LINENO;
|
||||
#endif
|
||||
|
||||
/* set new element's previous pointer */
|
||||
item->pmix_list_prev = sentinel->pmix_list_prev;
|
||||
|
||||
/* reset previous pointer on current last element */
|
||||
sentinel->pmix_list_prev->pmix_list_next = item;
|
||||
|
||||
/* reset new element's next pointer */
|
||||
item->pmix_list_next = sentinel;
|
||||
|
||||
/* reset the list's tail element previous pointer */
|
||||
sentinel->pmix_list_prev = item;
|
||||
|
||||
/* increment list element counter */
|
||||
list->pmix_list_length++;
|
||||
|
||||
#if PMIX_ENABLE_DEBUG
|
||||
/* Spot check: ensure this item is only on the list that we just
|
||||
appended it to */
|
||||
|
||||
item->pmix_list_item_refcount += 1;
|
||||
assert(1 == item->pmix_list_item_refcount);
|
||||
item->pmix_list_item_belong_to = list;
|
||||
#endif
|
||||
}
|
||||
|
||||
/**
|
||||
* Prepend an item to the beginning of the list.
|
||||
*
|
||||
* @param list The list container
|
||||
* @param item The item to prepend
|
||||
*
|
||||
* This is an O(1) operation to prepend an item to the beginning of a
|
||||
* list. The pmix_list_item_t is not PMIX_RETAIN()'ed; it is assumed
|
||||
* that "ownership" of the item is passed from the caller to the list.
|
||||
*
|
||||
* This is an inlined function in compilers that support inlining, so
|
||||
* it's usually a cheap operation.
|
||||
*/
|
||||
static inline void pmix_list_prepend(pmix_list_t *list, pmix_list_item_t *item)
|
||||
{
|
||||
pmix_list_item_t *sentinel = &(list->pmix_list_sentinel);
|
||||
#if PMIX_ENABLE_DEBUG
|
||||
/* Spot check: ensure that this item is previously on no lists */
|
||||
|
||||
assert(0 == item->pmix_list_item_refcount);
|
||||
assert(NULL == item->pmix_list_item_belong_to);
|
||||
#endif
|
||||
|
||||
/* reset item's next pointer */
|
||||
item->pmix_list_next = sentinel->pmix_list_next;
|
||||
|
||||
/* reset item's previous pointer */
|
||||
item->pmix_list_prev = sentinel;
|
||||
|
||||
/* reset previous first element's previous pointer */
|
||||
sentinel->pmix_list_next->pmix_list_prev = item;
|
||||
|
||||
/* reset head's next pointer */
|
||||
sentinel->pmix_list_next = item;
|
||||
|
||||
/* increment list element counter */
|
||||
list->pmix_list_length++;
|
||||
|
||||
#if PMIX_ENABLE_DEBUG
|
||||
/* Spot check: ensure this item is only on the list that we just
|
||||
prepended it to */
|
||||
|
||||
item->pmix_list_item_refcount += 1;
|
||||
assert(1 == item->pmix_list_item_refcount);
|
||||
item->pmix_list_item_belong_to = list;
|
||||
#endif
|
||||
}
|
||||
|
||||
/**
|
||||
* Remove the first item from the list and return it.
|
||||
*
|
||||
* @param list The list container
|
||||
*
|
||||
* @returns The first item on the list. If the list is empty,
|
||||
* NULL will be returned
|
||||
*
|
||||
* This is an O(1) operation to return the first item on the list. If
|
||||
* the list is not empty, a pointer to the first item in the list will
|
||||
* be returned. Ownership of the item is transferred from the list to
|
||||
* the caller; no calls to PMIX_RETAIN() or PMIX_RELEASE() are invoked.
|
||||
*
|
||||
* This is an inlined function in compilers that support inlining, so
|
||||
* it's usually a cheap operation.
|
||||
*/
|
||||
static inline pmix_list_item_t *pmix_list_remove_first(pmix_list_t *list)
|
||||
{
|
||||
/* Removes and returns first item on list.
|
||||
Caller now owns the item and should release the item
|
||||
when caller is done with it.
|
||||
*/
|
||||
volatile pmix_list_item_t *item;
|
||||
if (0 == list->pmix_list_length) {
|
||||
return (pmix_list_item_t *) NULL;
|
||||
}
|
||||
|
||||
#if PMIX_ENABLE_DEBUG
|
||||
/* Spot check: ensure that the first item is only on this list */
|
||||
|
||||
assert(1 == list->pmix_list_sentinel.pmix_list_next->pmix_list_item_refcount);
|
||||
#endif
|
||||
|
||||
/* reset list length counter */
|
||||
list->pmix_list_length--;
|
||||
|
||||
/* get pointer to first element on the list */
|
||||
item = (pmix_list_item_t*)list->pmix_list_sentinel.pmix_list_next;
|
||||
|
||||
/* reset previous pointer of next item on the list */
|
||||
item->pmix_list_next->pmix_list_prev = item->pmix_list_prev;
|
||||
|
||||
/* reset the head next pointer */
|
||||
list->pmix_list_sentinel.pmix_list_next = item->pmix_list_next;
|
||||
|
||||
#if PMIX_ENABLE_DEBUG
|
||||
assert(list == item->pmix_list_item_belong_to);
|
||||
item->pmix_list_item_belong_to = NULL;
|
||||
item->pmix_list_prev = (pmix_list_item_t *) NULL;
|
||||
item->pmix_list_next = (pmix_list_item_t *) NULL;
|
||||
|
||||
/* Spot check: ensure that the item we're returning is now on no
|
||||
lists */
|
||||
|
||||
item->pmix_list_item_refcount -= 1;
|
||||
assert(0 == item->pmix_list_item_refcount);
|
||||
#endif
|
||||
|
||||
return (pmix_list_item_t *) item;
|
||||
}
|
||||
|
||||
/**
|
||||
* Remove the last item from the list and return it.
|
||||
*
|
||||
* @param list The list container
|
||||
*
|
||||
* @returns The last item on the list. If the list is empty,
|
||||
* NULL will be returned
|
||||
*
|
||||
* This is an O(1) operation to return the last item on the list. If
|
||||
* the list is not empty, a pointer to the last item in the list will
|
||||
* be returned. Ownership of the item is transferred from the list to
|
||||
* the caller; no calls to PMIX_RETAIN() or PMIX_RELEASE() are invoked.
|
||||
*
|
||||
* This is an inlined function in compilers that support inlining, so
|
||||
* it's usually a cheap operation.
|
||||
*/
|
||||
static inline pmix_list_item_t *pmix_list_remove_last(pmix_list_t *list)
|
||||
{
|
||||
/* Removes, releases and returns last item on list.
|
||||
Caller now owns the item and should release the item
|
||||
when caller is done with it.
|
||||
*/
|
||||
volatile pmix_list_item_t *item;
|
||||
if (0 == list->pmix_list_length) {
|
||||
return (pmix_list_item_t *) NULL;
|
||||
}
|
||||
|
||||
#if PMIX_ENABLE_DEBUG
|
||||
/* Spot check: ensure that the first item is only on this list */
|
||||
|
||||
assert(1 == list->pmix_list_sentinel.pmix_list_prev->pmix_list_item_refcount);
|
||||
#endif
|
||||
|
||||
/* reset list length counter */
|
||||
list->pmix_list_length--;
|
||||
|
||||
/* get item */
|
||||
item = (pmix_list_item_t*)list->pmix_list_sentinel.pmix_list_prev;
|
||||
|
||||
/* reset previous pointer on next to last pointer */
|
||||
item->pmix_list_prev->pmix_list_next = item->pmix_list_next;
|
||||
|
||||
/* reset tail's previous pointer */
|
||||
list->pmix_list_sentinel.pmix_list_prev = item->pmix_list_prev;
|
||||
|
||||
#if PMIX_ENABLE_DEBUG
|
||||
assert(list == item->pmix_list_item_belong_to);
|
||||
item->pmix_list_next = item->pmix_list_prev = (pmix_list_item_t *) NULL;
|
||||
|
||||
/* Spot check: ensure that the item we're returning is now on no
|
||||
lists */
|
||||
|
||||
item->pmix_list_item_refcount -= 1;
|
||||
assert(0 == item->pmix_list_item_refcount);
|
||||
item->pmix_list_item_belong_to = NULL;
|
||||
#endif
|
||||
|
||||
return (pmix_list_item_t *) item;
|
||||
}
|
||||
|
||||
/**
|
||||
* Add an item to the list before a given element
|
||||
*
|
||||
* @param list The list container
|
||||
* @param pos List element to insert \c item before
|
||||
* @param item The item to insert
|
||||
*
|
||||
* Inserts \c item before \c pos. This is an O(1) operation.
|
||||
*/
|
||||
static inline void pmix_list_insert_pos(pmix_list_t *list, pmix_list_item_t *pos,
|
||||
pmix_list_item_t *item)
|
||||
{
|
||||
#if PMIX_ENABLE_DEBUG
|
||||
/* Spot check: ensure that the item we're insertting is currently
|
||||
not on any list */
|
||||
|
||||
assert(0 == item->pmix_list_item_refcount);
|
||||
assert(NULL == item->pmix_list_item_belong_to);
|
||||
#endif
|
||||
|
||||
/* point item at the existing elements */
|
||||
item->pmix_list_next = pos;
|
||||
item->pmix_list_prev = pos->pmix_list_prev;
|
||||
|
||||
/* splice into the list */
|
||||
pos->pmix_list_prev->pmix_list_next = item;
|
||||
pos->pmix_list_prev = item;
|
||||
|
||||
/* reset list length counter */
|
||||
list->pmix_list_length++;
|
||||
|
||||
#if PMIX_ENABLE_DEBUG
|
||||
/* Spot check: double check that this item is only on the list
|
||||
that we just added it to */
|
||||
|
||||
item->pmix_list_item_refcount += 1;
|
||||
assert(1 == item->pmix_list_item_refcount);
|
||||
item->pmix_list_item_belong_to = list;
|
||||
#endif
|
||||
}
|
||||
|
||||
/**
|
||||
* Add an item to the list at a specific index location in the list.
|
||||
*
|
||||
* @param list The list container
|
||||
* @param item The item to insert
|
||||
* @param index Location to add the item
|
||||
*
|
||||
* @returns true if insertion succeeded; otherwise false
|
||||
*
|
||||
* This is potentially an O(N) operation to traverse down to the
|
||||
* correct location in the list and add an item.
|
||||
*
|
||||
* Example: if idx = 2 and list = item1->item2->item3->item4, then
|
||||
* after insert, list = item1->item2->item->item3->item4.
|
||||
*
|
||||
* If index is greater than the length of the list, no action is
|
||||
* performed and false is returned.
|
||||
*/
|
||||
PMIX_EXPORT bool pmix_list_insert(pmix_list_t *list,
|
||||
pmix_list_item_t *item,
|
||||
long long idx);
|
||||
|
||||
/**
|
||||
* Join a list into another list
|
||||
*
|
||||
* @param thislist List container for list being operated on
|
||||
* @param pos List item in \c thislist marking the position before
|
||||
* which items are inserted
|
||||
* @param xlist List container for list being spliced from
|
||||
*
|
||||
* Join a list into another list. All of the elements of \c xlist
|
||||
* are inserted before \c pos and removed from \c xlist.
|
||||
*
|
||||
* This operation is an O(1) operation. Both \c thislist and \c
|
||||
* xlist must be valid list containsers. \c xlist will be empty
|
||||
* but valid after the call. All pointers to \c pmix_list_item_t
|
||||
* containers remain valid, including those that point to elements
|
||||
* in \c xlist.
|
||||
*/
|
||||
PMIX_EXPORT void pmix_list_join(pmix_list_t *thislist,
|
||||
pmix_list_item_t *pos,
|
||||
pmix_list_t *xlist);
|
||||
|
||||
/**
|
||||
* Splice a list into another list
|
||||
*
|
||||
* @param thislist List container for list being operated on
|
||||
* @param pos List item in \c thislist marking the position before
|
||||
* which items are inserted
|
||||
* @param xlist List container for list being spliced from
|
||||
* @param first List item in \c xlist marking the start of elements
|
||||
* to be copied into \c thislist
|
||||
* @param last List item in \c xlist marking the end of elements
|
||||
* to be copied into \c thislist
|
||||
*
|
||||
* Splice a subset of a list into another list. The \c [first,
|
||||
* last) elements of \c xlist are moved into \c thislist,
|
||||
* inserting them before \c pos. \c pos must be a valid iterator
|
||||
* in \c thislist and \c [first, last) must be a valid range in \c
|
||||
* xlist. \c position must not be in the range \c [first, last).
|
||||
* It is, however, valid for \c xlist and \c thislist to be the
|
||||
* same list.
|
||||
*
|
||||
* This is an O(N) operation because the length of both lists must
|
||||
* be recomputed.
|
||||
*/
|
||||
PMIX_EXPORT void pmix_list_splice(pmix_list_t *thislist,
|
||||
pmix_list_item_t *pos,
|
||||
pmix_list_t *xlist,
|
||||
pmix_list_item_t *first,
|
||||
pmix_list_item_t *last);
|
||||
|
||||
/**
|
||||
* Comparison function for pmix_list_sort(), below.
|
||||
*
|
||||
* @param a Pointer to a pointer to an pmix_list_item_t.
|
||||
* Explanation below.
|
||||
* @param b Pointer to a pointer to an pmix_list_item_t.
|
||||
* Explanation below.
|
||||
* @retval 1 if \em a is greater than \em b
|
||||
* @retval 0 if \em a is equal to \em b
|
||||
* @retval 11 if \em a is less than \em b
|
||||
*
|
||||
* This function is invoked by qsort(3) from within
|
||||
* pmix_list_sort(). It is important to understand what
|
||||
* pmix_list_sort() does before invoking qsort, so go read that
|
||||
* documentation first.
|
||||
*
|
||||
* The important thing to realize here is that a and b will be \em
|
||||
* double pointers to the items that you need to compare. Here's
|
||||
* a sample compare function to illustrate this point:
|
||||
*/
|
||||
typedef int (*pmix_list_item_compare_fn_t)(pmix_list_item_t **a,
|
||||
pmix_list_item_t **b);
|
||||
|
||||
/**
|
||||
* Sort a list with a provided compare function.
|
||||
*
|
||||
* @param list The list to sort
|
||||
* @param compare Compare function
|
||||
*
|
||||
* Put crassly, this function's complexity is O(N) + O(log(N)).
|
||||
* Its algorithm is:
|
||||
*
|
||||
* - remove every item from the list and put the corresponding
|
||||
* (pmix_list_item_t*)'s in an array
|
||||
* - call qsort(3) with that array and your compare function
|
||||
* - re-add every element of the now-sorted array to the list
|
||||
*
|
||||
* The resulting list is now ordered. Note, however, that since
|
||||
* an array of pointers is sorted, the comparison function must do
|
||||
* a double de-reference to get to the actual pmix_list_item_t (or
|
||||
* whatever the underlying type is). See the documentation of
|
||||
* pmix_list_item_compare_fn_t for an example).
|
||||
*/
|
||||
PMIX_EXPORT int pmix_list_sort(pmix_list_t *list,
|
||||
pmix_list_item_compare_fn_t compare);
|
||||
|
||||
END_C_DECLS
|
||||
|
||||
#endif /* PMIX_LIST_H */
|
||||
786
macx64/mpi/openmpi/include/pmix/src/class/pmix_object.h
Normal file
786
macx64/mpi/openmpi/include/pmix/src/class/pmix_object.h
Normal file
@@ -0,0 +1,786 @@
|
||||
/* -*- Mode: C; c-basic-offset:4 ; -*- */
|
||||
/*
|
||||
* Copyright (c) 2004-2005 The Trustees of Indiana University and Indiana
|
||||
* University Research and Technology
|
||||
* Corporation. All rights reserved.
|
||||
* Copyright (c) 2004-2007 The University of Tennessee and The University
|
||||
* of Tennessee Research Foundation. All rights
|
||||
* reserved.
|
||||
* Copyright (c) 2004-2006 High Performance Computing Center Stuttgart,
|
||||
* University of Stuttgart. All rights reserved.
|
||||
* Copyright (c) 2004-2005 The Regents of the University of California.
|
||||
* All rights reserved.
|
||||
* Copyright (c) 2007 Cisco Systems, Inc. All rights reserved.
|
||||
* Copyright (c) 2013-2020 Intel, Inc. All rights reserved.
|
||||
* Copyright (c) 2016 Research Organization for Information Science
|
||||
* and Technology (RIST). All rights reserved.
|
||||
* Copyright (c) 2021-2022 Nanook Consulting All rights reserved.
|
||||
* Copyright (c) 2021-2023 Triad National Security, LLC. All rights reserved.
|
||||
* $COPYRIGHT$
|
||||
*
|
||||
* Additional copyrights may follow
|
||||
*
|
||||
* $HEADER$
|
||||
*/
|
||||
|
||||
/**
|
||||
* @file:
|
||||
*
|
||||
* A simple C-language object-oriented system with single inheritance
|
||||
* and ownership-based memory management using a retain/release model.
|
||||
*
|
||||
* A class consists of a struct and singly-instantiated class
|
||||
* descriptor. The first element of the struct must be the parent
|
||||
* class's struct. The class descriptor must be given a well-known
|
||||
* name based upon the class struct name (if the struct is sally_t,
|
||||
* the class descriptor should be sally_t_class) and must be
|
||||
* statically initialized as discussed below.
|
||||
*
|
||||
* (a) To define a class
|
||||
*
|
||||
* In a interface (.h) file, define the class. The first element
|
||||
* should always be the parent class, for example
|
||||
* @code
|
||||
* struct sally_t
|
||||
* {
|
||||
* parent_t parent;
|
||||
* void *first_member;
|
||||
* ...
|
||||
* };
|
||||
* typedef struct sally_t sally_t;
|
||||
*
|
||||
* PMIX_CLASS_DECLARATION(sally_t);
|
||||
* @endcode
|
||||
* All classes must have a parent which is also class.
|
||||
*
|
||||
* In an implementation (.c) file, instantiate a class descriptor for
|
||||
* the class like this:
|
||||
* @code
|
||||
* PMIX_CLASS_INSTANCE(sally_t, parent_t, sally_construct, sally_destruct);
|
||||
* @endcode
|
||||
* This macro actually expands to
|
||||
* @code
|
||||
* pmix_class_t sally_t_class = {
|
||||
* "sally_t",
|
||||
* PMIX_CLASS(parent_t), // pointer to parent_t_class
|
||||
* sally_construct,
|
||||
* sally_destruct,
|
||||
* 0, 0, NULL, NULL,
|
||||
* sizeof ("sally_t")
|
||||
* };
|
||||
* @endcode
|
||||
* This variable should be declared in the interface (.h) file using
|
||||
* the PMIX_CLASS_DECLARATION macro as shown above.
|
||||
*
|
||||
* sally_construct, and sally_destruct are function pointers to the
|
||||
* constructor and destructor for the class and are best defined as
|
||||
* static functions in the implementation file. NULL pointers maybe
|
||||
* supplied instead.
|
||||
*
|
||||
* Other class methods may be added to the struct.
|
||||
*
|
||||
* (b) Class instantiation: dynamic
|
||||
*
|
||||
* To create a instance of a class (an object) use PMIX_NEW:
|
||||
* @code
|
||||
* sally_t *sally = PMIX_NEW(sally_t);
|
||||
* @endcode
|
||||
* which allocates memory of sizeof(sally_t) and runs the class's
|
||||
* constructors.
|
||||
*
|
||||
* Use PMIX_RETAIN, PMIX_RELEASE to do reference-count-based
|
||||
* memory management:
|
||||
* @code
|
||||
* PMIX_RETAIN(sally);
|
||||
* PMIX_RELEASE(sally);
|
||||
* PMIX_RELEASE(sally);
|
||||
* @endcode
|
||||
* When the reference count reaches zero, the class's destructor, and
|
||||
* those of its parents, are run and the memory is freed.
|
||||
*
|
||||
* N.B. There is no explicit free/delete method for dynamic objects in
|
||||
* this model.
|
||||
*
|
||||
* (c) Class instantiation: static
|
||||
*
|
||||
* For an object with static (or stack) allocation, it is only
|
||||
* necessary to initialize the memory, which is done using
|
||||
* PMIX_CONSTRUCT:
|
||||
* @code
|
||||
* sally_t sally;
|
||||
*
|
||||
* PMIX_CONSTRUCT(&sally, sally_t);
|
||||
* @endcode
|
||||
* The retain/release model is not necessary here, but before the
|
||||
* object goes out of scope, PMIX_DESTRUCT should be run to release
|
||||
* initialized resources:
|
||||
* @code
|
||||
* PMIX_DESTRUCT(&sally);
|
||||
* @endcode
|
||||
*/
|
||||
|
||||
#ifndef PMIX_OBJECT_H
|
||||
#define PMIX_OBJECT_H
|
||||
|
||||
#include "src/include/pmix_config.h"
|
||||
#include "pmix_common.h"
|
||||
|
||||
#include <assert.h>
|
||||
#ifdef HAVE_STDLIB_H
|
||||
# include <stdlib.h>
|
||||
#endif /* HAVE_STDLIB_H */
|
||||
#include <pthread.h>
|
||||
#include <stdio.h>
|
||||
#include <errno.h>
|
||||
|
||||
BEGIN_C_DECLS
|
||||
|
||||
#if PMIX_ENABLE_DEBUG
|
||||
/* Any kind of unique ID should do the job */
|
||||
# define PMIX_OBJ_MAGIC_ID ((0xdeafbeedULL << 32) + 0xdeafbeedULL)
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Macros for variadic object instantiation: w/wout custom memory allocator.
|
||||
*
|
||||
* NOTE(skg) There is probably a nicer way to implement this functionality. In
|
||||
* particular, with further macro magic we can probably unify a lot of the
|
||||
* common code here, but that is for another day.
|
||||
*/
|
||||
|
||||
/**
|
||||
* Takes in at least three arguments, eats all of them except the third.
|
||||
* This allows us to do things like:
|
||||
* PMIX_NEW_HAS_ARITY_HELPER(sally_t, TMA, NO_TMA, ERROR) --> NO_TMA
|
||||
* PMIX_NEW_HAS_ARITY_HELPER(sally_t, a_tma, TMA, NO_TMA, ERROR) --> TMA
|
||||
*/
|
||||
#define PMIX_NEW_HAS_ARITY_HELPER(_1, _2, N, ...) N
|
||||
|
||||
#define PMIX_NEW_HAS_ARITY_IMPL(...) \
|
||||
PMIX_NEW_HAS_ARITY_HELPER(__VA_ARGS__)
|
||||
/*
|
||||
* PMIX_CONSTRUCT() takes a maximum of three arguments:
|
||||
* Two arguments means caller does not want a custom memory allocator.
|
||||
* Three arguments means caller wants a custom (TMA) memory allocator.
|
||||
*
|
||||
* Please see PMIX_NEW_HAS_ARITY_HELPER's description above for more details
|
||||
* about how this macro functions.
|
||||
*/
|
||||
#define PMIX_CONSTRUCT_HAS_ARITY_HELPER(_1, _2, _3, N, ...) N
|
||||
|
||||
#define PMIX_CONSTRUCT_HAS_ARITY_IMPL(...) \
|
||||
PMIX_CONSTRUCT_HAS_ARITY_HELPER(__VA_ARGS__)
|
||||
|
||||
/*
|
||||
* Macro suffix naming convention must be _TMA or _NO_TMA.
|
||||
*
|
||||
* These are the displacement mode lists used in the PMIX_NEW_HAS_ARITY_HELPER
|
||||
* example above.
|
||||
*/
|
||||
#define PMIX_NEW_HAS_ARGS_SOURCE() TMA, NO_TMA, ERROR
|
||||
|
||||
#define PMIX_CONSTRUCT_HAS_ARGS_SOURCE() TMA, NO_TMA, ERROR, ERROR
|
||||
|
||||
#define PMIX_OBJ_HAS_ARGS(...) \
|
||||
PMIX_NEW_HAS_ARITY_IMPL(__VA_ARGS__, PMIX_NEW_HAS_ARGS_SOURCE())
|
||||
|
||||
#define PMIX_CONSTRUCT_HAS_ARGS(...) \
|
||||
PMIX_CONSTRUCT_HAS_ARITY_IMPL(__VA_ARGS__, PMIX_CONSTRUCT_HAS_ARGS_SOURCE())
|
||||
/*
|
||||
* These are used to generate the proper macro name and forward the relevant
|
||||
* arguments depending on the number of arguments used.
|
||||
*/
|
||||
#define PMIX_NEW_DISAMBIGUATE2(has_args, ...) \
|
||||
PMIX_NEW_ ## has_args (__VA_ARGS__)
|
||||
|
||||
#define PMIX_NEW_DISAMBIGUATE(has_args, ...) \
|
||||
PMIX_NEW_DISAMBIGUATE2(has_args, __VA_ARGS__)
|
||||
|
||||
#define PMIX_CONSTRUCT_DISAMBIGUATE2(has_args, ...) \
|
||||
PMIX_CONSTRUCT_ ## has_args (__VA_ARGS__)
|
||||
|
||||
#define PMIX_CONSTRUCT_DISAMBIGUATE(has_args, ...) \
|
||||
PMIX_CONSTRUCT_DISAMBIGUATE2(has_args, __VA_ARGS__)
|
||||
|
||||
/* typedefs ***********************************************************/
|
||||
|
||||
typedef struct pmix_object_t pmix_object_t;
|
||||
typedef struct pmix_class_t pmix_class_t;
|
||||
typedef void (*pmix_construct_t)(pmix_object_t *);
|
||||
typedef void (*pmix_destruct_t)(pmix_object_t *);
|
||||
|
||||
/* types **************************************************************/
|
||||
|
||||
/** Memory allocator for objects */
|
||||
typedef struct pmix_tma {
|
||||
/** Pointer to the TMA's malloc() function. */
|
||||
void *(*tma_malloc)(struct pmix_tma *, size_t);
|
||||
/** Pointer to the TMA's calloc() function. */
|
||||
void *(*tma_calloc)(struct pmix_tma *, size_t, size_t);
|
||||
/** Pointer to the TMA's realloc() function. */
|
||||
void *(*tma_realloc)(struct pmix_tma *, void *, size_t);
|
||||
/*
|
||||
* NOTE: The seemingly unnecessary name mangling here is in response to
|
||||
* certain compilers not liking the use of a function pointer named strdup.
|
||||
*/
|
||||
/** Pointer to the TMA's strdup() function. */
|
||||
char *(*tma_strdup)(struct pmix_tma *, const char *s);
|
||||
/**
|
||||
* A memmove()-like function that copies the provided contents to an
|
||||
* appropriate location in the memory area maintained by the allocator.
|
||||
* Like memmove(), it returns a pointer to the content's destination.
|
||||
*/
|
||||
void *(*tma_memmove)(struct pmix_tma *tma, const void *src, size_t n);
|
||||
/** Pointer to the TMA's free() function. */
|
||||
void (*tma_free)(struct pmix_tma *, void *);
|
||||
/** Points to a user-defined TMA context. */
|
||||
void *data_context;
|
||||
/**
|
||||
* Points to generic data used by a TMA. An example includes a pointer to a
|
||||
* value that maintains the next available address.
|
||||
*/
|
||||
void **data_ptr;
|
||||
} pmix_tma_t;
|
||||
|
||||
static inline void *pmix_tma_malloc(pmix_tma_t *tma, size_t size)
|
||||
{
|
||||
if (NULL != tma) {
|
||||
return tma->tma_malloc(tma, size);
|
||||
} else {
|
||||
return malloc(size);
|
||||
}
|
||||
}
|
||||
|
||||
static inline void *pmix_tma_calloc(pmix_tma_t *tma, size_t nmemb, size_t size)
|
||||
{
|
||||
if (NULL != tma) {
|
||||
return tma->tma_calloc(tma, nmemb, size);
|
||||
} else {
|
||||
return calloc(nmemb, size);
|
||||
}
|
||||
}
|
||||
|
||||
static inline void *pmix_tma_realloc(pmix_tma_t *tma, void *ptr, size_t size)
|
||||
{
|
||||
if (NULL != tma) {
|
||||
return tma->tma_realloc(tma, ptr, size);
|
||||
} else {
|
||||
return realloc(ptr, size);
|
||||
}
|
||||
}
|
||||
|
||||
static inline char *pmix_tma_strdup(pmix_tma_t *tma, const char *src)
|
||||
{
|
||||
if (NULL != tma) {
|
||||
return tma->tma_strdup(tma, src);
|
||||
} else {
|
||||
return strdup(src);
|
||||
}
|
||||
}
|
||||
|
||||
static inline void pmix_tma_free(pmix_tma_t *tma, void *ptr)
|
||||
{
|
||||
if (NULL != tma) {
|
||||
tma->tma_free(tma, ptr);
|
||||
} else {
|
||||
free(ptr);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Class descriptor.
|
||||
*
|
||||
* There should be a single instance of this descriptor for each class
|
||||
* definition.
|
||||
*/
|
||||
struct pmix_class_t {
|
||||
const char *cls_name; /**< symbolic name for class */
|
||||
pmix_class_t *cls_parent; /**< parent class descriptor */
|
||||
pmix_construct_t cls_construct; /**< class constructor */
|
||||
pmix_destruct_t cls_destruct; /**< class destructor */
|
||||
int cls_initialized; /**< is class initialized */
|
||||
int cls_depth; /**< depth of class hierarchy tree */
|
||||
pmix_construct_t *cls_construct_array;
|
||||
/**< array of parent class constructors */
|
||||
pmix_destruct_t *cls_destruct_array;
|
||||
/**< array of parent class destructors */
|
||||
size_t cls_sizeof; /**< size of an object instance */
|
||||
};
|
||||
|
||||
PMIX_EXPORT extern int pmix_class_init_epoch;
|
||||
|
||||
/**
|
||||
* For static initializations of OBJects.
|
||||
*
|
||||
* @param NAME Name of the class to initialize
|
||||
*/
|
||||
#if PMIX_ENABLE_DEBUG
|
||||
# define PMIX_OBJ_STATIC_INIT(BASE_CLASS) \
|
||||
{ \
|
||||
.obj_magic_id = PMIX_OBJ_MAGIC_ID, \
|
||||
.obj_class = PMIX_CLASS(BASE_CLASS), \
|
||||
.obj_lock = PTHREAD_MUTEX_INITIALIZER, \
|
||||
.obj_reference_count = 1, \
|
||||
.obj_tma = { \
|
||||
.tma_malloc = NULL, \
|
||||
.tma_calloc = NULL, \
|
||||
.tma_realloc = NULL, \
|
||||
.tma_strdup = NULL, \
|
||||
.tma_memmove = NULL, \
|
||||
.tma_free = NULL, \
|
||||
.data_context = NULL, \
|
||||
.data_ptr = NULL \
|
||||
}, \
|
||||
.cls_init_file_name = __FILE__, \
|
||||
.cls_init_lineno = __LINE__ \
|
||||
}
|
||||
#else
|
||||
# define PMIX_OBJ_STATIC_INIT(BASE_CLASS) \
|
||||
{ \
|
||||
.obj_class = PMIX_CLASS(BASE_CLASS), \
|
||||
.obj_lock = PTHREAD_MUTEX_INITIALIZER, \
|
||||
.obj_reference_count = 1, \
|
||||
.obj_tma = { \
|
||||
.tma_malloc = NULL, \
|
||||
.tma_calloc = NULL, \
|
||||
.tma_realloc = NULL, \
|
||||
.tma_strdup = NULL, \
|
||||
.tma_memmove = NULL, \
|
||||
.tma_free = NULL, \
|
||||
.data_context = NULL, \
|
||||
.data_ptr = NULL \
|
||||
} \
|
||||
}
|
||||
#endif
|
||||
|
||||
/**
|
||||
* Base object.
|
||||
*
|
||||
* This is special and does not follow the pattern for other classes.
|
||||
*/
|
||||
struct pmix_object_t {
|
||||
#if PMIX_ENABLE_DEBUG
|
||||
/** Magic ID -- want this to be the very first item in the
|
||||
struct's memory */
|
||||
uint64_t obj_magic_id;
|
||||
#endif
|
||||
pthread_mutex_t obj_lock;
|
||||
pmix_class_t *obj_class; /**< class descriptor */
|
||||
int32_t obj_reference_count; /**< reference count */
|
||||
pmix_tma_t obj_tma; /**< allocator for this object */
|
||||
#if PMIX_ENABLE_DEBUG
|
||||
const char *cls_init_file_name; /**< In debug mode store the file where the object get constructed */
|
||||
int cls_init_lineno; /**< In debug mode store the line number where the object get constructed */
|
||||
#endif /* PMIX_ENABLE_DEBUG */
|
||||
};
|
||||
|
||||
/* macros ************************************************************/
|
||||
|
||||
/**
|
||||
* Return a pointer to the class descriptor associated with a
|
||||
* class type.
|
||||
*
|
||||
* @param NAME Name of class
|
||||
* @return Pointer to class descriptor
|
||||
*/
|
||||
#define PMIX_CLASS(NAME) (&(NAME##_class))
|
||||
|
||||
/**
|
||||
* Static initializer for a class descriptor
|
||||
*
|
||||
* @param NAME Name of class
|
||||
* @param PARENT Name of parent class
|
||||
* @param CONSTRUCTOR Pointer to constructor
|
||||
* @param DESTRUCTOR Pointer to destructor
|
||||
*
|
||||
* Put this in NAME.c
|
||||
*/
|
||||
#define PMIX_CLASS_INSTANCE(NAME, PARENT, CONSTRUCTOR, DESTRUCTOR) \
|
||||
pmix_class_t NAME##_class = {#NAME, \
|
||||
PMIX_CLASS(PARENT), \
|
||||
(pmix_construct_t) CONSTRUCTOR, \
|
||||
(pmix_destruct_t) DESTRUCTOR, \
|
||||
0, \
|
||||
0, \
|
||||
NULL, \
|
||||
NULL, \
|
||||
sizeof(NAME)}
|
||||
|
||||
/**
|
||||
* Declaration for class descriptor
|
||||
*
|
||||
* @param NAME Name of class
|
||||
*
|
||||
* Put this in NAME.h
|
||||
*/
|
||||
#define PMIX_CLASS_DECLARATION(NAME) extern pmix_class_t NAME##_class
|
||||
|
||||
/**
|
||||
* Create an object: dynamically allocate storage and run the class
|
||||
* constructor.
|
||||
*
|
||||
* @param type Type (class) of the object
|
||||
* @return Pointer to the object
|
||||
*/
|
||||
static inline pmix_object_t *pmix_obj_new_tma(pmix_class_t *cls, pmix_tma_t *tma);
|
||||
#if PMIX_ENABLE_DEBUG
|
||||
static inline pmix_object_t *pmix_obj_new_debug_tma(pmix_class_t *type, pmix_tma_t *tma,
|
||||
const char *file, int line)
|
||||
{
|
||||
pmix_object_t *object = pmix_obj_new_tma(type, tma);
|
||||
if (NULL != object) {
|
||||
object->obj_magic_id = PMIX_OBJ_MAGIC_ID;
|
||||
object->cls_init_file_name = file;
|
||||
object->cls_init_lineno = line;
|
||||
}
|
||||
return object;
|
||||
}
|
||||
|
||||
#define PMIX_NEW_NO_TMA(type) \
|
||||
((type *)pmix_obj_new_debug_tma(PMIX_CLASS(type), NULL, __FILE__, __LINE__))
|
||||
|
||||
#define PMIX_NEW_TMA(type, tma) \
|
||||
((type *)pmix_obj_new_debug_tma(PMIX_CLASS(type), (tma), __FILE__, __LINE__))
|
||||
|
||||
#else
|
||||
#define PMIX_NEW_NO_TMA(type) ((type *)pmix_obj_new_tma(PMIX_CLASS(type), NULL))
|
||||
|
||||
#define PMIX_NEW_TMA(type, tma) ((type *)pmix_obj_new_tma(PMIX_CLASS(type), (tma)))
|
||||
|
||||
#endif /* PMIX_ENABLE_DEBUG */
|
||||
|
||||
/**
|
||||
* PMIX_NEW() takes a maximum of two arguments:
|
||||
* One argument means caller does not want a custom memory allocator, namely the
|
||||
* common case.
|
||||
* Two arguments means caller wants a custom (TMA) memory allocator.
|
||||
*/
|
||||
#define PMIX_NEW(...) \
|
||||
PMIX_NEW_DISAMBIGUATE(PMIX_OBJ_HAS_ARGS(__VA_ARGS__), __VA_ARGS__)
|
||||
|
||||
/**
|
||||
* Retain an object (by incrementing its reference count)
|
||||
*
|
||||
* @param object Pointer to the object
|
||||
*/
|
||||
#if PMIX_ENABLE_DEBUG
|
||||
# define PMIX_RETAIN(object) \
|
||||
do { \
|
||||
assert(NULL != ((pmix_object_t *) (object))->obj_class); \
|
||||
assert(PMIX_OBJ_MAGIC_ID == ((pmix_object_t *) (object))->obj_magic_id); \
|
||||
pmix_obj_update((pmix_object_t *) (object), 1); \
|
||||
assert(((pmix_object_t *) (object))->obj_reference_count >= 0); \
|
||||
} while (0)
|
||||
#else
|
||||
# define PMIX_RETAIN(object) pmix_obj_update((pmix_object_t *) (object), 1)
|
||||
#endif
|
||||
|
||||
/**
|
||||
* Helper macro for the debug mode to store the locations where the status of
|
||||
* an object change.
|
||||
*/
|
||||
#if PMIX_ENABLE_DEBUG
|
||||
# define PMIX_REMEMBER_FILE_AND_LINENO(OBJECT, FILE, LINENO) \
|
||||
do { \
|
||||
((pmix_object_t *) (OBJECT))->cls_init_file_name = FILE; \
|
||||
((pmix_object_t *) (OBJECT))->cls_init_lineno = LINENO; \
|
||||
} while (0)
|
||||
# define PMIX_SET_MAGIC_ID(OBJECT, VALUE) \
|
||||
do { \
|
||||
((pmix_object_t *) (OBJECT))->obj_magic_id = (VALUE); \
|
||||
} while (0)
|
||||
#else
|
||||
# define PMIX_REMEMBER_FILE_AND_LINENO(OBJECT, FILE, LINENO)
|
||||
# define PMIX_SET_MAGIC_ID(OBJECT, VALUE)
|
||||
#endif /* PMIX_ENABLE_DEBUG */
|
||||
|
||||
/**
|
||||
* Release an object (by decrementing its reference count). If the
|
||||
* reference count reaches zero, destruct (finalize) the object and
|
||||
* free its storage.
|
||||
*
|
||||
* Note: If the object is freed, then the value of the pointer is set
|
||||
* to NULL.
|
||||
*
|
||||
* @param object Pointer to the object
|
||||
*/
|
||||
#if PMIX_ENABLE_DEBUG
|
||||
# define PMIX_RELEASE(object) \
|
||||
do { \
|
||||
pmix_object_t *_obj = (pmix_object_t *) object; \
|
||||
assert(NULL != _obj->obj_class); \
|
||||
assert(PMIX_OBJ_MAGIC_ID == _obj->obj_magic_id); \
|
||||
if (0 == pmix_obj_update(_obj, -1)) { \
|
||||
PMIX_SET_MAGIC_ID((object), 0); \
|
||||
pmix_obj_run_destructors(_obj); \
|
||||
PMIX_REMEMBER_FILE_AND_LINENO(object, __FILE__, __LINE__); \
|
||||
if (NULL != _obj->obj_tma.tma_free) { \
|
||||
pmix_tma_free(&_obj->obj_tma, object); \
|
||||
} \
|
||||
else { \
|
||||
free(object); \
|
||||
} \
|
||||
object = NULL; \
|
||||
} \
|
||||
} while (0)
|
||||
#else
|
||||
# define PMIX_RELEASE(object) \
|
||||
do { \
|
||||
pmix_object_t *_obj = (pmix_object_t *) object; \
|
||||
if (0 == pmix_obj_update(_obj, -1)) { \
|
||||
pmix_obj_run_destructors(_obj); \
|
||||
if (NULL != _obj->obj_tma.tma_free) { \
|
||||
pmix_tma_free(&_obj->obj_tma, object); \
|
||||
} \
|
||||
else { \
|
||||
free(object); \
|
||||
} \
|
||||
object = NULL; \
|
||||
} \
|
||||
} while (0)
|
||||
#endif
|
||||
|
||||
/**
|
||||
* Construct (initialize) objects that are not dynamically allocated.
|
||||
*
|
||||
* @param object Pointer to the object
|
||||
* @param type The object type
|
||||
*/
|
||||
static inline void pmix_obj_construct_tma(pmix_object_t *obj, pmix_tma_t *tma)
|
||||
{
|
||||
if (NULL == tma) {
|
||||
obj->obj_tma.tma_malloc = NULL;
|
||||
obj->obj_tma.tma_calloc = NULL;
|
||||
obj->obj_tma.tma_realloc = NULL;
|
||||
obj->obj_tma.tma_strdup = NULL;
|
||||
obj->obj_tma.tma_memmove = NULL;
|
||||
obj->obj_tma.tma_free = NULL;
|
||||
obj->obj_tma.data_context = NULL;
|
||||
obj->obj_tma.data_ptr = NULL;
|
||||
} else {
|
||||
obj->obj_tma = *tma;
|
||||
}
|
||||
}
|
||||
|
||||
#define PMIX_CONSTRUCT_INTERNAL_TMA(object, type, t) \
|
||||
do { \
|
||||
PMIX_SET_MAGIC_ID((object), PMIX_OBJ_MAGIC_ID); \
|
||||
if (pmix_class_init_epoch != (type)->cls_initialized) { \
|
||||
pmix_class_initialize((type)); \
|
||||
} \
|
||||
((pmix_object_t *) (object))->obj_class = (type); \
|
||||
((pmix_object_t *) (object))->obj_reference_count = 1; \
|
||||
pmix_obj_construct_tma(((pmix_object_t *) (object)), (t)); \
|
||||
pmix_obj_run_constructors((pmix_object_t *) (object)); \
|
||||
PMIX_REMEMBER_FILE_AND_LINENO(object, __FILE__, __LINE__); \
|
||||
} while (0)
|
||||
|
||||
|
||||
#define PMIX_CONSTRUCT_TMA(object, type, t) \
|
||||
do { \
|
||||
PMIX_CONSTRUCT_INTERNAL_TMA((object), PMIX_CLASS(type), (t)); \
|
||||
} while (0)
|
||||
|
||||
|
||||
#define PMIX_CONSTRUCT_NO_TMA(object, type) \
|
||||
do { \
|
||||
PMIX_CONSTRUCT_TMA(object, type, NULL); \
|
||||
} while (0)
|
||||
|
||||
#define PMIX_CONSTRUCT(...) \
|
||||
PMIX_CONSTRUCT_DISAMBIGUATE(PMIX_CONSTRUCT_HAS_ARGS(__VA_ARGS__), __VA_ARGS__)
|
||||
|
||||
/**
|
||||
* Destruct (finalize) an object that is not dynamically allocated.
|
||||
*
|
||||
* @param object Pointer to the object
|
||||
*/
|
||||
#if PMIX_ENABLE_DEBUG
|
||||
# define PMIX_DESTRUCT(object) \
|
||||
do { \
|
||||
assert(PMIX_OBJ_MAGIC_ID == ((pmix_object_t *) (object))->obj_magic_id); \
|
||||
PMIX_SET_MAGIC_ID((object), 0); \
|
||||
pmix_obj_run_destructors((pmix_object_t *) (object)); \
|
||||
PMIX_REMEMBER_FILE_AND_LINENO(object, __FILE__, __LINE__); \
|
||||
} while (0)
|
||||
#else
|
||||
# define PMIX_DESTRUCT(object) \
|
||||
do { \
|
||||
pmix_obj_run_destructors((pmix_object_t *) (object)); \
|
||||
PMIX_REMEMBER_FILE_AND_LINENO(object, __FILE__, __LINE__); \
|
||||
} while (0)
|
||||
#endif
|
||||
|
||||
PMIX_CLASS_DECLARATION(pmix_object_t);
|
||||
|
||||
/* declarations *******************************************************/
|
||||
|
||||
/**
|
||||
* Lazy initialization of class descriptor.
|
||||
*
|
||||
* Specifically cache arrays of function pointers for the constructor
|
||||
* and destructor hierarchies for this class.
|
||||
*
|
||||
* @param class Pointer to class descriptor
|
||||
*/
|
||||
PMIX_EXPORT void pmix_class_initialize(pmix_class_t *cls);
|
||||
|
||||
/**
|
||||
* Shut down the class system and release all memory
|
||||
*
|
||||
* This function should be invoked as the ABSOLUTE LAST function to
|
||||
* use the class subsystem. It frees all associated memory with ALL
|
||||
* classes, rendering all of them inoperable. It is here so that
|
||||
* tools like valgrind and purify don't report still-reachable memory
|
||||
* upon process termination.
|
||||
*/
|
||||
PMIX_EXPORT int pmix_class_finalize(void);
|
||||
|
||||
/**
|
||||
* Run the hierarchy of class constructors for this object, in a
|
||||
* parent-first order.
|
||||
*
|
||||
* Do not use this function directly: use PMIX_CONSTRUCT() instead.
|
||||
*
|
||||
* WARNING: This implementation relies on a hardwired maximum depth of
|
||||
* the inheritance tree!!!
|
||||
*
|
||||
* Hardwired for fairly shallow inheritance trees
|
||||
* @param size Pointer to the object.
|
||||
*/
|
||||
static inline void pmix_obj_run_constructors(pmix_object_t *object)
|
||||
{
|
||||
pmix_construct_t *cls_construct;
|
||||
|
||||
assert(NULL != object->obj_class);
|
||||
|
||||
cls_construct = object->obj_class->cls_construct_array;
|
||||
while (NULL != *cls_construct) {
|
||||
(*cls_construct)(object);
|
||||
cls_construct++;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Run the hierarchy of class destructors for this object, in a
|
||||
* parent-last order.
|
||||
*
|
||||
* Do not use this function directly: use PMIX_DESTRUCT() instead.
|
||||
*
|
||||
* @param size Pointer to the object.
|
||||
*/
|
||||
static inline void pmix_obj_run_destructors(pmix_object_t *object)
|
||||
{
|
||||
pmix_destruct_t *cls_destruct;
|
||||
|
||||
assert(NULL != object->obj_class);
|
||||
|
||||
cls_destruct = object->obj_class->cls_destruct_array;
|
||||
while (NULL != *cls_destruct) {
|
||||
(*cls_destruct)(object);
|
||||
cls_destruct++;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Create new object: dynamically allocate storage and run the class
|
||||
* constructor.
|
||||
*
|
||||
* Do not use this function directly: use PMIX_NEW() instead.
|
||||
*
|
||||
* @param size Size of the object
|
||||
* @param cls Pointer to the class descriptor of this object
|
||||
* @return Pointer to the object
|
||||
*/
|
||||
static inline pmix_object_t *pmix_obj_new_tma(pmix_class_t *cls, pmix_tma_t *tma)
|
||||
{
|
||||
pmix_object_t *object;
|
||||
assert(cls->cls_sizeof >= sizeof(pmix_object_t));
|
||||
|
||||
object = (pmix_object_t *) pmix_tma_malloc(tma, cls->cls_sizeof);
|
||||
|
||||
if (pmix_class_init_epoch != cls->cls_initialized) {
|
||||
pmix_class_initialize(cls);
|
||||
}
|
||||
if (NULL != object) {
|
||||
#if PMIX_ENABLE_DEBUG
|
||||
pthread_mutexattr_t attr;
|
||||
pthread_mutexattr_init(&attr);
|
||||
|
||||
/* set type to ERRORCHECK so that we catch recursive locks */
|
||||
# if PMIX_HAVE_PTHREAD_MUTEX_ERRORCHECK_NP
|
||||
pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_ERRORCHECK_NP);
|
||||
# elif PMIX_HAVE_PTHREAD_MUTEX_ERRORCHECK
|
||||
pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_ERRORCHECK);
|
||||
# endif /* PMIX_HAVE_PTHREAD_MUTEX_ERRORCHECK_NP */
|
||||
|
||||
pthread_mutex_init(&object->obj_lock, &attr);
|
||||
pthread_mutexattr_destroy(&attr);
|
||||
|
||||
#else
|
||||
|
||||
/* Without debugging, choose the fastest available mutexes */
|
||||
pthread_mutex_init(&object->obj_lock, NULL);
|
||||
|
||||
#endif /* PMIX_ENABLE_DEBUG */
|
||||
object->obj_class = cls;
|
||||
object->obj_reference_count = 1;
|
||||
if (NULL == tma) {
|
||||
object->obj_tma.tma_malloc = NULL;
|
||||
object->obj_tma.tma_calloc = NULL;
|
||||
object->obj_tma.tma_realloc = NULL;
|
||||
object->obj_tma.tma_strdup = NULL;
|
||||
object->obj_tma.tma_free = NULL;
|
||||
object->obj_tma.data_context = NULL;
|
||||
object->obj_tma.data_ptr = NULL;
|
||||
} else {
|
||||
object->obj_tma = *tma;
|
||||
}
|
||||
pmix_obj_run_constructors(object);
|
||||
}
|
||||
return object;
|
||||
}
|
||||
|
||||
/**
|
||||
* Atomically update the object's reference count by some increment.
|
||||
*
|
||||
* This function should not be used directly: it is called via the
|
||||
* macros PMIX_RETAIN and PMIX_RELEASE
|
||||
*
|
||||
* @param object Pointer to the object
|
||||
* @param inc Increment by which to update reference count
|
||||
* @return New value of the reference count
|
||||
*/
|
||||
static inline int pmix_obj_update(pmix_object_t *object, int inc) __pmix_attribute_always_inline__;
|
||||
static inline int pmix_obj_update(pmix_object_t *object, int inc)
|
||||
{
|
||||
int ret = pthread_mutex_lock(&object->obj_lock);
|
||||
if (ret == EDEADLK) {
|
||||
errno = ret;
|
||||
perror("pthread_mutex_lock()");
|
||||
abort();
|
||||
}
|
||||
ret = (object->obj_reference_count += inc);
|
||||
pthread_mutex_unlock(&object->obj_lock);
|
||||
return ret;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get a pointer to a given object's memory allocator. Returns a pointer to the
|
||||
* TMA, if available. Returns NULL Otherwise.
|
||||
*/
|
||||
static inline pmix_tma_t *
|
||||
pmix_obj_get_tma(
|
||||
pmix_object_t *obj
|
||||
) {
|
||||
// Look for a given function pointer. If it isn't NULL, then assume that
|
||||
// this object has a custom memory allocator.
|
||||
if (obj->obj_tma.tma_malloc) {
|
||||
return &obj->obj_tma;
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
END_C_DECLS
|
||||
|
||||
#endif
|
||||
215
macx64/mpi/openmpi/include/pmix/src/class/pmix_pointer_array.h
Normal file
215
macx64/mpi/openmpi/include/pmix/src/class/pmix_pointer_array.h
Normal file
@@ -0,0 +1,215 @@
|
||||
/* -*- Mode: C; c-basic-offset:4 ; -*- */
|
||||
/*
|
||||
* Copyright (c) 2004-2005 The Trustees of Indiana University and Indiana
|
||||
* University Research and Technology
|
||||
* Corporation. All rights reserved.
|
||||
* Copyright (c) 2004-2017 The University of Tennessee and The University
|
||||
* of Tennessee Research Foundation. All rights
|
||||
* reserved.
|
||||
* Copyright (c) 2004-2005 High Performance Computing Center Stuttgart,
|
||||
* University of Stuttgart. All rights reserved.
|
||||
* Copyright (c) 2004-2005 The Regents of the University of California.
|
||||
* All rights reserved.
|
||||
* Copyright (c) 2017 Intel, Inc. All rights reserved.
|
||||
* Copyright (c) 2021-2022 Nanook Consulting. All rights reserved.
|
||||
* $COPYRIGHT$
|
||||
*
|
||||
* Additional copyrights may follow
|
||||
*
|
||||
* $HEADER$
|
||||
*/
|
||||
/** @file
|
||||
*
|
||||
* Utility functions to manage fortran <-> c opaque object
|
||||
* translation. Note that since MPI defines fortran handles as
|
||||
* [signed] int's, we use int everywhere in here where you would
|
||||
* normally expect size_t. There's some code that makes sure indices
|
||||
* don't go above FORTRAN_HANDLE_MAX (which is min(INT_MAX, fortran
|
||||
* INTEGER max)), just to be sure.
|
||||
*/
|
||||
|
||||
#ifndef PMIX_POINTER_ARRAY_H
|
||||
#define PMIX_POINTER_ARRAY_H
|
||||
|
||||
#include "src/include/pmix_config.h"
|
||||
|
||||
#include "src/class/pmix_object.h"
|
||||
#include "src/include/pmix_prefetch.h"
|
||||
|
||||
BEGIN_C_DECLS
|
||||
|
||||
/**
|
||||
* dynamic pointer array
|
||||
*/
|
||||
struct pmix_pointer_array_t {
|
||||
/** base class */
|
||||
pmix_object_t super;
|
||||
/** Index of lowest free element. NOTE: This is only an
|
||||
optimization to know where to search for the first free slot.
|
||||
It does \em not necessarily imply indices all above this index
|
||||
are not taken! */
|
||||
int lowest_free;
|
||||
/** number of free elements in the list */
|
||||
int number_free;
|
||||
/** size of list, i.e. number of elements in addr */
|
||||
int size;
|
||||
/** maximum size of the array */
|
||||
int max_size;
|
||||
/** block size for each allocation */
|
||||
int block_size;
|
||||
/** pointer to an array of bits to speed up the research for an empty position. */
|
||||
uint64_t *free_bits;
|
||||
/** pointer to array of pointers */
|
||||
void **addr;
|
||||
};
|
||||
|
||||
#define PMIX_POINTER_ARRAY_STATIC_INIT \
|
||||
{ \
|
||||
.super = PMIX_OBJ_STATIC_INIT(pmix_object_t), \
|
||||
.lowest_free = 0, \
|
||||
.number_free = 0, \
|
||||
.size = 0, \
|
||||
.max_size = 0, \
|
||||
.block_size = 0, \
|
||||
.free_bits = NULL, \
|
||||
.addr = NULL \
|
||||
}
|
||||
|
||||
/**
|
||||
* Convenience typedef
|
||||
*/
|
||||
typedef struct pmix_pointer_array_t pmix_pointer_array_t;
|
||||
/**
|
||||
* Class declaration
|
||||
*/
|
||||
PMIX_EXPORT PMIX_CLASS_DECLARATION(pmix_pointer_array_t);
|
||||
|
||||
/**
|
||||
* Initialize the pointer array with an initial size of initial_allocation.
|
||||
* Set the maximum size of the array, as well as the size of the allocation
|
||||
* block for all subsequent growing operations. Remarque: The pointer array
|
||||
* has to be created bfore calling this function.
|
||||
*
|
||||
* @param array Pointer to pointer of an array (IN/OUT)
|
||||
* @param initial_allocation The number of elements in the initial array (IN)
|
||||
* @param max_size The maximum size of the array (IN)
|
||||
* @param block_size The size for all subsequent grows of the array (IN).
|
||||
*
|
||||
* @return PMIX_SUCCESS if all initializations were successful. Otherwise,
|
||||
* the error indicate what went wrong in the function.
|
||||
*/
|
||||
PMIX_EXPORT int pmix_pointer_array_init(pmix_pointer_array_t *array, int initial_allocation,
|
||||
int max_size, int block_size);
|
||||
|
||||
/**
|
||||
* Add a pointer to the array (Grow the array, if need be)
|
||||
*
|
||||
* @param array Pointer to array (IN)
|
||||
* @param ptr Pointer value (IN)
|
||||
*
|
||||
* @return Index of inserted array element. Return value of
|
||||
* (-1) indicates an error.
|
||||
*/
|
||||
PMIX_EXPORT int pmix_pointer_array_add(pmix_pointer_array_t *array, void *ptr);
|
||||
|
||||
/**
|
||||
* Set the value of an element in array
|
||||
*
|
||||
* @param array Pointer to array (IN)
|
||||
* @param index Index of element to be reset (IN)
|
||||
* @param value New value to be set at element index (IN)
|
||||
*
|
||||
* @return Error code. (-1) indicates an error.
|
||||
*/
|
||||
PMIX_EXPORT int pmix_pointer_array_set_item(pmix_pointer_array_t *array, int index, void *value);
|
||||
|
||||
/**
|
||||
* Get the value of an element in array
|
||||
*
|
||||
* @param array Pointer to array (IN)
|
||||
* @param element_index Index of element to be returned (IN)
|
||||
*
|
||||
* @return Error code. NULL indicates an error.
|
||||
*/
|
||||
|
||||
static inline void *pmix_pointer_array_get_item(pmix_pointer_array_t *table, int element_index)
|
||||
{
|
||||
void *p;
|
||||
|
||||
if (PMIX_UNLIKELY(0 > element_index || table->size <= element_index)) {
|
||||
return NULL;
|
||||
}
|
||||
p = table->addr[element_index];
|
||||
return p;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the size of the pointer array
|
||||
*
|
||||
* @param array Pointer to array (IN)
|
||||
*
|
||||
* @returns size Size of the array
|
||||
*
|
||||
* Simple inline function to return the size of the array in order to
|
||||
* hide the member field from external users.
|
||||
*/
|
||||
static inline int pmix_pointer_array_get_size(pmix_pointer_array_t *array)
|
||||
{
|
||||
return array->size;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the size of the pointer array
|
||||
*
|
||||
* @param array Pointer to array (IN)
|
||||
*
|
||||
* @param size Desired size of the array
|
||||
*
|
||||
* Simple function to set the size of the array in order to
|
||||
* hide the member field from external users.
|
||||
*/
|
||||
PMIX_EXPORT int pmix_pointer_array_set_size(pmix_pointer_array_t *array, int size);
|
||||
|
||||
/**
|
||||
* Test whether a certain element is already in use. If not yet
|
||||
* in use, reserve it.
|
||||
*
|
||||
* @param array Pointer to array (IN)
|
||||
* @param index Index of element to be tested (IN)
|
||||
* @param value New value to be set at element index (IN)
|
||||
*
|
||||
* @return true/false True if element could be reserved
|
||||
* False if element could not be reserved (e.g., in use).
|
||||
*
|
||||
* In contrary to array_set, this function does not allow to overwrite
|
||||
* a value, unless the previous value is NULL ( equiv. to free ).
|
||||
*/
|
||||
PMIX_EXPORT bool pmix_pointer_array_test_and_set_item(pmix_pointer_array_t *table, int index,
|
||||
void *value);
|
||||
|
||||
/**
|
||||
* Empty the array.
|
||||
*
|
||||
* @param array Pointer to array (IN)
|
||||
*
|
||||
*/
|
||||
static inline void pmix_pointer_array_remove_all(pmix_pointer_array_t *array)
|
||||
{
|
||||
int i;
|
||||
if (array->number_free == array->size)
|
||||
return; /* nothing to do here this time (the array is already empty) */
|
||||
|
||||
array->lowest_free = 0;
|
||||
array->number_free = array->size;
|
||||
for (i = 0; i < array->size; i++) {
|
||||
array->addr[i] = NULL;
|
||||
}
|
||||
for (i = 0; i < (int) ((array->size + 8 * sizeof(uint64_t) - 1) / (8 * sizeof(uint64_t)));
|
||||
i++) {
|
||||
array->free_bits[i] = 0;
|
||||
}
|
||||
}
|
||||
|
||||
END_C_DECLS
|
||||
|
||||
#endif /* PMIX_POINTER_ARRAY_H */
|
||||
102
macx64/mpi/openmpi/include/pmix/src/class/pmix_ring_buffer.h
Normal file
102
macx64/mpi/openmpi/include/pmix/src/class/pmix_ring_buffer.h
Normal file
@@ -0,0 +1,102 @@
|
||||
/* -*- Mode: C; c-basic-offset:4 ; -*- */
|
||||
/*
|
||||
* Copyright (c) 2004-2005 The Trustees of Indiana University and Indiana
|
||||
* University Research and Technology
|
||||
* Corporation. All rights reserved.
|
||||
* Copyright (c) 2004-2008 The University of Tennessee and The University
|
||||
* of Tennessee Research Foundation. All rights
|
||||
* reserved.
|
||||
* Copyright (c) 2004-2005 High Performance Computing Center Stuttgart,
|
||||
* University of Stuttgart. All rights reserved.
|
||||
* Copyright (c) 2004-2005 The Regents of the University of California.
|
||||
* All rights reserved.
|
||||
* Copyright (c) 2010 Cisco Systems, Inc. All rights reserved.
|
||||
* Copyright (c) 2016-2020 Intel, Inc. All rights reserved.
|
||||
* Copyright (c) 2021-2022 Nanook Consulting. All rights reserved.
|
||||
* $COPYRIGHT$
|
||||
*
|
||||
* Additional copyrights may follow
|
||||
*
|
||||
* $HEADER$
|
||||
*/
|
||||
/** @file
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef PMIX_RING_BUFFER_H
|
||||
#define PMIX_RING_BUFFER_H
|
||||
|
||||
#include "src/include/pmix_config.h"
|
||||
|
||||
#include "src/class/pmix_object.h"
|
||||
#include "src/util/pmix_output.h"
|
||||
|
||||
BEGIN_C_DECLS
|
||||
|
||||
/**
|
||||
* dynamic pointer ring
|
||||
*/
|
||||
struct pmix_ring_buffer_t {
|
||||
/** base class */
|
||||
pmix_object_t super;
|
||||
/* head/tail indices */
|
||||
int head;
|
||||
int tail;
|
||||
/** size of list, i.e. number of elements in addr */
|
||||
int size;
|
||||
/** pointer to ring */
|
||||
char **addr;
|
||||
};
|
||||
/**
|
||||
* Convenience typedef
|
||||
*/
|
||||
typedef struct pmix_ring_buffer_t pmix_ring_buffer_t;
|
||||
/**
|
||||
* Class declaration
|
||||
*/
|
||||
PMIX_CLASS_DECLARATION(pmix_ring_buffer_t);
|
||||
|
||||
/**
|
||||
* Initialize the ring buffer, defining its size.
|
||||
*
|
||||
* @param ring Pointer to a ring buffer (IN/OUT)
|
||||
* @param size The number of elements in the ring (IN)
|
||||
*
|
||||
* @return PMIX_SUCCESS if all initializations were successful. Otherwise,
|
||||
* the error indicate what went wrong in the function.
|
||||
*/
|
||||
PMIX_EXPORT int pmix_ring_buffer_init(pmix_ring_buffer_t *ring, int size);
|
||||
|
||||
/**
|
||||
* Push an item onto the ring buffer, displacing the oldest
|
||||
* item on the ring if the ring is full
|
||||
*
|
||||
* @param ring Pointer to ring (IN)
|
||||
* @param ptr Pointer value (IN)
|
||||
*
|
||||
* @return Pointer to displaced item, NULL if ring
|
||||
* is not yet full
|
||||
*/
|
||||
PMIX_EXPORT void *pmix_ring_buffer_push(pmix_ring_buffer_t *ring, void *ptr);
|
||||
|
||||
/**
|
||||
* Pop an item off of the ring. The oldest entry on the ring will be
|
||||
* returned. If nothing on the ring, NULL is returned.
|
||||
*
|
||||
* @param ring Pointer to ring (IN)
|
||||
*
|
||||
* @return Error code. NULL indicates an error.
|
||||
*/
|
||||
|
||||
PMIX_EXPORT void *pmix_ring_buffer_pop(pmix_ring_buffer_t *ring);
|
||||
|
||||
/*
|
||||
* Access an element of the ring, without removing it, indexed
|
||||
* starting at the tail - a value of -1 will return the element
|
||||
* at the head of the ring
|
||||
*/
|
||||
PMIX_EXPORT void *pmix_ring_buffer_poke(pmix_ring_buffer_t *ring, int i);
|
||||
|
||||
END_C_DECLS
|
||||
|
||||
#endif /* PMIX_RING_BUFFER_H */
|
||||
278
macx64/mpi/openmpi/include/pmix/src/class/pmix_value_array.h
Normal file
278
macx64/mpi/openmpi/include/pmix/src/class/pmix_value_array.h
Normal file
@@ -0,0 +1,278 @@
|
||||
/*
|
||||
* Copyright (c) 2004-2007 The Trustees of Indiana University and Indiana
|
||||
* University Research and Technology
|
||||
* Corporation. All rights reserved.
|
||||
* Copyright (c) 2004-2006 The University of Tennessee and The University
|
||||
* of Tennessee Research Foundation. All rights
|
||||
* reserved.
|
||||
* Copyright (c) 2004-2005 High Performance Computing Center Stuttgart,
|
||||
* University of Stuttgart. All rights reserved.
|
||||
* Copyright (c) 2004-2005 The Regents of the University of California.
|
||||
* All rights reserved.
|
||||
* Copyright (c) 2016-2020 Intel, Inc. All rights reserved.
|
||||
* Copyright (c) 2021-2022 Nanook Consulting. All rights reserved.
|
||||
* $COPYRIGHT$
|
||||
*
|
||||
* Additional copyrights may follow
|
||||
*
|
||||
* $HEADER$
|
||||
*/
|
||||
|
||||
#ifndef PMIX_VALUE_ARRAY_H
|
||||
#define PMIX_VALUE_ARRAY_H
|
||||
|
||||
#include "src/include/pmix_config.h"
|
||||
|
||||
#include <string.h>
|
||||
#ifdef HAVE_STRINGS_H
|
||||
# include <strings.h>
|
||||
#endif /* HAVE_STRINGS_H */
|
||||
|
||||
#include "src/class/pmix_object.h"
|
||||
#if PMIX_ENABLE_DEBUG
|
||||
# include "src/util/pmix_output.h"
|
||||
#endif
|
||||
#include "pmix_common.h"
|
||||
|
||||
BEGIN_C_DECLS
|
||||
|
||||
/*
|
||||
* @file Array of elements maintained by value.
|
||||
*/
|
||||
|
||||
struct pmix_value_array_t {
|
||||
pmix_object_t super;
|
||||
unsigned char *array_items;
|
||||
size_t array_item_sizeof;
|
||||
size_t array_size;
|
||||
size_t array_alloc_size;
|
||||
};
|
||||
typedef struct pmix_value_array_t pmix_value_array_t;
|
||||
|
||||
PMIX_EXPORT PMIX_CLASS_DECLARATION(pmix_value_array_t);
|
||||
|
||||
/**
|
||||
* Initialize the array to hold items by value. This routine must
|
||||
* be called prior to using the array.
|
||||
*
|
||||
* @param array The array to initialize (IN).
|
||||
* @param item_size The sizeof each array element (IN).
|
||||
* @return PMIX error code
|
||||
*
|
||||
* Note that there is no corresponding "finalize" function -- use
|
||||
* OBJ_DESTRUCT (for stack arrays) or OBJ_RELEASE (for heap arrays) to
|
||||
* delete it.
|
||||
*/
|
||||
|
||||
static inline int pmix_value_array_init(pmix_value_array_t *array, size_t item_sizeof)
|
||||
{
|
||||
array->array_item_sizeof = item_sizeof;
|
||||
array->array_alloc_size = 1;
|
||||
array->array_size = 0;
|
||||
array->array_items = (unsigned char *) realloc(array->array_items,
|
||||
item_sizeof * array->array_alloc_size);
|
||||
return (NULL != array->array_items) ? PMIX_SUCCESS : PMIX_ERR_OUT_OF_RESOURCE;
|
||||
}
|
||||
|
||||
/**
|
||||
* Reserve space in the array for new elements, but do not change the size.
|
||||
*
|
||||
* @param array The input array (IN).
|
||||
* @param size The anticipated size of the array (IN).
|
||||
* @return PMIX error code.
|
||||
*/
|
||||
|
||||
static inline int pmix_value_array_reserve(pmix_value_array_t *array, size_t size)
|
||||
{
|
||||
if (size > array->array_alloc_size) {
|
||||
array->array_items = (unsigned char *) realloc(array->array_items,
|
||||
array->array_item_sizeof * size);
|
||||
if (NULL == array->array_items) {
|
||||
array->array_size = 0;
|
||||
array->array_alloc_size = 0;
|
||||
return PMIX_ERR_OUT_OF_RESOURCE;
|
||||
}
|
||||
array->array_alloc_size = size;
|
||||
}
|
||||
return PMIX_SUCCESS;
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieves the number of elements in the array.
|
||||
*
|
||||
* @param array The input array (IN).
|
||||
* @return The number of elements currently in use.
|
||||
*/
|
||||
|
||||
static inline size_t pmix_value_array_get_size(pmix_value_array_t *array)
|
||||
{
|
||||
return array->array_size;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the number of elements in the array.
|
||||
*
|
||||
* @param array The input array (IN).
|
||||
* @param size The new array size.
|
||||
*
|
||||
* @return PMIX error code.
|
||||
*
|
||||
* Note that resizing the array to a smaller size may not change
|
||||
* the underlying memory allocated by the array. However, setting
|
||||
* the size larger than the current allocation will grow it. In either
|
||||
* case, if the routine is successful, pmix_value_array_get_size() will
|
||||
* return the new size.
|
||||
*/
|
||||
|
||||
PMIX_EXPORT int pmix_value_array_set_size(pmix_value_array_t *array, size_t size);
|
||||
|
||||
/**
|
||||
* Macro to retrieve an item from the array by value.
|
||||
*
|
||||
* @param array The input array (IN).
|
||||
* @param item_type The C datatype of the array item (IN).
|
||||
* @param item_index The array index (IN).
|
||||
*
|
||||
* @returns item The requested item.
|
||||
*
|
||||
* Note that this does not change the size of the array - this macro is
|
||||
* strictly for performance - the user assumes the responsibility of
|
||||
* ensuring the array index is valid (0 <= item index < array size).
|
||||
*/
|
||||
|
||||
#define PMIX_VALUE_ARRAY_GET_ITEM(array, item_type, item_index) \
|
||||
((item_type *) ((array)->array_items))[item_index]
|
||||
|
||||
/**
|
||||
* Retrieve an item from the array by reference.
|
||||
*
|
||||
* @param array The input array (IN).
|
||||
* @param item_index The array index (IN).
|
||||
*
|
||||
* @return ptr Pointer to the requested item.
|
||||
*
|
||||
* Note that if the specified item_index is larger than the current
|
||||
* array size, the array is grown to satisfy the request.
|
||||
*/
|
||||
|
||||
static inline void *pmix_value_array_get_item(pmix_value_array_t *array, size_t item_index)
|
||||
{
|
||||
if (item_index >= array->array_size
|
||||
&& pmix_value_array_set_size(array, item_index + 1) != PMIX_SUCCESS)
|
||||
return NULL;
|
||||
return array->array_items + (item_index * array->array_item_sizeof);
|
||||
}
|
||||
|
||||
/**
|
||||
* Macro to set an array element by value.
|
||||
*
|
||||
* @param array The input array (IN).
|
||||
* @param item_type The C datatype of the array item (IN).
|
||||
* @param item_index The array index (IN).
|
||||
* @param item_value The new value for the specified index (IN).
|
||||
*
|
||||
* Note that this does not change the size of the array - this macro is
|
||||
* strictly for performance - the user assumes the responsibility of
|
||||
* ensuring the array index is valid (0 <= item index < array size).
|
||||
*
|
||||
* It is safe to free the item after returning from this call; it is
|
||||
* copied into the array by value.
|
||||
*/
|
||||
|
||||
#define PMIX_VALUE_ARRAY_SET_ITEM(array, item_type, item_index, item_value) \
|
||||
(((item_type *) ((array)->array_items))[item_index] = item_value)
|
||||
|
||||
/**
|
||||
* Set an array element by value.
|
||||
*
|
||||
* @param array The input array (IN).
|
||||
* @param item_index The array index (IN).
|
||||
* @param item_value A pointer to the item, which is copied into
|
||||
* the array.
|
||||
*
|
||||
* @return PMIX error code.
|
||||
*
|
||||
* It is safe to free the item after returning from this call; it is
|
||||
* copied into the array by value.
|
||||
*/
|
||||
|
||||
static inline int pmix_value_array_set_item(pmix_value_array_t *array, size_t item_index,
|
||||
const void *item)
|
||||
{
|
||||
int rc;
|
||||
if (item_index >= array->array_size
|
||||
&& (rc = pmix_value_array_set_size(array, item_index + 1)) != PMIX_SUCCESS)
|
||||
return rc;
|
||||
memcpy(array->array_items + (item_index * array->array_item_sizeof), item,
|
||||
array->array_item_sizeof);
|
||||
return PMIX_SUCCESS;
|
||||
}
|
||||
|
||||
/**
|
||||
* Appends an item to the end of the array.
|
||||
*
|
||||
* @param array The input array (IN).
|
||||
* @param item A pointer to the item to append, which is copied
|
||||
* into the array.
|
||||
*
|
||||
* @return PMIX error code
|
||||
*
|
||||
* This will grow the array if it is not large enough to contain the
|
||||
* item. It is safe to free the item after returning from this call;
|
||||
* it is copied by value into the array.
|
||||
*/
|
||||
|
||||
static inline int pmix_value_array_append_item(pmix_value_array_t *array, const void *item)
|
||||
{
|
||||
return pmix_value_array_set_item(array, array->array_size, item);
|
||||
}
|
||||
|
||||
/**
|
||||
* Remove a specific item from the array.
|
||||
*
|
||||
* @param array The input array (IN).
|
||||
* @param item_index The index to remove, which must be less than
|
||||
* the current array size (IN).
|
||||
*
|
||||
* @return PMIX error code.
|
||||
*
|
||||
* All elements following this index are shifted down.
|
||||
*/
|
||||
|
||||
static inline int pmix_value_array_remove_item(pmix_value_array_t *array, size_t item_index)
|
||||
{
|
||||
#if PMIX_ENABLE_DEBUG
|
||||
if (item_index >= array->array_size) {
|
||||
pmix_output(0, "pmix_value_array_remove_item: invalid index %lu\n",
|
||||
(unsigned long) item_index);
|
||||
return PMIX_ERR_BAD_PARAM;
|
||||
}
|
||||
#endif
|
||||
memmove(array->array_items + (array->array_item_sizeof * item_index),
|
||||
array->array_items + (array->array_item_sizeof * (item_index + 1)),
|
||||
array->array_item_sizeof * (array->array_size - item_index - 1));
|
||||
array->array_size--;
|
||||
return PMIX_SUCCESS;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the base pointer of the underlying array.
|
||||
*
|
||||
* @param array The input array (IN).
|
||||
* @param array_type The C datatype of the array (IN).
|
||||
*
|
||||
* @returns ptr Pointer to the actual array.
|
||||
*
|
||||
* This function is helpful when you need to iterate through an
|
||||
* entire array; simply get the base value of the array and use native
|
||||
* C to iterate through it manually. This can have better performance
|
||||
* than looping over PMIX_VALUE_ARRAY_GET_ITEM() and
|
||||
* PMIX_VALUE_ARRAY_SET_ITEM() because it will [potentially] reduce the
|
||||
* number of pointer dereferences.
|
||||
*/
|
||||
|
||||
#define PMIX_VALUE_ARRAY_GET_BASE(array, item_type) ((item_type *) ((array)->array_items))
|
||||
|
||||
END_C_DECLS
|
||||
|
||||
#endif
|
||||
68
macx64/mpi/openmpi/include/pmix/src/client/pmix_client_ops.h
Normal file
68
macx64/mpi/openmpi/include/pmix/src/client/pmix_client_ops.h
Normal file
@@ -0,0 +1,68 @@
|
||||
/*
|
||||
* Copyright (c) 2015-2020 Intel, Inc. All rights reserved.
|
||||
* Copyright (c) 2021-2023 Nanook Consulting. All rights reserved.
|
||||
* $COPYRIGHT$
|
||||
*
|
||||
* Additional copyrights may follow
|
||||
*
|
||||
* $HEADER$
|
||||
*/
|
||||
|
||||
#ifndef PMIX_CLIENT_OPS_H
|
||||
#define PMIX_CLIENT_OPS_H
|
||||
|
||||
#include "src/include/pmix_config.h"
|
||||
|
||||
#include "src/class/pmix_list.h"
|
||||
#include "src/class/pmix_pointer_array.h"
|
||||
#include "src/common/pmix_iof.h"
|
||||
#include "src/include/pmix_globals.h"
|
||||
#include "src/threads/pmix_threads.h"
|
||||
|
||||
BEGIN_C_DECLS
|
||||
|
||||
typedef struct {
|
||||
pmix_peer_t *myserver; // messaging support to/from my server
|
||||
bool singleton; // no server
|
||||
pmix_list_t pending_requests; // list of pmix_cb_t pending data requests
|
||||
pmix_pointer_array_t peers; // array of pmix_peer_t cached for data ops
|
||||
pmix_list_t groups; // list of groups this client is part of
|
||||
// verbosity for client get operations
|
||||
int get_output;
|
||||
int get_verbose;
|
||||
// verbosity for client connect operations
|
||||
int connect_output;
|
||||
int connect_verbose;
|
||||
// verbosity for client fence operations
|
||||
int fence_output;
|
||||
int fence_verbose;
|
||||
// verbosity for client pub operations
|
||||
int pub_output;
|
||||
int pub_verbose;
|
||||
// verbosity for client spawn operations
|
||||
int spawn_output;
|
||||
int spawn_verbose;
|
||||
// verbosity for client event operations
|
||||
int event_output;
|
||||
int event_verbose;
|
||||
// verbosity for client iof operations
|
||||
int iof_output;
|
||||
int iof_verbose;
|
||||
// verbosity for basic client functions
|
||||
int base_output;
|
||||
int base_verbose;
|
||||
/* IOF output sinks */
|
||||
pmix_iof_sink_t iof_stdout;
|
||||
pmix_iof_sink_t iof_stderr;
|
||||
} pmix_client_globals_t;
|
||||
|
||||
PMIX_EXPORT extern pmix_client_globals_t pmix_client_globals;
|
||||
|
||||
PMIX_EXPORT void pmix_parse_localquery(int sd, short args, void *cbdata);
|
||||
|
||||
PMIX_EXPORT pmix_status_t pmix_client_convert_group_procs(const pmix_proc_t *inprocs, size_t insize,
|
||||
pmix_proc_t **outprocs, size_t *outsize);
|
||||
|
||||
END_C_DECLS
|
||||
|
||||
#endif /* PMIX_CLIENT_OPS_H */
|
||||
76
macx64/mpi/openmpi/include/pmix/src/common/pmix_attributes.h
Normal file
76
macx64/mpi/openmpi/include/pmix/src/common/pmix_attributes.h
Normal file
@@ -0,0 +1,76 @@
|
||||
/*
|
||||
* Copyright (c) 2004-2005 The Trustees of Indiana University and Indiana
|
||||
* University Research and Technology
|
||||
* Corporation. All rights reserved.
|
||||
* Copyright (c) 2004-2011 The University of Tennessee and The University
|
||||
* of Tennessee Research Foundation. All rights
|
||||
* reserved.
|
||||
* Copyright (c) 2004-2005 High Performance Computing Center Stuttgart,
|
||||
* University of Stuttgart. All rights reserved.
|
||||
* Copyright (c) 2004-2005 The Regents of the University of California.
|
||||
* All rights reserved.
|
||||
* Copyright (c) 2008 Cisco Systems, Inc. All rights reserved.
|
||||
* Copyright (c) 2012-2013 Los Alamos National Security, LLC.
|
||||
* All rights reserved.
|
||||
* Copyright (c) 2015-2020 Intel, Inc. All rights reserved.
|
||||
* Copyright (c) 2017 IBM Corporation. All rights reserved.
|
||||
* Copyright (c) 2017 Mellanox Technologies. All rights reserved.
|
||||
* Copyright (c) 2018 Research Organization for Information Science
|
||||
* and Technology (RIST). All rights reserved.
|
||||
* Copyright (c) 2021-2022 Nanook Consulting. All rights reserved.
|
||||
* $COPYRIGHT$
|
||||
*
|
||||
* Additional copyrights may follow
|
||||
*
|
||||
* $HEADER$
|
||||
*/
|
||||
/**
|
||||
* @file
|
||||
*
|
||||
* I/O Forwarding Service
|
||||
*/
|
||||
|
||||
#ifndef PMIX_ATTRIBUTES_H
|
||||
#define PMIX_ATTRIBUTES_H
|
||||
|
||||
#include "src/include/pmix_config.h"
|
||||
|
||||
#ifdef HAVE_SYS_TYPES_H
|
||||
# include <sys/types.h>
|
||||
#endif
|
||||
#ifdef HAVE_SYS_UIO_H
|
||||
# include <sys/uio.h>
|
||||
#endif
|
||||
#ifdef HAVE_NET_UIO_H
|
||||
# include <net/uio.h>
|
||||
#endif
|
||||
#ifdef HAVE_UNISTD_H
|
||||
# include <unistd.h>
|
||||
#endif
|
||||
|
||||
#include "src/class/pmix_list.h"
|
||||
#include "src/include/pmix_globals.h"
|
||||
|
||||
BEGIN_C_DECLS
|
||||
|
||||
PMIX_EXPORT void pmix_init_registered_attrs(void);
|
||||
PMIX_EXPORT void pmix_release_registered_attrs(void);
|
||||
PMIX_EXPORT pmix_status_t pmix_register_tool_attrs(void);
|
||||
|
||||
PMIX_EXPORT pmix_status_t pmix_register_client_attrs(void);
|
||||
PMIX_EXPORT pmix_status_t pmix_register_server_attrs(void);
|
||||
|
||||
PMIX_EXPORT char **pmix_attributes_print_functions(char *level);
|
||||
PMIX_EXPORT char **pmix_attributes_print_attr(char *level, char *function);
|
||||
PMIX_EXPORT void pmix_attributes_print_attrs(char ***ans, char *function, pmix_regattr_t *attrs,
|
||||
size_t nattrs);
|
||||
PMIX_EXPORT void pmix_attributes_print_headers(char ***ans, char *level);
|
||||
|
||||
PMIX_EXPORT void pmix_attrs_query_support(int sd, short args, void *cbdata);
|
||||
PMIX_EXPORT const char *pmix_attributes_lookup(const char *name);
|
||||
PMIX_EXPORT const char *pmix_attributes_reverse_lookup(const char *name);
|
||||
PMIX_EXPORT const pmix_regattr_input_t *pmix_attributes_lookup_term(char *attr);
|
||||
|
||||
END_C_DECLS
|
||||
|
||||
#endif /* PMIX_IOF_H */
|
||||
287
macx64/mpi/openmpi/include/pmix/src/common/pmix_iof.h
Normal file
287
macx64/mpi/openmpi/include/pmix/src/common/pmix_iof.h
Normal file
@@ -0,0 +1,287 @@
|
||||
/*
|
||||
* Copyright (c) 2004-2005 The Trustees of Indiana University and Indiana
|
||||
* University Research and Technology
|
||||
* Corporation. All rights reserved.
|
||||
* Copyright (c) 2004-2011 The University of Tennessee and The University
|
||||
* of Tennessee Research Foundation. All rights
|
||||
* reserved.
|
||||
* Copyright (c) 2004-2005 High Performance Computing Center Stuttgart,
|
||||
* University of Stuttgart. All rights reserved.
|
||||
* Copyright (c) 2004-2005 The Regents of the University of California.
|
||||
* All rights reserved.
|
||||
* Copyright (c) 2008 Cisco Systems, Inc. All rights reserved.
|
||||
* Copyright (c) 2012-2013 Los Alamos National Security, LLC.
|
||||
* All rights reserved.
|
||||
* Copyright (c) 2015-2020 Intel, Inc. All rights reserved.
|
||||
* Copyright (c) 2017 IBM Corporation. All rights reserved.
|
||||
* Copyright (c) 2017 Mellanox Technologies. All rights reserved.
|
||||
* Copyright (c) 2018 Research Organization for Information Science
|
||||
* and Technology (RIST). All rights reserved.
|
||||
* Copyright (c) 2021-2024 Nanook Consulting All rights reserved.
|
||||
* $COPYRIGHT$
|
||||
*
|
||||
* Additional copyrights may follow
|
||||
*
|
||||
* $HEADER$
|
||||
*/
|
||||
/**
|
||||
* @file
|
||||
*
|
||||
* I/O Forwarding Service
|
||||
*/
|
||||
|
||||
#ifndef PMIX_IOF_H
|
||||
#define PMIX_IOF_H
|
||||
|
||||
#include "src/include/pmix_config.h"
|
||||
|
||||
#ifdef HAVE_SYS_TYPES_H
|
||||
# include <sys/types.h>
|
||||
#endif
|
||||
#ifdef HAVE_SYS_UIO_H
|
||||
# include <sys/uio.h>
|
||||
#endif
|
||||
#ifdef HAVE_NET_UIO_H
|
||||
# include <net/uio.h>
|
||||
#endif
|
||||
#ifdef HAVE_UNISTD_H
|
||||
# include <unistd.h>
|
||||
#endif
|
||||
#include <signal.h>
|
||||
|
||||
#include "src/class/pmix_list.h"
|
||||
#include "src/include/pmix_globals.h"
|
||||
#include "src/util/pmix_fd.h"
|
||||
|
||||
BEGIN_C_DECLS
|
||||
|
||||
/*
|
||||
* Maximum size of single msg
|
||||
*/
|
||||
#define PMIX_IOF_BASE_MSG_MAX 8192
|
||||
#define PMIX_IOF_BASE_TAG_MAX 1024
|
||||
#define PMIX_IOF_MAX_INPUT_BUFFERS 50
|
||||
#define PMIX_IOF_MAX_RETRIES 4
|
||||
|
||||
typedef struct {
|
||||
pmix_list_item_t super;
|
||||
bool pending;
|
||||
bool always_writable;
|
||||
int numtries;
|
||||
pmix_event_t *ev;
|
||||
struct timeval tv;
|
||||
int fd;
|
||||
pmix_list_t outputs;
|
||||
} pmix_iof_write_event_t;
|
||||
PMIX_EXPORT PMIX_CLASS_DECLARATION(pmix_iof_write_event_t);
|
||||
#define PMIX_IOF_WRITE_EVENT_STATIC_INIT \
|
||||
{ \
|
||||
.super = PMIX_LIST_ITEM_STATIC_INIT, \
|
||||
.pending = false, \
|
||||
.always_writable = false, \
|
||||
.numtries = 0, \
|
||||
.ev = NULL, \
|
||||
.tv = {0, 0}, \
|
||||
.fd = 0, \
|
||||
.outputs = PMIX_LIST_STATIC_INIT \
|
||||
}
|
||||
|
||||
typedef struct {
|
||||
pmix_list_item_t super;
|
||||
pmix_proc_t name;
|
||||
pmix_iof_channel_t tag;
|
||||
pmix_iof_write_event_t wev;
|
||||
bool xoff;
|
||||
bool exclusive;
|
||||
bool closed;
|
||||
} pmix_iof_sink_t;
|
||||
PMIX_EXPORT PMIX_CLASS_DECLARATION(pmix_iof_sink_t);
|
||||
#define PMIX_IOF_SINK_STATIC_INIT \
|
||||
{ \
|
||||
.super = PMIX_LIST_ITEM_STATIC_INIT, \
|
||||
.name = {{0}, 0}, \
|
||||
.tag = PMIX_FWD_NO_CHANNELS, \
|
||||
.wev = PMIX_IOF_WRITE_EVENT_STATIC_INIT, \
|
||||
.xoff = false, \
|
||||
.exclusive = false, \
|
||||
.closed = false \
|
||||
}
|
||||
|
||||
typedef struct {
|
||||
pmix_list_item_t super;
|
||||
char *data;
|
||||
int numbytes;
|
||||
} pmix_iof_write_output_t;
|
||||
PMIX_EXPORT PMIX_CLASS_DECLARATION(pmix_iof_write_output_t);
|
||||
|
||||
typedef struct {
|
||||
pmix_object_t super;
|
||||
pmix_event_t ev;
|
||||
struct timeval tv;
|
||||
int fd;
|
||||
bool active;
|
||||
void *childproc;
|
||||
bool always_readable;
|
||||
pmix_proc_t name;
|
||||
pmix_iof_channel_t channel;
|
||||
pmix_proc_t *targets;
|
||||
size_t ntargets;
|
||||
pmix_info_t *directives;
|
||||
size_t ndirs;
|
||||
} pmix_iof_read_event_t;
|
||||
PMIX_EXPORT PMIX_CLASS_DECLARATION(pmix_iof_read_event_t);
|
||||
|
||||
typedef struct {
|
||||
pmix_list_item_t super;
|
||||
pmix_proc_t name;
|
||||
pmix_iof_write_event_t *channel;
|
||||
pmix_iof_flags_t flags;
|
||||
pmix_iof_channel_t stream;
|
||||
bool copystdout;
|
||||
bool copystderr;
|
||||
pmix_byte_object_t bo;
|
||||
} pmix_iof_residual_t;
|
||||
PMIX_EXPORT PMIX_CLASS_DECLARATION(pmix_iof_residual_t);
|
||||
|
||||
/* Write event macro's */
|
||||
|
||||
static inline bool pmix_iof_fd_always_ready(int fd)
|
||||
{
|
||||
return pmix_fd_is_regular(fd) || (pmix_fd_is_chardev(fd) && !isatty(fd))
|
||||
|| pmix_fd_is_blkdev(fd);
|
||||
}
|
||||
|
||||
#define PMIX_IOF_SINK_BLOCKSIZE (1024)
|
||||
|
||||
#define PMIX_IOF_SINK_ACTIVATE(w) \
|
||||
do { \
|
||||
struct timeval *tv = NULL; \
|
||||
(w)->pending = true; \
|
||||
PMIX_POST_OBJECT((w)); \
|
||||
if ((w)->always_writable) { \
|
||||
/* Regular is always write ready. Use timer to activate */ \
|
||||
tv = &(w)->tv; \
|
||||
} \
|
||||
if (pmix_event_add((w)->ev, tv)) { \
|
||||
PMIX_ERROR_LOG(PMIX_ERR_BAD_PARAM); \
|
||||
} \
|
||||
} while (0);
|
||||
|
||||
/* define an output "sink", adding it to the provided
|
||||
* endpoint list for this proc */
|
||||
#define PMIX_IOF_SINK_DEFINE(snk, nm, fid, tg, wrthndlr) \
|
||||
do { \
|
||||
pmix_output_verbose(1, pmix_client_globals.iof_output, \
|
||||
"defining endpt: file %s line %d fd %d", __FILE__, __LINE__, (fid)); \
|
||||
PMIX_CONSTRUCT((snk), pmix_iof_sink_t); \
|
||||
pmix_strncpy((snk)->name.nspace, (nm)->nspace, PMIX_MAX_NSLEN); \
|
||||
(snk)->name.rank = (nm)->rank; \
|
||||
(snk)->tag = (tg); \
|
||||
if (0 <= (fid)) { \
|
||||
(snk)->wev.fd = (fid); \
|
||||
(snk)->wev.always_writable = pmix_iof_fd_always_ready(fid); \
|
||||
if ((snk)->wev.always_writable) { \
|
||||
pmix_event_evtimer_set(pmix_globals.evbase, (snk)->wev.ev, wrthndlr, (snk)); \
|
||||
} else { \
|
||||
pmix_event_set(pmix_globals.evbase, (snk)->wev.ev, (snk)->wev.fd, PMIX_EV_WRITE, \
|
||||
wrthndlr, (snk)); \
|
||||
} \
|
||||
} \
|
||||
PMIX_POST_OBJECT(snk); \
|
||||
} while (0);
|
||||
|
||||
/* Read event macro's */
|
||||
#define PMIX_IOF_READ_ADDEV(rev) \
|
||||
do { \
|
||||
struct timeval *tv = NULL; \
|
||||
if ((rev)->always_readable) { \
|
||||
tv = &(rev)->tv; \
|
||||
} \
|
||||
if (pmix_event_add(&(rev)->ev, tv)) { \
|
||||
PMIX_ERROR_LOG(PMIX_ERR_BAD_PARAM); \
|
||||
} \
|
||||
} while (0);
|
||||
|
||||
#define PMIX_IOF_READ_ACTIVATE(rev) \
|
||||
do { \
|
||||
(rev)->active = true; \
|
||||
PMIX_POST_OBJECT(rev); \
|
||||
PMIX_IOF_READ_ADDEV(rev); \
|
||||
} while (0);
|
||||
|
||||
#define PMIX_IOF_READ_EVENT(rv, p, np, d, nd, fid, cbfunc, actv) \
|
||||
do { \
|
||||
size_t _ii; \
|
||||
pmix_iof_read_event_t *rev; \
|
||||
pmix_output_verbose(1, pmix_client_globals.iof_output, "defining read event at: %s %d", \
|
||||
__FILE__, __LINE__); \
|
||||
rev = PMIX_NEW(pmix_iof_read_event_t); \
|
||||
if (NULL != (p)) { \
|
||||
(rev)->ntargets = (np); \
|
||||
PMIX_PROC_CREATE((rev)->targets, (rev)->ntargets); \
|
||||
memcpy((rev)->targets, (p), (np) * sizeof(pmix_proc_t)); \
|
||||
} \
|
||||
if (NULL != (d) && 0 < (nd)) { \
|
||||
PMIX_INFO_CREATE((rev)->directives, (nd)); \
|
||||
(rev)->ndirs = (nd); \
|
||||
for (_ii = 0; _ii < (size_t) nd; _ii++) { \
|
||||
PMIX_INFO_XFER(&((rev)->directives[_ii]), &((d)[_ii])); \
|
||||
} \
|
||||
} \
|
||||
rev->fd = (fid); \
|
||||
rev->always_readable = pmix_iof_fd_always_ready(fid); \
|
||||
*(rv) = rev; \
|
||||
if (rev->always_readable) { \
|
||||
pmix_event_evtimer_set(pmix_globals.evbase, &rev->ev, (cbfunc), rev); \
|
||||
} else { \
|
||||
pmix_event_set(pmix_globals.evbase, &rev->ev, (fid), PMIX_EV_READ, (cbfunc), rev); \
|
||||
} \
|
||||
if ((actv)) { \
|
||||
PMIX_IOF_READ_ACTIVATE(rev) \
|
||||
} \
|
||||
} while (0);
|
||||
|
||||
#define PMIX_IOF_READ_EVENT_LOCAL(rv, fid, cbfunc, actv) \
|
||||
do { \
|
||||
pmix_iof_read_event_t *rev; \
|
||||
pmix_output_verbose(1, pmix_client_globals.iof_output, "defining read event at: %s %d", \
|
||||
__FILE__, __LINE__); \
|
||||
rev = PMIX_NEW(pmix_iof_read_event_t); \
|
||||
rev->fd = (fid); \
|
||||
rev->always_readable = pmix_iof_fd_always_ready(fid); \
|
||||
*(rv) = rev; \
|
||||
if (rev->always_readable) { \
|
||||
pmix_event_evtimer_set(pmix_globals.evbase, &rev->ev, (cbfunc), rev); \
|
||||
} else { \
|
||||
pmix_event_set(pmix_globals.evbase, &rev->ev, (fid), PMIX_EV_READ, (cbfunc), rev); \
|
||||
} \
|
||||
if ((actv)) { \
|
||||
PMIX_IOF_READ_ACTIVATE(rev) \
|
||||
} \
|
||||
} while (0);
|
||||
|
||||
|
||||
PMIX_EXPORT pmix_status_t pmix_iof_flush(void);
|
||||
|
||||
PMIX_EXPORT pmix_status_t pmix_iof_write_output(const pmix_proc_t *name, pmix_iof_channel_t stream,
|
||||
const pmix_byte_object_t *bo);
|
||||
PMIX_EXPORT void pmix_iof_static_dump_output(pmix_iof_sink_t *sink);
|
||||
PMIX_EXPORT void pmix_iof_write_handler(int fd, short event, void *cbdata);
|
||||
PMIX_EXPORT bool pmix_iof_stdin_check(int fd);
|
||||
PMIX_EXPORT void pmix_iof_read_local_handler(int unusedfd, short event, void *cbdata);
|
||||
PMIX_EXPORT void pmix_iof_stdin_cb(int fd, short event, void *cbdata);
|
||||
PMIX_EXPORT pmix_status_t pmix_iof_process_iof(pmix_iof_channel_t channels,
|
||||
const pmix_proc_t *source,
|
||||
const pmix_byte_object_t *bo,
|
||||
const pmix_info_t *info, size_t ninfo,
|
||||
pmix_iof_req_t *req);
|
||||
PMIX_EXPORT void pmix_iof_check_flags(pmix_info_t *info, pmix_iof_flags_t *flags);
|
||||
PMIX_EXPORT void pmix_iof_flush_residuals(void);
|
||||
PMIX_EXPORT pmix_byte_object_t* pmix_iof_prep_output(const pmix_proc_t *name,
|
||||
pmix_iof_flags_t *myflags,
|
||||
pmix_iof_channel_t stream,
|
||||
const pmix_byte_object_t *bo);
|
||||
|
||||
END_C_DECLS
|
||||
|
||||
#endif /* PMIX_IOF_H */
|
||||
179
macx64/mpi/openmpi/include/pmix/src/common/pmix_pfexec.h
Normal file
179
macx64/mpi/openmpi/include/pmix/src/common/pmix_pfexec.h
Normal file
@@ -0,0 +1,179 @@
|
||||
/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil -*- */
|
||||
/*
|
||||
* Copyright (c) 2004-2008 The Trustees of Indiana University and Indiana
|
||||
* University Research and Technology
|
||||
* Corporation. All rights reserved.
|
||||
* Copyright (c) 2004-2005 The University of Tennessee and The University
|
||||
* of Tennessee Research Foundation. All rights
|
||||
* reserved.
|
||||
* Copyright (c) 2004-2005 High Performance Computing Center Stuttgart,
|
||||
* University of Stuttgart. All rights reserved.
|
||||
* Copyright (c) 2004-2005 The Regents of the University of California.
|
||||
* All rights reserved.
|
||||
* Copyright (c) 2011-2015 Los Alamos National Security, LLC. All rights
|
||||
* reserved.
|
||||
* Copyright (c) 2016-2020 Intel, Inc. All rights reserved.
|
||||
* Copyright (c) 2021-2024 Nanook Consulting All rights reserved.
|
||||
* $COPYRIGHT$
|
||||
*
|
||||
* Additional copyrights may follow
|
||||
*
|
||||
* $HEADER$
|
||||
*/
|
||||
/**
|
||||
* @file
|
||||
*
|
||||
* The PMIx Fork/Exec Subsystem
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef PMIX_PFEXEC_H
|
||||
#define PMIX_PFEXEC_H
|
||||
|
||||
#include "pmix_config.h"
|
||||
|
||||
#include "src/class/pmix_list.h"
|
||||
#include "src/common/pmix_iof.h"
|
||||
#include "src/server/pmix_server_ops.h"
|
||||
|
||||
BEGIN_C_DECLS
|
||||
|
||||
typedef struct {
|
||||
int usepty;
|
||||
bool connect_stdin;
|
||||
|
||||
/* private - callers should not modify these fields */
|
||||
int p_stdin[2];
|
||||
int p_stdout[2];
|
||||
int p_stderr[2];
|
||||
} pmix_pfexec_base_io_conf_t;
|
||||
|
||||
typedef struct {
|
||||
pmix_list_item_t super;
|
||||
pmix_event_t ev;
|
||||
pmix_proc_t proc;
|
||||
pid_t pid;
|
||||
bool completed;
|
||||
int exitcode;
|
||||
int keepalive[2];
|
||||
pmix_pfexec_base_io_conf_t opts;
|
||||
pmix_iof_sink_t stdinsink;
|
||||
pmix_iof_read_event_t *stdoutev;
|
||||
pmix_iof_read_event_t *stderrev;
|
||||
} pmix_pfexec_child_t;
|
||||
PMIX_EXPORT PMIX_CLASS_DECLARATION(pmix_pfexec_child_t);
|
||||
|
||||
typedef struct {
|
||||
pmix_event_t *handler;
|
||||
bool active;
|
||||
pmix_list_t children;
|
||||
int timeout_before_sigkill;
|
||||
size_t nextid;
|
||||
bool selected;
|
||||
} pmix_pfexec_globals_t;
|
||||
|
||||
PMIX_EXPORT extern pmix_pfexec_globals_t pmix_pfexec_globals;
|
||||
|
||||
typedef struct {
|
||||
pmix_object_t super;
|
||||
pmix_event_t ev;
|
||||
pmix_proc_t *proc;
|
||||
int signal;
|
||||
pmix_lock_t *lock;
|
||||
} pmix_pfexec_signal_caddy_t;
|
||||
PMIX_EXPORT PMIX_CLASS_DECLARATION(pmix_pfexec_signal_caddy_t);
|
||||
|
||||
PMIX_EXPORT int pmix_pfexec_base_open(void);
|
||||
|
||||
PMIX_EXPORT int pmix_pfexec_register(void);
|
||||
|
||||
PMIX_EXPORT int pmix_pfexec_base_close(void);
|
||||
|
||||
PMIX_EXPORT pmix_status_t pmix_pfexec_base_spawn_job(pmix_setup_caddy_t *fcd);
|
||||
|
||||
PMIX_EXPORT void pmix_pfexec_base_spawn_proc(int sd, short args, void *cbdata);
|
||||
|
||||
PMIX_EXPORT void pmix_pfexec_base_kill_proc(int sd, short args, void *cbdata);
|
||||
|
||||
PMIX_EXPORT void pmix_pfexec_base_signal_proc(int sd, short args, void *cbdata);
|
||||
|
||||
PMIX_EXPORT void pmix_pfexec_check_complete(int sd, short args, void *cbdata);
|
||||
|
||||
#define PMIX_PFEXEC_SPAWN(fcd) \
|
||||
do { \
|
||||
pmix_event_assign(&(fcd->ev), pmix_globals.evbase, -1, EV_WRITE, \
|
||||
pmix_pfexec_base_spawn_proc, fcd); \
|
||||
PMIX_POST_OBJECT((fcd)); \
|
||||
pmix_event_active(&((fcd)->ev), EV_WRITE, 1); \
|
||||
} while (0)
|
||||
|
||||
#define PMIX_PFEXEC_KILL(r, lk) \
|
||||
do { \
|
||||
pmix_pfexec_signal_caddy_t *scd; \
|
||||
(scd) = PMIX_NEW(pmix_pfexec_signal_caddy_t); \
|
||||
(scd)->proc = (r); \
|
||||
(scd)->lock = (lk); \
|
||||
pmix_event_assign(&((scd)->ev), pmix_globals.evbase, -1, EV_WRITE, \
|
||||
pmix_pfexec_base_kill_proc, (scd)); \
|
||||
PMIX_POST_OBJECT((scd)); \
|
||||
pmix_event_active(&((scd)->ev), EV_WRITE, 1); \
|
||||
} while (0)
|
||||
|
||||
#define PMIX_PFEXEC_SIGNAL(scd, r, nm, fn, lk) \
|
||||
do { \
|
||||
pmix_pfexec_signal_caddy_t *scd; \
|
||||
(scd) = PMIX_NEW(pmix_pfexec_signal_caddy_t); \
|
||||
(scd)->proc = (r); \
|
||||
(scd)->signal = (nm); \
|
||||
(scd)->lock = (lk); \
|
||||
pmix_event_assign(&((scd)->ev), pmix_globals.evbase, -1, EV_WRITE, \
|
||||
pmix_pfexec_base_signal_proc, (scd)); \
|
||||
PMIX_POST_OBJECT((scd)); \
|
||||
pmix_event_active(&((scd)->ev), EV_WRITE, 1); \
|
||||
} while (0)
|
||||
|
||||
typedef struct {
|
||||
pmix_object_t super;
|
||||
pmix_event_t ev;
|
||||
pmix_pfexec_child_t *child;
|
||||
} pmix_pfexec_cmpl_caddy_t;
|
||||
PMIX_EXPORT PMIX_CLASS_DECLARATION(pmix_pfexec_cmpl_caddy_t);
|
||||
|
||||
#define PMIX_PFEXEC_CHK_COMPLETE(c) \
|
||||
do { \
|
||||
pmix_pfexec_cmpl_caddy_t *pc = PMIX_NEW(pmix_pfexec_cmpl_caddy_t); \
|
||||
pc->child = (c); \
|
||||
pmix_event_assign(&((pc)->ev), pmix_globals.evbase, -1, EV_WRITE, \
|
||||
pmix_pfexec_check_complete, (pc)); \
|
||||
PMIX_POST_OBJECT((pc)); \
|
||||
pmix_event_active(&((pc)->ev), EV_WRITE, 1); \
|
||||
} while (0)
|
||||
|
||||
/*
|
||||
* Struct written up the pipe from the child to the parent.
|
||||
*/
|
||||
typedef struct {
|
||||
/* True if the child has died; false if this is just a warning to
|
||||
be printed. */
|
||||
bool fatal;
|
||||
/* Relevant only if fatal==true */
|
||||
int exit_status;
|
||||
|
||||
/* Length of the strings that are written up the pipe after this
|
||||
struct */
|
||||
int file_str_len;
|
||||
int topic_str_len;
|
||||
int msg_str_len;
|
||||
} pmix_pfexec_pipe_err_msg_t;
|
||||
|
||||
PMIX_EXPORT pmix_status_t pmix_pfexec_base_setup_child(pmix_pfexec_child_t *child);
|
||||
|
||||
/*
|
||||
* Max length of strings from the pmix_pfexec_pipe_err_msg_t
|
||||
*/
|
||||
#define PMIX_PFEXEC_MAX_FILE_LEN 511
|
||||
#define PMIX_PFEXEC_MAX_TOPIC_LEN PMIX_PFEXEC_MAX_FILE_LEN
|
||||
|
||||
END_C_DECLS
|
||||
|
||||
#endif /* MCA_PFEXEC_H */
|
||||
299
macx64/mpi/openmpi/include/pmix/src/event/pmix_event.h
Normal file
299
macx64/mpi/openmpi/include/pmix/src/event/pmix_event.h
Normal file
@@ -0,0 +1,299 @@
|
||||
/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil -*- */
|
||||
/*
|
||||
* Copyright (c) 2004-2005 The Trustees of Indiana University and Indiana
|
||||
* University Research and Technology
|
||||
* Corporation. All rights reserved.
|
||||
* Copyright (c) 2004-2006 The University of Tennessee and The University
|
||||
* of Tennessee Research Foundation. All rights
|
||||
* reserved.
|
||||
* Copyright (c) 2004-2005 High Performance Computing Center Stuttgart,
|
||||
* University of Stuttgart. All rights reserved.
|
||||
* Copyright (c) 2004-2005 The Regents of the University of California.
|
||||
* All rights reserved.
|
||||
* Copyright (c) 2015-2020 Intel, Inc. All rights reserved.
|
||||
* Copyright (c) 2020 IBM Corporation. All rights reserved.
|
||||
* Copyright (c) 2021-2022 Nanook Consulting. All rights reserved.
|
||||
* $COPYRIGHT$
|
||||
*
|
||||
* Additional copyrights may follow
|
||||
*
|
||||
* $HEADER$
|
||||
*/
|
||||
|
||||
#ifndef PMIX_EVENT_H
|
||||
#define PMIX_EVENT_H
|
||||
|
||||
#include "src/include/pmix_config.h"
|
||||
#include "src/include/pmix_types.h"
|
||||
#include <event.h>
|
||||
|
||||
#include "pmix_common.h"
|
||||
#include "src/class/pmix_list.h"
|
||||
#include "src/mca/bfrops/bfrops_types.h"
|
||||
#include "src/util/pmix_output.h"
|
||||
|
||||
BEGIN_C_DECLS
|
||||
|
||||
#define PMIX_EVENT_ORDER_NONE 0x00
|
||||
#define PMIX_EVENT_ORDER_FIRST 0x01
|
||||
#define PMIX_EVENT_ORDER_LAST 0x02
|
||||
#define PMIX_EVENT_ORDER_BEFORE 0x04
|
||||
#define PMIX_EVENT_ORDER_AFTER 0x08
|
||||
#define PMIX_EVENT_ORDER_PREPEND 0x10
|
||||
#define PMIX_EVENT_ORDER_APPEND 0x20
|
||||
#define PMIX_EVENT_ORDER_FIRST_OVERALL 0x40
|
||||
#define PMIX_EVENT_ORDER_LAST_OVERALL 0x80
|
||||
|
||||
/* define an internal attribute for marking that the
|
||||
* server processed an event before passing it up
|
||||
* to its host in case it comes back down - avoids
|
||||
* infinite loop */
|
||||
#define PMIX_SERVER_INTERNAL_NOTIFY "pmix.srvr.internal.notify"
|
||||
|
||||
/* define a struct for tracking registration ranges */
|
||||
typedef struct {
|
||||
pmix_data_range_t range;
|
||||
pmix_proc_t *procs;
|
||||
size_t nprocs;
|
||||
} pmix_range_trkr_t;
|
||||
|
||||
#define PMIX_RANGE_TRKR_STATIC_INIT \
|
||||
{ \
|
||||
.range = PMIX_RANGE_UNDEF, \
|
||||
.procs = NULL, \
|
||||
.nprocs = 0 \
|
||||
}
|
||||
|
||||
|
||||
/* define a common struct for tracking event handlers */
|
||||
typedef struct {
|
||||
pmix_list_item_t super;
|
||||
char *name;
|
||||
size_t index;
|
||||
uint8_t precedence;
|
||||
bool oneshot;
|
||||
char *locator;
|
||||
pmix_proc_t source; // who generated this event
|
||||
/* When registering for events, callers can specify
|
||||
* the range of sources from which they are willing
|
||||
* to receive notifications - e.g., for callers to
|
||||
* define different handlers for events coming from
|
||||
* the RM vs those coming from their peers. We use
|
||||
* the rng field to track these values upon registration.
|
||||
*/
|
||||
pmix_range_trkr_t rng;
|
||||
/* For registration, we use the affected field to track
|
||||
* the range of procs that, if affected by the event,
|
||||
* should cause the handler to be called (subject, of
|
||||
* course, to any rng constraints).
|
||||
*/
|
||||
pmix_proc_t *affected;
|
||||
size_t naffected;
|
||||
pmix_notification_fn_t evhdlr;
|
||||
void *cbobject;
|
||||
pmix_status_t *codes;
|
||||
size_t ncodes;
|
||||
} pmix_event_hdlr_t;
|
||||
PMIX_CLASS_DECLARATION(pmix_event_hdlr_t);
|
||||
|
||||
#define PMIX_EVENT_HDLR_STATIC_INIT \
|
||||
{ \
|
||||
.super = PMIX_LIST_ITEM_STATIC_INIT, \
|
||||
.name = NULL, \
|
||||
.index = SIZE_MAX, \
|
||||
.precedence = UINT8_MAX, \
|
||||
.locator = NULL, \
|
||||
.source = PMIX_PROC_STATIC_INIT, \
|
||||
.rng = PMIX_RANGE_TRKR_STATIC_INIT, \
|
||||
.affected - NULL, \
|
||||
.naffected = 0, \
|
||||
.evhdlr = NULL, \
|
||||
.cbobject = NULL, \
|
||||
.codes = NULL, \
|
||||
.ncodes = 0 \
|
||||
}
|
||||
|
||||
/* define an object for tracking status codes we are actively
|
||||
* registered to receive */
|
||||
typedef struct {
|
||||
pmix_list_item_t super;
|
||||
pmix_status_t code;
|
||||
size_t nregs;
|
||||
} pmix_active_code_t;
|
||||
PMIX_CLASS_DECLARATION(pmix_active_code_t);
|
||||
|
||||
/* define an object for housing the different lists of events
|
||||
* we have registered so we can easily scan them in precedent
|
||||
* order when we get an event */
|
||||
typedef struct {
|
||||
pmix_object_t super;
|
||||
size_t nhdlrs;
|
||||
pmix_event_hdlr_t *first;
|
||||
pmix_event_hdlr_t *last;
|
||||
pmix_list_t actives;
|
||||
pmix_list_t single_events;
|
||||
pmix_list_t multi_events;
|
||||
pmix_list_t default_events;
|
||||
} pmix_events_t;
|
||||
PMIX_CLASS_DECLARATION(pmix_events_t);
|
||||
|
||||
#define PMIX_EVENTS_STATIC_INIT \
|
||||
{ \
|
||||
.super = PMIX_OBJ_STATIC_INIT(pmix_object_t), \
|
||||
.nhdlrs = 0, \
|
||||
.first = NULL, \
|
||||
.last = NULL, \
|
||||
.actives = PMIX_LIST_STATIC_INIT, \
|
||||
.single_events = PMIX_LIST_STATIC_INIT, \
|
||||
.multi_events = PMIX_LIST_STATIC_INIT, \
|
||||
.default_events = PMIX_LIST_STATIC_INIT \
|
||||
}
|
||||
|
||||
/* define an object for chaining event notifications thru
|
||||
* the local state machine. Each registered event handler
|
||||
* that asked to be notified for a given code is given a
|
||||
* chance to "see" the reported event, starting with
|
||||
* single-code handlers, then multi-code handlers, and
|
||||
* finally default handlers. This object provides a
|
||||
* means for us to relay the event across that chain
|
||||
*/
|
||||
typedef struct pmix_event_chain_t {
|
||||
pmix_list_item_t super;
|
||||
pmix_status_t status;
|
||||
pmix_event_t ev;
|
||||
bool timer_active;
|
||||
bool nondefault;
|
||||
bool endchain;
|
||||
bool cached;
|
||||
pmix_proc_t source;
|
||||
pmix_data_range_t range;
|
||||
/* When generating events, callers can specify
|
||||
* the range of targets to receive notifications.
|
||||
*/
|
||||
pmix_proc_t *targets;
|
||||
size_t ntargets;
|
||||
/* the processes that we affected by the event */
|
||||
pmix_proc_t *affected;
|
||||
size_t naffected;
|
||||
/* any info provided by the event generator */
|
||||
pmix_info_t *info;
|
||||
size_t ninfo;
|
||||
size_t nallocated;
|
||||
pmix_status_t interim_status;
|
||||
pmix_info_t *results;
|
||||
size_t nresults;
|
||||
pmix_info_t *interim;
|
||||
size_t ninterim;
|
||||
pmix_event_hdlr_t *evhdlr;
|
||||
pmix_op_cbfunc_t opcbfunc;
|
||||
void *cbdata;
|
||||
pmix_op_cbfunc_t final_cbfunc;
|
||||
void *final_cbdata;
|
||||
} pmix_event_chain_t;
|
||||
PMIX_CLASS_DECLARATION(pmix_event_chain_t);
|
||||
|
||||
/* prepare a chain for processing by cycling across provided
|
||||
* info structs and translating those supported by the event
|
||||
* system into the chain object*/
|
||||
PMIX_EXPORT pmix_status_t pmix_prep_event_chain(pmix_event_chain_t *chain, const pmix_info_t *info,
|
||||
size_t ninfo, bool xfer);
|
||||
|
||||
/* invoke the error handler that is registered against the given
|
||||
* status, passing it the provided info on the procs that were
|
||||
* affected, plus any additional info provided by the server */
|
||||
PMIX_EXPORT void pmix_invoke_local_event_hdlr(pmix_event_chain_t *chain);
|
||||
|
||||
PMIX_EXPORT bool pmix_notify_check_range(pmix_range_trkr_t *rng, const pmix_proc_t *proc);
|
||||
|
||||
PMIX_EXPORT bool pmix_notify_check_affected(pmix_proc_t *interested, size_t ninterested,
|
||||
pmix_proc_t *affected, size_t naffected);
|
||||
|
||||
PMIX_EXPORT pmix_status_t pmix_deregister_event_hdlr(size_t event_hdlr_ref,
|
||||
pmix_buffer_t *msg);
|
||||
|
||||
/* invoke the server event notification handler */
|
||||
PMIX_EXPORT pmix_status_t pmix_server_notify_client_of_event(pmix_status_t status,
|
||||
const pmix_proc_t *source,
|
||||
pmix_data_range_t range,
|
||||
const pmix_info_t info[], size_t ninfo,
|
||||
pmix_op_cbfunc_t cbfunc, void *cbdata);
|
||||
PMIX_EXPORT pmix_status_t pmix_notify_server_of_event(pmix_status_t status, const pmix_proc_t *source,
|
||||
pmix_data_range_t range, const pmix_info_t info[],
|
||||
size_t ninfo, pmix_op_cbfunc_t cbfunc, void *cbdata,
|
||||
bool dolocal);
|
||||
|
||||
PMIX_EXPORT void pmix_event_timeout_cb(int fd, short flags, void *arg);
|
||||
|
||||
#define PMIX_REPORT_EVENT(e, p, r, f) \
|
||||
do { \
|
||||
pmix_event_chain_t *ch, *cp; \
|
||||
size_t _n; \
|
||||
\
|
||||
ch = NULL; \
|
||||
/* see if we already have this event cached */ \
|
||||
PMIX_LIST_FOREACH (cp, &pmix_globals.cached_events, pmix_event_chain_t) { \
|
||||
if (cp->status == (e)) { \
|
||||
ch = cp; \
|
||||
break; \
|
||||
} \
|
||||
} \
|
||||
if (NULL == ch) { \
|
||||
/* nope - need to add it */ \
|
||||
ch = PMIX_NEW(pmix_event_chain_t); \
|
||||
ch->status = (e); \
|
||||
ch->range = (r); \
|
||||
PMIX_LOAD_PROCID(&ch->source, (p)->nptr->nspace, (p)->info->pname.rank); \
|
||||
PMIX_PROC_CREATE(ch->affected, 1); \
|
||||
ch->naffected = 1; \
|
||||
PMIX_LOAD_PROCID(ch->affected, (p)->nptr->nspace, (p)->info->pname.rank); \
|
||||
/* if this is lost-connection-to-server, then we let it go to */ \
|
||||
/* the default event handler - otherwise, we don't */ \
|
||||
if (PMIX_ERR_LOST_CONNECTION != (e) && PMIX_ERR_UNREACH != (e)) { \
|
||||
ch->ninfo = 1; \
|
||||
ch->nallocated = 3; \
|
||||
PMIX_INFO_CREATE(ch->info, ch->nallocated); \
|
||||
/* mark for non-default handlers only */ \
|
||||
PMIX_INFO_LOAD(&ch->info[0], PMIX_EVENT_NON_DEFAULT, NULL, PMIX_BOOL); \
|
||||
} else { \
|
||||
ch->nallocated = 2; \
|
||||
PMIX_INFO_CREATE(ch->info, ch->nallocated); \
|
||||
} \
|
||||
ch->final_cbfunc = (f); \
|
||||
ch->final_cbdata = ch; \
|
||||
/* cache it */ \
|
||||
pmix_list_append(&pmix_globals.cached_events, &ch->super); \
|
||||
ch->timer_active = true; \
|
||||
pmix_event_assign(&ch->ev, pmix_globals.evbase, -1, 0, pmix_event_timeout_cb, ch); \
|
||||
PMIX_POST_OBJECT(ch); \
|
||||
pmix_event_add(&ch->ev, &pmix_globals.event_window); \
|
||||
} else { \
|
||||
/* add this peer to the array of sources */ \
|
||||
pmix_proc_t proc_tmp; \
|
||||
pmix_info_t *info_tmp; \
|
||||
size_t ninfo_tmp; \
|
||||
pmix_strncpy(proc_tmp.nspace, (p)->nptr->nspace, PMIX_MAX_NSLEN); \
|
||||
proc_tmp.rank = (p)->info->pname.rank; \
|
||||
ninfo_tmp = ch->nallocated + 1; \
|
||||
PMIX_INFO_CREATE(info_tmp, ninfo_tmp); \
|
||||
/* must keep the hdlr name and return object at the end, so prepend */ \
|
||||
PMIX_INFO_LOAD(&info_tmp[0], PMIX_PROCID, &proc_tmp, PMIX_PROC); \
|
||||
for (_n = 0; _n < ch->ninfo; _n++) { \
|
||||
PMIX_INFO_XFER(&info_tmp[_n + 1], &ch->info[_n]); \
|
||||
} \
|
||||
PMIX_INFO_FREE(ch->info, ch->nallocated); \
|
||||
ch->nallocated = ninfo_tmp; \
|
||||
ch->info = info_tmp; \
|
||||
ch->ninfo = ninfo_tmp - 2; \
|
||||
/* reset the timer */ \
|
||||
if (ch->timer_active) { \
|
||||
pmix_event_del(&ch->ev); \
|
||||
} \
|
||||
PMIX_POST_OBJECT(ch); \
|
||||
ch->timer_active = true; \
|
||||
pmix_event_add(&ch->ev, &pmix_globals.event_window); \
|
||||
} \
|
||||
} while (0)
|
||||
|
||||
END_C_DECLS
|
||||
|
||||
#endif /* PMIX_EVENT_H */
|
||||
150
macx64/mpi/openmpi/include/pmix/src/hwloc/pmix_hwloc.h
Normal file
150
macx64/mpi/openmpi/include/pmix/src/hwloc/pmix_hwloc.h
Normal file
@@ -0,0 +1,150 @@
|
||||
/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil -*- */
|
||||
/*
|
||||
* Copyright (c) 2007-2008 Cisco Systems, Inc. All rights reserved.
|
||||
*
|
||||
* Copyright (c) 2015-2018 Research Organization for Information Science
|
||||
* and Technology (RIST). All rights reserved.
|
||||
* Copyright (c) 2018-2020 Intel, Inc. All rights reserved.
|
||||
* Copyright (c) 2021-2022 Nanook Consulting. All rights reserved.
|
||||
* Copyright (c) 2022 Triad National Security, LLC. All rights reserved.
|
||||
* $COPYRIGHT$
|
||||
*
|
||||
* Additional copyrights may follow
|
||||
*
|
||||
* $HEADER$
|
||||
*/
|
||||
|
||||
/**
|
||||
* @file
|
||||
*
|
||||
* This interface is for use by PMIx to obtain topology-related info
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef PMIX_HWLOC_H
|
||||
#define PMIX_HWLOC_H
|
||||
|
||||
#include "src/include/pmix_config.h"
|
||||
|
||||
#include <hwloc.h>
|
||||
|
||||
#include "pmix_common.h"
|
||||
|
||||
#include "src/class/pmix_list.h"
|
||||
#include "src/include/pmix_globals.h"
|
||||
#include "src/mca/base/pmix_mca_base_framework.h"
|
||||
#include "src/mca/base/pmix_mca_base_var.h"
|
||||
#include "src/mca/mca.h"
|
||||
#include "src/server/pmix_server_ops.h"
|
||||
|
||||
BEGIN_C_DECLS
|
||||
|
||||
#if HWLOC_API_VERSION < 0x20000
|
||||
|
||||
# ifndef HAVE_HWLOC_TOPOLOGY_DUP
|
||||
# define HAVE_HWLOC_TOPOLOGY_DUP 0
|
||||
# endif
|
||||
|
||||
# define HWLOC_OBJ_L3CACHE HWLOC_OBJ_CACHE
|
||||
# define HWLOC_OBJ_L2CACHE HWLOC_OBJ_CACHE
|
||||
# define HWLOC_OBJ_L1CACHE HWLOC_OBJ_CACHE
|
||||
|
||||
# if HWLOC_API_VERSION < 0x10b00
|
||||
# define HWLOC_OBJ_NUMANODE HWLOC_OBJ_NODE
|
||||
# define HWLOC_OBJ_PACKAGE HWLOC_OBJ_SOCKET
|
||||
# endif
|
||||
|
||||
# define HAVE_DECL_HWLOC_OBJ_OSDEV_COPROC 0
|
||||
|
||||
#else
|
||||
|
||||
# define HAVE_DECL_HWLOC_OBJ_OSDEV_COPROC 1
|
||||
|
||||
#endif
|
||||
|
||||
/**
|
||||
* Register params
|
||||
*/
|
||||
PMIX_EXPORT pmix_status_t pmix_hwloc_register(void);
|
||||
|
||||
/**
|
||||
* Finalize. Tear down any allocated storage
|
||||
*/
|
||||
PMIX_EXPORT void pmix_hwloc_finalize(void);
|
||||
|
||||
/* Setup the topology for delivery to clients */
|
||||
PMIX_EXPORT pmix_status_t pmix_hwloc_setup_topology(pmix_info_t *info, size_t ninfo);
|
||||
|
||||
/* Load the topology */
|
||||
PMIX_EXPORT pmix_status_t pmix_hwloc_load_topology(pmix_topology_t *topo);
|
||||
|
||||
/* Generate the string representation of a cpuset */
|
||||
PMIX_EXPORT pmix_status_t pmix_hwloc_generate_cpuset_string(const pmix_cpuset_t *cpuset,
|
||||
char **cpuset_string);
|
||||
|
||||
/* get cpuset from its string representation */
|
||||
PMIX_EXPORT pmix_status_t pmix_hwloc_parse_cpuset_string(const char *cpuset_string, pmix_cpuset_t *cpuset);
|
||||
|
||||
/* Get locality string */
|
||||
PMIX_EXPORT pmix_status_t pmix_hwloc_generate_locality_string(const pmix_cpuset_t *cpuset, char **loc);
|
||||
|
||||
/* Get relative locality */
|
||||
PMIX_EXPORT pmix_status_t pmix_hwloc_get_relative_locality(const char *locality1,
|
||||
const char *locality2,
|
||||
pmix_locality_t *loc);
|
||||
|
||||
/* Get current bound location */
|
||||
PMIX_EXPORT pmix_status_t pmix_hwloc_get_cpuset(pmix_cpuset_t *cpuset, pmix_bind_envelope_t ref);
|
||||
|
||||
/* Get distance array */
|
||||
PMIX_EXPORT pmix_status_t pmix_hwloc_compute_distances(pmix_topology_t *topo, pmix_cpuset_t *cpuset,
|
||||
pmix_info_t info[], size_t ninfo,
|
||||
pmix_device_distance_t **dist, size_t *ndist);
|
||||
|
||||
PMIX_EXPORT pmix_status_t pmix_hwloc_check_vendor(pmix_topology_t *topo,
|
||||
unsigned short vendorID,
|
||||
uint16_t class);
|
||||
|
||||
/* cpuset pack/unpack/copy/print functions */
|
||||
PMIX_EXPORT pmix_status_t pmix_hwloc_pack_cpuset(pmix_buffer_t *buf, pmix_cpuset_t *src,
|
||||
pmix_pointer_array_t *regtypes);
|
||||
|
||||
PMIX_EXPORT pmix_status_t pmix_hwloc_unpack_cpuset(pmix_buffer_t *buf, pmix_cpuset_t *dest,
|
||||
pmix_pointer_array_t *regtypes);
|
||||
|
||||
PMIX_EXPORT pmix_status_t pmix_hwloc_copy_cpuset(pmix_cpuset_t *dest, pmix_cpuset_t *src);
|
||||
|
||||
PMIX_EXPORT char *pmix_hwloc_print_cpuset(pmix_cpuset_t *src);
|
||||
|
||||
PMIX_EXPORT void pmix_hwloc_destruct_cpuset(pmix_cpuset_t *cpuset);
|
||||
|
||||
PMIX_EXPORT void pmix_hwloc_release_cpuset(pmix_cpuset_t *ptr, size_t sz);
|
||||
|
||||
PMIX_EXPORT pmix_status_t pmix_hwloc_get_cpuset_size(pmix_cpuset_t *ptr, size_t *sz);
|
||||
|
||||
/* topology pack/unpack/copy/print functions */
|
||||
PMIX_EXPORT pmix_status_t pmix_hwloc_pack_topology(pmix_buffer_t *buf, pmix_topology_t *src,
|
||||
pmix_pointer_array_t *regtypes);
|
||||
|
||||
PMIX_EXPORT pmix_status_t pmix_hwloc_unpack_topology(pmix_buffer_t *buf, pmix_topology_t *dest,
|
||||
pmix_pointer_array_t *regtypes);
|
||||
|
||||
PMIX_EXPORT pmix_status_t pmix_hwloc_copy_topology(pmix_topology_t *dest, pmix_topology_t *src);
|
||||
|
||||
PMIX_EXPORT char *pmix_hwloc_print_topology(pmix_topology_t *src);
|
||||
|
||||
PMIX_EXPORT void pmix_hwloc_destruct_topology(pmix_topology_t *ptr);
|
||||
|
||||
PMIX_EXPORT void pmix_hwloc_release_topology(pmix_topology_t *ptr, size_t sz);
|
||||
|
||||
PMIX_EXPORT pmix_status_t pmix_hwloc_get_topology_size(pmix_topology_t *ptr, size_t *sz);
|
||||
|
||||
/**** PRESERVE ABI ****/
|
||||
PMIX_EXPORT void pmix_ploc_base_destruct_cpuset(pmix_cpuset_t *cpuset);
|
||||
PMIX_EXPORT void pmix_ploc_base_release_cpuset(pmix_cpuset_t *ptr, size_t sz);
|
||||
PMIX_EXPORT void pmix_ploc_base_destruct_topology(pmix_topology_t *ptr);
|
||||
PMIX_EXPORT void pmix_ploc_base_release_topology(pmix_topology_t *ptr, size_t sz);
|
||||
|
||||
END_C_DECLS
|
||||
|
||||
#endif
|
||||
142
macx64/mpi/openmpi/include/pmix/src/include/pmix_atomic.h
Normal file
142
macx64/mpi/openmpi/include/pmix/src/include/pmix_atomic.h
Normal file
@@ -0,0 +1,142 @@
|
||||
/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil -*- */
|
||||
/*
|
||||
* Copyright (c) 2004-2005 The Trustees of Indiana University and Indiana
|
||||
* University Research and Technology
|
||||
* Corporation. All rights reserved.
|
||||
* Copyright (c) 2004-2006 The University of Tennessee and The University
|
||||
* of Tennessee Research Foundation. All rights
|
||||
* reserved.
|
||||
* Copyright (c) 2004-2005 High Performance Computing Center Stuttgart,
|
||||
* University of Stuttgart. All rights reserved.
|
||||
* Copyright (c) 2004-2005 The Regents of the University of California.
|
||||
* All rights reserved.
|
||||
* Copyright (c) 2007 Sun Microsystems, Inc. All rights reserved.
|
||||
* Copyright (c) 2011 Sandia National Laboratories. All rights reserved.
|
||||
* Copyright (c) 2011-2017 Los Alamos National Security, LLC. All rights
|
||||
* reserved.
|
||||
* Copyright (c) 2017 Research Organization for Information Science
|
||||
* and Technology (RIST). All rights reserved.
|
||||
* Copyright (c) 2018-2020 Intel, Inc. All rights reserved.
|
||||
* Copyright (c) 2021-2022 Nanook Consulting All rights reserved.
|
||||
* Copyright (c) Amazon.com, Inc. or its affiliates. All Rights
|
||||
* reserved.
|
||||
* Copyright (c) 2023 Triad National Security, LLC. All rights reserved.
|
||||
* $COPYRIGHT$
|
||||
*
|
||||
* Additional copyrights may follow
|
||||
*
|
||||
* $HEADER$
|
||||
*/
|
||||
|
||||
/** @file
|
||||
*
|
||||
* Atomic operations.
|
||||
*
|
||||
* This API is patterned after the FreeBSD kernel atomic interface
|
||||
* (which is influenced by Intel's ia64 architecture). The
|
||||
* FreeBSD interface is documented at
|
||||
*
|
||||
* http://www.freebsd.org/cgi/man.cgi?query=atomic&sektion=9
|
||||
*
|
||||
* Only the necessary subset of functions are implemented here.
|
||||
*
|
||||
* The following #defines will be true / false based on
|
||||
* assembly support:
|
||||
*
|
||||
* - \c PMIX_HAVE_ATOMIC_MEM_BARRIER atomic memory barriers
|
||||
* - \c PMIX_HAVE_ATOMIC_SPINLOCKS atomic spinlocks
|
||||
* - \c PMIX_HAVE_ATOMIC_MATH_32 if 32 bit add/sub/compare-exchange can be done "atomically"
|
||||
* - \c PMIX_HAVE_ATOMIC_MATH_64 if 64 bit add/sub/compare-exchange can be done "atomically"
|
||||
*
|
||||
* Note that for the Atomic math, atomic add/sub may be implemented as
|
||||
* C code using pmix_atomic_compare_exchange. The appearance of atomic
|
||||
* operation will be upheld in these cases.
|
||||
*/
|
||||
|
||||
#ifndef PMIX_SYS_ATOMIC_H
|
||||
#define PMIX_SYS_ATOMIC_H 1
|
||||
|
||||
#include "src/include/pmix_config.h"
|
||||
#include "src/include/pmix_stdatomic.h"
|
||||
|
||||
#if PMIX_USE_C11_ATOMICS
|
||||
|
||||
#include <stdatomic.h>
|
||||
|
||||
static inline void pmix_atomic_wmb(void)
|
||||
{
|
||||
atomic_thread_fence(memory_order_release);
|
||||
}
|
||||
|
||||
static inline void pmix_atomic_rmb(void)
|
||||
{
|
||||
# if defined(PMIX_ATOMIC_X86_64)
|
||||
/* work around a bug in older gcc versions (observed in gcc 6.x)
|
||||
* where acquire seems to get treated as a no-op instead of being
|
||||
* equivalent to __asm__ __volatile__("": : :"memory") on x86_64 */
|
||||
__asm__ __volatile__("" : : : "memory");
|
||||
# else
|
||||
atomic_thread_fence(memory_order_acquire);
|
||||
# endif
|
||||
}
|
||||
|
||||
#define PMIX_ATOMIC_DEFINE_OP(type, bits, operator, name) \
|
||||
static inline type \
|
||||
pmix_atomic_fetch_##name##_##bits(pmix_atomic_##type *addr, type value) \
|
||||
{ \
|
||||
return atomic_fetch_##name##_explicit( \
|
||||
addr, value, memory_order_relaxed); \
|
||||
} \
|
||||
\
|
||||
static inline type \
|
||||
pmix_atomic_##name##_fetch_##bits(pmix_atomic_##type *addr, type value) \
|
||||
{ \
|
||||
return atomic_fetch_##name##_explicit( \
|
||||
addr, value, memory_order_relaxed) operator value; \
|
||||
}
|
||||
|
||||
/* end of PMIX_USE_C11_ATOMICS */
|
||||
#elif PMIX_USE_GCC_BUILTIN_ATOMICS
|
||||
|
||||
static inline void pmix_atomic_wmb(void)
|
||||
{
|
||||
__atomic_thread_fence(__ATOMIC_RELEASE);
|
||||
}
|
||||
|
||||
static inline void pmix_atomic_rmb(void)
|
||||
{
|
||||
#if defined(PMIX_ATOMIC_X86_64)
|
||||
/* work around a bug in older gcc versions where ACQUIRE seems to get
|
||||
* treated as a no-op instead of being equivalent to
|
||||
* __asm__ __volatile__("": : :"memory") */
|
||||
__asm__ __volatile__("" : : : "memory");
|
||||
#else
|
||||
__atomic_thread_fence(__ATOMIC_ACQUIRE);
|
||||
#endif
|
||||
}
|
||||
|
||||
#define PMIX_ATOMIC_DEFINE_OP(type, bits, operator, name) \
|
||||
static inline type \
|
||||
pmix_atomic_fetch_##name##_##bits(pmix_atomic_##type *addr, type value) \
|
||||
{ \
|
||||
return __atomic_fetch_##name(addr, value, __ATOMIC_RELAXED); \
|
||||
} \
|
||||
\
|
||||
static inline type \
|
||||
pmix_atomic_##name##_fetch_##bits(pmix_atomic_##type *addr, type value) \
|
||||
{ \
|
||||
return __atomic_##name##_fetch(addr, value, __ATOMIC_RELAXED); \
|
||||
}
|
||||
|
||||
/* end of PMIX_USE_GCC_BUILTIN_ATOMICS */
|
||||
#else
|
||||
#error OpenPMIx requires either C11 atomics support or GCC built-in atomics.
|
||||
#endif
|
||||
|
||||
PMIX_ATOMIC_DEFINE_OP(int32_t, 32, +, add)
|
||||
PMIX_ATOMIC_DEFINE_OP(int32_t, 32, &, and)
|
||||
PMIX_ATOMIC_DEFINE_OP(int32_t, 32, |, or)
|
||||
PMIX_ATOMIC_DEFINE_OP(int32_t, 32, ^, xor)
|
||||
PMIX_ATOMIC_DEFINE_OP(int32_t, 32, -, sub)
|
||||
|
||||
#endif /* PMIX_SYS_ATOMIC_H */
|
||||
886
macx64/mpi/openmpi/include/pmix/src/include/pmix_config.h
Normal file
886
macx64/mpi/openmpi/include/pmix/src/include/pmix_config.h
Normal file
@@ -0,0 +1,886 @@
|
||||
/* src/include/pmix_config.h. Generated from pmix_config.h.in by configure. */
|
||||
/* src/include/pmix_config.h.in. Generated from configure.ac by autoheader. */
|
||||
|
||||
/* -*- c -*-
|
||||
*
|
||||
* Copyright (c) 2004-2005 The Trustees of Indiana University.
|
||||
* All rights reserved.
|
||||
* Copyright (c) 2004-2005 The Trustees of the University of Tennessee.
|
||||
* All rights reserved.
|
||||
* Copyright (c) 2004-2005 High Performance Computing Center Stuttgart,
|
||||
* University of Stuttgart. All rights reserved.
|
||||
* Copyright (c) 2004-2005 The Regents of the University of California.
|
||||
* All rights reserved.
|
||||
* Copyright (c) 2013-2015 Intel, Inc. All rights reserved
|
||||
* Copyright (c) 2016 IBM Corporation. All rights reserved.
|
||||
* $COPYRIGHT$
|
||||
*
|
||||
* Additional copyrights may follow
|
||||
*
|
||||
* $HEADER$
|
||||
*
|
||||
* This file is automatically generated by configure. Edits will be lost
|
||||
* the next time you run configure!
|
||||
*/
|
||||
|
||||
#ifndef PMIX_CONFIG_H
|
||||
#define PMIX_CONFIG_H
|
||||
|
||||
#include "src/include/pmix_config_top.h"
|
||||
|
||||
|
||||
|
||||
/* Define if building universal (internal helper macro) */
|
||||
/* #undef AC_APPLE_UNIVERSAL_BUILD */
|
||||
|
||||
/* The normal alignment of `bool', in bytes. */
|
||||
#define ALIGNOF_BOOL 1
|
||||
|
||||
/* The normal alignment of `double', in bytes. */
|
||||
#define ALIGNOF_DOUBLE 8
|
||||
|
||||
/* The normal alignment of `int', in bytes. */
|
||||
#define ALIGNOF_INT 4
|
||||
|
||||
/* The normal alignment of `long', in bytes. */
|
||||
#define ALIGNOF_LONG 8
|
||||
|
||||
/* The normal alignment of `long long', in bytes. */
|
||||
#define ALIGNOF_LONG_LONG 8
|
||||
|
||||
/* The normal alignment of `size_t', in bytes. */
|
||||
#define ALIGNOF_SIZE_T 8
|
||||
|
||||
/* Define to 1 if you have the <arpa/inet.h> header file. */
|
||||
#define HAVE_ARPA_INET_H 1
|
||||
|
||||
/* Define to 1 if you have the `asprintf' function. */
|
||||
#define HAVE_ASPRINTF 1
|
||||
|
||||
/* Define to 1 if you have the `atexit' function. */
|
||||
#define HAVE_ATEXIT 1
|
||||
|
||||
/* Define to 1 if you have the <crt_externs.h> header file. */
|
||||
#define HAVE_CRT_EXTERNS_H 1
|
||||
|
||||
/* Define to 1 if you have the declaration of `AF_INET6', and to 0 if you
|
||||
don't. */
|
||||
#define HAVE_DECL_AF_INET6 1
|
||||
|
||||
/* Define to 1 if you have the declaration of `AF_UNSPEC', and to 0 if you
|
||||
don't. */
|
||||
#define HAVE_DECL_AF_UNSPEC 1
|
||||
|
||||
/* Define to 1 if you have the declaration of `HZ', and to 0 if you don't. */
|
||||
/* #undef HAVE_DECL_HZ */
|
||||
|
||||
/* Define to 1 if you have the declaration of `PF_INET6', and to 0 if you
|
||||
don't. */
|
||||
#define HAVE_DECL_PF_INET6 1
|
||||
|
||||
/* Define to 1 if you have the declaration of `PF_UNSPEC', and to 0 if you
|
||||
don't. */
|
||||
#define HAVE_DECL_PF_UNSPEC 1
|
||||
|
||||
/* Define to 1 if you have the declaration of `__func__', and to 0 if you
|
||||
don't. */
|
||||
#define HAVE_DECL___FUNC__ 1
|
||||
|
||||
/* Define to 1 if you have the <dirent.h> header file. */
|
||||
#define HAVE_DIRENT_H 1
|
||||
|
||||
/* Define to 1 if you have the <dlfcn.h> header file. */
|
||||
#define HAVE_DLFCN_H 1
|
||||
|
||||
/* Define to 1 if you have the `execve' function. */
|
||||
#define HAVE_EXECVE 1
|
||||
|
||||
/* Define to 1 if you have the <fcntl.h> header file. */
|
||||
#define HAVE_FCNTL_H 1
|
||||
|
||||
/* Define to 1 if you have the `fork' function. */
|
||||
#define HAVE_FORK 1
|
||||
|
||||
/* Define to 1 if you have the `getpeereid' function. */
|
||||
#define HAVE_GETPEEREID 1
|
||||
|
||||
/* Define to 1 if you have the `getpeerucred' function. */
|
||||
/* #undef HAVE_GETPEERUCRED */
|
||||
|
||||
/* Define to 1 if you have the <grp.h> header file. */
|
||||
#define HAVE_GRP_H 1
|
||||
|
||||
/* Define to 1 if you have the <hostLib.h> header file. */
|
||||
/* #undef HAVE_HOSTLIB_H */
|
||||
|
||||
/* Define to 1 if you have the <ifaddrs.h> header file. */
|
||||
#define HAVE_IFADDRS_H 1
|
||||
|
||||
/* Define to 1 if the system has the type `int16_t'. */
|
||||
#define HAVE_INT16_T 1
|
||||
|
||||
/* Define to 1 if the system has the type `int32_t'. */
|
||||
#define HAVE_INT32_T 1
|
||||
|
||||
/* Define to 1 if the system has the type `int64_t'. */
|
||||
#define HAVE_INT64_T 1
|
||||
|
||||
/* Define to 1 if the system has the type `int8_t'. */
|
||||
#define HAVE_INT8_T 1
|
||||
|
||||
/* Define to 1 if the system has the type `intptr_t'. */
|
||||
#define HAVE_INTPTR_T 1
|
||||
|
||||
/* Define to 1 if you have the <inttypes.h> header file. */
|
||||
#define HAVE_INTTYPES_H 1
|
||||
|
||||
/* Define to 1 if you have the <ioLib.h> header file. */
|
||||
/* #undef HAVE_IOLIB_H */
|
||||
|
||||
/* Define to 1 if you have the <libgen.h> header file. */
|
||||
#define HAVE_LIBGEN_H 1
|
||||
|
||||
/* Define to 1 if you have the <libutil.h> header file. */
|
||||
/* #undef HAVE_LIBUTIL_H */
|
||||
|
||||
/* Define to 1 if you have the <limits.h> header file. */
|
||||
#define HAVE_LIMITS_H 1
|
||||
|
||||
/* Define to 1 if the system has the type `long long'. */
|
||||
#define HAVE_LONG_LONG 1
|
||||
|
||||
/* Define to 1 if you have the <minix/config.h> header file. */
|
||||
/* #undef HAVE_MINIX_CONFIG_H */
|
||||
|
||||
/* Define to 1 if you have the <mntent.h> header file. */
|
||||
/* #undef HAVE_MNTENT_H */
|
||||
|
||||
/* Define to 1 if you have the <netdb.h> header file. */
|
||||
#define HAVE_NETDB_H 1
|
||||
|
||||
/* Define to 1 if you have the <netinet/in.h> header file. */
|
||||
#define HAVE_NETINET_IN_H 1
|
||||
|
||||
/* Define to 1 if you have the <netinet/tcp.h> header file. */
|
||||
#define HAVE_NETINET_TCP_H 1
|
||||
|
||||
/* Define to 1 if you have the <net/if.h> header file. */
|
||||
#define HAVE_NET_IF_H 1
|
||||
|
||||
/* Define to 1 if you have the <net/uio.h> header file. */
|
||||
/* #undef HAVE_NET_UIO_H */
|
||||
|
||||
/* Define to 1 if you have the `openpty' function. */
|
||||
#define HAVE_OPENPTY 1
|
||||
|
||||
/* Define to 1 if you have the `posix_fallocate' function. */
|
||||
/* #undef HAVE_POSIX_FALLOCATE */
|
||||
|
||||
/* Define to 1 if you have the `pthread_setaffinity_np' function. */
|
||||
/* #undef HAVE_PTHREAD_SETAFFINITY_NP */
|
||||
|
||||
/* Define to 1 if the system has the type `ptrdiff_t'. */
|
||||
#define HAVE_PTRDIFF_T 1
|
||||
|
||||
/* Define to 1 if you have the `ptsname' function. */
|
||||
#define HAVE_PTSNAME 1
|
||||
|
||||
/* Define to 1 if you have the <pty.h> header file. */
|
||||
/* #undef HAVE_PTY_H */
|
||||
|
||||
/* Define to 1 if you have the `setenv' function. */
|
||||
#define HAVE_SETENV 1
|
||||
|
||||
/* Define to 1 if you have the `setpgid' function. */
|
||||
#define HAVE_SETPGID 1
|
||||
|
||||
/* Define to 1 if `si_band' is a member of `siginfo_t'. */
|
||||
#define HAVE_SIGINFO_T_SI_BAND 1
|
||||
|
||||
/* Define to 1 if `si_fd' is a member of `siginfo_t'. */
|
||||
/* #undef HAVE_SIGINFO_T_SI_FD */
|
||||
|
||||
/* Define to 1 if you have the <signal.h> header file. */
|
||||
#define HAVE_SIGNAL_H 1
|
||||
|
||||
/* Define to 1 if you have the `snprintf' function. */
|
||||
#define HAVE_SNPRINTF 1
|
||||
|
||||
/* Define to 1 if you have the `socketpair' function. */
|
||||
#define HAVE_SOCKETPAIR 1
|
||||
|
||||
/* Define to 1 if the system has the type `socklen_t'. */
|
||||
#define HAVE_SOCKLEN_T 1
|
||||
|
||||
/* Define to 1 if you have the <sockLib.h> header file. */
|
||||
/* #undef HAVE_SOCKLIB_H */
|
||||
|
||||
/* Define to 1 if you have the `statfs' function. */
|
||||
#define HAVE_STATFS 1
|
||||
|
||||
/* Define to 1 if you have the `statvfs' function. */
|
||||
#define HAVE_STATVFS 1
|
||||
|
||||
/* Define to 1 if you have the <stdarg.h> header file. */
|
||||
#define HAVE_STDARG_H 1
|
||||
|
||||
/* Define to 1 if you have the <stdatomic.h> header file. */
|
||||
#define HAVE_STDATOMIC_H 1
|
||||
|
||||
/* Define to 1 if you have the <stdbool.h> header file. */
|
||||
#define HAVE_STDBOOL_H 1
|
||||
|
||||
/* Define to 1 if you have the <stddef.h> header file. */
|
||||
#define HAVE_STDDEF_H 1
|
||||
|
||||
/* Define to 1 if you have the <stdint.h> header file. */
|
||||
#define HAVE_STDINT_H 1
|
||||
|
||||
/* Define to 1 if you have the <stdio.h> header file. */
|
||||
#define HAVE_STDIO_H 1
|
||||
|
||||
/* Define to 1 if you have the <stdlib.h> header file. */
|
||||
#define HAVE_STDLIB_H 1
|
||||
|
||||
/* Define to 1 if you have the <strings.h> header file. */
|
||||
#define HAVE_STRINGS_H 1
|
||||
|
||||
/* Define to 1 if you have the <string.h> header file. */
|
||||
#define HAVE_STRING_H 1
|
||||
|
||||
/* Define to 1 if you have the `strncpy_s' function. */
|
||||
/* #undef HAVE_STRNCPY_S */
|
||||
|
||||
/* Define to 1 if you have the `strnlen' function. */
|
||||
#define HAVE_STRNLEN 1
|
||||
|
||||
/* Define to 1 if you have the <stropts.h> header file. */
|
||||
/* #undef HAVE_STROPTS_H */
|
||||
|
||||
/* Define to 1 if you have the `strsignal' function. */
|
||||
#define HAVE_STRSIGNAL 1
|
||||
|
||||
/* Define to 1 if `d_type' is a member of `struct dirent'. */
|
||||
#define HAVE_STRUCT_DIRENT_D_TYPE 1
|
||||
|
||||
/* Define to 1 if `ifr_hwaddr' is a member of `struct ifreq'. */
|
||||
/* #undef HAVE_STRUCT_IFREQ_IFR_HWADDR */
|
||||
|
||||
/* Define to 1 if `ifr_mtu' is a member of `struct ifreq'. */
|
||||
/* #undef HAVE_STRUCT_IFREQ_IFR_MTU */
|
||||
|
||||
/* Define to 1 if the system has the type `struct sockaddr_in'. */
|
||||
#define HAVE_STRUCT_SOCKADDR_IN 1
|
||||
|
||||
/* Define to 1 if the system has the type `struct sockaddr_in6'. */
|
||||
#define HAVE_STRUCT_SOCKADDR_IN6 1
|
||||
|
||||
/* Define to 1 if `sa_len' is a member of `struct sockaddr'. */
|
||||
#define HAVE_STRUCT_SOCKADDR_SA_LEN 1
|
||||
|
||||
/* Define to 1 if the system has the type `struct sockaddr_storage'. */
|
||||
#define HAVE_STRUCT_SOCKADDR_STORAGE 1
|
||||
|
||||
/* Define to 1 if the system has the type `struct sockaddr_un'. */
|
||||
#define HAVE_STRUCT_SOCKADDR_UN 1
|
||||
|
||||
/* Define to 1 if `uid' is a member of `struct sockpeercred'. */
|
||||
/* #undef HAVE_STRUCT_SOCKPEERCRED_UID */
|
||||
|
||||
/* Define to 1 if `f_fstypename' is a member of `struct statfs'. */
|
||||
#define HAVE_STRUCT_STATFS_F_FSTYPENAME 1
|
||||
|
||||
/* Define to 1 if `f_type' is a member of `struct statfs'. */
|
||||
/* #undef HAVE_STRUCT_STATFS_F_TYPE */
|
||||
|
||||
/* Define to 1 if `f_basetype' is a member of `struct statvfs'. */
|
||||
/* #undef HAVE_STRUCT_STATVFS_F_BASETYPE */
|
||||
|
||||
/* Define to 1 if `f_fstypename' is a member of `struct statvfs'. */
|
||||
/* #undef HAVE_STRUCT_STATVFS_F_FSTYPENAME */
|
||||
|
||||
/* Define to 1 if `cr_uid' is a member of `struct ucred'. */
|
||||
/* #undef HAVE_STRUCT_UCRED_CR_UID */
|
||||
|
||||
/* Define to 1 if `uid' is a member of `struct ucred'. */
|
||||
/* #undef HAVE_STRUCT_UCRED_UID */
|
||||
|
||||
/* Define to 1 if you have the <syslog.h> header file. */
|
||||
#define HAVE_SYSLOG_H 1
|
||||
|
||||
/* Define to 1 if you have the <sys/auxv.h> header file. */
|
||||
/* #undef HAVE_SYS_AUXV_H */
|
||||
|
||||
/* Define to 1 if you have the <sys/cdefs.h> header file. */
|
||||
#define HAVE_SYS_CDEFS_H 1
|
||||
|
||||
/* Define to 1 if you have the <sys/fcntl.h> header file. */
|
||||
#define HAVE_SYS_FCNTL_H 1
|
||||
|
||||
/* Define to 1 if you have the <sys/ioctl.h> header file. */
|
||||
#define HAVE_SYS_IOCTL_H 1
|
||||
|
||||
/* Define to 1 if you have the <sys/mount.h> header file. */
|
||||
#define HAVE_SYS_MOUNT_H 1
|
||||
|
||||
/* Define to 1 if you have the <sys/param.h> header file. */
|
||||
#define HAVE_SYS_PARAM_H 1
|
||||
|
||||
/* Define to 1 if you have the <sys/select.h> header file. */
|
||||
#define HAVE_SYS_SELECT_H 1
|
||||
|
||||
/* Define to 1 if you have the <sys/socket.h> header file. */
|
||||
#define HAVE_SYS_SOCKET_H 1
|
||||
|
||||
/* Define to 1 if you have the <sys/sockio.h> header file. */
|
||||
#define HAVE_SYS_SOCKIO_H 1
|
||||
|
||||
/* Define to 1 if you have the <sys/statfs.h> header file. */
|
||||
/* #undef HAVE_SYS_STATFS_H */
|
||||
|
||||
/* Define to 1 if you have the <sys/statvfs.h> header file. */
|
||||
#define HAVE_SYS_STATVFS_H 1
|
||||
|
||||
/* Define to 1 if you have the <sys/stat.h> header file. */
|
||||
#define HAVE_SYS_STAT_H 1
|
||||
|
||||
/* Define to 1 if you have the <sys/sysctl.h> header file. */
|
||||
#define HAVE_SYS_SYSCTL_H 1
|
||||
|
||||
/* Define to 1 if you have the <sys/time.h> header file. */
|
||||
#define HAVE_SYS_TIME_H 1
|
||||
|
||||
/* Define to 1 if you have the <sys/types.h> header file. */
|
||||
#define HAVE_SYS_TYPES_H 1
|
||||
|
||||
/* Define to 1 if you have the <sys/uio.h> header file. */
|
||||
#define HAVE_SYS_UIO_H 1
|
||||
|
||||
/* Define to 1 if you have the <sys/un.h> header file. */
|
||||
#define HAVE_SYS_UN_H 1
|
||||
|
||||
/* Define to 1 if you have the <sys/utsname.h> header file. */
|
||||
#define HAVE_SYS_UTSNAME_H 1
|
||||
|
||||
/* Define to 1 if you have the <sys/wait.h> header file. */
|
||||
#define HAVE_SYS_WAIT_H 1
|
||||
|
||||
/* Define to 1 if you have the `tcgetpgrp' function. */
|
||||
#define HAVE_TCGETPGRP 1
|
||||
|
||||
/* Define to 1 if you have the <termios.h> header file. */
|
||||
#define HAVE_TERMIOS_H 1
|
||||
|
||||
/* Define to 1 if you have the <termio.h> header file. */
|
||||
/* #undef HAVE_TERMIO_H */
|
||||
|
||||
/* Define to 1 if you have the <time.h> header file. */
|
||||
#define HAVE_TIME_H 1
|
||||
|
||||
/* Define to 1 if you have the <ucred.h> header file. */
|
||||
/* #undef HAVE_UCRED_H */
|
||||
|
||||
/* Define to 1 if the system has the type `uint128_t'. */
|
||||
/* #undef HAVE_UINT128_T */
|
||||
|
||||
/* Define to 1 if the system has the type `uint16_t'. */
|
||||
#define HAVE_UINT16_T 1
|
||||
|
||||
/* Define to 1 if the system has the type `uint32_t'. */
|
||||
#define HAVE_UINT32_T 1
|
||||
|
||||
/* Define to 1 if the system has the type `uint64_t'. */
|
||||
#define HAVE_UINT64_T 1
|
||||
|
||||
/* Define to 1 if the system has the type `uint8_t'. */
|
||||
#define HAVE_UINT8_T 1
|
||||
|
||||
/* Define to 1 if the system has the type `uintptr_t'. */
|
||||
#define HAVE_UINTPTR_T 1
|
||||
|
||||
/* Define to 1 if you have the <unistd.h> header file. */
|
||||
#define HAVE_UNISTD_H 1
|
||||
|
||||
/* whether unix byteswap routines -- htonl, htons, nothl, ntohs -- are
|
||||
available */
|
||||
#define HAVE_UNIX_BYTESWAP 1
|
||||
|
||||
/* Define to 1 if you have the `usleep' function. */
|
||||
#define HAVE_USLEEP 1
|
||||
|
||||
/* Define to 1 if you have the <util.h> header file. */
|
||||
#define HAVE_UTIL_H 1
|
||||
|
||||
/* Define to 1 if you have the <utmp.h> header file. */
|
||||
#define HAVE_UTMP_H 1
|
||||
|
||||
/* Define to 1 if you have the `vasprintf' function. */
|
||||
#define HAVE_VASPRINTF 1
|
||||
|
||||
/* Define to 1 if you have the `vsnprintf' function. */
|
||||
#define HAVE_VSNPRINTF 1
|
||||
|
||||
/* Define to 1 if you have the `waitpid' function. */
|
||||
#define HAVE_WAITPID 1
|
||||
|
||||
/* Define to 1 if you have the <wchar.h> header file. */
|
||||
#define HAVE_WCHAR_H 1
|
||||
|
||||
/* Define to 1 if the system has the type `__int128'. */
|
||||
#define HAVE___INT128 1
|
||||
|
||||
/* Define to the sub-directory where libtool stores uninstalled libraries. */
|
||||
#define LT_OBJDIR ".libs/"
|
||||
|
||||
/* Whether or not we have apple */
|
||||
#define OAC_HAVE_APPLE 1
|
||||
|
||||
/* Whether or not we have solaris */
|
||||
#define OAC_HAVE_SOLARIS 0
|
||||
|
||||
/* Define to the address where bug reports for this package should be sent. */
|
||||
#define PACKAGE_BUGREPORT "https://github.com/openpmix/openpmix/issues"
|
||||
|
||||
/* Define to the full name of this package. */
|
||||
#define PACKAGE_NAME "pmix"
|
||||
|
||||
/* Define to the full name and version of this package. */
|
||||
#define PACKAGE_STRING "pmix 5.0.5"
|
||||
|
||||
/* Define to the one symbol short name of this package. */
|
||||
#define PACKAGE_TARNAME "pmix"
|
||||
|
||||
/* Define to the home page for this package. */
|
||||
#define PACKAGE_URL ""
|
||||
|
||||
/* Define to the version of this package. */
|
||||
#define PACKAGE_VERSION "5.0.5"
|
||||
|
||||
/* The compiler $lower which OMPI was built with */
|
||||
#define PMIX_BUILD_PLATFORM_COMPILER_FAMILYID 0
|
||||
|
||||
/* The compiler $lower which OMPI was built with */
|
||||
#define PMIX_BUILD_PLATFORM_COMPILER_VERSION 0
|
||||
|
||||
/* PMIx underlying C compiler */
|
||||
#define PMIX_CC "gcc"
|
||||
|
||||
/* Capture the configure cmd line */
|
||||
#define PMIX_CONFIGURE_CLI " \'--disable-option-checking\' \'--prefix=/Users/girgis/Documents/code/cpp-thirdparty-src/mpi/openmpi/install/5.0.7\' \'--without-tests-examples\' \'--enable-pmix-binaries\' \'--disable-pmix-backward-compatibility\' \'--disable-visibility\' \'--disable-devel-check\' \'--with-libevent\' \'--disable-libevent-lib-checks\' \'--with-libevent-extra-libs=/Users/girgis/Documents/code/cpp-thirdparty-src/mpi/openmpi/build/5.0.7/3rd-party/libevent-2.1.12-stable-ompi/libevent_core.la /Users/girgis/Documents/code/cpp-thirdparty-src/mpi/openmpi/build/5.0.7/3rd-party/libevent-2.1.12-stable-ompi/libevent_pthreads.la\' \'--disable-hwloc-lib-checks\' \'--with-hwloc-extra-libs=/Users/girgis/Documents/code/cpp-thirdparty-src/mpi/openmpi/build/5.0.7/3rd-party/hwloc-2.7.1/hwloc/libhwloc.la\' \'--with-wrapper-libs=-levent_core -levent_pthreads \' \'--disable-vt\' \'--disable-mpi-cxx\' \'--disable-static\' \'--disable-wrapper-rpath\' \'--disable-wrapper-runpath\' \'--disable-dlopen\' \'--enable-mca-static=allocator,bml,btl-sm,btl-self,coll,common-sm,errmgr,gpr,io,iof,maffinity-first_use,mpool-sm,ns,odls,oob,osc,pls,pml,ras,rcache,rds,rmaps,rmgr,rml,sds,topo\' \'CFLAGS=-O3\' \'CPPFLAGS=-I/Users/girgis/Documents/code/cpp-thirdparty-src/mpi/openmpi/build/5.0.7/3rd-party/libevent-2.1.12-stable-ompi -I/Users/girgis/Documents/code/cpp-thirdparty-src/mpi/openmpi/build/5.0.7/3rd-party/libevent-2.1.12-stable-ompi/include -I/Users/girgis/Documents/code/cpp-thirdparty-src/mpi/openmpi/build/5.0.7/3rd-party/hwloc-2.7.1/include -I/Users/girgis/Documents/code/cpp-thirdparty-src/mpi/openmpi/build/openmpi-5.0.7/3rd-party/hwloc-2.7.1/include\' \'--cache-file=/dev/null\' \'--srcdir=/Users/girgis/Documents/code/cpp-thirdparty-src/mpi/openmpi/build/openmpi-5.0.7/3rd-party/openpmix\'"
|
||||
|
||||
/* Date when PMIx was built */
|
||||
#define PMIX_CONFIGURE_DATE "Wed Mar 19 13:29:30 UTC 2025"
|
||||
|
||||
/* Hostname where PMIx was built */
|
||||
#define PMIX_CONFIGURE_HOST "hera.local"
|
||||
|
||||
/* User who built PMIx */
|
||||
#define PMIX_CONFIGURE_USER "girgis"
|
||||
|
||||
/* Whether C compiler supports GCC style inline assembly */
|
||||
#define PMIX_C_GCC_INLINE_ASSEMBLY 1
|
||||
|
||||
/* Whether C compiler supports atomic convenience variables in stdatomic.h */
|
||||
#define PMIX_C_HAVE_ATOMIC_CONV_VAR 1
|
||||
|
||||
/* Whether C compiler supports __builtin_clz */
|
||||
#define PMIX_C_HAVE_BUILTIN_CLZ 0
|
||||
|
||||
/* Whether C compiler supports __builtin_expect */
|
||||
#define PMIX_C_HAVE_BUILTIN_EXPECT 1
|
||||
|
||||
/* Whether C compiler supports __builtin_prefetch */
|
||||
#define PMIX_C_HAVE_BUILTIN_PREFETCH 0
|
||||
|
||||
/* Whether C compiler supports __Atomic keyword */
|
||||
#define PMIX_C_HAVE__ATOMIC 1
|
||||
|
||||
/* Whether C compiler supports __Generic keyword */
|
||||
#define PMIX_C_HAVE__GENERIC 1
|
||||
|
||||
/* Whether C compiler supports _Static_assert keyword */
|
||||
#define PMIX_C_HAVE__STATIC_ASSERT 1
|
||||
|
||||
/* Whether C compiler supports __Thread_local */
|
||||
#define PMIX_C_HAVE__THREAD_LOCAL 1
|
||||
|
||||
/* Whether C compiler supports __thread */
|
||||
#define PMIX_C_HAVE___THREAD 1
|
||||
|
||||
/* Whether we want developer-level debugging code or not */
|
||||
#define PMIX_ENABLE_DEBUG 0
|
||||
|
||||
/* Whether we want to enable dlopen support */
|
||||
#define PMIX_ENABLE_DLOPEN_SUPPORT 0
|
||||
|
||||
/* Enable IPv6 support, but only if the underlying system supports it */
|
||||
#define PMIX_ENABLE_IPV6 0
|
||||
|
||||
/* Whether we should enable thread support within the PMIX code base */
|
||||
#define PMIX_ENABLE_MULTI_THREADS 1
|
||||
|
||||
/* Whether user wants PTY support or not */
|
||||
#define PMIX_ENABLE_PTY_SUPPORT 1
|
||||
|
||||
/* Whether we want developer-level timing support or not */
|
||||
#define PMIX_ENABLE_TIMING 0
|
||||
|
||||
/* If built from a git repo */
|
||||
/* #undef PMIX_GIT_REPO_BUILD */
|
||||
|
||||
/* Whether your compiler has __attribute__ or not */
|
||||
#define PMIX_HAVE_ATTRIBUTE 1
|
||||
|
||||
/* Whether your compiler has __attribute__ aligned or not */
|
||||
#define PMIX_HAVE_ATTRIBUTE_ALIGNED 1
|
||||
|
||||
/* Whether your compiler has __attribute__ always_inline or not */
|
||||
#define PMIX_HAVE_ATTRIBUTE_ALWAYS_INLINE 1
|
||||
|
||||
/* Whether your compiler has __attribute__ cold or not */
|
||||
#define PMIX_HAVE_ATTRIBUTE_COLD 1
|
||||
|
||||
/* Whether your compiler has __attribute__ const or not */
|
||||
#define PMIX_HAVE_ATTRIBUTE_CONST 1
|
||||
|
||||
/* Whether your compiler has __attribute__ deprecated or not */
|
||||
#define PMIX_HAVE_ATTRIBUTE_DEPRECATED 1
|
||||
|
||||
/* Whether your compiler has __attribute__ deprecated with optional argument
|
||||
*/
|
||||
#define PMIX_HAVE_ATTRIBUTE_DEPRECATED_ARGUMENT 1
|
||||
|
||||
/* Whether your compiler has __attribute__ destructor or not */
|
||||
#define PMIX_HAVE_ATTRIBUTE_DESTRUCTOR 1
|
||||
|
||||
/* Whether your compiler has __attribute__ extension or not */
|
||||
#define PMIX_HAVE_ATTRIBUTE_EXTENSION 1
|
||||
|
||||
/* Whether your compiler has __attribute__ format or not */
|
||||
#define PMIX_HAVE_ATTRIBUTE_FORMAT 1
|
||||
|
||||
/* Whether your compiler has __attribute__ format and it works on function
|
||||
pointers */
|
||||
#define PMIX_HAVE_ATTRIBUTE_FORMAT_FUNCPTR 1
|
||||
|
||||
/* Whether your compiler has __attribute__ hot or not */
|
||||
#define PMIX_HAVE_ATTRIBUTE_HOT 1
|
||||
|
||||
/* Whether your compiler has __attribute__ malloc or not */
|
||||
#define PMIX_HAVE_ATTRIBUTE_MALLOC 1
|
||||
|
||||
/* Whether your compiler has __attribute__ may_alias or not */
|
||||
#define PMIX_HAVE_ATTRIBUTE_MAY_ALIAS 1
|
||||
|
||||
/* Whether your compiler has __attribute__ nonnull or not */
|
||||
#define PMIX_HAVE_ATTRIBUTE_NONNULL 1
|
||||
|
||||
/* Whether your compiler has __attribute__ noreturn or not */
|
||||
#define PMIX_HAVE_ATTRIBUTE_NORETURN 1
|
||||
|
||||
/* Whether your compiler has __attribute__ noreturn and it works on function
|
||||
pointers */
|
||||
#define PMIX_HAVE_ATTRIBUTE_NORETURN_FUNCPTR 1
|
||||
|
||||
/* Whether your compiler has __attribute__ no_instrument_function or not */
|
||||
#define PMIX_HAVE_ATTRIBUTE_NO_INSTRUMENT_FUNCTION 1
|
||||
|
||||
/* Whether your compiler has __attribute__ optnone or not */
|
||||
#define PMIX_HAVE_ATTRIBUTE_OPTNONE 1
|
||||
|
||||
/* Whether your compiler has __attribute__ packed or not */
|
||||
#define PMIX_HAVE_ATTRIBUTE_PACKED 1
|
||||
|
||||
/* Whether your compiler has __attribute__ pure or not */
|
||||
#define PMIX_HAVE_ATTRIBUTE_PURE 1
|
||||
|
||||
/* Whether your compiler has __attribute__ sentinel or not */
|
||||
#define PMIX_HAVE_ATTRIBUTE_SENTINEL 1
|
||||
|
||||
/* Whether your compiler has __attribute__ unused or not */
|
||||
#define PMIX_HAVE_ATTRIBUTE_UNUSED 1
|
||||
|
||||
/* Whether your compiler has __attribute__ visibility or not */
|
||||
#define PMIX_HAVE_ATTRIBUTE_VISIBILITY 1
|
||||
|
||||
/* Whether your compiler has __attribute__ warn unused result or not */
|
||||
#define PMIX_HAVE_ATTRIBUTE_WARN_UNUSED_RESULT 1
|
||||
|
||||
/* Whether your compiler has __attribute__ weak alias or not */
|
||||
#define PMIX_HAVE_ATTRIBUTE_WEAK_ALIAS
|
||||
|
||||
/* Whether C11 atomic compare swap is both supported and lock-free on 128-bit
|
||||
values */
|
||||
/* #undef PMIX_HAVE_C11_CSWAP_INT128 */
|
||||
|
||||
/* whether ceil is found and available */
|
||||
#define PMIX_HAVE_CEIL 1
|
||||
|
||||
/* Whether we have Clang __c11 atomic functions */
|
||||
#define PMIX_HAVE_CLANG_BUILTIN_ATOMIC_C11_FUNC 1
|
||||
|
||||
/* whether clock_gettime is found and available */
|
||||
#define PMIX_HAVE_CLOCK_GETTIME 1
|
||||
|
||||
/* whether dirname is found and available */
|
||||
#define PMIX_HAVE_DIRNAME 1
|
||||
|
||||
/* Whether the __atomic builtin atomic compare swap is both supported and
|
||||
lock-free on 128-bit values */
|
||||
#define PMIX_HAVE_GCC_BUILTIN_CSWAP_INT128 1
|
||||
|
||||
/* whether gethostbyname is found and available */
|
||||
#define PMIX_HAVE_GETHOSTBYNAME 1
|
||||
|
||||
/* Whether we are building against libev */
|
||||
#define PMIX_HAVE_LIBEV 0
|
||||
|
||||
/* Whether we are building against libevent */
|
||||
#define PMIX_HAVE_LIBEVENT 1
|
||||
|
||||
/* whether openpty is found and available */
|
||||
#define PMIX_HAVE_OPENPTY 1
|
||||
|
||||
/* Whether the PMIX PDL framework is functional or not */
|
||||
#define PMIX_HAVE_PDL_SUPPORT 0
|
||||
|
||||
/* If PTHREADS implementation supports PTHREAD_MUTEX_ERRORCHECK */
|
||||
#define PMIX_HAVE_PTHREAD_MUTEX_ERRORCHECK 1
|
||||
|
||||
/* If PTHREADS implementation supports PTHREAD_MUTEX_ERRORCHECK_NP */
|
||||
#define PMIX_HAVE_PTHREAD_MUTEX_ERRORCHECK_NP 0
|
||||
|
||||
/* Whether we have SA_RESTART in <signal.h> or not */
|
||||
#define PMIX_HAVE_SA_RESTART 1
|
||||
|
||||
/* whether socket is found and available */
|
||||
#define PMIX_HAVE_SOCKET 1
|
||||
|
||||
/* Whether the __sync builtin atomic compare and swap supports 128-bit values
|
||||
*/
|
||||
/* #undef PMIX_HAVE_SYNC_BUILTIN_CSWAP_INT128 */
|
||||
|
||||
/* Whether we have __va_copy or not */
|
||||
#define PMIX_HAVE_UNDERSCORE_VA_COPY 1
|
||||
|
||||
/* Whether we have va_copy or not */
|
||||
#define PMIX_HAVE_VA_COPY 1
|
||||
|
||||
/* Whether C compiler supports symbol visibility or not */
|
||||
#define PMIX_HAVE_VISIBILITY 0
|
||||
|
||||
/* ident string for PMIX */
|
||||
#define PMIX_IDENT_STRING ""
|
||||
|
||||
/* The library major version is always available, contrary to VERSION */
|
||||
#define PMIX_MAJOR_VERSION 5
|
||||
|
||||
/* Whether or not we are using memory sanitizers */
|
||||
#define PMIX_MEMORY_SANITIZERS 0
|
||||
|
||||
/* The library minor version is always available, contrary to VERSION */
|
||||
#define PMIX_MINOR_VERSION 0
|
||||
|
||||
/* Whether the C compiler supports "bool" without any other help (such as
|
||||
<stdbool.h>) */
|
||||
#define PMIX_NEED_C_BOOL 1
|
||||
|
||||
/* Whether libraries can be configured with destructor functions */
|
||||
#define PMIX_NO_LIB_DESTRUCTOR 0
|
||||
|
||||
/* package/branding string for PMIx */
|
||||
#define PMIX_PACKAGE_STRING "PMIx girgis@hera.local Distribution"
|
||||
|
||||
/* Whether we have lt_dladvise or not */
|
||||
#define PMIX_PDL_PLIBLTDL_HAVE_LT_DLADVISE 0
|
||||
|
||||
/* Whether or not we are using picky compiler settings */
|
||||
#define PMIX_PICKY_COMPILERS 0
|
||||
|
||||
/* Where to report bugs */
|
||||
#define PMIX_PROXY_BUGREPORT_STRING "https://github.com/openpmix/openpmix"
|
||||
|
||||
/* type to use for ptrdiff_t */
|
||||
#define PMIX_PTRDIFF_TYPE ptrdiff_t
|
||||
|
||||
/* The library release version is always available, contrary to VERSION */
|
||||
#define PMIX_RELEASE_VERSION 5
|
||||
|
||||
/* The OpenPMIx Git Revision */
|
||||
#define PMIX_REPO_REV "v5.0.5"
|
||||
|
||||
/* Default value for mca_base_component_show_load_errors MCA variable */
|
||||
#define PMIX_SHOW_LOAD_ERRORS_DEFAULT "all"
|
||||
|
||||
/* The PMIx Standard Provisional ABI compliance level(s) */
|
||||
#define PMIX_STD_ABI_PROVISIONAL_VERSION "0.0"
|
||||
|
||||
/* The PMIx Standard Stable ABI compliance level(s) */
|
||||
#define PMIX_STD_ABI_STABLE_VERSION "0.0"
|
||||
|
||||
/* The PMIx Standard compliance level */
|
||||
#define PMIX_STD_VERSION "4.2"
|
||||
|
||||
/* Whether to use C11 atomics for atomics implementation */
|
||||
#define PMIX_USE_C11_ATOMICS 0
|
||||
|
||||
/* Whether to use GCC-style built-in atomics for atomics implementation */
|
||||
#define PMIX_USE_GCC_BUILTIN_ATOMICS 1
|
||||
|
||||
/* Whether to use <stdbool.h> or not */
|
||||
#define PMIX_USE_STDBOOL_H 1
|
||||
|
||||
/* The library version is always available, contrary to VERSION */
|
||||
#define PMIX_VERSION "5.0.5"
|
||||
|
||||
/* Enable per-user config files */
|
||||
#define PMIX_WANT_HOME_CONFIG_FILES 1
|
||||
|
||||
/* if want pretty-print stack trace feature */
|
||||
#define PMIX_WANT_PRETTY_PRINT_STACKTRACE 1
|
||||
|
||||
/* The size of `int', as computed by sizeof. */
|
||||
#define SIZEOF_INT 4
|
||||
|
||||
/* The size of `long', as computed by sizeof. */
|
||||
#define SIZEOF_LONG 8
|
||||
|
||||
/* The size of `pid_t', as computed by sizeof. */
|
||||
#define SIZEOF_PID_T 4
|
||||
|
||||
/* The size of `short', as computed by sizeof. */
|
||||
#define SIZEOF_SHORT 2
|
||||
|
||||
/* The size of `size_t', as computed by sizeof. */
|
||||
#define SIZEOF_SIZE_T 8
|
||||
|
||||
/* The size of `void *', as computed by sizeof. */
|
||||
#define SIZEOF_VOID_P 8
|
||||
|
||||
/* The size of `_Bool', as computed by sizeof. */
|
||||
#define SIZEOF__BOOL 1
|
||||
|
||||
/* Define to 1 if all of the C90 standard headers exist (not just the ones
|
||||
required in a freestanding environment). This macro is provided for
|
||||
backward compatibility; new code need not use it. */
|
||||
#define STDC_HEADERS 1
|
||||
|
||||
/* Enable extensions on AIX 3, Interix. */
|
||||
#ifndef _ALL_SOURCE
|
||||
# define _ALL_SOURCE 1
|
||||
#endif
|
||||
/* Enable general extensions on macOS. */
|
||||
#ifndef _DARWIN_C_SOURCE
|
||||
# define _DARWIN_C_SOURCE 1
|
||||
#endif
|
||||
/* Enable general extensions on Solaris. */
|
||||
#ifndef __EXTENSIONS__
|
||||
# define __EXTENSIONS__ 1
|
||||
#endif
|
||||
/* Enable GNU extensions on systems that have them. */
|
||||
#ifndef _GNU_SOURCE
|
||||
# define _GNU_SOURCE 1
|
||||
#endif
|
||||
/* Enable X/Open compliant socket functions that do not require linking
|
||||
with -lxnet on HP-UX 11.11. */
|
||||
#ifndef _HPUX_ALT_XOPEN_SOCKET_API
|
||||
# define _HPUX_ALT_XOPEN_SOCKET_API 1
|
||||
#endif
|
||||
/* Identify the host operating system as Minix.
|
||||
This macro does not affect the system headers' behavior.
|
||||
A future release of Autoconf may stop defining this macro. */
|
||||
#ifndef _MINIX
|
||||
/* # undef _MINIX */
|
||||
#endif
|
||||
/* Enable general extensions on NetBSD.
|
||||
Enable NetBSD compatibility extensions on Minix. */
|
||||
#ifndef _NETBSD_SOURCE
|
||||
# define _NETBSD_SOURCE 1
|
||||
#endif
|
||||
/* Enable OpenBSD compatibility extensions on NetBSD.
|
||||
Oddly enough, this does nothing on OpenBSD. */
|
||||
#ifndef _OPENBSD_SOURCE
|
||||
# define _OPENBSD_SOURCE 1
|
||||
#endif
|
||||
/* Define to 1 if needed for POSIX-compatible behavior. */
|
||||
#ifndef _POSIX_SOURCE
|
||||
/* # undef _POSIX_SOURCE */
|
||||
#endif
|
||||
/* Define to 2 if needed for POSIX-compatible behavior. */
|
||||
#ifndef _POSIX_1_SOURCE
|
||||
/* # undef _POSIX_1_SOURCE */
|
||||
#endif
|
||||
/* Enable POSIX-compatible threading on Solaris. */
|
||||
#ifndef _POSIX_PTHREAD_SEMANTICS
|
||||
# define _POSIX_PTHREAD_SEMANTICS 1
|
||||
#endif
|
||||
/* Enable extensions specified by ISO/IEC TS 18661-5:2014. */
|
||||
#ifndef __STDC_WANT_IEC_60559_ATTRIBS_EXT__
|
||||
# define __STDC_WANT_IEC_60559_ATTRIBS_EXT__ 1
|
||||
#endif
|
||||
/* Enable extensions specified by ISO/IEC TS 18661-1:2014. */
|
||||
#ifndef __STDC_WANT_IEC_60559_BFP_EXT__
|
||||
# define __STDC_WANT_IEC_60559_BFP_EXT__ 1
|
||||
#endif
|
||||
/* Enable extensions specified by ISO/IEC TS 18661-2:2015. */
|
||||
#ifndef __STDC_WANT_IEC_60559_DFP_EXT__
|
||||
# define __STDC_WANT_IEC_60559_DFP_EXT__ 1
|
||||
#endif
|
||||
/* Enable extensions specified by ISO/IEC TS 18661-4:2015. */
|
||||
#ifndef __STDC_WANT_IEC_60559_FUNCS_EXT__
|
||||
# define __STDC_WANT_IEC_60559_FUNCS_EXT__ 1
|
||||
#endif
|
||||
/* Enable extensions specified by ISO/IEC TS 18661-3:2015. */
|
||||
#ifndef __STDC_WANT_IEC_60559_TYPES_EXT__
|
||||
# define __STDC_WANT_IEC_60559_TYPES_EXT__ 1
|
||||
#endif
|
||||
/* Enable extensions specified by ISO/IEC TR 24731-2:2010. */
|
||||
#ifndef __STDC_WANT_LIB_EXT2__
|
||||
# define __STDC_WANT_LIB_EXT2__ 1
|
||||
#endif
|
||||
/* Enable extensions specified by ISO/IEC 24747:2009. */
|
||||
#ifndef __STDC_WANT_MATH_SPEC_FUNCS__
|
||||
# define __STDC_WANT_MATH_SPEC_FUNCS__ 1
|
||||
#endif
|
||||
/* Enable extensions on HP NonStop. */
|
||||
#ifndef _TANDEM_SOURCE
|
||||
# define _TANDEM_SOURCE 1
|
||||
#endif
|
||||
/* Enable X/Open extensions. Define to 500 only if necessary
|
||||
to make mbstate_t available. */
|
||||
#ifndef _XOPEN_SOURCE
|
||||
/* # undef _XOPEN_SOURCE */
|
||||
#endif
|
||||
|
||||
|
||||
/* Define WORDS_BIGENDIAN to 1 if your processor stores words with the most
|
||||
significant byte first (like Motorola and SPARC, unlike Intel). */
|
||||
#if defined AC_APPLE_UNIVERSAL_BUILD
|
||||
# if defined __BIG_ENDIAN__
|
||||
# define WORDS_BIGENDIAN 1
|
||||
# endif
|
||||
#else
|
||||
# ifndef WORDS_BIGENDIAN
|
||||
/* # undef WORDS_BIGENDIAN */
|
||||
# endif
|
||||
#endif
|
||||
|
||||
/* Define to 1 if `lex' declares `yytext' as a `char *' by default, not a
|
||||
`char[]'. */
|
||||
#define YYTEXT_POINTER 1
|
||||
|
||||
/* Enable GNU extensions on systems that have them. */
|
||||
#ifndef _GNU_SOURCE
|
||||
# define _GNU_SOURCE 1
|
||||
#endif
|
||||
|
||||
/* Define to `__inline__' or `__inline' if that's what the C compiler
|
||||
calls it, or to nothing if 'inline' is not supported under any name. */
|
||||
#ifndef __cplusplus
|
||||
#define inline __inline__
|
||||
#endif
|
||||
|
||||
|
||||
#include "src/include/pmix_config_bottom.h"
|
||||
#endif /* PMIX_CONFIG_H */
|
||||
|
||||
570
macx64/mpi/openmpi/include/pmix/src/include/pmix_config_bottom.h
Normal file
570
macx64/mpi/openmpi/include/pmix/src/include/pmix_config_bottom.h
Normal file
@@ -0,0 +1,570 @@
|
||||
/*
|
||||
* Copyright (c) 2004-2005 The Trustees of Indiana University and Indiana
|
||||
* University Research and Technology
|
||||
* Corporation. All rights reserved.
|
||||
* Copyright (c) 2004-2005 The University of Tennessee and The University
|
||||
* of Tennessee Research Foundation. All rights
|
||||
* reserved.
|
||||
* Copyright (c) 2004-2010 High Performance Computing Center Stuttgart,
|
||||
* University of Stuttgart. All rights reserved.
|
||||
* Copyright (c) 2004-2005 The Regents of the University of California.
|
||||
* All rights reserved.
|
||||
* Copyright (c) 2009 Sun Microsystems, Inc. All rights reserved.
|
||||
* Copyright (c) 2009-2011 Cisco Systems, Inc. All rights reserved.
|
||||
* Copyright (c) 2013 Mellanox Technologies, Inc.
|
||||
* All rights reserved.
|
||||
* Copyright (c) 2013-2020 Intel, Inc. All rights reserved.
|
||||
* Copyright (c) 2016 IBM Corporation. All rights reserved.
|
||||
* Copyright (c) 2021-2024 Nanook Consulting All rights reserved.
|
||||
* $COPYRIGHT$
|
||||
*
|
||||
* Additional copyrights may follow
|
||||
*
|
||||
* $HEADER$
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef PMIX_CONFIG_BOTTOM_H
|
||||
#define PMIX_CONFIG_BOTTOM_H
|
||||
|
||||
/*
|
||||
* If we build a static library, Visual C define the _LIB symbol. In the
|
||||
* case of a shared library _USERDLL get defined.
|
||||
*
|
||||
*/
|
||||
#ifndef PMIX_BUILDING
|
||||
# define PMIX_BUILDING 1
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Flex is trying to include the unistd.h file. As there is no configure
|
||||
* option or this, the flex generated files will try to include the file
|
||||
* even on platforms without unistd.h. Therefore, if we
|
||||
* know this file is not available, we can prevent flex from including it.
|
||||
*/
|
||||
#ifndef HAVE_UNISTD_H
|
||||
# define YY_NO_UNISTD_H
|
||||
#endif
|
||||
|
||||
/***********************************************************************
|
||||
*
|
||||
* code that should be in ompi_config_bottom.h regardless of build
|
||||
* status
|
||||
*
|
||||
**********************************************************************/
|
||||
|
||||
/* Do we have posix or solaris thread lib */
|
||||
#define PMIX_HAVE_THREADS (PMIX_HAVE_POSIX_THREADS || OAC_HAVE_SOLARIS_THREADS)
|
||||
|
||||
/*
|
||||
* BEGIN_C_DECLS should be used at the beginning of your declarations,
|
||||
* so that C++ compilers don't mangle their names. Use END_C_DECLS at
|
||||
* the end of C declarations.
|
||||
*/
|
||||
#undef BEGIN_C_DECLS
|
||||
#undef END_C_DECLS
|
||||
#if defined(c_plusplus) || defined(__cplusplus)
|
||||
# define BEGIN_C_DECLS extern "C" {
|
||||
# define END_C_DECLS }
|
||||
#else
|
||||
# define BEGIN_C_DECLS /* empty */
|
||||
# define END_C_DECLS /* empty */
|
||||
#endif
|
||||
|
||||
/* Defined to 1 on Linux */
|
||||
#undef PMIX_LINUX_SYS
|
||||
|
||||
/* Defined to 1 if the CPU_SET macro works */
|
||||
#undef PMIX_HAVE_CPU_SET
|
||||
|
||||
/* Defined to 1 if you have the `windows.h' header. */
|
||||
#undef PMIX_HAVE_WINDOWS_H
|
||||
#undef pmix_pid_t
|
||||
#undef pmix_thread_t
|
||||
|
||||
/*
|
||||
* Note: this is public. We can not assume anything from the compiler used
|
||||
* by the application and thus the PMIX_HAVE_* macros below are not
|
||||
* fetched from the autoconf result here. We only automatically use a few
|
||||
* well-known easy cases.
|
||||
*/
|
||||
|
||||
/* Some handy constants to make the logic below a little more readable */
|
||||
#if defined(__cplusplus) && (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR >= 4))
|
||||
# define GXX_ABOVE_3_4 1
|
||||
#else
|
||||
# define GXX_ABOVE_3_4 0
|
||||
#endif
|
||||
|
||||
#if !defined(__cplusplus) && (__GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 95))
|
||||
# define GCC_ABOVE_2_95 1
|
||||
#else
|
||||
# define GCC_ABOVE_2_95 0
|
||||
#endif
|
||||
|
||||
#if !defined(__cplusplus) && (__GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 96))
|
||||
# define GCC_ABOVE_2_96 1
|
||||
#else
|
||||
# define GCC_ABOVE_2_96 0
|
||||
#endif
|
||||
|
||||
#if !defined(__cplusplus) && (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 3))
|
||||
# define GCC_ABOVE_3_3 1
|
||||
#else
|
||||
# define GCC_ABOVE_3_3 0
|
||||
#endif
|
||||
|
||||
/**
|
||||
* The attribute definition should be included before any potential
|
||||
* usage.
|
||||
*/
|
||||
#if PMIX_HAVE_ATTRIBUTE_ALIGNED
|
||||
# define __pmix_attribute_aligned__(a) __attribute__((__aligned__(a)))
|
||||
# define __pmix_attribute_aligned_max__ __attribute__((__aligned__))
|
||||
#else
|
||||
# define __pmix_attribute_aligned__(a)
|
||||
# define __pmix_attribute_aligned_max__
|
||||
#endif
|
||||
|
||||
/* Note that if we're compiling C++, then just use the "inline"
|
||||
keyword, since it's part of C++ */
|
||||
#if defined(c_plusplus) || defined(__cplusplus)
|
||||
# define __pmix_inline inline
|
||||
#elif defined(_MSC_VER) || defined(__HP_cc)
|
||||
# define __pmix_inline __inline
|
||||
#else
|
||||
# define __pmix_inline __inline__
|
||||
#endif
|
||||
|
||||
#if PMIX_HAVE_ATTRIBUTE_ALWAYS_INLINE
|
||||
# define __pmix_attribute_always_inline__ __attribute__((__always_inline__))
|
||||
#else
|
||||
# define __pmix_attribute_always_inline__
|
||||
#endif
|
||||
|
||||
#if PMIX_HAVE_ATTRIBUTE_COLD
|
||||
# define __pmix_attribute_cold__ __attribute__((__cold__))
|
||||
#else
|
||||
# define __pmix_attribute_cold__
|
||||
#endif
|
||||
|
||||
#ifdef PMIX_HAVE_ATTRIBUTE_CONST
|
||||
# define __PMIX_HAVE_ATTRIBUTE_CONST PMIX_HAVE_ATTRIBUTE_CONST
|
||||
#elif defined(__GNUC__)
|
||||
# define __PMIX_HAVE_ATTRIBUTE_CONST (GXX_ABOVE_3_4 || GCC_ABOVE_2_95)
|
||||
#else
|
||||
# define __PMIX_HAVE_ATTRIBUTE_CONST 0
|
||||
#endif
|
||||
#if __PMIX_HAVE_ATTRIBUTE_CONST
|
||||
# define __pmix_attribute_const __attribute__((__const__))
|
||||
#else
|
||||
# define __pmix_attribute_const
|
||||
#endif
|
||||
|
||||
#if PMIX_HAVE_ATTRIBUTE_CONST
|
||||
# define __pmix_attribute_const__ __attribute__((__const__))
|
||||
#else
|
||||
# define __pmix_attribute_const__
|
||||
#endif
|
||||
|
||||
#ifdef PMIX_HAVE_ATTRIBUTE_DEPRECATED
|
||||
# define __PMIX_HAVE_ATTRIBUTE_DEPRECATED PMIX_HAVE_ATTRIBUTE_DEPRECATED
|
||||
#elif defined(__GNUC__)
|
||||
# define __PMIX_HAVE_ATTRIBUTE_DEPRECATED (GXX_ABOVE_3_4 || GCC_ABOVE_3_3)
|
||||
#else
|
||||
# define __PMIX_HAVE_ATTRIBUTE_DEPRECATED 0
|
||||
#endif
|
||||
#if __PMIX_HAVE_ATTRIBUTE_DEPRECATED
|
||||
# define __pmix_attribute_deprecated __attribute__((__deprecated__))
|
||||
#else
|
||||
# define __pmix_attribute_deprecated
|
||||
#endif
|
||||
|
||||
#if PMIX_HAVE_ATTRIBUTE_DEPRECATED
|
||||
# define __pmix_attribute_deprecated__ __attribute__((__deprecated__))
|
||||
#else
|
||||
# define __pmix_attribute_deprecated__
|
||||
#endif
|
||||
|
||||
#if PMIX_HAVE_ATTRIBUTE_FORMAT
|
||||
#if OAC_HAVE_SOLARIS
|
||||
# define __pmix_attribute_format__(a, b, c)
|
||||
#else
|
||||
# define __pmix_attribute_format__(a, b, c) __attribute__((__format__(a, b, c)))
|
||||
#endif
|
||||
#else
|
||||
# define __pmix_attribute_format__(a, b, c)
|
||||
#endif
|
||||
|
||||
/* Use this __atribute__ on function-ptr declarations, only */
|
||||
#if PMIX_HAVE_ATTRIBUTE_FORMAT_FUNCPTR
|
||||
# define __pmix_attribute_format_funcptr__(a, b, c) __attribute__((__format__(a, b, c)))
|
||||
#else
|
||||
# define __pmix_attribute_format_funcptr__(a, b, c)
|
||||
#endif
|
||||
|
||||
#if PMIX_HAVE_ATTRIBUTE_HOT
|
||||
# define __pmix_attribute_hot__ __attribute__((__hot__))
|
||||
#else
|
||||
# define __pmix_attribute_hot__
|
||||
#endif
|
||||
|
||||
#ifdef PMIX_HAVE_ATTRIBUTE_MALLOC
|
||||
# define __PMIX_HAVE_ATTRIBUTE_MALLOC PMIX_HAVE_ATTRIBUTE_MALLOC
|
||||
#elif defined(__GNUC__)
|
||||
# define __PMIX_HAVE_ATTRIBUTE_MALLOC (GXX_ABOVE_3_4 || GCC_ABOVE_2_96)
|
||||
#else
|
||||
# define __PMIX_HAVE_ATTRIBUTE_MALLOC 0
|
||||
#endif
|
||||
#if __PMIX_HAVE_ATTRIBUTE_MALLOC
|
||||
# define __pmix_attribute_malloc __attribute__((__malloc__))
|
||||
#else
|
||||
# define __pmix_attribute_malloc
|
||||
#endif
|
||||
|
||||
#if PMIX_HAVE_ATTRIBUTE_MALLOC
|
||||
# define __pmix_attribute_malloc__ __attribute__((__malloc__))
|
||||
#else
|
||||
# define __pmix_attribute_malloc__
|
||||
#endif
|
||||
|
||||
#ifdef PMIX_HAVE_ATTRIBUTE_MAY_ALIAS
|
||||
# define __PMIX_HAVE_ATTRIBUTE_MAY_ALIAS PMIX_HAVE_ATTRIBUTE_MAY_ALIAS
|
||||
#elif defined(__GNUC__)
|
||||
# define __PMIX_HAVE_ATTRIBUTE_MAY_ALIAS (GXX_ABOVE_3_4 || GCC_ABOVE_3_3)
|
||||
#else
|
||||
# define __PMIX_HAVE_ATTRIBUTE_MAY_ALIAS 0
|
||||
#endif
|
||||
#if __PMIX_HAVE_ATTRIBUTE_MAY_ALIAS
|
||||
# define __pmix_attribute_may_alias __attribute__((__may_alias__))
|
||||
#else
|
||||
# define __pmix_attribute_may_alias
|
||||
#endif
|
||||
|
||||
#if PMIX_HAVE_ATTRIBUTE_MAY_ALIAS
|
||||
# define __pmix_attribute_may_alias__ __attribute__((__may_alias__))
|
||||
#else
|
||||
# define __pmix_attribute_may_alias__
|
||||
#endif
|
||||
|
||||
#if PMIX_HAVE_ATTRIBUTE_NO_INSTRUMENT_FUNCTION
|
||||
# define __pmix_attribute_no_instrument_function__ __attribute__((__no_instrument_function__))
|
||||
#else
|
||||
# define __pmix_attribute_no_instrument_function__
|
||||
#endif
|
||||
|
||||
#if PMIX_HAVE_ATTRIBUTE_NONNULL
|
||||
# define __pmix_attribute_nonnull__(a) __attribute__((__nonnull__(a)))
|
||||
# define __pmix_attribute_nonnull_all__ __attribute__((__nonnull__))
|
||||
#else
|
||||
# define __pmix_attribute_nonnull__(a)
|
||||
# define __pmix_attribute_nonnull_all__
|
||||
#endif
|
||||
|
||||
#if PMIX_HAVE_ATTRIBUTE_NORETURN
|
||||
# define __pmix_attribute_noreturn__ __attribute__((__noreturn__))
|
||||
#else
|
||||
# define __pmix_attribute_noreturn__
|
||||
#endif
|
||||
|
||||
/* Use this __atribute__ on function-ptr declarations, only */
|
||||
#if PMIX_HAVE_ATTRIBUTE_NORETURN_FUNCPTR
|
||||
# define __pmix_attribute_noreturn_funcptr__ __attribute__((__noreturn__))
|
||||
#else
|
||||
# define __pmix_attribute_noreturn_funcptr__
|
||||
#endif
|
||||
|
||||
#if PMIX_HAVE_ATTRIBUTE_PACKED
|
||||
# define __pmix_attribute_packed__ __attribute__((__packed__))
|
||||
#else
|
||||
# define __pmix_attribute_packed__
|
||||
#endif
|
||||
|
||||
#ifdef PMIX_HAVE_ATTRIBUTE_PURE
|
||||
# define __PMIX_HAVE_ATTRIBUTE_PURE PMIX_HAVE_ATTRIBUTE_PURE
|
||||
#elif defined(__GNUC__)
|
||||
# define __PMIX_HAVE_ATTRIBUTE_PURE (GXX_ABOVE_3_4 || GCC_ABOVE_2_96)
|
||||
#else
|
||||
# define __PMIX_HAVE_ATTRIBUTE_PURE 0
|
||||
#endif
|
||||
#if __PMIX_HAVE_ATTRIBUTE_PURE
|
||||
# define __pmix_attribute_pure __attribute__((__pure__))
|
||||
#else
|
||||
# define __pmix_attribute_pure
|
||||
#endif
|
||||
|
||||
#if PMIX_HAVE_ATTRIBUTE_PURE
|
||||
# define __pmix_attribute_pure__ __attribute__((__pure__))
|
||||
#else
|
||||
# define __pmix_attribute_pure__
|
||||
#endif
|
||||
|
||||
#if PMIX_HAVE_ATTRIBUTE_SENTINEL
|
||||
#if OAC_HAVE_SOLARIS
|
||||
# define __pmix_attribute_sentinel__
|
||||
#else
|
||||
# define __pmix_attribute_sentinel__ __attribute__((__sentinel__))
|
||||
#endif
|
||||
#else
|
||||
# define __pmix_attribute_sentinel__
|
||||
#endif
|
||||
|
||||
/* Maybe before gcc 2.95 too */
|
||||
#ifdef PMIX_HAVE_ATTRIBUTE_UNUSED
|
||||
# define __PMIX_HAVE_ATTRIBUTE_UNUSED PMIX_HAVE_ATTRIBUTE_UNUSED
|
||||
#elif defined(__GNUC__)
|
||||
# define __PMIX_HAVE_ATTRIBUTE_UNUSED (GXX_ABOVE_3_4 || GCC_ABOVE_2_95)
|
||||
#else
|
||||
# define __PMIX_HAVE_ATTRIBUTE_UNUSED 0
|
||||
#endif
|
||||
#if __PMIX_HAVE_ATTRIBUTE_UNUSED
|
||||
# define __pmix_attribute_unused __attribute__((__unused__))
|
||||
#else
|
||||
# define __pmix_attribute_unused
|
||||
#endif
|
||||
|
||||
#if PMIX_HAVE_ATTRIBUTE_UNUSED
|
||||
# define __pmix_attribute_unused__ __attribute__((__unused__))
|
||||
#else
|
||||
# define __pmix_attribute_unused__
|
||||
#endif
|
||||
|
||||
#if PMIX_HAVE_ATTRIBUTE_WARN_UNUSED_RESULT
|
||||
# define __pmix_attribute_warn_unused_result__ __attribute__((__warn_unused_result__))
|
||||
#else
|
||||
# define __pmix_attribute_warn_unused_result__
|
||||
#endif
|
||||
|
||||
#if PMIX_HAVE_ATTRIBUTE_DESTRUCTOR
|
||||
# define __pmix_attribute_destructor__ __attribute__((__destructor__))
|
||||
#else
|
||||
# define __pmix_attribute_destructor__
|
||||
#endif
|
||||
|
||||
#if PMIX_HAVE_ATTRIBUTE_OPTNONE
|
||||
# define __pmix_attribute_optnone__ __attribute__((__optnone__))
|
||||
#else
|
||||
# define __pmix_attribute_optnone__
|
||||
#endif
|
||||
|
||||
#if PMIX_HAVE_ATTRIBUTE_EXTENSION
|
||||
# define __pmix_attribute_extension__ __extension__
|
||||
#else
|
||||
# define __pmix_attribute_extension__
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Do we have <stdint.h>?
|
||||
*/
|
||||
#ifdef HAVE_STDINT_H
|
||||
# if !defined(__STDC_LIMIT_MACROS) && (defined(c_plusplus) || defined(__cplusplus))
|
||||
/* When using a C++ compiler, the max / min value #defines for std
|
||||
types are only included if __STDC_LIMIT_MACROS is set before
|
||||
including stdint.h */
|
||||
# define __STDC_LIMIT_MACROS
|
||||
# endif
|
||||
# include "src/include/pmix_config.h"
|
||||
# include <stdint.h>
|
||||
#else
|
||||
# include "src/include/pmix_stdint.h"
|
||||
#endif
|
||||
|
||||
/***********************************************************************
|
||||
*
|
||||
* Code that is only for when building PMIx or utilities that are
|
||||
* using the internals of PMIx. It should not be included when
|
||||
* building MPI applications
|
||||
*
|
||||
**********************************************************************/
|
||||
#if PMIX_BUILDING
|
||||
|
||||
# ifndef HAVE_PTRDIFF_T
|
||||
typedef PMIX_PTRDIFF_TYPE ptrdiff_t;
|
||||
# endif
|
||||
|
||||
/*
|
||||
* Maximum size of a filename path.
|
||||
*/
|
||||
# include <limits.h>
|
||||
# ifdef HAVE_SYS_PARAM_H
|
||||
# include <sys/param.h>
|
||||
# endif
|
||||
# if defined(PATH_MAX)
|
||||
# define PMIX_PATH_MAX (PATH_MAX + 1)
|
||||
# elif defined(_POSIX_PATH_MAX)
|
||||
# define PMIX_PATH_MAX (_POSIX_PATH_MAX + 1)
|
||||
# else
|
||||
# define PMIX_PATH_MAX 256
|
||||
# endif
|
||||
|
||||
# if defined(MAXHOSTNAMELEN)
|
||||
# define PMIX_MAXHOSTNAMELEN (MAXHOSTNAMELEN + 1)
|
||||
# elif defined(HOST_NAME_MAX)
|
||||
# define PMIX_MAXHOSTNAMELEN (HOST_NAME_MAX + 1)
|
||||
# else
|
||||
/* SUSv2 guarantees that "Host names are limited to 255 bytes". */
|
||||
# define PMIX_MAXHOSTNAMELEN (255 + 1)
|
||||
# endif
|
||||
|
||||
/*
|
||||
* Set the compile-time path-separator on this system and variable separator
|
||||
*/
|
||||
# define PMIX_PATH_SEP "/"
|
||||
# define PMIX_ENV_SEP ':'
|
||||
|
||||
/*
|
||||
* printf functions for portability (only when building PMIx)
|
||||
*/
|
||||
# if !defined(HAVE_VASPRINTF) || !defined(HAVE_VSNPRINTF)
|
||||
# include <stdarg.h>
|
||||
# include <stdlib.h>
|
||||
# endif
|
||||
|
||||
# if !defined(HAVE_ASPRINTF) || !defined(HAVE_SNPRINTF) || !defined(HAVE_VASPRINTF) \
|
||||
|| !defined(HAVE_VSNPRINTF)
|
||||
# include "src/util/pmix_printf.h"
|
||||
# endif
|
||||
|
||||
# ifndef HAVE_ASPRINTF
|
||||
# define asprintf pmix_asprintf
|
||||
# endif
|
||||
|
||||
# ifndef HAVE_SNPRINTF
|
||||
# define snprintf pmix_snprintf
|
||||
# endif
|
||||
|
||||
# ifndef HAVE_VASPRINTF
|
||||
# define vasprintf pmix_vasprintf
|
||||
# endif
|
||||
|
||||
# ifndef HAVE_VSNPRINTF
|
||||
# define vsnprintf pmix_vsnprintf
|
||||
# endif
|
||||
|
||||
|
||||
/*
|
||||
* Define __func__-preprocessor directive if the compiler does not
|
||||
* already define it. Define it to __FILE__ so that we at least have
|
||||
* a clue where the developer is trying to indicate where the error is
|
||||
* coming from (assuming that __func__ is typically used for
|
||||
* printf-style debugging).
|
||||
*/
|
||||
# if defined(HAVE_DECL___FUNC__) && !HAVE_DECL___FUNC__
|
||||
# define __func__ __FILE__
|
||||
# endif
|
||||
|
||||
# define IOVBASE_TYPE void
|
||||
|
||||
# include <stdbool.h>
|
||||
/**
|
||||
* If we generate our own bool type, we need a special way to cast the result
|
||||
* in such a way to keep the compilers silent.
|
||||
*/
|
||||
# define PMIX_INT_TO_BOOL(VALUE) (bool) (VALUE)
|
||||
|
||||
# if !defined(HAVE_STRUCT_SOCKADDR_STORAGE) && defined(HAVE_STRUCT_SOCKADDR_IN)
|
||||
# define sockaddr_storage sockaddr
|
||||
# define ss_family sa_family
|
||||
# endif
|
||||
|
||||
/* Compatibility structure so that we don't have to have as many
|
||||
#if checks in the code base */
|
||||
# if !defined(HAVE_STRUCT_SOCKADDR_IN6) && defined(HAVE_STRUCT_SOCKADDR_IN)
|
||||
# define sockaddr_in6 sockaddr_in
|
||||
# define sin6_len sin_len
|
||||
# define sin6_family sin_family
|
||||
# define sin6_port sin_port
|
||||
# define sin6_addr sin_addr
|
||||
# endif
|
||||
|
||||
# if !HAVE_DECL_AF_UNSPEC
|
||||
# define AF_UNSPEC 0
|
||||
# endif
|
||||
# if !HAVE_DECL_PF_UNSPEC
|
||||
# define PF_UNSPEC 0
|
||||
# endif
|
||||
# if !HAVE_DECL_AF_INET6
|
||||
# define AF_INET6 AF_UNSPEC
|
||||
# endif
|
||||
# if !HAVE_DECL_PF_INET6
|
||||
# define PF_INET6 PF_UNSPEC
|
||||
# endif
|
||||
|
||||
# if defined(__APPLE__) && defined(HAVE_INTTYPES_H)
|
||||
/* Prior to Mac OS X 10.3, the length modifier "ll" wasn't
|
||||
supported, but "q" was for long long. This isn't ANSI
|
||||
C and causes a warning when using PRI?64 macros. We
|
||||
don't support versions prior to OS X 10.3, so we don't
|
||||
need such backward compatibility. Instead, redefine
|
||||
the macros to be "ll", which is ANSI C and doesn't
|
||||
cause a compiler warning. */
|
||||
# include <inttypes.h>
|
||||
# if defined(__PRI_64_LENGTH_MODIFIER__)
|
||||
# undef __PRI_64_LENGTH_MODIFIER__
|
||||
# define __PRI_64_LENGTH_MODIFIER__ "ll"
|
||||
# endif
|
||||
# if defined(__SCN_64_LENGTH_MODIFIER__)
|
||||
# undef __SCN_64_LENGTH_MODIFIER__
|
||||
# define __SCN_64_LENGTH_MODIFIER__ "ll"
|
||||
# endif
|
||||
# endif
|
||||
|
||||
# ifdef MCS_VXWORKS
|
||||
/* VXWorks puts some common functions in oddly named headers. Rather
|
||||
than update all the places the functions are used, which would be a
|
||||
maintenance disatster, just update here... */
|
||||
# ifdef HAVE_IOLIB_H
|
||||
/* pipe(), ioctl() */
|
||||
# include <ioLib.h>
|
||||
# endif
|
||||
# ifdef HAVE_SOCKLIB_H
|
||||
/* socket() */
|
||||
# include <sockLib.h>
|
||||
# endif
|
||||
# ifdef HAVE_HOSTLIB_H
|
||||
/* gethostname() */
|
||||
# include <hostLib.h>
|
||||
# endif
|
||||
# endif
|
||||
|
||||
/* If we're in C++, then just undefine restrict and then define it to
|
||||
nothing. "restrict" is not part of the C++ language, and we don't
|
||||
have a corresponding AC_CXX_RESTRICT to figure out what the C++
|
||||
compiler supports. */
|
||||
# if defined(c_plusplus) || defined(__cplusplus)
|
||||
# undef restrict
|
||||
# define restrict
|
||||
# endif
|
||||
|
||||
# if (__GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 95))
|
||||
# define __pmix_restrict __restrict
|
||||
# else
|
||||
# if __STDC_VERSION__ >= 199901L
|
||||
# define __pmix_restrict restrict
|
||||
# else
|
||||
# define __pmix_restrict
|
||||
# endif
|
||||
# endif
|
||||
|
||||
#else
|
||||
|
||||
/* For a similar reason to what is listed in pmix_config_top.h, we
|
||||
want to protect others from the autoconf/automake-generated
|
||||
PACKAGE_<foo> macros in pmix_config.h. We can't put these undef's
|
||||
directly in pmix_config.h because they'll be turned into #defines'
|
||||
via autoconf.
|
||||
|
||||
So put them here in case any one else includes PMIX's
|
||||
config.h files. */
|
||||
|
||||
# undef PACKAGE_BUGREPORT
|
||||
# undef PACKAGE_NAME
|
||||
# undef PACKAGE_STRING
|
||||
# undef PACKAGE_TARNAME
|
||||
# undef PACKAGE_VERSION
|
||||
# undef PACKAGE_URL
|
||||
# undef HAVE_CONFIG_H
|
||||
|
||||
#endif /* PMIX_BUILDING */
|
||||
|
||||
#endif /* PMIX_CONFIG_BOTTOM_H */
|
||||
@@ -0,0 +1,41 @@
|
||||
/*
|
||||
* Copyright (c) 2011 Cisco Systems, Inc. All rights reserved.
|
||||
* Copyright (c) 2013-2015 Intel, Inc. All rights reserved
|
||||
* Copyright (c) 2016 IBM Corporation. All rights reserved.
|
||||
* Copyright (c) 2021 Nanook Consulting. All rights reserved.
|
||||
* $COPYRIGHT$
|
||||
*
|
||||
* Additional copyrights may follow
|
||||
*
|
||||
* $HEADER$
|
||||
*
|
||||
* This file is included at the top of pmix_config.h, and is
|
||||
* therefore a) before all the #define's that were output from
|
||||
* configure, and b) included in most/all files in PMIx.
|
||||
*
|
||||
* Since this file is *only* ever included by pmix_config.h, and
|
||||
* pmix_config.h already has #ifndef/#endif protection, there is no
|
||||
* need to #ifndef/#endif protection here.
|
||||
*/
|
||||
|
||||
#ifndef PMIX_CONFIG_H
|
||||
# error "pmix_config_top.h should only be included from config.h(.in)"
|
||||
#endif
|
||||
|
||||
/* The only purpose of this file is to undef the PACKAGE_<foo> macros
|
||||
that are put in by autoconf/automake projects. Specifically, if
|
||||
you include a .h file from another project that defines these
|
||||
macros (e.g., gmp.h) and then include PMIX's config.h,
|
||||
you'll get a preprocessor conflict. So put these undef's here to
|
||||
protect us from other package's PACKAGE_<foo> macros.
|
||||
|
||||
Note that we can't put them directly in pmix_config.h (e.g., via
|
||||
AH_TOP) because they will be turned into #define's by autoconf. */
|
||||
|
||||
#undef PACKAGE_BUGREPORT
|
||||
#undef PACKAGE_NAME
|
||||
#undef PACKAGE_STRING
|
||||
#undef PACKAGE_TARNAME
|
||||
#undef PACKAGE_VERSION
|
||||
#undef PACKAGE_URL
|
||||
#undef HAVE_CONFIG_H
|
||||
@@ -0,0 +1,22 @@
|
||||
/*
|
||||
* This file is autogenerated by construct_dictionary.py.
|
||||
* Do not edit this file by hand.
|
||||
*/
|
||||
|
||||
#include "src/include/pmix_config.h"
|
||||
#include "src/include/pmix_globals.h"
|
||||
#include "include/pmix_common.h"
|
||||
|
||||
#ifndef PMIX_DICTIONARY_H
|
||||
#define PMIX_DICTIONARY_H
|
||||
|
||||
BEGIN_C_DECLS
|
||||
|
||||
PMIX_EXPORT extern const pmix_regattr_input_t pmix_dictionary[564];
|
||||
|
||||
#define PMIX_INDEX_BOUNDARY 564
|
||||
|
||||
END_C_DECLS
|
||||
|
||||
#endif
|
||||
|
||||
@@ -0,0 +1,22 @@
|
||||
/*
|
||||
* This file is autogenerated by construct_event_strings.py.
|
||||
* Do not edit this file by hand.
|
||||
*/
|
||||
|
||||
#include "src/include/pmix_config.h"
|
||||
#include "src/include/pmix_globals.h"
|
||||
#include "include/pmix_common.h"
|
||||
|
||||
#ifndef PMIX_EVENT_STRINGS_H
|
||||
#define PMIX_EVENT_STRINGS_H
|
||||
|
||||
BEGIN_C_DECLS
|
||||
|
||||
PMIX_EXPORT extern const pmix_event_string_t pmix_event_strings[163];
|
||||
|
||||
#define PMIX_EVENT_INDEX_BOUNDARY 162
|
||||
|
||||
END_C_DECLS
|
||||
|
||||
#endif
|
||||
|
||||
@@ -0,0 +1,31 @@
|
||||
/*
|
||||
* This file is autogenerated by autogen.pl. Do not edit this file by hand.
|
||||
*/
|
||||
#ifndef PMIX_FRAMEWORKS_H
|
||||
#define PMIX_FRAMEWORKS_H
|
||||
|
||||
#include "src/mca/base/pmix_mca_base_framework.h"
|
||||
|
||||
extern pmix_mca_base_framework_t pmix_bfrops_base_framework;
|
||||
extern pmix_mca_base_framework_t pmix_gds_base_framework;
|
||||
extern pmix_mca_base_framework_t pmix_pcompress_base_framework;
|
||||
extern pmix_mca_base_framework_t pmix_pdl_base_framework;
|
||||
extern pmix_mca_base_framework_t pmix_pif_base_framework;
|
||||
extern pmix_mca_base_framework_t pmix_pinstalldirs_base_framework;
|
||||
extern pmix_mca_base_framework_t pmix_plog_base_framework;
|
||||
extern pmix_mca_base_framework_t pmix_pmdl_base_framework;
|
||||
extern pmix_mca_base_framework_t pmix_pnet_base_framework;
|
||||
extern pmix_mca_base_framework_t pmix_preg_base_framework;
|
||||
extern pmix_mca_base_framework_t pmix_psec_base_framework;
|
||||
extern pmix_mca_base_framework_t pmix_psensor_base_framework;
|
||||
extern pmix_mca_base_framework_t pmix_psquash_base_framework;
|
||||
extern pmix_mca_base_framework_t pmix_pstat_base_framework;
|
||||
extern pmix_mca_base_framework_t pmix_ptl_base_framework;
|
||||
|
||||
|
||||
PMIX_EXPORT extern pmix_mca_base_framework_t *pmix_frameworks[];
|
||||
|
||||
PMIX_EXPORT extern char *pmix_framework_names[];
|
||||
|
||||
#endif /* PMIX_FRAMEWORKS_H */
|
||||
|
||||
923
macx64/mpi/openmpi/include/pmix/src/include/pmix_globals.h
Normal file
923
macx64/mpi/openmpi/include/pmix/src/include/pmix_globals.h
Normal file
@@ -0,0 +1,923 @@
|
||||
/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil -*- */
|
||||
/*
|
||||
* Copyright (c) 2004-2005 The Trustees of Indiana University and Indiana
|
||||
* University Research and Technology
|
||||
* Corporation. All rights reserved.
|
||||
* Copyright (c) 2004-2005 The University of Tennessee and The University
|
||||
* of Tennessee Research Foundation. All rights
|
||||
* reserved.
|
||||
* Copyright (c) 2004-2005 High Performance Computing Center Stuttgart,
|
||||
* University of Stuttgart. All rights reserved.
|
||||
* Copyright (c) 2004-2005 The Regents of the University of California.
|
||||
* All rights reserved.
|
||||
* Copyright (c) 2014-2020 Intel, Inc. All rights reserved.
|
||||
* Copyright (c) 2019 Research Organization for Information Science
|
||||
* and Technology (RIST). All rights reserved.
|
||||
* Copyright (c) 2019 Mellanox Technologies, Inc.
|
||||
* All rights reserved.
|
||||
* Copyright (c) 2021-2024 Nanook Consulting All rights reserved.
|
||||
* Copyright (c) 2023 Triad National Security, LLC. All rights reserved.
|
||||
* $COPYRIGHT$
|
||||
*
|
||||
* Additional copyrights may follow
|
||||
*
|
||||
* $HEADER$
|
||||
*/
|
||||
|
||||
#ifndef PMIX_GLOBALS_H
|
||||
#define PMIX_GLOBALS_H
|
||||
|
||||
#include "src/include/pmix_config.h"
|
||||
#include "src/include/pmix_types.h"
|
||||
|
||||
#include <unistd.h>
|
||||
#ifdef HAVE_SYS_TYPES_H
|
||||
# include <sys/types.h>
|
||||
#endif
|
||||
#include <event.h>
|
||||
|
||||
#include "pmix.h"
|
||||
#include "pmix_common.h"
|
||||
#include "pmix_tool.h"
|
||||
|
||||
#include "src/class/pmix_hash_table.h"
|
||||
#include "src/class/pmix_hotel.h"
|
||||
#include "src/class/pmix_list.h"
|
||||
#include "src/event/pmix_event.h"
|
||||
#include "src/runtime/pmix_init_util.h"
|
||||
#include "src/threads/pmix_threads.h"
|
||||
|
||||
#include "src/mca/bfrops/bfrops.h"
|
||||
#include "src/mca/gds/gds.h"
|
||||
#include "src/mca/psec/psec.h"
|
||||
#include "src/mca/ptl/ptl.h"
|
||||
|
||||
#include "src/util/pmix_name_fns.h"
|
||||
|
||||
BEGIN_C_DECLS
|
||||
|
||||
/* some limits */
|
||||
#define PMIX_MAX_CRED_SIZE 131072 // set max at 128kbytes
|
||||
#define PMIX_MAX_ERR_CONSTANT INT_MIN
|
||||
|
||||
/* internal-only attributes */
|
||||
#define PMIX_BFROPS_MODULE \
|
||||
"pmix.bfrops.mod" // (char*) name of bfrops plugin in-use by a given nspace
|
||||
#define PMIX_PNET_SETUP_APP \
|
||||
"pmix.pnet.setapp" // (pmix_byte_object_t) blob containing info to be given to
|
||||
// pnet framework on remote nodes
|
||||
|
||||
// define some bit handling macros
|
||||
#define PMIX_SET_BIT(a, f) \
|
||||
(a) |= (f)
|
||||
|
||||
#define PMIX_UNSET_BIT(a, f) \
|
||||
(a) &= ~(f)
|
||||
|
||||
#define PMIX_CHECK_BIT_IS_SET(a, f) \
|
||||
((a) & (f))
|
||||
|
||||
#define PMIX_CHECK_BIT_NOT_SET(a, f) \
|
||||
!PMIX_CHECK_BIT_IS_SET(a, f)
|
||||
|
||||
#define PMIX_INFO_OP_COMPLETE 0x80000000
|
||||
#define PMIX_INFO_OP_COMPLETED(m) \
|
||||
PMIX_SET_BIT((m)->flags, PMIX_INFO_OP_COMPLETE)
|
||||
#define PMIX_INFO_OP_IS_COMPLETE(m) \
|
||||
PMIX_CHECK_BIT_IS_SET((m)->flags, PMIX_INFO_OP_COMPLETE)
|
||||
|
||||
|
||||
/* define an internal-only object for creating
|
||||
* lists of names */
|
||||
typedef struct {
|
||||
pmix_list_item_t super;
|
||||
pmix_name_t *pname;
|
||||
} pmix_namelist_t;
|
||||
PMIX_CLASS_DECLARATION(pmix_namelist_t);
|
||||
|
||||
/* define a struct for holding entries in the
|
||||
* dictionary of attributes */
|
||||
typedef struct {
|
||||
uint32_t index;
|
||||
char *name;
|
||||
char *string;
|
||||
pmix_data_type_t type;
|
||||
char **description;
|
||||
} pmix_regattr_input_t;
|
||||
#define PMIX_REGATTR_INPUT_NEW(a, i, n, s, t, d) \
|
||||
do { \
|
||||
(a) = (pmix_regattr_input_t*)pmix_malloc(sizeof(pmix_regattr_input_t)); \
|
||||
if (NULL != (a)) { \
|
||||
memset((a), 0, sizeof(pmix_regattr_input_t)); \
|
||||
(a)->index = (i); \
|
||||
if (NULL != (n)) { \
|
||||
(a)->name = strdup((n)); \
|
||||
} \
|
||||
if (NULL != (s)) { \
|
||||
(a)->string = strdup((s)); \
|
||||
} \
|
||||
(a)->type = (t); \
|
||||
if (NULL != (d)) { \
|
||||
(a)->description = PMIx_Argv_copy((d)); \
|
||||
} \
|
||||
} \
|
||||
} while(0)
|
||||
#define PMIX_REGATTR_INPUT_FREE(a) \
|
||||
do { \
|
||||
if (NULL != (a)) { \
|
||||
if (NULL != (a)->name) { \
|
||||
free((a)->name); \
|
||||
} \
|
||||
if (NULL != (a)->string) \
|
||||
free((a)->string); \
|
||||
} \
|
||||
if (NULL != (a)->description) { \
|
||||
free((a)->description); \
|
||||
} \
|
||||
} \
|
||||
} while(0)
|
||||
|
||||
/* define a struct for holding entries in the
|
||||
* dictionary of event strings */
|
||||
typedef struct {
|
||||
uint32_t index;
|
||||
char *name;
|
||||
int32_t code;
|
||||
} pmix_event_string_t;
|
||||
|
||||
/* define a struct for storing data in memory */
|
||||
typedef struct {
|
||||
uint32_t index;
|
||||
pmix_value_t *value;
|
||||
} pmix_qual_t;
|
||||
#define PMIX_QUAL_NEW(d, k) \
|
||||
do { \
|
||||
(d) = (pmix_qual_t*)pmix_malloc(sizeof(pmix_qual_t)); \
|
||||
if (NULL != (d)) { \
|
||||
(d)->index = k; \
|
||||
(d)->value = NULL; \
|
||||
} \
|
||||
} while(0)
|
||||
#define PMIX_QUAL_RELEASE(d) \
|
||||
do { \
|
||||
if (NULL != (d)->value) { \
|
||||
PMIX_VALUE_RELEASE((d)->value); \
|
||||
} \
|
||||
} while(0)
|
||||
|
||||
typedef struct {
|
||||
uint32_t index;
|
||||
uint32_t qualindex;
|
||||
pmix_value_t *value;
|
||||
} pmix_dstor_t;
|
||||
|
||||
PMIX_EXPORT pmix_dstor_t *
|
||||
pmix_dstor_new_tma(
|
||||
uint32_t index,
|
||||
pmix_tma_t *tma
|
||||
);
|
||||
|
||||
PMIX_EXPORT void
|
||||
pmix_dstor_release_tma(
|
||||
pmix_dstor_t *d,
|
||||
pmix_tma_t *tma
|
||||
);
|
||||
|
||||
#define PMIX_DSTOR_NEW(d, k) \
|
||||
do { \
|
||||
(d) = pmix_dstor_new_tma((k), NULL); \
|
||||
} while(0)
|
||||
|
||||
#define PMIX_DSTOR_RELEASE(d) \
|
||||
do { \
|
||||
pmix_dstor_release_tma((d), NULL); \
|
||||
} while(0)
|
||||
|
||||
/* define a struct for passing topology objects */
|
||||
typedef struct {
|
||||
pmix_object_t super;
|
||||
char *source;
|
||||
void *object;
|
||||
} pmix_topo_obj_t;
|
||||
PMIX_CLASS_DECLARATION(pmix_topo_obj_t);
|
||||
|
||||
/* define a command type for communicating to the
|
||||
* pmix server */
|
||||
typedef uint8_t pmix_cmd_t;
|
||||
|
||||
/* define some commands */
|
||||
#define PMIX_REQ_CMD 0
|
||||
#define PMIX_ABORT_CMD 1
|
||||
#define PMIX_COMMIT_CMD 2
|
||||
#define PMIX_FENCENB_CMD 3
|
||||
#define PMIX_GETNB_CMD 4
|
||||
#define PMIX_FINALIZE_CMD 5
|
||||
#define PMIX_PUBLISHNB_CMD 6
|
||||
#define PMIX_LOOKUPNB_CMD 7
|
||||
#define PMIX_UNPUBLISHNB_CMD 8
|
||||
#define PMIX_SPAWNNB_CMD 9
|
||||
#define PMIX_CONNECTNB_CMD 10
|
||||
#define PMIX_DISCONNECTNB_CMD 11
|
||||
#define PMIX_NOTIFY_CMD 12
|
||||
#define PMIX_REGEVENTS_CMD 13
|
||||
#define PMIX_DEREGEVENTS_CMD 14
|
||||
#define PMIX_QUERY_CMD 15
|
||||
#define PMIX_LOG_CMD 16
|
||||
#define PMIX_ALLOC_CMD 17
|
||||
#define PMIX_JOB_CONTROL_CMD 18
|
||||
#define PMIX_MONITOR_CMD 19
|
||||
#define PMIX_GET_CREDENTIAL_CMD 20
|
||||
#define PMIX_VALIDATE_CRED_CMD 21
|
||||
#define PMIX_IOF_PULL_CMD 22
|
||||
#define PMIX_IOF_PUSH_CMD 23
|
||||
#define PMIX_GROUP_CONSTRUCT_CMD 24
|
||||
#define PMIX_GROUP_JOIN_CMD 25
|
||||
#define PMIX_GROUP_INVITE_CMD 26
|
||||
#define PMIX_GROUP_LEAVE_CMD 27
|
||||
#define PMIX_GROUP_DESTRUCT_CMD 28
|
||||
#define PMIX_IOF_DEREG_CMD 29
|
||||
#define PMIX_FABRIC_REGISTER_CMD 30
|
||||
#define PMIX_FABRIC_UPDATE_CMD 31
|
||||
#define PMIX_COMPUTE_DEVICE_DISTANCES_CMD 32
|
||||
#define PMIX_REFRESH_CACHE 33
|
||||
|
||||
/* provide a "pretty-print" function for cmds */
|
||||
const char *pmix_command_string(pmix_cmd_t cmd);
|
||||
|
||||
/* provide a hook to init tool data */
|
||||
PMIX_EXPORT extern pmix_status_t pmix_tool_init_info(void);
|
||||
|
||||
/* define a set of flags to direct collection
|
||||
* of data during operations */
|
||||
typedef enum {
|
||||
PMIX_COLLECT_INVALID = -1,
|
||||
PMIX_COLLECT_NO,
|
||||
PMIX_COLLECT_YES,
|
||||
PMIX_COLLECT_MAX
|
||||
} pmix_collect_t;
|
||||
|
||||
/**** PEER STRUCTURES ****/
|
||||
|
||||
/* clients can only talk to their server, and servers are
|
||||
* assumed to all have the same personality. Thus, each
|
||||
* process only needs to track a single set of personality
|
||||
* modules. All interactions between a client and its local
|
||||
* server, or between servers, are done thru these modules */
|
||||
typedef struct pmix_personality_t {
|
||||
pmix_bfrop_buffer_type_t type;
|
||||
pmix_bfrops_module_t *bfrops;
|
||||
pmix_psec_module_t *psec;
|
||||
pmix_gds_base_module_t *gds;
|
||||
} pmix_personality_t;
|
||||
|
||||
/* define a set of structs for tracking post-termination cleanup */
|
||||
typedef struct pmix_epilog_t {
|
||||
uid_t uid;
|
||||
gid_t gid;
|
||||
pmix_list_t cleanup_dirs;
|
||||
pmix_list_t cleanup_files;
|
||||
pmix_list_t ignores;
|
||||
} pmix_epilog_t;
|
||||
|
||||
typedef struct {
|
||||
pmix_list_item_t super;
|
||||
char *path;
|
||||
} pmix_cleanup_file_t;
|
||||
PMIX_CLASS_DECLARATION(pmix_cleanup_file_t);
|
||||
|
||||
typedef struct {
|
||||
pmix_list_item_t super;
|
||||
char *path;
|
||||
bool recurse;
|
||||
bool leave_topdir;
|
||||
} pmix_cleanup_dir_t;
|
||||
PMIX_CLASS_DECLARATION(pmix_cleanup_dir_t);
|
||||
|
||||
/* define a struct to hold booleans controlling the
|
||||
* format/contents of the output */
|
||||
typedef struct {
|
||||
bool set;
|
||||
bool xml;
|
||||
bool timestamp;
|
||||
bool tag;
|
||||
bool tag_detailed;
|
||||
bool tag_fullname;
|
||||
bool rank;
|
||||
char *file;
|
||||
char *directory;
|
||||
bool nocopy;
|
||||
bool merge;
|
||||
bool local_output;
|
||||
bool local_output_given;
|
||||
bool pattern;
|
||||
bool raw;
|
||||
} pmix_iof_flags_t;
|
||||
|
||||
#define PMIX_IOF_FLAGS_STATIC_INIT \
|
||||
{ \
|
||||
.set = false, \
|
||||
.xml = false, \
|
||||
.timestamp = false, \
|
||||
.tag = false, \
|
||||
.tag_detailed = false, \
|
||||
.tag_fullname = false, \
|
||||
.rank = false, \
|
||||
.file = NULL, \
|
||||
.directory = NULL, \
|
||||
.nocopy = false, \
|
||||
.merge = false, \
|
||||
.local_output = false, \
|
||||
.local_output_given = false, \
|
||||
.pattern = false, \
|
||||
.raw = false \
|
||||
}
|
||||
|
||||
/* objects used by servers for tracking active nspaces */
|
||||
typedef struct {
|
||||
pmix_list_item_t super;
|
||||
char *nspace;
|
||||
struct {
|
||||
uint8_t major;
|
||||
uint8_t minor;
|
||||
uint8_t release;
|
||||
} version;
|
||||
pmix_rank_t nprocs; // num procs in this nspace
|
||||
size_t nlocalprocs;
|
||||
size_t num_waiting; // number of local procs waiting for debugger attach/release
|
||||
bool all_registered; // all local ranks have been defined
|
||||
bool version_stored; // the version string used by this nspace has been stored
|
||||
pmix_buffer_t *jobbkt; // packed version of jobinfo
|
||||
size_t ndelivered; // count of #local clients that have received the jobinfo
|
||||
size_t nfinalized; // count of #local clients that have finalized
|
||||
pmix_list_t ranks; // list of pmix_rank_info_t for connection support of my clients
|
||||
/* all members of an nspace are required to have the
|
||||
* same personality, but it can differ between nspaces.
|
||||
* Since servers may support clients from multiple nspaces,
|
||||
* track their respective compatibility modules here */
|
||||
pmix_personality_t compat;
|
||||
pmix_epilog_t epilog; // things to do upon termination of all local clients
|
||||
// from this nspace
|
||||
pmix_list_t setup_data; // list of pmix_kval_t containing info structs having blobs
|
||||
// for setting up the local node for this nspace/application
|
||||
pmix_iof_flags_t iof_flags; // output formatting flags
|
||||
pmix_list_t sinks; // IOF write events for output to files or directories
|
||||
} pmix_namespace_t;
|
||||
PMIX_CLASS_DECLARATION(pmix_namespace_t);
|
||||
|
||||
/* define a caddy for quickly creating a list of pmix_namespace_t
|
||||
* objects for local, dedicated purposes */
|
||||
typedef struct {
|
||||
pmix_list_item_t super;
|
||||
pmix_namespace_t *ns;
|
||||
} pmix_nspace_caddy_t;
|
||||
PMIX_CLASS_DECLARATION(pmix_nspace_caddy_t);
|
||||
|
||||
typedef struct {
|
||||
pmix_list_item_t super;
|
||||
pmix_namespace_t *ns;
|
||||
pmix_list_t envars;
|
||||
} pmix_nspace_env_cache_t;
|
||||
PMIX_CLASS_DECLARATION(pmix_nspace_env_cache_t);
|
||||
|
||||
typedef struct {
|
||||
pmix_list_item_t super;
|
||||
pmix_envar_t envar;
|
||||
} pmix_envar_list_item_t;
|
||||
PMIX_CLASS_DECLARATION(pmix_envar_list_item_t);
|
||||
|
||||
|
||||
typedef struct pmix_rank_info_t {
|
||||
pmix_list_item_t super;
|
||||
int peerid; // peer object index into the local clients array on the server
|
||||
pmix_name_t pname;
|
||||
uid_t uid;
|
||||
gid_t gid;
|
||||
bool modex_recvd;
|
||||
int proc_cnt; // #clones of this rank we know about
|
||||
void *server_object; // pointer to rank-specific object provided by server
|
||||
} pmix_rank_info_t;
|
||||
PMIX_CLASS_DECLARATION(pmix_rank_info_t);
|
||||
|
||||
/* define a very simple caddy for dealing with pmix_info_t
|
||||
* and pmix_query_t objects when transferring portions of arrays */
|
||||
typedef struct {
|
||||
pmix_list_item_t super;
|
||||
pmix_info_t *info;
|
||||
size_t ninfo;
|
||||
} pmix_info_caddy_t;
|
||||
PMIX_CLASS_DECLARATION(pmix_info_caddy_t);
|
||||
|
||||
typedef struct {
|
||||
pmix_list_item_t super;
|
||||
pmix_info_t info;
|
||||
} pmix_infolist_t;
|
||||
PMIX_CLASS_DECLARATION(pmix_infolist_t);
|
||||
|
||||
typedef struct {
|
||||
pmix_list_item_t super;
|
||||
pmix_query_t query;
|
||||
} pmix_querylist_t;
|
||||
PMIX_CLASS_DECLARATION(pmix_querylist_t);
|
||||
|
||||
typedef struct {
|
||||
pmix_list_item_t super;
|
||||
pmix_proc_t proc;
|
||||
} pmix_proclist_t;
|
||||
PMIX_CLASS_DECLARATION(pmix_proclist_t);
|
||||
|
||||
/* object for tracking peers - each peer can have multiple
|
||||
* connections. This can occur if the initial app executes
|
||||
* a fork/exec, and the child initiates its own connection
|
||||
* back to the PMIx server. Thus, the trackers should be "indexed"
|
||||
* by the socket, not the process nspace/rank */
|
||||
typedef struct pmix_peer_t {
|
||||
pmix_object_t super;
|
||||
pmix_namespace_t *nptr; // point to the nspace object for this process
|
||||
pmix_rank_info_t *info;
|
||||
pmix_proc_type_t proc_type;
|
||||
pmix_listener_protocol_t protocol;
|
||||
int proc_cnt;
|
||||
int index; // index into the local clients array on the server
|
||||
int sd;
|
||||
bool finalized; // peer has called finalize
|
||||
pmix_event_t send_event; /**< registration with event thread for send events */
|
||||
bool send_ev_active;
|
||||
pmix_event_t recv_event; /**< registration with event thread for recv events */
|
||||
bool recv_ev_active;
|
||||
pmix_list_t send_queue; /**< list of messages to send */
|
||||
pmix_ptl_send_t *send_msg; /**< current send in progress */
|
||||
pmix_ptl_recv_t *recv_msg; /**< current recv in progress */
|
||||
int commit_cnt;
|
||||
pmix_epilog_t epilog; /**< things to be performed upon
|
||||
termination of this peer */
|
||||
} pmix_peer_t;
|
||||
PMIX_CLASS_DECLARATION(pmix_peer_t);
|
||||
|
||||
/* tracker for IOF requests */
|
||||
typedef struct {
|
||||
pmix_object_t super;
|
||||
pmix_event_t ev;
|
||||
pmix_peer_t *requestor;
|
||||
size_t local_id;
|
||||
size_t remote_id;
|
||||
pmix_proc_t *procs;
|
||||
size_t nprocs;
|
||||
pmix_iof_flags_t flags;
|
||||
pmix_iof_channel_t channels;
|
||||
pmix_iof_cbfunc_t cbfunc;
|
||||
pmix_hdlr_reg_cbfunc_t regcbfunc;
|
||||
void *cbdata;
|
||||
} pmix_iof_req_t;
|
||||
PMIX_CLASS_DECLARATION(pmix_iof_req_t);
|
||||
|
||||
/* caddy for query requests */
|
||||
typedef struct {
|
||||
pmix_object_t super;
|
||||
pmix_event_t ev;
|
||||
pmix_lock_t lock;
|
||||
bool host_called;
|
||||
pmix_status_t status;
|
||||
pmix_query_t *queries;
|
||||
size_t nqueries;
|
||||
pmix_proc_t *targets;
|
||||
size_t ntargets;
|
||||
pmix_info_t *info;
|
||||
pmix_info_t *dirs;
|
||||
size_t ninfo;
|
||||
size_t ndirs;
|
||||
pmix_list_t results;
|
||||
size_t nreplies;
|
||||
size_t nrequests;
|
||||
pmix_byte_object_t bo;
|
||||
pmix_info_cbfunc_t cbfunc;
|
||||
pmix_value_cbfunc_t valcbfunc;
|
||||
pmix_release_cbfunc_t relcbfunc;
|
||||
pmix_credential_cbfunc_t credcbfunc;
|
||||
pmix_validation_cbfunc_t validcbfunc;
|
||||
void *cbdata;
|
||||
} pmix_query_caddy_t;
|
||||
PMIX_CLASS_DECLARATION(pmix_query_caddy_t);
|
||||
|
||||
typedef struct {
|
||||
pmix_list_item_t super;
|
||||
char *grpid;
|
||||
pmix_proc_t *members;
|
||||
size_t nmbrs;
|
||||
} pmix_group_t;
|
||||
PMIX_CLASS_DECLARATION(pmix_group_t);
|
||||
|
||||
typedef struct {
|
||||
pmix_list_item_t super;
|
||||
pmix_proc_t proc;
|
||||
pmix_byte_object_t blob; // packed blob of info provided by this proc
|
||||
} pmix_grpinfo_t;
|
||||
PMIX_CLASS_DECLARATION(pmix_grpinfo_t);
|
||||
|
||||
/* define a tracker for collective operations
|
||||
* - instanced in pmix_server_ops.c */
|
||||
typedef struct {
|
||||
pmix_list_item_t super;
|
||||
pmix_event_t ev;
|
||||
bool event_active;
|
||||
bool host_called; // tracker has been passed up to host
|
||||
bool local; // operation is strictly local
|
||||
char *id; // string identifier for the collective
|
||||
pmix_cmd_t type;
|
||||
pmix_proc_t pname;
|
||||
bool hybrid; // true if participating procs are from more than one nspace
|
||||
pmix_proc_t *pcs; // copy of the original array of participants
|
||||
size_t npcs; // number of procs in the array
|
||||
pmix_list_t nslist; // unique nspace list of participants
|
||||
pmix_lock_t lock; // flag for waiting for completion
|
||||
bool def_complete; // all local procs have been registered and the trk definition is complete
|
||||
pmix_list_t local_cbs; // list of pmix_server_caddy_t for sending result to the local participants
|
||||
// Note: there may be multiple entries for a given proc if that proc
|
||||
// has fork/exec'd clones that are also participating
|
||||
uint32_t nlocal; // number of local participants
|
||||
uint32_t local_cnt; // number of local participants who have contributed
|
||||
pmix_info_t *info; // array of info structs
|
||||
size_t ninfo; // number of info structs in array
|
||||
pmix_list_t grpinfo; // list of group info to be distributed
|
||||
int grpop; // the group operation being tracked
|
||||
pmix_collect_t collect_type; // whether or not data is to be returned at completion
|
||||
pmix_modex_cbfunc_t modexcbfunc;
|
||||
pmix_op_cbfunc_t op_cbfunc;
|
||||
void *cbdata;
|
||||
} pmix_server_trkr_t;
|
||||
PMIX_CLASS_DECLARATION(pmix_server_trkr_t);
|
||||
|
||||
/* define an object for moving a send
|
||||
* request into the server's event base and
|
||||
* dealing with some request timeouts
|
||||
* - instanced in pmix_server_ops.c */
|
||||
typedef struct {
|
||||
pmix_list_item_t super;
|
||||
pmix_event_t ev;
|
||||
bool event_active;
|
||||
pmix_server_trkr_t *trk;
|
||||
pmix_ptl_hdr_t hdr;
|
||||
pmix_peer_t *peer;
|
||||
pmix_info_t *info;
|
||||
size_t ninfo;
|
||||
} pmix_server_caddy_t;
|
||||
PMIX_CLASS_DECLARATION(pmix_server_caddy_t);
|
||||
|
||||
/**** THREAD-RELATED ****/
|
||||
/* define a caddy for thread-shifting operations */
|
||||
typedef struct {
|
||||
pmix_object_t super;
|
||||
pmix_event_t ev;
|
||||
pmix_lock_t lock;
|
||||
pmix_status_t status;
|
||||
pmix_status_t *codes;
|
||||
size_t ncodes;
|
||||
uint32_t sessionid;
|
||||
pmix_name_t pname;
|
||||
pmix_proc_t *proc;
|
||||
pmix_peer_t *peer;
|
||||
const char *data;
|
||||
size_t ndata;
|
||||
const char *key;
|
||||
pmix_info_t *info;
|
||||
size_t ninfo;
|
||||
pmix_info_t *directives;
|
||||
size_t ndirs;
|
||||
pmix_notification_fn_t evhdlr;
|
||||
pmix_iof_req_t *iofreq;
|
||||
pmix_kval_t *kv;
|
||||
pmix_value_t *vptr;
|
||||
pmix_server_caddy_t *cd;
|
||||
pmix_server_trkr_t *tracker;
|
||||
bool enviro;
|
||||
union {
|
||||
pmix_release_cbfunc_t relfn;
|
||||
pmix_hdlr_reg_cbfunc_t hdlrregcbfn;
|
||||
pmix_op_cbfunc_t opcbfn;
|
||||
pmix_modex_cbfunc_t modexcbfunc;
|
||||
pmix_info_cbfunc_t infocbfunc;
|
||||
} cbfunc;
|
||||
void *cbdata;
|
||||
size_t ref;
|
||||
} pmix_shift_caddy_t;
|
||||
PMIX_CLASS_DECLARATION(pmix_shift_caddy_t);
|
||||
|
||||
typedef struct {
|
||||
pmix_object_t super;
|
||||
pmix_proc_t p;
|
||||
bool pntrval;
|
||||
bool stval;
|
||||
bool optional;
|
||||
bool immediate;
|
||||
bool add_immediate;
|
||||
bool refresh_cache;
|
||||
pmix_scope_t scope;
|
||||
bool sessioninfo;
|
||||
bool sessiondirective;
|
||||
uint32_t sessionid;
|
||||
bool nodeinfo;
|
||||
bool nodedirective;
|
||||
char *hostname;
|
||||
uint32_t nodeid;
|
||||
bool appinfo;
|
||||
bool appdirective;
|
||||
uint32_t appnum;
|
||||
} pmix_get_logic_t;
|
||||
PMIX_CLASS_DECLARATION(pmix_get_logic_t);
|
||||
|
||||
/* struct for tracking ops */
|
||||
typedef struct {
|
||||
pmix_list_item_t super;
|
||||
pmix_event_t ev;
|
||||
pmix_lock_t lock;
|
||||
bool checked;
|
||||
int status;
|
||||
pmix_status_t pstatus;
|
||||
pmix_scope_t scope;
|
||||
pmix_buffer_t data;
|
||||
union {
|
||||
pmix_ptl_cbfunc_t ptlfn;
|
||||
pmix_op_cbfunc_t opfn;
|
||||
pmix_value_cbfunc_t valuefn;
|
||||
pmix_lookup_cbfunc_t lookupfn;
|
||||
pmix_spawn_cbfunc_t spawnfn;
|
||||
pmix_hdlr_reg_cbfunc_t hdlrregfn;
|
||||
pmix_info_cbfunc_t infofn;
|
||||
pmix_device_dist_cbfunc_t distfn;
|
||||
} cbfunc;
|
||||
size_t errhandler_ref;
|
||||
void *cbdata;
|
||||
pmix_name_t pname;
|
||||
char *key;
|
||||
pmix_value_t *value;
|
||||
pmix_proc_t *proc;
|
||||
pmix_proc_t *procs;
|
||||
size_t nprocs;
|
||||
pmix_info_t *info;
|
||||
size_t ninfo;
|
||||
pmix_device_distance_t *dist;
|
||||
bool infocopy;
|
||||
size_t nvals;
|
||||
pmix_list_t kvs;
|
||||
bool copy;
|
||||
pmix_get_logic_t *lg;
|
||||
bool timer_running;
|
||||
pmix_fabric_t *fabric;
|
||||
pmix_topology_t *topo;
|
||||
} pmix_cb_t;
|
||||
PMIX_CLASS_DECLARATION(pmix_cb_t);
|
||||
|
||||
#define PMIX_THREADSHIFT(r, c) \
|
||||
do { \
|
||||
pmix_event_assign(&((r)->ev), pmix_globals.evbase, -1, EV_WRITE, (c), (r)); \
|
||||
PMIX_POST_OBJECT((r)); \
|
||||
pmix_event_active(&((r)->ev), EV_WRITE, 1); \
|
||||
} while (0)
|
||||
|
||||
#define PMIX_THREADSHIFT_DELAY(r, c, t) \
|
||||
do { \
|
||||
struct timeval _tv = {0, 0}; \
|
||||
pmix_event_evtimer_set(pmix_globals.evbase, &(r)->ev, (c), (r)); \
|
||||
_tv.tv_sec = (int) (t); \
|
||||
_tv.tv_usec = ((t) -_tv.tv_sec) * 1000000.0; \
|
||||
PMIX_POST_OBJECT((r)); \
|
||||
pmix_event_evtimer_add(&(r)->ev, &_tv); \
|
||||
} while (0)
|
||||
|
||||
typedef struct {
|
||||
pmix_object_t super;
|
||||
pmix_event_t ev;
|
||||
pmix_lock_t lock;
|
||||
/* timestamp receipt of the notification so we
|
||||
* can evict the oldest one if we get overwhelmed */
|
||||
time_t ts;
|
||||
/* what room of the hotel they are in */
|
||||
int room;
|
||||
pmix_status_t status;
|
||||
pmix_proc_t source;
|
||||
pmix_data_range_t range;
|
||||
/* For notification, we use the targets field to track
|
||||
* any custom range of procs that are to receive the
|
||||
* event.
|
||||
*/
|
||||
pmix_proc_t *targets;
|
||||
size_t ntargets;
|
||||
size_t nleft; // number of targets left to be notified
|
||||
/* When generating a notification, the originator can
|
||||
* specify the range of procs affected by this event.
|
||||
* For example, when creating a JOB_TERMINATED event,
|
||||
* the RM can specify the nspace of the job that has
|
||||
* ended, thus allowing users to provide a different
|
||||
* callback object based on the nspace being monitored.
|
||||
* We use the "affected" field to track these values
|
||||
* when processing the event chain.
|
||||
*/
|
||||
pmix_proc_t *affected;
|
||||
size_t naffected;
|
||||
/* track if the event generator stipulates that default
|
||||
* event handlers are/are not to be given the event */
|
||||
bool nondefault;
|
||||
/* carry along any other provided info so the individual
|
||||
* handlers can look at it */
|
||||
pmix_info_t *info;
|
||||
size_t ninfo;
|
||||
/* allow for a buffer to be carried across internal processing */
|
||||
pmix_buffer_t *buf;
|
||||
/* the final callback to be executed upon completion of the event */
|
||||
pmix_op_cbfunc_t cbfunc;
|
||||
void *cbdata;
|
||||
} pmix_notify_caddy_t;
|
||||
PMIX_CLASS_DECLARATION(pmix_notify_caddy_t);
|
||||
|
||||
typedef struct {
|
||||
pmix_object_t super;
|
||||
/** Points to key <--> index translation table. */
|
||||
pmix_pointer_array_t *table;
|
||||
/** Stores the next ID. */
|
||||
uint32_t next_id;
|
||||
} pmix_keyindex_t;
|
||||
PMIX_CLASS_DECLARATION(pmix_keyindex_t);
|
||||
|
||||
#define PMIX_KEYINDEX_STATIC_INIT \
|
||||
{ \
|
||||
.super = PMIX_OBJ_STATIC_INIT(pmix_object_t), \
|
||||
.table = NULL, \
|
||||
.next_id = PMIX_INDEX_BOUNDARY \
|
||||
}
|
||||
|
||||
/**** GLOBAL STORAGE ****/
|
||||
/* define a global construct that includes values that must be shared
|
||||
* between various parts of the code library. The client, tool,
|
||||
* and server libraries must instance this structure */
|
||||
typedef struct {
|
||||
int init_cntr; // #times someone called Init - #times called Finalize
|
||||
pmix_proc_t myid;
|
||||
pmix_value_t myidval;
|
||||
pmix_value_t myrankval;
|
||||
pmix_peer_t *mypeer; // my own peer object
|
||||
uid_t uid; // my effective uid
|
||||
gid_t gid; // my effective gid
|
||||
char *hostname; // my hostname
|
||||
uint32_t appnum; // my appnum
|
||||
pid_t pid; // my local pid
|
||||
uint32_t nodeid; // my nodeid, if given
|
||||
uint32_t sessionid; // my sessionid, if given
|
||||
int pindex;
|
||||
pmix_event_base_t *evbase;
|
||||
pmix_event_base_t *evauxbase;
|
||||
int debug_output;
|
||||
pmix_events_t events; // my event handler registrations.
|
||||
bool connected;
|
||||
bool commits_pending;
|
||||
struct timeval event_window;
|
||||
pmix_list_t cached_events; // events waiting in the window prior to processing
|
||||
pmix_pointer_array_t iof_requests; // array of pmix_iof_req_t IOF requests
|
||||
int max_events; // size of the notifications hotel
|
||||
int event_eviction_time; // max time to cache notifications
|
||||
pmix_hotel_t notifications; // hotel of pending notifications
|
||||
/* IOF controls */
|
||||
bool pushstdin;
|
||||
pmix_list_t stdin_targets; // list of pmix_namelist_t
|
||||
bool tag_output;
|
||||
bool xml_output;
|
||||
bool timestamp_output;
|
||||
size_t output_limit;
|
||||
pmix_list_t nspaces;
|
||||
pmix_topology_t topology;
|
||||
pmix_cpuset_t cpuset;
|
||||
bool external_topology;
|
||||
bool external_progress;
|
||||
pmix_iof_flags_t iof_flags;
|
||||
pmix_keyindex_t keyindex;
|
||||
} pmix_globals_t;
|
||||
|
||||
/* provide access to a function to cleanup epilogs */
|
||||
PMIX_EXPORT void pmix_execute_epilog(pmix_epilog_t *ep);
|
||||
|
||||
PMIX_EXPORT pmix_status_t pmix_notify_event_cache(pmix_notify_caddy_t *cd);
|
||||
|
||||
PMIX_EXPORT extern pmix_globals_t pmix_globals;
|
||||
PMIX_EXPORT extern pmix_lock_t pmix_global_lock;
|
||||
PMIX_EXPORT extern const char* PMIX_PROXY_VERSION;
|
||||
PMIX_EXPORT extern const char* PMIX_PROXY_BUGREPORT;
|
||||
|
||||
PMIX_EXPORT void pmix_log_local_op(int sd, short args, void *cbdata_);
|
||||
|
||||
static inline bool pmix_check_node_info(const char *key)
|
||||
{
|
||||
char *keys[] = {
|
||||
PMIX_HOSTNAME, PMIX_HOSTNAME_ALIASES,
|
||||
PMIX_NODEID, PMIX_AVAIL_PHYS_MEMORY,
|
||||
PMIX_LOCAL_PEERS, PMIX_LOCAL_PROCS,
|
||||
PMIX_LOCAL_CPUSETS, PMIX_LOCAL_SIZE,
|
||||
PMIX_NODE_SIZE, PMIX_LOCALLDR,
|
||||
PMIX_NODE_OVERSUBSCRIBED, PMIX_FABRIC_DEVICES,
|
||||
PMIX_FABRIC_COORDINATES, PMIX_FABRIC_DEVICE,
|
||||
PMIX_FABRIC_DEVICE_INDEX, PMIX_FABRIC_DEVICE_NAME,
|
||||
PMIX_FABRIC_DEVICE_VENDOR, PMIX_FABRIC_DEVICE_BUS_TYPE,
|
||||
PMIX_FABRIC_DEVICE_VENDORID, PMIX_FABRIC_DEVICE_DRIVER,
|
||||
PMIX_FABRIC_DEVICE_FIRMWARE, PMIX_FABRIC_DEVICE_ADDRESS,
|
||||
PMIX_FABRIC_DEVICE_MTU, PMIX_FABRIC_DEVICE_COORDINATES,
|
||||
PMIX_FABRIC_DEVICE_SPEED, PMIX_FABRIC_DEVICE_STATE,
|
||||
PMIX_FABRIC_DEVICE_TYPE, PMIX_FABRIC_DEVICE_PCI_DEVID,
|
||||
NULL
|
||||
};
|
||||
size_t n;
|
||||
|
||||
for (n = 0; NULL != keys[n]; n++) {
|
||||
if (0 == strncmp(key, keys[n], PMIX_MAX_KEYLEN)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
static inline bool pmix_check_app_info(const char *key)
|
||||
{
|
||||
char *keys[] = {
|
||||
PMIX_APP_SIZE, PMIX_APPLDR, PMIX_APP_ARGV, PMIX_WDIR,
|
||||
PMIX_PSET_NAME, PMIX_PSET_MEMBERS, PMIX_APP_MAP_TYPE, PMIX_APP_MAP_REGEX,
|
||||
NULL
|
||||
};
|
||||
size_t n;
|
||||
|
||||
for (n = 0; NULL != keys[n]; n++) {
|
||||
if (0 == strncmp(key, keys[n], PMIX_MAX_KEYLEN)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
static inline bool pmix_check_session_info(const char *key)
|
||||
{
|
||||
char *keys[] = {
|
||||
PMIX_SESSION_ID, PMIX_CLUSTER_ID, PMIX_UNIV_SIZE,
|
||||
PMIX_TMPDIR, PMIX_TDIR_RMCLEAN, PMIX_HOSTNAME_KEEP_FQDN,
|
||||
PMIX_RM_NAME, PMIX_RM_VERSION,
|
||||
NULL
|
||||
};
|
||||
size_t n;
|
||||
|
||||
for (n = 0; NULL != keys[n]; n++) {
|
||||
if (0 == strncmp(key, keys[n], PMIX_MAX_KEYLEN)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
static inline bool pmix_check_special_key(const char *key)
|
||||
{
|
||||
char *keys[] = {
|
||||
PMIX_GROUP_CONTEXT_ID,
|
||||
PMIX_GROUP_LOCAL_CID,
|
||||
NULL
|
||||
};
|
||||
size_t n;
|
||||
|
||||
for (n = 0; NULL != keys[n]; n++) {
|
||||
if (0 == strncmp(key, keys[n], PMIX_MAX_KEYLEN)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
#if PMIX_PICKY_COMPILERS
|
||||
#define PMIX_HIDE_UNUSED_PARAMS(...) \
|
||||
do { \
|
||||
int __x = 3; \
|
||||
pmix_hide_unused_params(__x, __VA_ARGS__); \
|
||||
} while(0)
|
||||
|
||||
PMIX_EXPORT void pmix_hide_unused_params(int x, ...);
|
||||
|
||||
#else
|
||||
#define PMIX_HIDE_UNUSED_PARAMS(...)
|
||||
#endif
|
||||
|
||||
#define PMIX_TRACE_KEY_ACTUAL(s, k, v) \
|
||||
do { \
|
||||
if (0 == strcmp(s, k)) { \
|
||||
char *_v = PMIx_Value_string(v); \
|
||||
pmix_output(0, "[%s:%s:%d] %s\n%s\n", \
|
||||
__FILE__, __func__, __LINE__, \
|
||||
PMIx_Get_attribute_name(k), _v); \
|
||||
free(_v); \
|
||||
} \
|
||||
} while(0)
|
||||
|
||||
#define PMIX_TRACE_KEY(c, s, k, v) \
|
||||
do { \
|
||||
if (0 == strcasecmp(c, "SERVER") && \
|
||||
PMIX_PEER_IS_SERVER(pmix_globals.mypeer)) { \
|
||||
PMIX_TRACE_KEY_ACTUAL(s, k, v); \
|
||||
} else if (0 == strcasecmp(c, "CLIENT") && \
|
||||
!PMIX_PEER_IS_SERVER(pmix_globals.mypeer)) { \
|
||||
PMIX_TRACE_KEY_ACTUAL(s, k, v); \
|
||||
} \
|
||||
} while (0)
|
||||
|
||||
END_C_DECLS
|
||||
|
||||
#endif /* PMIX_GLOBALS_H */
|
||||
@@ -0,0 +1,70 @@
|
||||
/*
|
||||
* Copyright (c) 2004-2007 The University of Tennessee and The University
|
||||
* of Tennessee Research Foundation. All rights
|
||||
* reserved.
|
||||
* Copyright (c) 2021-2022 Nanook Consulting. All rights reserved.
|
||||
* $COPYRIGHT$
|
||||
*
|
||||
* Additional copyrights may follow
|
||||
*
|
||||
* $HEADER$
|
||||
*/
|
||||
|
||||
/** @file
|
||||
*
|
||||
* Simple macros to quickly compute a hash value from a string.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef PMIX_HASH_STRING_H
|
||||
#define PMIX_HASH_STRING_H
|
||||
|
||||
/**
|
||||
* Compute the hash value and the string length simultaneously
|
||||
*
|
||||
* @param str (IN) The string which will be parsed (char*)
|
||||
* @param hash (OUT) Where the hash value will be stored (uint32_t)
|
||||
* @param length (OUT) The computed length of the string (uint32_t)
|
||||
*/
|
||||
#define PMIX_HASH_STRLEN(str, hash, length) \
|
||||
do { \
|
||||
register const char *_str = (str); \
|
||||
register uint32_t _hash = 0; \
|
||||
register uint32_t _len = 0; \
|
||||
\
|
||||
while (*_str) { \
|
||||
_len++; \
|
||||
_hash += *_str++; \
|
||||
_hash += (_hash << 10); \
|
||||
_hash ^= (_hash >> 6); \
|
||||
} \
|
||||
\
|
||||
_hash += (_hash << 3); \
|
||||
_hash ^= (_hash >> 11); \
|
||||
(hash) = (_hash + (_hash << 15)); \
|
||||
(length) = _len; \
|
||||
} while (0)
|
||||
|
||||
/**
|
||||
* Compute the hash value
|
||||
*
|
||||
* @param str (IN) The string which will be parsed (char*)
|
||||
* @param hash (OUT) Where the hash value will be stored (uint32_t)
|
||||
*/
|
||||
#define PMIX_HASH_STR(str, hash) \
|
||||
do { \
|
||||
register const char *_str = (str); \
|
||||
register uint32_t _hash = 0; \
|
||||
\
|
||||
while (*_str) { \
|
||||
_hash += *_str++; \
|
||||
_hash += (_hash << 10); \
|
||||
_hash ^= (_hash >> 6); \
|
||||
} \
|
||||
\
|
||||
_hash += (_hash << 3); \
|
||||
_hash ^= (_hash >> 11); \
|
||||
(hash) = (_hash + (_hash << 15)); \
|
||||
} while (0)
|
||||
|
||||
#endif /* PMIX_HASH_STRING_H */
|
||||
@@ -0,0 +1,20 @@
|
||||
/*
|
||||
* Copyright (c) 2021 Amazon.com, Inc. or its affiliates. All Rights
|
||||
* reserved.
|
||||
* Copyright (c) 2021-2024 Nanook Consulting All rights reserved.
|
||||
* $COPYRIGHT$
|
||||
*
|
||||
* Additional copyrights may follow
|
||||
*
|
||||
* $HEADER$
|
||||
*
|
||||
* Wrapper around GASNet's gasnet_portable_platform.h to avoid
|
||||
* compiler warnings
|
||||
*/
|
||||
|
||||
#ifndef PMIX_PORTABLE_PLATFORM_H
|
||||
#define PMIX_PORTABLE_PLATFORM_H 1
|
||||
|
||||
#include "src/include/pmix_portable_platform_real.h"
|
||||
|
||||
#endif
|
||||
File diff suppressed because it is too large
Load Diff
40
macx64/mpi/openmpi/include/pmix/src/include/pmix_prefetch.h
Normal file
40
macx64/mpi/openmpi/include/pmix/src/include/pmix_prefetch.h
Normal file
@@ -0,0 +1,40 @@
|
||||
/*
|
||||
* Copyright (c) 2004-2006 The Regents of the University of California.
|
||||
* All rights reserved.
|
||||
* Copyright (c) 2014-2020 Intel, Inc. All rights reserved.
|
||||
* Copyright (c) 2021-2022 Nanook Consulting. All rights reserved.
|
||||
* $COPYRIGHT$
|
||||
*
|
||||
* Additional copyrights may follow
|
||||
*
|
||||
* $HEADER$
|
||||
*/
|
||||
|
||||
/** @file
|
||||
*
|
||||
* Compiler-specific prefetch functions
|
||||
*
|
||||
* A small set of prefetch / prediction interfaces for using compiler
|
||||
* directives to improve memory prefetching and branch prediction
|
||||
*/
|
||||
|
||||
#ifndef PMIX_PREFETCH_H
|
||||
#define PMIX_PREFETCH_H
|
||||
|
||||
#include "src/include/pmix_config.h"
|
||||
|
||||
#if PMIX_C_HAVE_BUILTIN_EXPECT
|
||||
# define PMIX_LIKELY(expression) __builtin_expect(!!(expression), 1)
|
||||
# define PMIX_UNLIKELY(expression) __builtin_expect(!!(expression), 0)
|
||||
#else
|
||||
# define PMIX_LIKELY(expression) (expression)
|
||||
# define PMIX_UNLIKELY(expression) (expression)
|
||||
#endif
|
||||
|
||||
#if PMIX_C_HAVE_BUILTIN_PREFETCH
|
||||
# define PMIX_PREFETCH(address, rw, locality) __builtin_prefetch(address, rw, locality)
|
||||
#else
|
||||
# define PMIX_PREFETCH(address, rw, locality)
|
||||
#endif
|
||||
|
||||
#endif
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user