Re: [PATCH v8 4/7] rust: time: Add wrapper for fsleep function
From: Alice Ryhl
Date: Fri Jan 17 2025 - 09:31:43 EST
On Fri, Jan 17, 2025 at 3:20 PM FUJITA Tomonori
<fujita.tomonori@xxxxxxxxx> wrote:
>
> On Fri, 17 Jan 2025 14:05:52 +0100
> Alice Ryhl <aliceryhl@xxxxxxxxxx> wrote:
>
> > On Fri, Jan 17, 2025 at 10:55 AM FUJITA Tomonori
> > <fujita.tomonori@xxxxxxxxx> wrote:
> >>
> >> On Fri, 17 Jan 2025 10:13:08 +0100
> >> Alice Ryhl <aliceryhl@xxxxxxxxxx> wrote:
> >>
> >> > On Fri, Jan 17, 2025 at 10:01 AM FUJITA Tomonori
> >> > <fujita.tomonori@xxxxxxxxx> wrote:
> >> >>
> >> >> On Fri, 17 Jan 2025 16:53:26 +0900 (JST)
> >> >> FUJITA Tomonori <fujita.tomonori@xxxxxxxxx> wrote:
> >> >>
> >> >> > On Thu, 16 Jan 2025 10:27:02 +0100
> >> >> > Alice Ryhl <aliceryhl@xxxxxxxxxx> wrote:
> >> >> >
> >> >> >>> +/// This function can only be used in a nonatomic context.
> >> >> >>> +pub fn fsleep(delta: Delta) {
> >> >> >>> + // The argument of fsleep is an unsigned long, 32-bit on 32-bit architectures.
> >> >> >>> + // Considering that fsleep rounds up the duration to the nearest millisecond,
> >> >> >>> + // set the maximum value to u32::MAX / 2 microseconds.
> >> >> >>> + const MAX_DURATION: Delta = Delta::from_micros(u32::MAX as i64 >> 1);
> >> >> >>
> >> >> >> Hmm, is this value correct on 64-bit platforms?
> >> >> >
> >> >> > You meant that the maximum can be longer on 64-bit platforms? 2147484
> >> >> > milliseconds is long enough for fsleep's duration?
> >> >> >
> >> >> > If you prefer, I use different maximum durations for 64-bit and 32-bit
> >> >> > platforms, respectively.
> >> >>
> >> >> How about the following?
> >> >>
> >> >> const MAX_DURATION: Delta = Delta::from_micros(usize::MAX as i64 >> 1);
> >> >
> >> > Why is there a maximum in the first place? Are you worried about
> >> > overflow on the C side?
> >>
> >> Yeah, Boqun is concerned that an incorrect input (a negative value or
> >> an overflow on the C side) leads to unintentional infinite sleep:
> >>
> >> https://lore.kernel.org/lkml/ZxwVuceNORRAI7FV@Boquns-Mac-mini.local/
> >
> > Okay, can you explain in the comment that this maximum value prevents
> > integer overflow inside fsleep?
>
> Surely, how about the following?
>
> pub fn fsleep(delta: Delta) {
> // The argument of fsleep is an unsigned long, 32-bit on 32-bit architectures.
> // Considering that fsleep rounds up the duration to the nearest millisecond,
> // set the maximum value to u32::MAX / 2 microseconds to prevent integer
> // overflow inside fsleep, which could lead to unintentional infinite sleep.
> const MAX_DURATION: Delta = Delta::from_micros(u32::MAX as i64 >> 1);
Hmm ... this is phrased as-if the problem is on 32-bit machines, but
the problem is that fsleep casts an `unsigned long` to `unsigned int`
which can overflow on 64-bit machines. I would instead say this
prevents overflow on 64-bit machines when casting to an int.
Also, it might be cleaner to just use `i32::MAX as i64` instead of u32.
Alice