1
1
openmpi/opal/mca/btl/usnic/btl_usnic_util.h
Jeff Squyres 8a2441603f btl/usnic: remove all calls to abort()
Inspired by https://github.com/open-mpi/ompi/pull/5205, finally remove
all calls to abort() from the usnic BTL.

Signed-off-by: Jeff Squyres <jsquyres@cisco.com>
2019-05-11 05:17:29 -07:00

126 строки
2.8 KiB
C

/*
* Copyright (c) 2013-2019 Cisco Systems, Inc. All rights reserved
* $COPYRIGHT$
*
* Additional copyrights may follow
*
* $HEADER$
*/
#ifndef BTL_USNIC_UTIL_H
#define BTL_USNIC_UTIL_H
#include "opal/datatype/opal_convertor.h"
#include "btl_usnic.h"
#ifndef MIN
# define MIN(a,b) ((a) < (b) ? (a) : (b))
#endif
/*
* Safely (but abnornmally) exit this process without abort()'ing (and
* leaving a corefile).
*/
struct opal_btl_usnic_module_t;
void opal_btl_usnic_exit(struct opal_btl_usnic_module_t *module);
/*
* Print a show_help message and then call opal_btl_usnic_exit().
*/
void opal_btl_usnic_util_abort(const char *msg, const char *file, int line);
/*
* Long enough to hold "xxx.xxx.xxx.xxx/xx"
*/
#define IPV4STRADDRLEN 20
/*
* If netmask==0, it is not included in the output string. addr is
* expected to be in network byte order.
*/
void opal_btl_usnic_snprintf_ipv4_addr(char *out, size_t maxlen,
uint32_t addr_be, uint32_t netmask_be);
void opal_btl_usnic_snprintf_bool_array(char *s, size_t slen, bool a[], size_t alen);
void opal_btl_usnic_dump_hex(int verbose_level, int output_id,
void *vaddr, int len);
size_t opal_btl_usnic_convertor_pack_peek(const opal_convertor_t *conv,
size_t max_len);
/* avoid "defined but not used" warnings */
static inline int __opal_attribute_always_inline__ usnic_fls(int x)
__opal_attribute_unused__;
static inline int __opal_attribute_always_inline__ usnic_fls(int x)
{
int r = 32;
if (!x) {
return 0;
}
if (!(x & 0xffff0000u)) {
x <<= 16;
r -= 16;
}
if (!(x & 0xff000000u)) {
x <<= 8;
r -= 8;
}
if (!(x & 0xf0000000u)) {
x <<= 4;
r -= 4;
}
if (!(x & 0xc0000000u)) {
x <<= 2;
r -= 2;
}
if (!(x & 0x80000000u)) {
r -= 1;
}
return r;
}
/* a helper function that just declutters convertor packing */
static inline void
usnic_convertor_pack_simple(
opal_convertor_t *convertor,
void *dest,
size_t max_bytes_to_pack,
size_t *bytes_packed)
{
int rc;
struct iovec iov;
uint32_t iov_count;
iov.iov_base = (IOVBASE_TYPE*)dest;
iov.iov_len = max_bytes_to_pack;
iov_count = 1;
*bytes_packed = max_bytes_to_pack;
rc = opal_convertor_pack(convertor, &iov, &iov_count, bytes_packed);
if (OPAL_UNLIKELY(rc < 0)) {
opal_btl_usnic_util_abort("opal_convertor_pack error", __FILE__, __LINE__);
}
}
static inline int
usnic_netmask_to_cidrlen(
uint32_t netmask_be)
{
return 33 - ffs(ntohl(netmask_be));
}
static inline uint32_t
usnic_cidrlen_to_netmask(
int cidrlen)
{
uint32_t mask;
mask = ~0 << (32 - cidrlen);
return htonl(mask);
}
#endif /* BTL_USNIC_UTIL_H */