diff options
author | Sverker Eriksson <[email protected]> | 2016-10-24 18:35:35 +0200 |
---|---|---|
committer | Sverker Eriksson <[email protected]> | 2016-11-28 18:35:08 +0100 |
commit | a85a45b5a384deae60f8020d0805a93df141a7c3 (patch) | |
tree | f34010fbc4ea4b13ee06b0baeb6d421e7c95b425 /erts | |
parent | cdcb2376b37a218a2847086b3c56e05dc99b1e02 (diff) | |
download | otp-a85a45b5a384deae60f8020d0805a93df141a7c3.tar.gz otp-a85a45b5a384deae60f8020d0805a93df141a7c3.tar.bz2 otp-a85a45b5a384deae60f8020d0805a93df141a7c3.zip |
erts: Change handling of error event for driver_select
Make the code simpler.
May change the behavior as we may call both iready and oready
when getting an error. But doesn't that seem more correct.
Diffstat (limited to 'erts')
-rw-r--r-- | erts/emulator/sys/common/erl_check_io.c | 43 |
1 files changed, 17 insertions, 26 deletions
diff --git a/erts/emulator/sys/common/erl_check_io.c b/erts/emulator/sys/common/erl_check_io.c index 44a77f3ea5..146f6ae5a1 100644 --- a/erts/emulator/sys/common/erl_check_io.c +++ b/erts/emulator/sys/common/erl_check_io.c @@ -1699,31 +1699,22 @@ ERTS_CIO_EXPORT(erts_check_io)(int do_wait) switch (state->type) { case ERTS_EV_TYPE_DRV_SEL: { /* Requested via driver_select()... */ - ErtsPollEvents revents; - ErtsPollEvents revent_mask; - - revent_mask = ~(ERTS_POLL_EV_IN|ERTS_POLL_EV_OUT); - revent_mask |= state->events; - revents = pollres[i].events & revent_mask; - - if (revents & ERTS_POLL_EV_ERR) { - /* - * Let the driver handle the error condition. Only input, - * only output, or nothing might have been selected. - * We *do not* want to call a callback that corresponds - * to an event not selected. revents might give us a clue - * on which one to call. - */ - if ((revents & ERTS_POLL_EV_IN) - || (!(revents & ERTS_POLL_EV_OUT) - && state->events & ERTS_POLL_EV_IN)) { - iready(state->driver.select->inport, state, current_cio_time); - } - else if (state->events & ERTS_POLL_EV_OUT) { - oready(state->driver.select->outport, state, current_cio_time); - } - } - else if (revents & (ERTS_POLL_EV_IN|ERTS_POLL_EV_OUT)) { + ErtsPollEvents revents = pollres[i].events; + + if (revents & ERTS_POLL_EV_ERR) { + /* + * Handle error events by triggering all in/out events + * that the driver has selected. + * We *do not* want to call a callback that corresponds + * to an event not selected. + */ + revents = state->events; + } + else { + revents &= (state->events | ERTS_POLL_EV_NVAL); + } + + if (revents & (ERTS_POLL_EV_IN|ERTS_POLL_EV_OUT)) { if (revents & ERTS_POLL_EV_OUT) { oready(state->driver.select->outport, state, current_cio_time); } @@ -1731,7 +1722,7 @@ ERTS_CIO_EXPORT(erts_check_io)(int do_wait) was read (true also on the non-smp emulator since oready() may have been called); therefore, update revents... */ - revents &= ~(~state->events & ERTS_POLL_EV_IN); + revents &= state->events; if (revents & ERTS_POLL_EV_IN) { iready(state->driver.select->inport, state, current_cio_time); } |