cosmopolitan/third_party/nsync/time.h
Justine Tunney 3f0bcdc3ef
Improve cancellations, randomness, and time
- Exhaustively document cancellation points
- Rename SIGCANCEL to SIGTHR just like BSDs
- Further improve POSIX thread cancellations
- Ensure asynchronous cancellations work correctly
- Elevate the quality of getrandom() and getentropy()
- Make futexes cancel correctly on OpenBSD 6.x and 7.x
- Add reboot.com and shutdown.com to examples directory
- Remove underscore prefix from awesome timespec_*() APIs
- Create assertions that help verify our cancellation points
- Remove bad timespec APIs (cmp generalizes eq/ne/gt/gte/lt/lte)
2022-11-05 23:45:32 -07:00

60 lines
2 KiB
C

#ifndef NSYNC_TIME_H_
#define NSYNC_TIME_H_
#include "libc/calls/struct/timespec.h"
#if !(__ASSEMBLER__ + __LINKER__ + 0)
COSMOPOLITAN_C_START_
#define NSYNC_TIME_SEC(t) ((t).tv_sec)
#define NSYNC_TIME_NSEC(t) ((t).tv_nsec)
#define NSYNC_TIME_STATIC_INIT(t, ns) \
{ (t), (ns) }
/* The type nsync_time represents the interval elapsed between two
moments in time. Often the first such moment is an address-space-wide
epoch, such as the Unix epoch, but clients should not rely on the
epoch in one address space being the same as that in another.
Intervals relative to the epoch are known as absolute times. */
typedef struct timespec nsync_time;
/* A deadline infinitely far in the future. */
#define nsync_time_no_deadline timespec_max
/* The zero delay, or an expired deadline. */
#define nsync_time_zero timespec_zero
/* Return the current time since the epoch. */
#define nsync_time_now() timespec_real()
/* Sleep for the specified delay. Returns the unslept time which may be
non-zero if the call was interrupted. */
#define nsync_time_sleep(a) timespec_sleep(a)
/* Sleep until the specified time. Returns 0 on success, and EINTR
if the call was interrupted. */
#define nsync_time_sleep_until(a) timespec_sleep_until(a)
/* Return a+b */
#define nsync_time_add(a, b) timespec_add(a, b)
/* Return a-b */
#define nsync_time_sub(a, b) timespec_sub(a, b)
/* Return +ve, 0, or -ve according to whether a>b, a==b, or a<b. */
#define nsync_time_cmp(a, b) timespec_cmp(a, b)
/* Return the specified number of milliseconds as a time. */
#define nsync_time_ms(a) timespec_frommillis(a)
/* Return the specified number of microseconds as a time. */
#define nsync_time_us(a) timespec_frommicros(a)
/* Return the specified number of nanoseconds as a time. */
#define nsync_time_ns(a) timespec_fromnanos(a)
/* Return an nsync_time constructed from second and nanosecond
components */
#define nsync_time_s_ns(s, ns) ((nsync_time){(int64_t)(s), (unsigned)(ns)})
COSMOPOLITAN_C_END_
#endif /* !(__ASSEMBLER__ + __LINKER__ + 0) */
#endif /* NSYNC_TIME_H_ */