static const char * hook_eq_strerror(struct fid_eq *eq, int prov_errno, const void *err_data, char *buf, size_t len) { struct hook_eq *myeq = container_of(eq, struct hook_eq, eq); return fi_eq_strerror(myeq->heq, prov_errno, err_data, buf, len); }
void eq_readerr(struct fid_eq *eq, char *eq_str) { struct fi_eq_err_entry eq_err; const char *err_str; int rd; rd = fi_eq_readerr(eq, &eq_err, 0); if (rd != sizeof(eq_err)) { FT_PRINTERR("fi_eq_readerr", rd); } else { err_str = fi_eq_strerror(eq, eq_err.prov_errno, eq_err.err_data, NULL, 0); fprintf(stderr, "%s: %d %s\n", eq_str, eq_err.err, fi_strerror(eq_err.err)); fprintf(stderr, "%s: prov_err: %s (%d)\n", eq_str, err_str, eq_err.prov_errno); } }
std::string get_eq_error_string(fid_eq* eq, ssize_t ec) { fi_eq_err_entry entry = {}; std::stringstream error{}; if (ec < 0) { ec = -ec; } if (ec != FI_EAVAIL) { error << "fi_eq_sread error: " << fi_error_to_string(int(ec)) << "(" << ec << ") "; } auto rc = fi_eq_readerr(eq, &entry, 0); if (rc < 0) { error << "fi_eq_readerr error: " << fi_error_to_string(int(rc)) << "(" << rc << ")"; } else { error << "fi_eq_readerr provider_error: " << fi_eq_strerror(eq, entry.prov_errno, entry.err_data, nullptr, 0) << "(" << entry.prov_errno << ") error: " << fi_error_to_string(entry.err); } return error.str(); }
int create_connection(void) { struct fi_info *prov; struct fi_eq_cm_entry entry; struct fi_info *info; ssize_t n; uint32_t event; int ret = -1; print_trace("in\n"); memset(&ctx, 0, sizeof(ctx)); if (match_provider(&prov)) goto err1; if (client_connect(prov, &ctx)) goto err2; dprint(DEBUG_CONNECT, "Waiting for Server to connect\n"); n = fi_eq_sread(ctx.eq, &event, &entry, sizeof(entry), CTIMEOUT, 0); if (n < sizeof(entry)) { struct fi_eq_err_entry eqe; int rc; print_err("fi_eq_sread '%s'(%d)\n", fi_strerror(n), (int) n); rc = fi_eq_readerr(ctx.eq, &eqe, 0); if (rc) print_err("fi_eq_readerr() returns %d '%s'\n", rc, fi_strerror(rc)); else { char buf[64]; print_err("fi_eq_readerr() prov_err '%s'(%d)\n", fi_eq_strerror(ctx.eq, eqe.prov_errno, eqe.err_data, buf, sizeof(buf)), eqe.prov_errno); print_err("fi_eq_readerr() err '%s'(%d)\n", fi_strerror(eqe.err), eqe.err); } return (int) n; } if (event != FI_CONNECTED) { print_err("unexpected event %d\n", event); return -FI_EOTHER; } /* same context specified in fi_endpoint()? */ if (entry.fid->context != CONTEXT) { print_err("entry.fid->context %lx != %lx\n", (ulong)entry.fid->context, (ulong)CONTEXT); } info = entry.info; dprint(DEBUG_CONNECT, "*** Client Connected\n"); dprint(DEBUG_CONNECT, "Client private data(len %ld): '%s'\n", (n - sizeof(entry)), entry.data); return 0; err2: client_disconnect(&ctx); fi_freeinfo(prov); err1: return ret; }