diff options
Diffstat (limited to 'libc-bottom-half/cloudlibc/src/libc/time')
7 files changed, 135 insertions, 0 deletions
diff --git a/libc-bottom-half/cloudlibc/src/libc/time/CLOCK_MONOTONIC.c b/libc-bottom-half/cloudlibc/src/libc/time/CLOCK_MONOTONIC.c new file mode 100644 index 0000000..a4c4a62 --- /dev/null +++ b/libc-bottom-half/cloudlibc/src/libc/time/CLOCK_MONOTONIC.c @@ -0,0 +1,12 @@ +// Copyright (c) 2016 Nuxi, https://nuxi.nl/ +// +// SPDX-License-Identifier: BSD-2-Clause + +#include <common/clock.h> + +#include <wasi/api.h> +#include <time.h> + +const struct __clockid _CLOCK_MONOTONIC = { + .id = __WASI_CLOCKID_MONOTONIC, +}; diff --git a/libc-bottom-half/cloudlibc/src/libc/time/CLOCK_REALTIME.c b/libc-bottom-half/cloudlibc/src/libc/time/CLOCK_REALTIME.c new file mode 100644 index 0000000..9523754 --- /dev/null +++ b/libc-bottom-half/cloudlibc/src/libc/time/CLOCK_REALTIME.c @@ -0,0 +1,12 @@ +// Copyright (c) 2016 Nuxi, https://nuxi.nl/ +// +// SPDX-License-Identifier: BSD-2-Clause + +#include <common/clock.h> + +#include <wasi/api.h> +#include <time.h> + +const struct __clockid _CLOCK_REALTIME = { + .id = __WASI_CLOCKID_REALTIME, +}; diff --git a/libc-bottom-half/cloudlibc/src/libc/time/clock_getres.c b/libc-bottom-half/cloudlibc/src/libc/time/clock_getres.c new file mode 100644 index 0000000..8030d4b --- /dev/null +++ b/libc-bottom-half/cloudlibc/src/libc/time/clock_getres.c @@ -0,0 +1,21 @@ +// Copyright (c) 2015-2016 Nuxi, https://nuxi.nl/ +// +// SPDX-License-Identifier: BSD-2-Clause + +#include <common/clock.h> +#include <common/time.h> + +#include <wasi/api.h> +#include <errno.h> +#include <time.h> + +int clock_getres(clockid_t clock_id, struct timespec *res) { + __wasi_timestamp_t ts; + __wasi_errno_t error = __wasi_clock_res_get(clock_id->id, &ts); + if (error != 0) { + errno = error; + return -1; + } + *res = timestamp_to_timespec(ts); + return 0; +} diff --git a/libc-bottom-half/cloudlibc/src/libc/time/clock_gettime.c b/libc-bottom-half/cloudlibc/src/libc/time/clock_gettime.c new file mode 100644 index 0000000..c7e1a60 --- /dev/null +++ b/libc-bottom-half/cloudlibc/src/libc/time/clock_gettime.c @@ -0,0 +1,22 @@ +// Copyright (c) 2015-2016 Nuxi, https://nuxi.nl/ +// +// SPDX-License-Identifier: BSD-2-Clause + +#include <common/clock.h> +#include <common/time.h> + +#include <wasi/api.h> +#include <errno.h> +#include <time.h> + +int __clock_gettime(clockid_t clock_id, struct timespec *tp) { + __wasi_timestamp_t ts; + __wasi_errno_t error = __wasi_clock_time_get(clock_id->id, 1, &ts); + if (error != 0) { + errno = error; + return -1; + } + *tp = timestamp_to_timespec(ts); + return 0; +} +weak_alias(__clock_gettime, clock_gettime); diff --git a/libc-bottom-half/cloudlibc/src/libc/time/clock_nanosleep.c b/libc-bottom-half/cloudlibc/src/libc/time/clock_nanosleep.c new file mode 100644 index 0000000..d375056 --- /dev/null +++ b/libc-bottom-half/cloudlibc/src/libc/time/clock_nanosleep.c @@ -0,0 +1,37 @@ +// Copyright (c) 2015-2016 Nuxi, https://nuxi.nl/ +// +// SPDX-License-Identifier: BSD-2-Clause + +#include <common/clock.h> +#include <common/time.h> + +#include <assert.h> +#include <wasi/api.h> +#include <errno.h> +#include <time.h> + +static_assert(TIMER_ABSTIME == __WASI_SUBCLOCKFLAGS_SUBSCRIPTION_CLOCK_ABSTIME, + "Value mismatch"); + +int clock_nanosleep(clockid_t clock_id, int flags, const struct timespec *rqtp, + struct timespec *rmtp) { + if ((flags & ~TIMER_ABSTIME) != 0) + return EINVAL; + + // Prepare polling subscription. + __wasi_subscription_t sub = { + .u.tag = __WASI_EVENTTYPE_CLOCK, + .u.u.clock.id = clock_id->id, + .u.u.clock.flags = flags, + }; + if (!timespec_to_timestamp_clamp(rqtp, &sub.u.u.clock.timeout)) + return EINVAL; + + // Block until polling event is triggered. + size_t nevents; + __wasi_event_t ev; + __wasi_errno_t error = __wasi_poll_oneoff(&sub, &ev, 1, &nevents); + return error == 0 && ev.error == 0 ? 0 : ENOTSUP; +} + +weak_alias(clock_nanosleep, __clock_nanosleep); diff --git a/libc-bottom-half/cloudlibc/src/libc/time/nanosleep.c b/libc-bottom-half/cloudlibc/src/libc/time/nanosleep.c new file mode 100644 index 0000000..5f26c5c --- /dev/null +++ b/libc-bottom-half/cloudlibc/src/libc/time/nanosleep.c @@ -0,0 +1,15 @@ +// Copyright (c) 2015 Nuxi, https://nuxi.nl/ +// +// SPDX-License-Identifier: BSD-2-Clause + +#include <errno.h> +#include <time.h> + +int nanosleep(const struct timespec *rqtp, struct timespec *rem) { + int error = clock_nanosleep(CLOCK_REALTIME, 0, rqtp, rem); + if (error != 0) { + errno = error; + return -1; + } + return 0; +} diff --git a/libc-bottom-half/cloudlibc/src/libc/time/time.c b/libc-bottom-half/cloudlibc/src/libc/time/time.c new file mode 100644 index 0000000..52bc0e4 --- /dev/null +++ b/libc-bottom-half/cloudlibc/src/libc/time/time.c @@ -0,0 +1,16 @@ +// Copyright (c) 2015-2016 Nuxi, https://nuxi.nl/ +// +// SPDX-License-Identifier: BSD-2-Clause + +#include <common/time.h> + +#include <wasi/api.h> +#include <time.h> + +time_t time(time_t *tloc) { + __wasi_timestamp_t ts = 0; + (void)__wasi_clock_time_get(__WASI_CLOCKID_REALTIME, NSEC_PER_SEC, &ts); + if (tloc != NULL) + *tloc = ts / NSEC_PER_SEC; + return ts / NSEC_PER_SEC; +} |