/* -*- 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 #include /* 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 */