diff options
author | Dmitry Chestnykh <dm.chestnykh@gmail.com> | 2024-02-25 14:43:28 +0300 |
---|---|---|
committer | Waldemar Brodkorb <wbx@openadk.org> | 2024-02-25 19:27:48 +0100 |
commit | 81ed334f67e0c56ff0a89ade0fc156c0ba23f190 (patch) | |
tree | 09829cc5cd0d03a4f91887864f6a3c28213549af /include/internal/time64_helpers.h | |
parent | 086a5f165096af104b01bb6d5639bd769bd17620 (diff) |
Add support for using time64 on big-endian machines.
For BE architectures there is one significant difference
in comparison with time64 support for little-endian
architectures like ARMv7.
The difference is that we strictly need to pass two 64bit
values to system calls because Linux Kernel internally uses
`struct __kernel_timespec` and similar, which consists of two
64bit fields.
For this reason many files have been changed to convert
pointers to timespec-family structures (mixed of 64bit and 32bit values)
to the pointer of the similar but 64bit-only structures
for using as system calls args.
This is general prerequisite for any BE architecture.
Signed-off-by: Dmitry Chestnykh <dm.chestnykh@gmail.com>
Diffstat (limited to 'include/internal/time64_helpers.h')
-rw-r--r-- | include/internal/time64_helpers.h | 31 |
1 files changed, 31 insertions, 0 deletions
diff --git a/include/internal/time64_helpers.h b/include/internal/time64_helpers.h new file mode 100644 index 000000000..7a78e8388 --- /dev/null +++ b/include/internal/time64_helpers.h @@ -0,0 +1,31 @@ +#ifndef _TIME64_HELPERS_H +#define _TIME64_HELPERS_H + +#include <bits/types.h> +#include <time.h> +#include <stddef.h> + +struct __ts64_struct { + __S64_TYPE tv_sec; + __S64_TYPE tv_nsec; +}; + +#define TO_TS64_P(__ts) (((struct timespec *)(__ts)) ? \ + (&(struct __ts64_struct) {.tv_sec = ((struct timespec *)(__ts))->tv_sec, \ + .tv_nsec = ((struct timespec *)(__ts))->tv_nsec}) : NULL) + +struct __its64_struct { + __S64_TYPE interval_tv_sec; + __S64_TYPE interval_tv_nsec; + __S64_TYPE value_tv_sec; + __S64_TYPE value_tv_nsec; +}; + +#define TO_ITS64_P(__its) (((struct itimerspec *)(__its)) ? \ + (&(struct __its64_struct) {.interval_tv_sec = ((struct itimerspec *)(__its))->it_interval.tv_sec, \ + .interval_tv_nsec = ((struct itimerspec *)(__its))->it_interval.tv_nsec, \ + .value_tv_sec = ((struct itimerspec *)(__its))->it_value.tv_sec, \ + .value_tv_nsec = ((struct itimerspec *)(__its))->it_value.tv_nsec}) : NULL) + + +#endif /* _TIME64_HELPERS_H */ |