|
50 | 50 | #define DEBUG_PRINT_FD(FMT, STATE, ...) \
|
51 | 51 | do { \
|
52 | 52 | 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)", \ |
54 | 54 | (STATE) ? (STATE)->fd : (ErtsSysFdType)-1, ##__VA_ARGS__, \
|
55 | 55 | ev2str((STATE) ? (STATE)->events : ERTS_POLL_EV_NONE), \
|
56 | 56 | ev2str((STATE) ? (STATE)->active_events : ERTS_POLL_EV_NONE), \
|
57 | 57 | event_state_flag_to_str((STATE) ? (STATE)->flags : ERTS_EV_FLAG_CLEAR, \
|
58 |
| - buff, sizeof(buff))); \ |
| 58 | + buff, sizeof(buff)), (STATE)->count); \ |
59 | 59 | } while(0)
|
60 | 60 | #define DEBUG_PRINT_MODE
|
61 | 61 | #else
|
@@ -120,7 +120,7 @@ static const char* event_state_flag_to_str(EventStateFlags f, const char *buff,
|
120 | 120 | case ERTS_EV_FLAG_WANT_ERROR: return "WANT_ERROR";
|
121 | 121 |
|
122 | 122 | #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"; |
124 | 124 | case ERTS_EV_FLAG_USED | ERTS_EV_FLAG_NIF_SELECT: return "USED|NIF_SELECT";
|
125 | 125 | case ERTS_EV_FLAG_SCHEDULER: return "SCHD";
|
126 | 126 | case ERTS_EV_FLAG_SCHEDULER | ERTS_EV_FLAG_USED: return "USED|SCHD";
|
@@ -1358,7 +1358,18 @@ enif_select_x(ErlNifEnv* env,
|
1358 | 1358 | }
|
1359 | 1359 | }
|
1360 | 1360 | if (ctl_events & ERTS_POLL_EV_IN) {
|
| 1361 | + ErtsSchedulerData *esdp = erts_get_scheduler_data(); |
1361 | 1362 | 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 | + } |
1362 | 1373 | }
|
1363 | 1374 | }
|
1364 | 1375 | #endif
|
|
0 commit comments