Skip to content

Commit f4f2d1a

Browse files
committed
Merge branch 'lukas/erts/enif_scheduler_pollset/OTP-19479'
* lukas/erts/enif_scheduler_pollset/OTP-19479: erts: Clean scheduler data when enif_select is called
2 parents 9b04fc4 + 7cf1173 commit f4f2d1a

File tree

1 file changed

+14
-3
lines changed

1 file changed

+14
-3
lines changed

erts/emulator/sys/common/erl_check_io.c

+14-3
Original file line numberDiff line numberDiff line change
@@ -50,12 +50,12 @@
5050
#define DEBUG_PRINT_FD(FMT, STATE, ...) \
5151
do { \
5252
const char buff[128]; \
53-
DEBUG_PRINT("%d: " FMT " (ev=%s, ac=%s, flg=%s)", \
53+
DEBUG_PRINT("%d: " FMT " (ev=%s, ac=%s, flg=%s, cnt=%d)", \
5454
(STATE) ? (STATE)->fd : (ErtsSysFdType)-1, ##__VA_ARGS__, \
5555
ev2str((STATE) ? (STATE)->events : ERTS_POLL_EV_NONE), \
5656
ev2str((STATE) ? (STATE)->active_events : ERTS_POLL_EV_NONE), \
5757
event_state_flag_to_str((STATE) ? (STATE)->flags : ERTS_EV_FLAG_CLEAR, \
58-
buff, sizeof(buff))); \
58+
buff, sizeof(buff)), (STATE)->count); \
5959
} while(0)
6060
#define DEBUG_PRINT_MODE
6161
#else
@@ -120,7 +120,7 @@ static const char* event_state_flag_to_str(EventStateFlags f, const char *buff,
120120
case ERTS_EV_FLAG_WANT_ERROR: return "WANT_ERROR";
121121

122122
#if ERTS_POLL_USE_SCHEDULER_POLLING
123-
case ERTS_EV_FLAG_CLEAR | ERTS_EV_FLAG_NIF_SELECT: return "CLEAR|NIF_SELECT";
123+
case ERTS_EV_FLAG_NIF_SELECT: return "NIF_SELECT";
124124
case ERTS_EV_FLAG_USED | ERTS_EV_FLAG_NIF_SELECT: return "USED|NIF_SELECT";
125125
case ERTS_EV_FLAG_SCHEDULER: return "SCHD";
126126
case ERTS_EV_FLAG_SCHEDULER | ERTS_EV_FLAG_USED: return "USED|SCHD";
@@ -1358,7 +1358,18 @@ enif_select_x(ErlNifEnv* env,
13581358
}
13591359
}
13601360
if (ctl_events & ERTS_POLL_EV_IN) {
1361+
ErtsSchedulerData *esdp = erts_get_scheduler_data();
13611362
erts_io_clear_nif_select(fd, state);
1363+
/* Clear the marker in scheduler data so that the scheduler
1364+
* does not detect the flag is this FD is again triggered very
1365+
* soon.
1366+
*/
1367+
for (int i = 0; i < sizeof(esdp->nif_select_fds) / sizeof(ErtsSysFdType); i++) {
1368+
if (esdp->nif_select_fds[i] == fd) {
1369+
DEBUG_PRINT("%d: Clear in sched %d's state", esdp->nif_select_fds[i], esdp->no);
1370+
esdp->nif_select_fds[i] = ERTS_SYS_FD_INVALID;
1371+
}
1372+
}
13621373
}
13631374
}
13641375
#endif

0 commit comments

Comments
 (0)