Skip to content

Conversation

@macdrevx
Copy link

@macdrevx macdrevx commented Aug 4, 2025

The expression UInt64(self.dueTime - Date().timeIntervalSince(lastEmission)) crashes if self.dueTime - Date().timeIntervalSince(lastEmission) is less than UInt64.min.

Since Date().timeIntervalSince(lastEmission) seems like it normally evaluates to something near 0, the suspicion is that the crash must occur when the process is suspended in between lastEmission = Date() and Date().timeIntervalSince(lastEmission).

This commit removes lastEmission entirely and ensures that the value passed to UInt64.min is non-negative.

Fixes #60

The expression `UInt64(self.dueTime - Date().timeIntervalSince(lastEmission))`
crashes if `self.dueTime - Date().timeIntervalSince(lastEmission)` is
less than `UInt64.min`.

Since `Date().timeIntervalSince(lastEmission)` seems like it normally
evaluates to something near 0, the suspicion is that the crash must
occur when the process is suspended in between `lastEmission = Date()`
and `Date().timeIntervalSince(lastEmission)`.

This commit removes `lastEmission` entirely and ensures that the value
passed to `UInt64.min` is non-negative.

Fixes reddavis#60
try? await Task.sleep(nanoseconds: delay)

let sleep = Task<RaceResult, Never> { [dueTime] in
try? await Task.sleep(nanoseconds: UInt64(Swift.max(dueTime, 0)) * NSEC_PER_SEC)
Copy link
Author

@macdrevx macdrevx Aug 6, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

An unrelated problem here is that dueTime is converted to an integer before multiplication with NSEC_PER_SEC which means that any fractional seconds are lost.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Crash in DebounceAsyncSequence

1 participant