blob: ba261555cddd3c68607ff17ecff275372e22718d [file] [log] [blame]
/* -*- Mode: C; c-basic-offset:4 ; -*- */
/*
* (C) 2007 by Argonne National Laboratory.
* See COPYRIGHT in top-level directory.
*/
#ifndef PMI2UTIL_H_INCLUDED
#define PMI2UTIL_H_INCLUDED
#include <stdio.h>
#include <stdlib.h>
/* maximum sizes for arrays */
#define PMI2_MAXLINE 1024
#define PMI2_IDSIZE 32
#define TRUE 1
#define FALSE 0
#ifdef DEBUG
#define PMI2U_printf(x...) do { \
char logstr[1024]; \
snprintf(logstr, 1024, x); \
fprintf(stderr, "[%s (%d): %s] %s\n", \
__FILE__, __LINE__, __func__, logstr); \
} while (0)
#else
#define PMI2U_printf(x...)
#endif
#define PMI2U_Assert(a_) do { \
if (!(a_)) { \
PMI2U_printf("ASSERT( %s )", #a_); \
} \
} while (0)
#define PMI2U_ERR_POP(err) do { \
pmi2_errno = err; \
PMI2U_printf("err. %d", pmi2_errno); \
goto fn_fail; \
} while (0)
#define PMI2U_ERR_SETANDJUMP(err, class, x...) do { \
char errstr[PMI2_MAXLINE * 3]; \
snprintf(errstr, sizeof(errstr), x); \
PMI2U_printf("err. %s", errstr);\
pmi2_errno = class; \
goto fn_fail; \
} while (0)
#define PMI2U_ERR_CHKANDJUMP(cond, err, class, x...) do { \
if (cond) PMI2U_ERR_SETANDJUMP(err, class, x); \
} while (0)
#define PMI2U_CHKMEM_SETERR(rc_, nbytes_, name_) do { \
PMI2U_printf("ERROR: memory allocation of %lu bytes failed for %s", \
(long unsigned int) nbytes_, name_); \
rc_ = PMI2_ERR_NOMEM; \
goto fn_exit; \
} while(0)
/* Persistent memory that we may want to recover if something goes wrong */
#define PMI2U_CHKMEM_DECL(n_) \
void* pmi2u_chkmem_stk_[n_] = {0}; \
int pmi2u_chkmem_stk_sp_= 0; \
const int pmi2u_chkmem_stk_sz_ = n_
#define PMI2U_CHKMEM_REAP() \
while (pmi2u_chkmem_stk_sp_ > 0) { \
free ((void*)( pmi2u_chkmem_stk_[--pmi2u_chkmem_stk_sp_] )); \
}
#define PMI2U_CHKMEM_COMMIT() pmi2u_chkmem_stk_sp_ = 0
#define PMI2U_CHKMEM_MALLOC(pointer_,type_,nbytes_,rc_,name_) do { \
pointer_ = (type_)malloc(nbytes_); \
if (pointer_ && (pmi2u_chkmem_stk_sp_< pmi2u_chkmem_stk_sz_)) { \
pmi2u_chkmem_stk_[pmi2u_chkmem_stk_sp_++] = pointer_; \
} else { \
PMI2U_CHKMEM_SETERR(rc_,nbytes_,name_); \
goto fn_fail; \
} \
} while(0)
#define PMI2U_CHKMEM_FREEALL() \
while (pmi2u_chkmem_stk_sp_ > 0) { \
free ((void*)( pmi2u_chkmem_stk_[--pmi2u_chkmem_stk_sp_] )); \
}
/* prototypes for PMIU routines */
void PMI2U_Set_rank( int PMI_rank );
void PMI2U_SetServer( void );
int PMI2U_readline( int fd, char *buf, int max );
int PMI2U_writeline( int fd, char *buf );
int PMI2U_parse_keyvals( char *st );
void PMI2U_dump_keyvals( void );
char *PMI2U_getval( const char *keystr, char *valstr, int vallen );
void PMI2U_chgval( const char *keystr, char *valstr );
int MPIU_Strncpy(char *, const char *, size_t);
#endif /* PMI2UTIL_H_INCLUDED */