erl_check_io.c
来自「OTP是开放电信平台的简称」· C语言 代码 · 共 1,430 行 · 第 1/3 页
C
1,430 行
case ERTS_EV_TYPE_NONE: /* Deselected ... */ break; default: { /* Error */ erts_dsprintf_buf_t *dsbufp; dsbufp = erts_create_logger_dsbuf(); erts_dsprintf(dsbufp, "Invalid event request type for fd in erts_poll()! " "fd=%d, event request type=%sd\n", fd, (int) drv_ev_state[fd].type); ASSERT(0); deselect(fd, 0); break; } } } reset_ignores(); erts_smp_mtx_unlock(&drv_ev_state_mtx);}static voidbad_fd_in_pollset(int fd, Eterm inport, Eterm outport, ErtsPollEvents events){ erts_dsprintf_buf_t *dsbufp = erts_create_logger_dsbuf(); if (events & (ERTS_POLL_EV_IN|ERTS_POLL_EV_OUT)) { char *io_str; Eterm port = NIL; if ((events & ERTS_POLL_EV_IN) && (events & ERTS_POLL_EV_OUT)) { io_str = "input/output"; if (inport == outport) port = inport; } else { if (events & ERTS_POLL_EV_IN) { io_str = "input"; port = inport; } else { io_str = "output"; port = outport; } } erts_dsprintf(dsbufp, "Bad %s fd in erts_poll()! fd=%d, ", io_str, fd); if (is_nil(port)) { ErtsPortNames *ipnp = erts_get_port_names(inport); ErtsPortNames *opnp = erts_get_port_names(outport); erts_dsprintf(dsbufp, "ports=%T/%T, drivers=%s/%s, names=%s/%s\n", is_nil(inport) ? am_undefined : inport, is_nil(outport) ? am_undefined : outport, ipnp->driver_name ? ipnp->driver_name : "<unknown>", opnp->driver_name ? opnp->driver_name : "<unknown>", ipnp->name ? ipnp->name : "<unknown>", opnp->name ? opnp->name : "<unknown>"); erts_free_port_names(ipnp); erts_free_port_names(opnp); } else { ErtsPortNames *pnp = erts_get_port_names(port); erts_dsprintf(dsbufp, "port=%T, driver=%s, name=%s\n", is_nil(port) ? am_undefined : port, pnp->driver_name ? pnp->driver_name : "<unknown>", pnp->name ? pnp->name : "<unknown>"); erts_free_port_names(pnp); } } else { erts_dsprintf(dsbufp, "Bad fd in erts_poll()! fd=%d\n", fd); } erts_send_error_to_logger_nogl(dsbufp); /* unmap entry */ deselect(fd, 0);}static voidstale_drv_select(Eterm id, int fd, int mode){ erts_stale_drv_select(id, (ErlDrvEvent) fd, mode, 0); deselect(fd, mode);}voidERTS_CIO_EXPORT(erts_init_check_io)(void){ init_fd_list_alloc(); ignored_list = NULL; erts_smp_atomic_init(&in_poll_wait, 0); ERTS_CIO_POLL_INIT(); max_fds = ERTS_CIO_POLL_MAX_FDS(); pollset = ERTS_CIO_NEW_POLLSET(); erts_smp_mtx_init(&drv_ev_state_mtx, "drv_ev_state"); drv_ev_state_len = 0; drv_ev_state = NULL;}intERTS_CIO_EXPORT(erts_check_io_max_files)(void){ return max_fds;}UintERTS_CIO_EXPORT(erts_check_io_size)(void){ Uint res; ErtsPollInfo pi; erts_smp_mtx_lock(&drv_ev_state_mtx); ERTS_CIO_POLL_INFO(pollset, &pi); res = pi.memory_size; res += sizeof(ErtsDrvEventState)*drv_ev_state_len; erts_smp_mtx_unlock(&drv_ev_state_mtx); return res;}EtermERTS_CIO_EXPORT(erts_check_io_info)(void *proc){ Process *p = (Process *) proc; Eterm tags[15], values[15], res; Uint sz, *szp, *hp, **hpp, memory_size; Sint i; ErtsPollInfo pi; erts_smp_mtx_lock(&drv_ev_state_mtx); ERTS_CIO_POLL_INFO(pollset, &pi); memory_size = pi.memory_size; memory_size += sizeof(ErtsDrvEventState)*drv_ev_state_len; erts_smp_mtx_unlock(&drv_ev_state_mtx); hpp = NULL; szp = &sz; sz = 0; bld_it: i = 0; tags[i] = erts_bld_atom(hpp, szp, "name"); values[i++] = erts_bld_atom(hpp, szp, "erts_poll"); tags[i] = erts_bld_atom(hpp, szp, "primary"); values[i++] = erts_bld_atom(hpp, szp, pi.primary); tags[i] = erts_bld_atom(hpp, szp, "fallback"); values[i++] = erts_bld_atom(hpp, szp, pi.fallback ? pi.fallback : "false"); tags[i] = erts_bld_atom(hpp, szp, "kernel_poll"); values[i++] = erts_bld_atom(hpp, szp, pi.kernel_poll ? pi.kernel_poll : "false"); tags[i] = erts_bld_atom(hpp, szp, "memory_size"); values[i++] = erts_bld_uint(hpp, szp, memory_size); tags[i] = erts_bld_atom(hpp, szp, "total_poll_set_size"); values[i++] = erts_bld_uint(hpp, szp, (Uint) pi.poll_set_size); if (pi.fallback) { tags[i] = erts_bld_atom(hpp, szp, "fallback_poll_set_size"); values[i++] = erts_bld_uint(hpp, szp, (Uint) pi.fallback_poll_set_size); } tags[i] = erts_bld_atom(hpp, szp, "lazy_updates"); values[i++] = pi.lazy_updates ? am_true : am_false; if (pi.lazy_updates) { tags[i] = erts_bld_atom(hpp, szp, "pending_updates"); values[i++] = erts_bld_uint(hpp, szp, (Uint) pi.pending_updates); } tags[i] = erts_bld_atom(hpp, szp, "batch_updates"); values[i++] = pi.batch_updates ? am_true : am_false; tags[i] = erts_bld_atom(hpp, szp, "concurrent_updates"); values[i++] = pi.concurrent_updates ? am_true : am_false; tags[i] = erts_bld_atom(hpp, szp, "max_fds"); values[i++] = erts_bld_uint(hpp, szp, (Uint) pi.max_fds);#ifdef ERTS_POLL_COUNT_AVOIDED_WAKEUPS tags[i] = erts_bld_atom(hpp, szp, "no_avoided_wakeups"); values[i++] = erts_bld_uint(hpp, szp, (Uint) pi.no_avoided_wakeups); tags[i] = erts_bld_atom(hpp, szp, "no_avoided_interrupts"); values[i++] = erts_bld_uint(hpp, szp, (Uint) pi.no_avoided_interrupts); tags[i] = erts_bld_atom(hpp, szp, "no_interrupt_timed"); values[i++] = erts_bld_uint(hpp, szp, (Uint) pi.no_interrupt_timed);#endif res = erts_bld_2tup_list(hpp, szp, i, tags, values); if (!hpp) { hp = HAlloc(p, sz); hpp = &hp; szp = NULL; goto bld_it; } return res;}static ERTS_INLINE ErtsPollEventsprint_events(ErtsPollEvents ev){ int first = 1; if(ev & ERTS_POLL_EV_IN) { ev &= ~ERTS_POLL_EV_IN; erts_printf("%s%s", first ? "" : "|", "IN"); first = 0; } if(ev & ERTS_POLL_EV_OUT) { ev &= ~ERTS_POLL_EV_OUT; erts_printf("%s%s", first ? "" : "|", "OUT"); first = 0; } /* The following should not appear... */ if(ev & ERTS_POLL_EV_NVAL) { erts_printf("%s%s", first ? "" : "|", "NVAL"); first = 0; } if(ev & ERTS_POLL_EV_ERR) { erts_printf("%s%s", first ? "" : "|", "ERR"); first = 0; } if(ev & ERTS_POLL_EV_1SHOT) { erts_printf("%s%s", first ? "" : "|", "1SHOT"); first = 0; } if(ev & ERTS_POLL_EV_FULL_1SHOT) { erts_printf("%s%s", first ? "" : "|", "FULL_1SHOT"); first = 0; } if (ev) erts_printf("%s0x%b32x", first ? "" : "|", (Uint32) ev); return ev;}intERTS_CIO_EXPORT(erts_check_io_debug)(void){ int res = 0; int fd; int used_fds = 0; int internal_fds = 0; ErtsPollEvents *epep; ErtsDrvEventState null_des; null_des.driver.select = NULL; null_des.events = 0; null_des.flags = 0; null_des.type = ERTS_EV_TYPE_NONE; erts_smp_mtx_lock(&drv_ev_state_mtx); erts_printf("--- fds in pollset --------------------------------------\n"); epep = erts_alloc(ERTS_ALC_T_TMP, sizeof(ErtsPollEvents)*max_fds); ERTS_POLL_EXPORT(erts_poll_get_selected_events)(pollset, epep, max_fds); for (fd = 0; fd < max_fds; fd++) { int err = 0; ErtsDrvEventState *desp = ((fd < drv_ev_state_len) ? &drv_ev_state[fd] : &null_des); ErtsPollEvents cio_events = desp->events; ErtsPollEvents ep_events = epep[fd]; int internal = 0;#ifdef HAVE_FSTAT struct stat stat_buf;#endif if (desp->events || ep_events) { if (ep_events & ERTS_POLL_EV_NVAL) { ep_events &= ~ERTS_POLL_EV_NVAL; internal = 1; internal_fds++; } else used_fds++; erts_printf("fd=%d ", fd);#ifdef HAVE_FSTAT if (fstat(fd, &stat_buf) < 0) erts_printf("type=unknown "); else { erts_printf("type=");#ifdef S_ISSOCK if (S_ISSOCK(stat_buf.st_mode)) erts_printf("sock "); else#endif#ifdef S_ISFIFO if (S_ISFIFO(stat_buf.st_mode)) erts_printf("fifo "); else#endif#ifdef S_ISCHR if (S_ISCHR(stat_buf.st_mode)) erts_printf("chr "); else#endif#ifdef S_ISDIR if (S_ISDIR(stat_buf.st_mode)) erts_printf("dir "); else#endif#ifdef S_ISBLK if (S_ISBLK(stat_buf.st_mode)) erts_printf("blk "); else#endif#ifdef S_ISREG if (S_ISREG(stat_buf.st_mode)) erts_printf("reg "); else#endif#ifdef S_ISLNK if (S_ISLNK(stat_buf.st_mode)) erts_printf("lnk "); else#endif#ifdef S_ISDOOR if (S_ISDOOR(stat_buf.st_mode)) erts_printf("door "); else#endif#ifdef S_ISWHT if (S_ISWHT(stat_buf.st_mode)) erts_printf("wht "); else#endif#ifdef S_ISXATTR if (S_ISXATTR(stat_buf.st_mode)) erts_printf("xattr "); else#endif erts_printf("unknown "); }#endif if (desp->type == ERTS_EV_TYPE_DRV_SEL) { erts_printf("driver_select "); if (internal) { erts_printf("internal "); err = 1; } if (cio_events == ep_events) { erts_printf("ev="); if (print_events(cio_events) != 0) err = 1; } else { err = 1; erts_printf("cio_ev="); print_events(cio_events); erts_printf(" ep_ev="); print_events(ep_events); } erts_printf(" "); if (cio_events & ERTS_POLL_EV_IN) { Eterm id = desp->driver.select->inport; if (is_nil(id)) { erts_printf("inport=none inname=none indrv=none "); err = 1; } else { ErtsPortNames *pnp = erts_get_port_names(id); erts_printf(" inport=%T inname=%s indrv=%s ", id, pnp->name ? pnp->name : "unknown", (pnp->driver_name ? pnp->driver_name : "unknown")); erts_free_port_names(pnp); } } if (cio_events & ERTS_POLL_EV_OUT) { Eterm id = desp->driver.select->outport; if (is_nil(id)) { erts_printf("outport=none outname=none outdrv=none "); err = 1; } else { ErtsPortNames *pnp = erts_get_port_names(id); erts_printf(" outport=%T outname=%s outdrv=%s ", id, pnp->name ? pnp->name : "unknown", (pnp->driver_name ? pnp->driver_name : "unknown")); erts_free_port_names(pnp); } } } else if (desp->type == ERTS_EV_TYPE_DRV_EV) { Eterm id; erts_printf("driver_event "); if (internal) { erts_printf("internal "); err = 1; } if (cio_events == ep_events) { erts_printf("ev=0x%b32x", (Uint32) cio_events); } else { err = 1; erts_printf("cio_ev=0x%b32x", (Uint32) cio_events); erts_printf(" ep_ev=0x%b32x", (Uint32) ep_events); } id = desp->driver.event->port; if (is_nil(id)) { erts_printf(" port=none name=none drv=none "); err = 1; } else { ErtsPortNames *pnp = erts_get_port_names(id); erts_printf(" port=%T name=%s drv=%s ", id, pnp->name ? pnp->name : "unknown", (pnp->driver_name ? pnp->driver_name : "unknown")); erts_free_port_names(pnp); } } else if (internal) { erts_printf("internal "); if (cio_events) { err = 1; erts_printf("cio_ev="); print_events(cio_events); } if (ep_events) { erts_printf("ep_ev="); print_events(ep_events); } } else { err = 1; erts_printf("control_type=%d ", desp->type); if (cio_events == ep_events) { erts_printf("ev=0x%b32x", (Uint32) cio_events); } else { erts_printf("cio_ev=0x%b32x", (Uint32) cio_events); erts_printf(" ep_ev=0x%b32x", (Uint32) ep_events); } } if (err) { res++; erts_printf(" ERROR"); } erts_printf("\n"); } } erts_printf("\n"); erts_printf("used fds=%d\n", used_fds); erts_printf("internal fds=%d\n", internal_fds); erts_printf("---------------------------------------------------------\n"); fflush(stdout); erts_free(ERTS_ALC_T_TMP, (void *) epep); erts_smp_mtx_unlock(&drv_ev_state_mtx); return res;}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?