1 /*
2  * Copyright (c) 2023 Meta
3  * Copyright (c) 2025 Tenstorrent AI ULC
4  *
5  * SPDX-License-Identifier: Apache-2.0
6  */
7 
8 #include "posix_clock.h"
9 #include "posix_internal.h"
10 
11 #include <stddef.h>
12 #include <time.h>
13 #include <errno.h>
14 
15 #include <zephyr/sys/clock.h>
16 #include <zephyr/toolchain.h>
17 
clock_nanosleep(clockid_t clock_id,int flags,const struct timespec * rqtp,struct timespec * rmtp)18 int clock_nanosleep(clockid_t clock_id, int flags, const struct timespec *rqtp,
19 		    struct timespec *rmtp)
20 {
21 	int ret;
22 
23 	if (rqtp == NULL) {
24 		errno = EFAULT;
25 		return -1;
26 	}
27 
28 	ret = sys_clock_nanosleep(sys_clock_from_clockid((int)clock_id), flags, rqtp, rmtp);
29 	if (ret < 0) {
30 		errno = -ret;
31 		return -1;
32 	}
33 
34 	return 0;
35 }
36 
pthread_condattr_getclock(const pthread_condattr_t * ZRESTRICT att,clockid_t * ZRESTRICT clock_id)37 int pthread_condattr_getclock(const pthread_condattr_t *ZRESTRICT att,
38 			      clockid_t *ZRESTRICT clock_id)
39 {
40 	struct posix_condattr *const attr = (struct posix_condattr *)att;
41 
42 	if ((attr == NULL) || !attr->initialized) {
43 		return EINVAL;
44 	}
45 
46 	*clock_id = attr->clock;
47 
48 	return 0;
49 }
50 
pthread_condattr_setclock(pthread_condattr_t * att,clockid_t clock_id)51 int pthread_condattr_setclock(pthread_condattr_t *att, clockid_t clock_id)
52 {
53 	struct posix_condattr *const attr = (struct posix_condattr *)att;
54 
55 	if (clock_id != CLOCK_REALTIME && clock_id != CLOCK_MONOTONIC) {
56 		return -EINVAL;
57 	}
58 
59 	if ((attr == NULL) || !attr->initialized) {
60 		return EINVAL;
61 	}
62 
63 	attr->clock = clock_id;
64 
65 	return 0;
66 }
67