Sign Up
Log In
Log In
or
Sign Up
Places
All Projects
Status Monitor
Collapse sidebar
home:Ledest:erlang:24
erlang
0634-erts-Fix-bug-in-erts_io_notify_port_task_e...
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File 0634-erts-Fix-bug-in-erts_io_notify_port_task_executed.patch of Package erlang
From b8d4d604048becbfdcaab32e359176fab5f67cc4 Mon Sep 17 00:00:00 2001 From: Sverker Eriksson <sverker@erlang.org> Date: Thu, 12 Jan 2023 14:40:14 +0100 Subject: [PATCH] erts: Fix bug in erts_io_notify_port_task_executed Seen symptom: Failed assert DEBUG_PRINT_FD("executed ready_input", state); ASSERT(!(state->active_events & ERTS_POLL_EV_IN)); with state->type == ERTS_EV_TYPE_NIF that is, the fd already closed and then reused by a NIF. --- erts/emulator/sys/common/erl_check_io.c | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/erts/emulator/sys/common/erl_check_io.c b/erts/emulator/sys/common/erl_check_io.c index 964f2df27e..7cd4948c83 100644 --- a/erts/emulator/sys/common/erl_check_io.c +++ b/erts/emulator/sys/common/erl_check_io.c @@ -486,14 +486,16 @@ erts_io_notify_port_task_executed(ErtsPortTaskType type, active_events = state->active_events; - if (!(state->flags & ERTS_EV_FLAG_IN_SCHEDULER) || type == ERTS_PORT_TASK_OUTPUT) { + if (state->type == ERTS_EV_TYPE_DRV_SEL) { switch (type) { case ERTS_PORT_TASK_INPUT: DEBUG_PRINT_FD("executed ready_input", state); - ASSERT(!(state->active_events & ERTS_POLL_EV_IN)); - if (state->events & ERTS_POLL_EV_IN) { + if (!(state->flags & ERTS_EV_FLAG_IN_SCHEDULER) + && !(active_events & ERTS_POLL_EV_IN) + && (state->events & ERTS_POLL_EV_IN)) { + active_events |= ERTS_POLL_EV_IN; if (state->count > 10 && ERTS_POLL_USE_SCHEDULER_POLLING) { if (!(state->flags & ERTS_EV_FLAG_SCHEDULER)) @@ -511,8 +513,9 @@ erts_io_notify_port_task_executed(ErtsPortTaskType type, DEBUG_PRINT_FD("executed ready_output", state); - ASSERT(!(state->active_events & ERTS_POLL_EV_OUT)); - if (state->events & ERTS_POLL_EV_OUT) { + if (!(active_events & ERTS_POLL_EV_OUT) + && (state->events & ERTS_POLL_EV_OUT)) { + active_events |= ERTS_POLL_EV_OUT; if (state->flags & ERTS_EV_FLAG_IN_SCHEDULER && active_events & ERTS_POLL_EV_IN) new_events = ERTS_POLL_EV_OUT; @@ -525,7 +528,8 @@ erts_io_notify_port_task_executed(ErtsPortTaskType type, break; } - if (state->active_events != active_events && new_events) { + if (state->active_events != active_events) { + ASSERT(new_events); state->active_events = active_events; new_events = erts_io_control(state, op, new_events); } -- 2.35.3
Locations
Projects
Search
Status Monitor
Help
OpenBuildService.org
Documentation
API Documentation
Code of Conduct
Contact
Support
@OBShq
Terms
openSUSE Build Service is sponsored by
The Open Build Service is an
openSUSE project
.
Sign Up
Log In
Places
Places
All Projects
Status Monitor