📄 errutil.c
字号:
i_mid = (i_high + i_low) / 2; c = strcmp( generic_err_msgs[i].short_name, msg ); if (c == 0) return i_mid; if (c < 0) { i_low = i_mid + 1; } else { i_high = i_mid - 1; } } return -1;*/#endif#if MPICH_ERROR_MSG_LEVEL >= MPICH_ERROR_MSG_ALL/* Given a message string abbreviation (e.g., one that starts "**"), return the corresponding index. For the specific * (parameterized messages), use idx = FindSpecificMsgIndex( "**msg" ); */static int FindSpecificMsgIndex( const char *msg ){ int i, c; for (i=0; i<specific_msgs_len; i++) { c = strcmp( specific_err_msgs[i].short_name, msg ); if (c == 0) return i; if (c > 0) { /* don't return here if the string partially matches */ if (strncmp(specific_err_msgs[i].short_name, msg, strlen(msg)) != 0) return -1; } } return -1;}#endifint MPIR_Err_is_fatal(int errcode){ return (errcode & ERROR_FATAL_MASK) ? TRUE : FALSE;}#if 0char * simplify_fmt_string(const char *str){ char *result; char *p; result = MPIU_Strdup(str); /* communicator */ p = strstr(result, "%C"); while (p) { p++; *p = 'd'; p = strstr(p, "%C"); } /* info */ p = strstr(result, "%I"); while (p) { p++; *p = 'd'; p = strstr(p, "%I"); } /* datatype */ p = strstr(result, "%D"); while (p) { p++; *p = 'd'; p = strstr(p, "%D"); } /* file */ p = strstr(result, "%F"); while (p) { p++; *p = 'd'; p = strstr(p, "%F"); } /* window */ p = strstr(result, "%W"); while (p) { p++; *p = 'd'; p = strstr(p, "%W"); } /* group */ p = strstr(result, "%G"); while (p) { p++; *p = 'd'; p = strstr(p, "%G"); } /* op */ p = strstr(result, "%O"); while (p) { p++; *p = 'd'; p = strstr(p, "%O"); } /* request */ p = strstr(result, "%R"); while (p) { p++; *p = 'd'; p = strstr(p, "%R"); } /* errhandler */ p = strstr(result, "%E"); while (p) { p++; *p = 'd'; p = strstr(p, "%E"); } return result;}#endif#define ASSERT_STR_MAXLEN 256static const char * GetAssertString(int d){ static char str[ASSERT_STR_MAXLEN] = ""; char *cur; size_t len = ASSERT_STR_MAXLEN; size_t n; if (d == 0) { MPIU_Strncpy(str, "assert=0", ASSERT_STR_MAXLEN); return str; } cur = str; if (d & MPI_MODE_NOSTORE) { MPIU_Strncpy(cur, "MPI_MODE_NOSTORE", len); n = strlen(cur); cur += n; len -= n; d ^= MPI_MODE_NOSTORE; } if (d & MPI_MODE_NOCHECK) { if (len < ASSERT_STR_MAXLEN) MPIU_Strncpy(cur, " | MPI_MODE_NOCHECK", len); else MPIU_Strncpy(cur, "MPI_MODE_NOCHECK", len); n = strlen(cur); cur += n; len -= n; d ^= MPI_MODE_NOCHECK; } if (d & MPI_MODE_NOPUT) { if (len < ASSERT_STR_MAXLEN) MPIU_Strncpy(cur, " | MPI_MODE_NOPUT", len); else MPIU_Strncpy(cur, "MPI_MODE_NOPUT", len); n = strlen(cur); cur += n; len -= n; d ^= MPI_MODE_NOPUT; } if (d & MPI_MODE_NOPRECEDE) { if (len < ASSERT_STR_MAXLEN) MPIU_Strncpy(cur, " | MPI_MODE_NOPRECEDE", len); else MPIU_Strncpy(cur, "MPI_MODE_NOPRECEDE", len); n = strlen(cur); cur += n; len -= n; d ^= MPI_MODE_NOPRECEDE; } if (d & MPI_MODE_NOSUCCEED) { if (len < ASSERT_STR_MAXLEN) MPIU_Strncpy(cur, " | MPI_MODE_NOSUCCEED", len); else MPIU_Strncpy(cur, "MPI_MODE_NOSUCCEED", len); n = strlen(cur); cur += n; len -= n; d ^= MPI_MODE_NOSUCCEED; } if (d) { if (len < ASSERT_STR_MAXLEN) MPIU_Snprintf(cur, len, " | 0x%x", d); else MPIU_Snprintf(cur, len, "assert=0x%x", d); } return str;}static const char * GetDTypeString(MPI_Datatype d){ static char default_str[64]; int num_integers, num_addresses, num_datatypes, combiner = 0; char *str; if (d == MPI_DATATYPE_NULL) return "MPI_DATATYPE_NULL"; if (d == 0) { MPIU_Strncpy(default_str, "dtype=0x0", 64); return default_str; } MPID_Type_get_envelope(d, &num_integers, &num_addresses, &num_datatypes, &combiner); if (combiner == MPI_COMBINER_NAMED) { str = MPIDU_Datatype_builtin_to_string(d); if (str == NULL) { MPIU_Snprintf(default_str, 64, "dtype=0x%08x", d); return default_str; } return str; } /* default is not thread safe */ str = MPIDU_Datatype_combiner_to_string(combiner); if (str == NULL) { MPIU_Snprintf(default_str, 64, "dtype=USER<0x%08x>", d); return default_str; } MPIU_Snprintf(default_str, 64, "dtype=USER<%s>", str); return default_str;}static const char * GetMPIOpString(MPI_Op o){ static char default_str[64]; switch (o) { case MPI_OP_NULL: return "MPI_OP_NULL"; case MPI_MAX: return "MPI_MAX"; case MPI_MIN: return "MPI_MIN"; case MPI_SUM: return "MPI_SUM"; case MPI_PROD: return "MPI_PROD"; case MPI_LAND: return "MPI_LAND"; case MPI_BAND: return "MPI_BAND"; case MPI_LOR: return "MPI_LOR"; case MPI_BOR: return "MPI_BOR"; case MPI_LXOR: return "MPI_LXOR"; case MPI_BXOR: return "MPI_BXOR"; case MPI_MINLOC: return "MPI_MINLOC"; case MPI_MAXLOC: return "MPI_MAXLOC"; case MPI_REPLACE: return "MPI_REPLACE"; } /* default is not thread safe */ MPIU_Snprintf(default_str, 64, "op=0x%x", o); return default_str;}static int vsnprintf_mpi(char *str, size_t maxlen, const char *fmt_orig, va_list list){ char *begin, *end, *fmt; size_t len; MPI_Comm C; MPI_Info I; MPI_Datatype D;/* MPI_File F;*/ MPI_Win W; MPI_Group G; MPI_Op O; MPI_Request R; MPI_Errhandler E; char *s; int t, i, d, mpi_errno=MPI_SUCCESS; void *p; fmt = MPIU_Strdup(fmt_orig); if (fmt == NULL) { if (maxlen > 0 && str != NULL) *str = '\0'; return 0; } begin = fmt; end = strchr(fmt, '%'); while (end) { len = maxlen; if (len > (size_t)(end - begin)) { len = (size_t)(end - begin); } if (len) { memcpy(str, begin, len); str += len; maxlen -= len; } end++; begin = end+1; switch ((int)(*end)) { case (int)'s': s = va_arg(list, char *); MPIU_Strncpy(str, s, maxlen); break; case (int)'d': d = va_arg(list, int); MPIU_Snprintf(str, maxlen, "%d", d); break; case (int)'i': i = va_arg(list, int); switch (i) { case MPI_ANY_SOURCE: MPIU_Strncpy(str, "MPI_ANY_SOURCE", maxlen); break; case MPI_PROC_NULL: MPIU_Strncpy(str, "MPI_PROC_NULL", maxlen); break; case MPI_ROOT: MPIU_Strncpy(str, "MPI_ROOT", maxlen); break; case MPI_UNDEFINED_RANK: MPIU_Strncpy(str, "MPI_UNDEFINED_RANK", maxlen); break; default: MPIU_Snprintf(str, maxlen, "%d", i); break; } break; case (int)'t': t = va_arg(list, int); switch (t) { case MPI_ANY_TAG: MPIU_Strncpy(str, "MPI_ANY_TAG", maxlen); break; case MPI_UNDEFINED: MPIU_Strncpy(str, "MPI_UNDEFINED", maxlen); break; default: MPIU_Snprintf(str, maxlen, "%d", t); break; } break; case (int)'p': p = va_arg(list, void *); if (p == MPI_IN_PLACE) { MPIU_Strncpy(str, "MPI_IN_PLACE", maxlen); } else {#ifdef HAVE_WINDOWS_H MPIU_Snprintf(str, maxlen, "0x%p", p);#else MPIU_Snprintf(str, maxlen, "%p", p);#endif } break; case (int)'C': C = va_arg(list, MPI_Comm); switch (C) { case MPI_COMM_WORLD: MPIU_Strncpy(str, "MPI_COMM_WORLD", maxlen); break; case MPI_COMM_SELF: MPIU_Strncpy(str, "MPI_COMM_SELF", maxlen); break; case MPI_COMM_NULL: MPIU_Strncpy(str, "MPI_COMM_NULL", maxlen); break; default: MPIU_Snprintf(str, maxlen, "comm=0x%x", C); break; } break; case (int)'I': I = va_arg(list, MPI_Info); if (I == MPI_INFO_NULL) { MPIU_Strncpy(str, "MPI_INFO_NULL", maxlen); } else { MPIU_Snprintf(str, maxlen, "info=0x%x", I); } break; case (int)'D': D = va_arg(list, MPI_Datatype); MPIU_Snprintf(str, maxlen, "%s", GetDTypeString(D)); break;#if 0 case (int)'F': F = va_arg(list, MPI_File); if (F == MPI_FILE_NULL) { MPIU_Strncpy(str, "MPI_FILE_NULL", maxlen); } else { MPIU_Snprintf(str, maxlen, "file=0x%x", (unsigned long)F); } break;#endif case (int)'W': W = va_arg(list, MPI_Win); if (W == MPI_WIN_NULL) { MPIU_Strncpy(str, "MPI_WIN_NULL", maxlen); } else { MPIU_Snprintf(str, maxlen, "win=0x%x", W); } break; case (int)'A': d = va_arg(list, int); MPIU_Snprintf(str, maxlen, "%s", GetAssertString(d)); break; case (int)'G': G = va_arg(list, MPI_Group); if (G == MPI_GROUP_NULL) { MPIU_Strncpy(str, "MPI_GROUP_NULL", maxlen); } else { MPIU_Snprintf(str, maxlen, "group=0x%x", G); } break; case (int)'O': O = va_arg(list, MPI_Op); MPIU_Snprintf(str, maxlen, "%s", GetMPIOpString(O)); break; case (int)'R': R = va_arg(list, MPI_Request); if (R == MPI_REQUEST_NULL) { MPIU_Strncpy(str, "MPI_REQUEST_NULL", maxlen); } else { MPIU_Snprintf(str, maxlen, "req=0x%x", R); } break; case (int)'E': E = va_arg(list, MPI_Errhandler); if (E == MPI_ERRHANDLER_NULL) { MPIU_Strncpy(str, "MPI_ERRHANDLER_NULL", maxlen); } else { MPIU_Snprintf(str, maxlen, "errh=0x%x", E); } break; default: /* Error: unhandled output type */ return 0; /* if (maxlen > 0 && str != NULL) *str = '\0'; break; */ } len = strlen(str); maxlen -= len; str += len; end = strchr(begin, '%'); } if (*begin != '\0') { MPIU_Strncpy(str, begin, maxlen); } /* Free the dup'ed format string */ MPIU_Free( fmt ); return mpi_errno;}/* Err_create_code is just a shell that accesses the va_list and then calls the real routine. */int MPIR_Err_create_code( int lastcode, int fatal, const char fcname[], int line, int error_class, const char generic_msg[], const char specific_msg[], ... ){ int rc; va_list Argp; va_start(Argp, specific_msg); rc = MPIR_Err_create_code_valist( lastcode, fatal, fcname, line, error_class, generic_msg, specific_msg, Argp ); va_end(Argp); return rc;}/* * This is the real routine for generating an error code. It takes * a va_list so that it can be called by any routine that accepts a * variable number of arguments. */int MPIR_Err_create_code_valist( int lastcode, int fatal, const char fcname[], int line, int error_class, const char generic_msg[], const char specific_msg[], va_list Argp ){ int err_code; int generic_idx; int use_user_error_code = 0; /* Create the code from the class and the message ring index */ if (MPIR_Err_abort_on_error) { /*printf("aborting from %s, line %d\n", fcname, line);fflush(stdout);*/ abort(); } /* va_start(Argp, specific_msg); */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -