CVSROOT: /cvs
Module name: src
Changes by: [email protected] 2020/03/19 21:37:09
Modified files:
sys/sys : systm.h
share/man/man9 : tsleep.9
Log message:
tsleep_nsec(9): add MAXTSLP macro, the maximum sleep duration
This macro will be useful for truncating durations below INFSLP
(UINT64_MAX) when converting from a timespec or timeval to a count
of nanoseconds before calling tsleep_nsec(9), msleep_nsec(9), or
rwsleep_nsec(9).
A relative timespec can hold many more nanoseconds than a uint64_t
can. TIMESPEC_TO_NSEC() and TIMEVAL_TO_NSEC() check for overflow,
returning UINT64_MAX if the conversion would overflow a uint64_t.
Thus, MAXTSLP will make it easy to avoid inadvertently passing INFSLP
to tsleep_nsec(9) et al. when the caller intended to set a timeout.
The code in such a case might look something like this:
uint64_t nsecs = MIN(TIMESPEC_TO_NSEC(&ts), MAXTSLP);
The macro may also be useful for rejecting intervals that are "too large",
e.g. for sockets with timeouts, if the timeout duration is to be stored
as a uint64_t in an object in the kernel. The code in such a case might
look something like this:
case SIOCTIMEOUT:
{
struct timeval *tv = (struct timeval *)data;
uint64_t nsecs;
if (tv->tv_sec < 0 || !timerisvalid(tv))
return EINVAL;
nsecs = TIMEVAL_TO_NSEC(tv);
if (nsecs > MAXTSLP)
return EOVERFLOW;
obj.timeout = nsecs;
break;
}
Idea suggested by visa@.
ok visa@