diff options
author | Lukas Larsson <[email protected]> | 2019-01-23 10:21:59 +0100 |
---|---|---|
committer | Lukas Larsson <[email protected]> | 2019-01-23 10:21:59 +0100 |
commit | b487f750abe3b6bb8c3f1cf8615f6c2166e203ef (patch) | |
tree | 91a1f3d74ffb225e16db5153f3a67852035580c1 /erts/emulator/drivers/common | |
parent | b2a13ad4f00db3399df277b0d2081a0a3019cf11 (diff) | |
parent | 51fdf17ef9703692b1de4cec67cc64e84ba1accc (diff) | |
download | otp-b487f750abe3b6bb8c3f1cf8615f6c2166e203ef.tar.gz otp-b487f750abe3b6bb8c3f1cf8615f6c2166e203ef.tar.bz2 otp-b487f750abe3b6bb8c3f1cf8615f6c2166e203ef.zip |
Merge branch 'lukas/erts/fix_inet_multitimer_cleanup/OTP-15536' into maint
* lukas/erts/fix_inet_multitimer_cleanup/OTP-15536:
erts: Fix cleanup of the inet MultiTimer
Diffstat (limited to 'erts/emulator/drivers/common')
-rw-r--r-- | erts/emulator/drivers/common/inet_drv.c | 40 |
1 files changed, 21 insertions, 19 deletions
diff --git a/erts/emulator/drivers/common/inet_drv.c b/erts/emulator/drivers/common/inet_drv.c index b44464d6da..ed687b8d70 100644 --- a/erts/emulator/drivers/common/inet_drv.c +++ b/erts/emulator/drivers/common/inet_drv.c @@ -12960,38 +12960,40 @@ make_noninheritable_handle(SOCKET s) static void fire_multi_timers(tcp_descriptor *desc, ErlDrvPort port, ErlDrvData data) { - ErlDrvTime next_timeout; - MultiTimerData *curr = desc->mtd; - if (!curr) { - ASSERT(0); - return; + ErlDrvTime next_timeout = 0; + if (!desc->mtd) { + ASSERT(0); + return; } #ifdef DEBUG { ErlDrvTime chk = erl_drv_monotonic_time(ERL_DRV_MSEC); - ASSERT(chk >= curr->when); + ASSERT(chk >= desc->mtd->when); } #endif do { - MultiTimerData *save = curr; + MultiTimerData save = *desc->mtd; - (*(save->timeout_function))(data,save->caller); + /* We first remove the timer so that the timeout_functions has + can call clean_multi_timers without breaking anything */ + if (desc->mtd_cache == NULL) { + desc->mtd_cache = desc->mtd; + } else { + FREE(desc->mtd); + } - curr = curr->next; + desc->mtd = save.next; + if (desc->mtd != NULL) + desc->mtd->prev = NULL; - if (desc->mtd_cache == NULL) - desc->mtd_cache = save; - else - FREE(save); + (*(save.timeout_function))(data,save.caller); - if (curr == NULL) { - desc->mtd = NULL; + if (desc->mtd == NULL) return; - } - curr->prev = NULL; - next_timeout = curr->when - erl_drv_monotonic_time(ERL_DRV_MSEC); + + next_timeout = desc->mtd->when - erl_drv_monotonic_time(ERL_DRV_MSEC); } while (next_timeout <= 0); - desc->mtd = curr; + driver_set_timer(port, (unsigned long) next_timeout); } |