1 /*
2  * Copyright (c) 2018 Intel Corporation
3  *
4  * SPDX-License-Identifier: Apache-2.0
5  */
6 #ifndef ZEPHYR_INCLUDE_POSIX_TIME_H_
7 #define ZEPHYR_INCLUDE_POSIX_TIME_H_
8 
9 /* Read standard header.  This may find <posix/time.h> since they
10  * refer to the same file when include/posix is in the search path.
11  */
12 #include <time.h>
13 
14 #ifdef CONFIG_NEWLIB_LIBC
15 /* Kludge to support outdated newlib version as used in SDK 0.10 for Xtensa */
16 #include <newlib.h>
17 
18 #ifdef __NEWLIB__
19 /* Newever Newlib 3.x+ */
20 #include <sys/timespec.h>
21 #else /* __NEWLIB__ */
22 /* Workaround for older Newlib 2.x, as used by Xtensa. It lacks sys/_timeval.h,
23  * so mimic it here.
24  */
25 #include <sys/types.h>
26 #ifndef __timespec_defined
27 
28 #ifdef __cplusplus
29 extern "C" {
30 #endif
31 
32 struct timespec {
33 	time_t tv_sec;
34 	long tv_nsec;
35 };
36 
37 struct itimerspec {
38 	struct timespec it_interval;  /* Timer interval */
39 	struct timespec it_value;     /* Timer expiration */
40 };
41 
42 #ifdef __cplusplus
43 }
44 #endif
45 
46 #endif /* __timespec_defined */
47 #endif /* __NEWLIB__ */
48 
49 #else /* CONFIG_NEWLIB_LIBC */
50 /* Not Newlib */
51 # if defined(CONFIG_ARCH_POSIX) && defined(CONFIG_EXTERNAL_LIBC)
52 #  include <bits/types/struct_timespec.h>
53 #  include <bits/types/struct_itimerspec.h>
54 # else
55 #  include <sys/timespec.h>
56 # endif
57 #endif /* CONFIG_NEWLIB_LIBC */
58 
59 #include <zephyr/kernel.h>
60 #include <errno.h>
61 #include <zephyr/posix/posix_types.h>
62 #include <zephyr/posix/signal.h>
63 
64 #ifdef __cplusplus
65 extern "C" {
66 #endif
67 
68 #ifndef CLOCK_REALTIME
69 #define CLOCK_REALTIME 1
70 #endif
71 
72 #ifndef CLOCK_PROCESS_CPUTIME_ID
73 #define CLOCK_PROCESS_CPUTIME_ID 2
74 #endif
75 
76 #ifndef CLOCK_THREAD_CPUTIME_ID
77 #define CLOCK_THREAD_CPUTIME_ID 3
78 #endif
79 
80 #ifndef CLOCK_MONOTONIC
81 #define CLOCK_MONOTONIC 4
82 #endif
83 
84 #ifndef TIMER_ABSTIME
85 #define TIMER_ABSTIME 4
86 #endif
87 
_ts_to_ms(const struct timespec * to)88 static inline int32_t _ts_to_ms(const struct timespec *to)
89 {
90 	return (int32_t)(to->tv_sec * MSEC_PER_SEC) + (int32_t)(to->tv_nsec / NSEC_PER_MSEC);
91 }
92 
93 int clock_gettime(clockid_t clock_id, struct timespec *ts);
94 int clock_getres(clockid_t clock_id, struct timespec *ts);
95 int clock_settime(clockid_t clock_id, const struct timespec *ts);
96 int clock_getcpuclockid(pid_t pid, clockid_t *clock_id);
97 /* Timer APIs */
98 int timer_create(clockid_t clockId, struct sigevent *evp, timer_t *timerid);
99 int timer_delete(timer_t timerid);
100 struct itimerspec;
101 int timer_gettime(timer_t timerid, struct itimerspec *its);
102 int timer_settime(timer_t timerid, int flags, const struct itimerspec *value,
103 		  struct itimerspec *ovalue);
104 int timer_getoverrun(timer_t timerid);
105 int nanosleep(const struct timespec *rqtp, struct timespec *rmtp);
106 int clock_nanosleep(clockid_t clock_id, int flags,
107 		    const struct timespec *rqtp, struct timespec *rmtp);
108 
109 #ifdef __cplusplus
110 }
111 #endif
112 
113 #else /* ZEPHYR_INCLUDE_POSIX_TIME_H_ */
114 /* Read the toolchain header when <posix/time.h> finds itself on the
115  * first attempt.
116  */
117 #include_next <time.h>
118 #endif /* ZEPHYR_INCLUDE_POSIX_TIME_H_ */
119