su_timer: skip an expired timer with no callback instead of aborting#334
Open
garacil wants to merge 1 commit into
Open
su_timer: skip an expired timer with no callback instead of aborting#334garacil wants to merge 1 commit into
garacil wants to merge 1 commit into
Conversation
su_timer_expire() asserted that a set, expired timer always has a wakeup callback. Under load a stale/racy or invalidly-set timer can reach expiry with a NULL callback (e.g. a concurrent su_timer_reset); there is nothing valid to call, but assert(f) abort()s the whole process. Skip such a timer gracefully: log it, mark it not-running (sut_running = reset, sut_arg = NULL) and continue with the next timer, rather than aborting. Timers that do have a callback are unaffected. Fixes freeswitch#251, freeswitch#255.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
su_timer_expire()asserted that a set, expired timer always has a wakeup callback. Under load a stale/racy or invalidly-set timer can reach expiry with aNULLcallback (e.g. a concurrentsu_timer_reset()); there is nothing valid to call, butassert(f)abort()s the whole process (#251, #255).This skips such a timer gracefully: it is logged, marked not-running (
sut_running = reset,sut_arg = NULL) and the loop continues with the next timer, rather than aborting. Timers that do have a callback are unaffected, and the skipped timer is not counted as fired.Fixes #251, #255.